[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