[ARVADOS] updated: 1.3.0-719-gdccac1099
Git user
git at public.curoverse.com
Fri Apr 26 20:58:02 UTC 2019
Summary of changes:
apps/workbench/app/models/arvados_base.rb | 113 ++++++++++++++++++++++++-----
apps/workbench/test/unit/work_unit_test.rb | 10 ++-
2 files changed, 104 insertions(+), 19 deletions(-)
via dccac1099d26fb9d40bf8ace962702a4e9ab1c40 (commit)
from 0ebe4a09a3d12f1415d2c119e716a2788ff889ec (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
commit dccac1099d26fb9d40bf8ace962702a4e9ab1c40
Author: Lucas Di Pentima <ldipentima at veritasgenetics.com>
Date: Fri Apr 26 17:56:23 2019 -0300
14988: Refactors ArvadosBase class to not subclass ActiveRecord.
Unit tests passing ok. The nulldb gem is still needed to avoid rails
try to run db reset/migrations.
Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima <ldipentima at veritasgenetics.com>
diff --git a/apps/workbench/app/models/arvados_base.rb b/apps/workbench/app/models/arvados_base.rb
index aa25ac439..1752e0aeb 100644
--- a/apps/workbench/app/models/arvados_base.rb
+++ b/apps/workbench/app/models/arvados_base.rb
@@ -2,11 +2,52 @@
#
# SPDX-License-Identifier: AGPL-3.0
-class ArvadosBase < ApplicationRecord
- self.abstract_class = true
+class ArvadosBase
+ include ActiveModel::Validations
+ include ActiveModel::Conversion
+ include ActiveModel::Serialization
+ include ActiveModel::Dirty
+ extend ActiveModel::Naming
+
+ Column = Struct.new("Column", :name)
+
attr_accessor :attribute_sortkey
attr_accessor :create_params
+ class Error < StandardError; end
+
+ module Type
+ class Hash < ActiveModel::Type::Value
+ def type
+ :hash
+ end
+
+ def default_value
+ {}
+ end
+
+ private
+ def cast_value(value)
+ (value.class == String) ? ::JSON.parse(value) : value
+ end
+ end
+
+ class Array < ActiveModel::Type::Value
+ def type
+ :array
+ end
+
+ def default_value
+ []
+ end
+
+ private
+ def cast_value(value)
+ (value.class == String) ? ::JSON.parse(value) : value
+ end
+ end
+ end
+
def self.arvados_api_client
ArvadosApiClient.new_or_current
end
@@ -35,7 +76,7 @@ class ArvadosBase < ApplicationRecord
end
def initialize raw_params={}, create_params={}
- super self.class.permit_attribute_params(raw_params)
+ self.class.permit_attribute_params(raw_params)
@create_params = create_params
@attribute_sortkey ||= {
'id' => nil,
@@ -58,7 +99,11 @@ class ArvadosBase < ApplicationRecord
'uuid' => '999',
}
@loaded_attributes = {}
- end
+ attributes = self.class.columns.map { |c| [c.name.to_sym, nil] }.to_h.merge(raw_params)
+ attributes.symbolize_keys.each do |name, value|
+ send("#{name}=", value)
+ end
+end
def self.columns
return @discovered_columns if @discovered_columns.andand.any?
@@ -77,29 +122,56 @@ class ArvadosBase < ApplicationRecord
else
# Hash, Array
@discovered_columns << column(k, coldef[:type], coldef[:type].constantize.new)
- serialize k, coldef[:type].constantize
- end
- define_method k do
- unless new_record? or @loaded_attributes.include? k.to_s
- Rails.logger.debug "BUG: access non-loaded attribute #{k}"
- # We should...
- # raise ActiveModel::MissingAttributeError, "missing attribute: #{k}"
- end
- super()
+ # serialize k, coldef[:type].constantize
end
+ attr_reader k
@attribute_info[k] = coldef
end
end
@discovered_columns
end
+ def new_record?
+ (uuid == nil) ? true : false
+ end
+
def self.column(name, sql_type = nil, default = nil, null = true)
- if sql_type == 'datetime'
- cast_type = "ActiveRecord::Type::DateTime".constantize.new
- else
- cast_type = ActiveRecord::Base.connection.lookup_cast_type(sql_type)
+ caster = case sql_type
+ when 'integer'
+ ActiveModel::Type::Integer
+ when 'string', 'text'
+ ActiveModel::Type::String
+ when 'float'
+ ActiveModel::Type::Float
+ when 'datetime'
+ ActiveModel::Type::DateTime
+ when 'boolean'
+ ActiveModel::Type::Boolean
+ when 'Hash'
+ ArvadosBase::Type::Hash
+ when 'Array'
+ ArvadosBase::Type::Array
+ else
+ raise ArvadosBase::Error.new("Type unknown: #{sql_type}")
+ end
+ define_method "#{name}=" do |val|
+ casted_value = caster.new.cast(val || default)
+ attribute_will_change!(name) if send(name) != casted_value
+ set_attribute_after_cast(name, casted_value)
end
- ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default, cast_type, sql_type.to_s, null)
+ Column.new(name.to_s)
+ end
+
+ def set_attribute_after_cast(name, casted_value)
+ instance_variable_set("@#{name}", casted_value)
+ end
+
+ def [](attr_name)
+ send(attr_name)
+ end
+
+ def []=(attr_name, attr_val)
+ send("#{attr_name}=", attr_val)
end
def self.attribute_info
@@ -336,6 +408,11 @@ class ArvadosBase < ApplicationRecord
forget_uuid!
end
+ def attributes
+ kv = self.class.columns.collect {|c| c.name}.map {|key| [key, send(key)]}
+ kv.to_h
+ end
+
def attributes_for_display
self.attributes.reject { |k,v|
attribute_sortkey.has_key?(k) and !attribute_sortkey[k]
diff --git a/apps/workbench/test/unit/work_unit_test.rb b/apps/workbench/test/unit/work_unit_test.rb
index 7f166b5d0..eaf65c578 100644
--- a/apps/workbench/test/unit/work_unit_test.rb
+++ b/apps/workbench/test/unit/work_unit_test.rb
@@ -32,12 +32,18 @@ class WorkUnitTest < ActiveSupport::TestCase
if label != nil
assert_equal(label, wu.label)
+ elsif obj.name.nil?
+ assert_nil(wu.label)
else
assert_equal(obj.name, wu.label)
end
assert_equal(obj['uuid'], wu.uuid)
assert_equal(state, wu.state_label)
- assert_equal(success, wu.success?)
+ if success.nil?
+ assert_nil(wu.success?)
+ else
+ assert_equal(success, wu.success?)
+ end
assert_equal(progress, wu.progress)
assert_equal(num_children, wu.children.size)
@@ -89,6 +95,8 @@ class WorkUnitTest < ActiveSupport::TestCase
if queuedtime
assert_equal true, (wu.queuedtime >= queuedtime)
+ elsif queuedtime.nil?
+ assert_nil wu.queuedtime
else
assert_equal queuedtime, wu.queuedtime
end
-----------------------------------------------------------------------
hooks/post-receive
--
More information about the arvados-commits
mailing list