dm-core 0.10.2 → 1.0.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +10 -1
 - data/Gemfile +143 -0
 - data/Rakefile +9 -5
 - data/VERSION +1 -1
 - data/dm-core.gemspec +160 -57
 - data/lib/dm-core.rb +131 -56
 - data/lib/dm-core/adapters.rb +98 -14
 - data/lib/dm-core/adapters/abstract_adapter.rb +24 -4
 - data/lib/dm-core/adapters/in_memory_adapter.rb +7 -2
 - data/lib/dm-core/associations/many_to_many.rb +19 -30
 - data/lib/dm-core/associations/many_to_one.rb +58 -42
 - data/lib/dm-core/associations/one_to_many.rb +33 -23
 - data/lib/dm-core/associations/one_to_one.rb +27 -11
 - data/lib/dm-core/associations/relationship.rb +4 -4
 - data/lib/dm-core/collection.rb +23 -16
 - data/lib/dm-core/core_ext/array.rb +36 -0
 - data/lib/dm-core/core_ext/hash.rb +30 -0
 - data/lib/dm-core/core_ext/module.rb +46 -0
 - data/lib/dm-core/core_ext/object.rb +31 -0
 - data/lib/dm-core/core_ext/pathname.rb +20 -0
 - data/lib/dm-core/core_ext/string.rb +22 -0
 - data/lib/dm-core/core_ext/try_dup.rb +44 -0
 - data/lib/dm-core/model.rb +88 -27
 - data/lib/dm-core/model/hook.rb +75 -18
 - data/lib/dm-core/model/property.rb +50 -9
 - data/lib/dm-core/model/relationship.rb +31 -31
 - data/lib/dm-core/model/scope.rb +3 -3
 - data/lib/dm-core/property.rb +196 -516
 - data/lib/dm-core/property/binary.rb +7 -0
 - data/lib/dm-core/property/boolean.rb +35 -0
 - data/lib/dm-core/property/class.rb +24 -0
 - data/lib/dm-core/property/date.rb +47 -0
 - data/lib/dm-core/property/date_time.rb +48 -0
 - data/lib/dm-core/property/decimal.rb +43 -0
 - data/lib/dm-core/property/discriminator.rb +48 -0
 - data/lib/dm-core/property/float.rb +24 -0
 - data/lib/dm-core/property/integer.rb +32 -0
 - data/lib/dm-core/property/numeric.rb +43 -0
 - data/lib/dm-core/property/object.rb +32 -0
 - data/lib/dm-core/property/serial.rb +8 -0
 - data/lib/dm-core/property/string.rb +49 -0
 - data/lib/dm-core/property/text.rb +12 -0
 - data/lib/dm-core/property/time.rb +48 -0
 - data/lib/dm-core/property/typecast/numeric.rb +32 -0
 - data/lib/dm-core/property/typecast/time.rb +28 -0
 - data/lib/dm-core/property_set.rb +10 -4
 - data/lib/dm-core/query.rb +14 -37
 - data/lib/dm-core/query/conditions/comparison.rb +8 -6
 - data/lib/dm-core/query/conditions/operation.rb +33 -2
 - data/lib/dm-core/query/operator.rb +2 -5
 - data/lib/dm-core/query/path.rb +4 -6
 - data/lib/dm-core/repository.rb +21 -6
 - data/lib/dm-core/resource.rb +316 -133
 - data/lib/dm-core/resource/state.rb +79 -0
 - data/lib/dm-core/resource/state/clean.rb +40 -0
 - data/lib/dm-core/resource/state/deleted.rb +30 -0
 - data/lib/dm-core/resource/state/dirty.rb +86 -0
 - data/lib/dm-core/resource/state/immutable.rb +34 -0
 - data/lib/dm-core/resource/state/persisted.rb +29 -0
 - data/lib/dm-core/resource/state/transient.rb +70 -0
 - data/lib/dm-core/spec/lib/adapter_helpers.rb +52 -0
 - data/lib/dm-core/spec/lib/collection_helpers.rb +20 -0
 - data/{spec → lib/dm-core/spec}/lib/counter_adapter.rb +5 -1
 - data/lib/dm-core/spec/lib/pending_helpers.rb +50 -0
 - data/lib/dm-core/spec/lib/spec_helper.rb +68 -0
 - data/lib/dm-core/spec/setup.rb +165 -0
 - data/lib/dm-core/spec/{adapter_shared_spec.rb → shared/adapter_spec.rb} +21 -7
 - data/{spec/public/shared/resource_shared_spec.rb → lib/dm-core/spec/shared/resource_spec.rb} +120 -83
 - data/{spec/public/shared/sel_shared_spec.rb → lib/dm-core/spec/shared/sel_spec.rb} +5 -6
 - data/lib/dm-core/support/assertions.rb +8 -0
 - data/lib/dm-core/support/equalizer.rb +1 -0
 - data/lib/dm-core/support/hook.rb +420 -0
 - data/lib/dm-core/support/lazy_array.rb +453 -0
 - data/lib/dm-core/support/local_object_space.rb +12 -0
 - data/lib/dm-core/support/logger.rb +193 -6
 - data/lib/dm-core/support/naming_conventions.rb +8 -8
 - data/lib/dm-core/support/subject.rb +33 -0
 - data/lib/dm-core/type.rb +4 -0
 - data/lib/dm-core/types/boolean.rb +2 -0
 - data/lib/dm-core/types/decimal.rb +9 -0
 - data/lib/dm-core/types/discriminator.rb +2 -0
 - data/lib/dm-core/types/object.rb +3 -0
 - data/lib/dm-core/types/serial.rb +2 -0
 - data/lib/dm-core/types/text.rb +2 -0
 - data/lib/dm-core/version.rb +1 -1
 - data/spec/public/associations/many_to_many/read_multiple_join_spec.rb +67 -0
 - data/spec/public/model/hook_spec.rb +209 -0
 - data/spec/public/model/property_spec.rb +35 -0
 - data/spec/public/model/relationship_spec.rb +33 -20
 - data/spec/public/model_spec.rb +142 -10
 - data/spec/public/property/binary_spec.rb +14 -0
 - data/spec/public/property/boolean_spec.rb +14 -0
 - data/spec/public/property/class_spec.rb +20 -0
 - data/spec/public/property/date_spec.rb +14 -0
 - data/spec/public/property/date_time_spec.rb +14 -0
 - data/spec/public/property/decimal_spec.rb +14 -0
 - data/spec/public/{types → property}/discriminator_spec.rb +2 -12
 - data/spec/public/property/float_spec.rb +14 -0
 - data/spec/public/property/integer_spec.rb +14 -0
 - data/spec/public/property/object_spec.rb +9 -17
 - data/spec/public/property/serial_spec.rb +14 -0
 - data/spec/public/property/string_spec.rb +14 -0
 - data/spec/public/property/text_spec.rb +52 -0
 - data/spec/public/property/time_spec.rb +14 -0
 - data/spec/public/property_spec.rb +28 -87
 - data/spec/public/resource_spec.rb +101 -0
 - data/spec/public/sel_spec.rb +5 -15
 - data/spec/public/shared/collection_shared_spec.rb +16 -30
 - data/spec/public/shared/finder_shared_spec.rb +2 -4
 - data/spec/public/shared/property_shared_spec.rb +176 -0
 - data/spec/semipublic/adapters/abstract_adapter_spec.rb +1 -1
 - data/spec/semipublic/adapters/in_memory_adapter_spec.rb +2 -2
 - data/spec/semipublic/associations/many_to_many_spec.rb +89 -0
 - data/spec/semipublic/associations/many_to_one_spec.rb +24 -1
 - data/spec/semipublic/associations/one_to_many_spec.rb +51 -0
 - data/spec/semipublic/associations/one_to_one_spec.rb +49 -0
 - data/spec/semipublic/associations/relationship_spec.rb +3 -3
 - data/spec/semipublic/associations_spec.rb +1 -1
 - data/spec/semipublic/property/binary_spec.rb +13 -0
 - data/spec/semipublic/property/boolean_spec.rb +65 -0
 - data/spec/semipublic/property/class_spec.rb +33 -0
 - data/spec/semipublic/property/date_spec.rb +43 -0
 - data/spec/semipublic/property/date_time_spec.rb +46 -0
 - data/spec/semipublic/property/decimal_spec.rb +82 -0
 - data/spec/semipublic/property/discriminator_spec.rb +19 -0
 - data/spec/semipublic/property/float_spec.rb +82 -0
 - data/spec/semipublic/property/integer_spec.rb +82 -0
 - data/spec/semipublic/property/serial_spec.rb +13 -0
 - data/spec/semipublic/property/string_spec.rb +13 -0
 - data/spec/semipublic/property/text_spec.rb +31 -0
 - data/spec/semipublic/property/time_spec.rb +50 -0
 - data/spec/semipublic/property_spec.rb +2 -532
 - data/spec/semipublic/query/conditions/comparison_spec.rb +171 -169
 - data/spec/semipublic/query/conditions/operation_spec.rb +53 -51
 - data/spec/semipublic/query/path_spec.rb +17 -17
 - data/spec/semipublic/query_spec.rb +47 -78
 - data/spec/semipublic/resource/state/clean_spec.rb +88 -0
 - data/spec/semipublic/resource/state/deleted_spec.rb +78 -0
 - data/spec/semipublic/resource/state/dirty_spec.rb +133 -0
 - data/spec/semipublic/resource/state/immutable_spec.rb +99 -0
 - data/spec/semipublic/resource/state/transient_spec.rb +128 -0
 - data/spec/semipublic/resource/state_spec.rb +226 -0
 - data/spec/semipublic/shared/property_shared_spec.rb +143 -0
 - data/spec/semipublic/shared/resource_shared_spec.rb +16 -15
 - data/spec/semipublic/shared/resource_state_shared_spec.rb +78 -0
 - data/spec/semipublic/shared/subject_shared_spec.rb +79 -0
 - data/spec/spec_helper.rb +21 -97
 - data/spec/support/types/huge_integer.rb +17 -0
 - data/spec/unit/array_spec.rb +48 -0
 - data/spec/unit/hash_spec.rb +35 -0
 - data/spec/unit/hook_spec.rb +1234 -0
 - data/spec/unit/lazy_array_spec.rb +1959 -0
 - data/spec/unit/module_spec.rb +70 -0
 - data/spec/unit/object_spec.rb +37 -0
 - data/spec/unit/try_dup_spec.rb +45 -0
 - data/tasks/local_gemfile.rake +18 -0
 - data/tasks/spec.rake +0 -3
 - metadata +197 -71
 - data/deps.rip +0 -2
 - data/lib/dm-core/adapters/data_objects_adapter.rb +0 -712
 - data/lib/dm-core/adapters/mysql_adapter.rb +0 -42
 - data/lib/dm-core/adapters/oracle_adapter.rb +0 -229
 - data/lib/dm-core/adapters/postgres_adapter.rb +0 -22
 - data/lib/dm-core/adapters/sqlite3_adapter.rb +0 -17
 - data/lib/dm-core/adapters/sqlserver_adapter.rb +0 -114
 - data/lib/dm-core/adapters/yaml_adapter.rb +0 -111
 - data/lib/dm-core/core_ext/enumerable.rb +0 -28
 - data/lib/dm-core/migrations.rb +0 -1427
 - data/lib/dm-core/spec/data_objects_adapter_shared_spec.rb +0 -366
 - data/lib/dm-core/transaction.rb +0 -508
 - data/lib/dm-core/types/paranoid_boolean.rb +0 -42
 - data/lib/dm-core/types/paranoid_datetime.rb +0 -41
 - data/spec/lib/adapter_helpers.rb +0 -105
 - data/spec/lib/collection_helpers.rb +0 -18
 - data/spec/lib/pending_helpers.rb +0 -46
 - data/spec/public/migrations_spec.rb +0 -503
 - data/spec/public/transaction_spec.rb +0 -153
 - data/spec/semipublic/adapters/mysql_adapter_spec.rb +0 -17
 - data/spec/semipublic/adapters/oracle_adapter_spec.rb +0 -194
 - data/spec/semipublic/adapters/postgres_adapter_spec.rb +0 -17
 - data/spec/semipublic/adapters/sqlite3_adapter_spec.rb +0 -17
 - data/spec/semipublic/adapters/sqlserver_adapter_spec.rb +0 -17
 - data/spec/semipublic/adapters/yaml_adapter_spec.rb +0 -12
 
| 
         @@ -0,0 +1,48 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'dm-core/property/typecast/time'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module DataMapper
         
     | 
| 
      
 4 
     | 
    
         
            +
              class Property
         
     | 
| 
      
 5 
     | 
    
         
            +
                class Time < Object
         
     | 
| 
      
 6 
     | 
    
         
            +
                  include PassThroughLoadDump
         
     | 
| 
      
 7 
     | 
    
         
            +
                  include Typecast::Time
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                  primitive ::Time
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                  # Typecasts an arbitrary value to a Time
         
     | 
| 
      
 12 
     | 
    
         
            +
                  # Handles both Hashes and Time instances.
         
     | 
| 
      
 13 
     | 
    
         
            +
                  #
         
     | 
| 
      
 14 
     | 
    
         
            +
                  # @param [#to_mash, #to_s] value
         
     | 
| 
      
 15 
     | 
    
         
            +
                  #   value to be typecast
         
     | 
| 
      
 16 
     | 
    
         
            +
                  #
         
     | 
| 
      
 17 
     | 
    
         
            +
                  # @return [Time]
         
     | 
| 
      
 18 
     | 
    
         
            +
                  #   Time constructed from value
         
     | 
| 
      
 19 
     | 
    
         
            +
                  #
         
     | 
| 
      
 20 
     | 
    
         
            +
                  # @api private
         
     | 
| 
      
 21 
     | 
    
         
            +
                  def typecast_to_primitive(value)
         
     | 
| 
      
 22 
     | 
    
         
            +
                    if value.respond_to?(:to_time)
         
     | 
| 
      
 23 
     | 
    
         
            +
                      value.to_time
         
     | 
| 
      
 24 
     | 
    
         
            +
                    elsif value.respond_to?(:to_mash)
         
     | 
| 
      
 25 
     | 
    
         
            +
                      typecast_hash_to_time(value)
         
     | 
| 
      
 26 
     | 
    
         
            +
                    else
         
     | 
| 
      
 27 
     | 
    
         
            +
                      ::Time.parse(value.to_s)
         
     | 
| 
      
 28 
     | 
    
         
            +
                    end
         
     | 
| 
      
 29 
     | 
    
         
            +
                  rescue ArgumentError
         
     | 
| 
      
 30 
     | 
    
         
            +
                    value
         
     | 
| 
      
 31 
     | 
    
         
            +
                  end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                  # Creates a Time instance from a Hash with keys :year, :month, :day,
         
     | 
| 
      
 34 
     | 
    
         
            +
                  # :hour, :min, :sec
         
     | 
| 
      
 35 
     | 
    
         
            +
                  #
         
     | 
| 
      
 36 
     | 
    
         
            +
                  # @param [#to_mash] value
         
     | 
| 
      
 37 
     | 
    
         
            +
                  #   value to be typecast
         
     | 
| 
      
 38 
     | 
    
         
            +
                  #
         
     | 
| 
      
 39 
     | 
    
         
            +
                  # @return [Time]
         
     | 
| 
      
 40 
     | 
    
         
            +
                  #   Time constructed from hash
         
     | 
| 
      
 41 
     | 
    
         
            +
                  #
         
     | 
| 
      
 42 
     | 
    
         
            +
                  # @api private
         
     | 
| 
      
 43 
     | 
    
         
            +
                  def typecast_hash_to_time(value)
         
     | 
| 
      
 44 
     | 
    
         
            +
                    ::Time.local(*extract_time(value))
         
     | 
| 
      
 45 
     | 
    
         
            +
                  end
         
     | 
| 
      
 46 
     | 
    
         
            +
                end # class Time
         
     | 
| 
      
 47 
     | 
    
         
            +
              end # class Property
         
     | 
| 
      
 48 
     | 
    
         
            +
            end # module DataMapper
         
     | 
| 
         @@ -0,0 +1,32 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module DataMapper
         
     | 
| 
      
 2 
     | 
    
         
            +
              class Property
         
     | 
| 
      
 3 
     | 
    
         
            +
                module Typecast
         
     | 
| 
      
 4 
     | 
    
         
            +
                  module Numeric
         
     | 
| 
      
 5 
     | 
    
         
            +
                    # Match numeric string
         
     | 
| 
      
 6 
     | 
    
         
            +
                    #
         
     | 
| 
      
 7 
     | 
    
         
            +
                    # @param [#to_str, Numeric] value
         
     | 
| 
      
 8 
     | 
    
         
            +
                    #   value to typecast
         
     | 
| 
      
 9 
     | 
    
         
            +
                    # @param [Symbol] method
         
     | 
| 
      
 10 
     | 
    
         
            +
                    #   method to typecast with
         
     | 
| 
      
 11 
     | 
    
         
            +
                    #
         
     | 
| 
      
 12 
     | 
    
         
            +
                    # @return [Numeric]
         
     | 
| 
      
 13 
     | 
    
         
            +
                    #   number if matched, value if no match
         
     | 
| 
      
 14 
     | 
    
         
            +
                    #
         
     | 
| 
      
 15 
     | 
    
         
            +
                    # @api private
         
     | 
| 
      
 16 
     | 
    
         
            +
                    def typecast_to_numeric(value, method)
         
     | 
| 
      
 17 
     | 
    
         
            +
                      if value.respond_to?(:to_str)
         
     | 
| 
      
 18 
     | 
    
         
            +
                        if value.to_str =~ /\A(-?(?:0|[1-9]\d*)(?:\.\d+)?|(?:\.\d+))\z/
         
     | 
| 
      
 19 
     | 
    
         
            +
                          $1.send(method)
         
     | 
| 
      
 20 
     | 
    
         
            +
                        else
         
     | 
| 
      
 21 
     | 
    
         
            +
                          value
         
     | 
| 
      
 22 
     | 
    
         
            +
                        end
         
     | 
| 
      
 23 
     | 
    
         
            +
                      elsif value.respond_to?(method)
         
     | 
| 
      
 24 
     | 
    
         
            +
                        value.send(method)
         
     | 
| 
      
 25 
     | 
    
         
            +
                      else
         
     | 
| 
      
 26 
     | 
    
         
            +
                        value
         
     | 
| 
      
 27 
     | 
    
         
            +
                      end
         
     | 
| 
      
 28 
     | 
    
         
            +
                    end
         
     | 
| 
      
 29 
     | 
    
         
            +
                  end # Numeric
         
     | 
| 
      
 30 
     | 
    
         
            +
                end # Typecast
         
     | 
| 
      
 31 
     | 
    
         
            +
              end # Property
         
     | 
| 
      
 32 
     | 
    
         
            +
            end # DataMapper
         
     | 
| 
         @@ -0,0 +1,28 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module DataMapper
         
     | 
| 
      
 2 
     | 
    
         
            +
              class Property
         
     | 
| 
      
 3 
     | 
    
         
            +
                module Typecast
         
     | 
| 
      
 4 
     | 
    
         
            +
                  module Time
         
     | 
| 
      
 5 
     | 
    
         
            +
                    include Numeric
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
                    # Extracts the given args from the hash. If a value does not exist, it
         
     | 
| 
      
 8 
     | 
    
         
            +
                    # uses the value of Time.now.
         
     | 
| 
      
 9 
     | 
    
         
            +
                    #
         
     | 
| 
      
 10 
     | 
    
         
            +
                    # @param [#to_mash] value
         
     | 
| 
      
 11 
     | 
    
         
            +
                    #   value to extract time args from
         
     | 
| 
      
 12 
     | 
    
         
            +
                    #
         
     | 
| 
      
 13 
     | 
    
         
            +
                    # @return [Array]
         
     | 
| 
      
 14 
     | 
    
         
            +
                    #   Extracted values
         
     | 
| 
      
 15 
     | 
    
         
            +
                    #
         
     | 
| 
      
 16 
     | 
    
         
            +
                    # @api private
         
     | 
| 
      
 17 
     | 
    
         
            +
                    def extract_time(value)
         
     | 
| 
      
 18 
     | 
    
         
            +
                      mash = value.to_mash
         
     | 
| 
      
 19 
     | 
    
         
            +
                      now  = ::Time.now
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                      [ :year, :month, :day, :hour, :min, :sec ].map do |segment|
         
     | 
| 
      
 22 
     | 
    
         
            +
                        typecast_to_numeric(mash.fetch(segment, now.send(segment)), :to_i)
         
     | 
| 
      
 23 
     | 
    
         
            +
                      end
         
     | 
| 
      
 24 
     | 
    
         
            +
                    end
         
     | 
| 
      
 25 
     | 
    
         
            +
                  end # Numeric
         
     | 
| 
      
 26 
     | 
    
         
            +
                end # Typecast
         
     | 
| 
      
 27 
     | 
    
         
            +
              end # Property
         
     | 
| 
      
 28 
     | 
    
         
            +
            end # DataMapper
         
     | 
    
        data/lib/dm-core/property_set.rb
    CHANGED
    
    | 
         @@ -25,7 +25,7 @@ module DataMapper 
     | 
|
| 
       25 
25 
     | 
    
         | 
| 
       26 
26 
     | 
    
         
             
                # @api semipublic
         
     | 
| 
       27 
27 
     | 
    
         
             
                def named?(name)
         
     | 
| 
       28 
     | 
    
         
            -
                  @properties.key?(name)
         
     | 
| 
      
 28 
     | 
    
         
            +
                  @properties.key?(name.to_sym)
         
     | 
| 
       29 
29 
     | 
    
         
             
                end
         
     | 
| 
       30 
30 
     | 
    
         | 
| 
       31 
31 
     | 
    
         
             
                # @api semipublic
         
     | 
| 
         @@ -68,7 +68,7 @@ module DataMapper 
     | 
|
| 
       68 
68 
     | 
    
         | 
| 
       69 
69 
     | 
    
         
             
                # @api semipublic
         
     | 
| 
       70 
70 
     | 
    
         
             
                def discriminator
         
     | 
| 
       71 
     | 
    
         
            -
                  @discriminator ||= detect { |property| property.type == Types::Discriminator }
         
     | 
| 
      
 71 
     | 
    
         
            +
                  @discriminator ||= detect { |property| property.kind_of?(Property::Discriminator) || property.type == Types::Discriminator }
         
     | 
| 
       72 
72 
     | 
    
         
             
                end
         
     | 
| 
       73 
73 
     | 
    
         | 
| 
       74 
74 
     | 
    
         
             
                # @api semipublic
         
     | 
| 
         @@ -87,7 +87,8 @@ module DataMapper 
     | 
|
| 
       87 
87 
     | 
    
         | 
| 
       88 
88 
     | 
    
         
             
                # @api semipublic
         
     | 
| 
       89 
89 
     | 
    
         
             
                def get(resource)
         
     | 
| 
       90 
     | 
    
         
            -
                   
     | 
| 
      
 90 
     | 
    
         
            +
                  return [] if resource.nil?
         
     | 
| 
      
 91 
     | 
    
         
            +
                  map { |property| resource.__send__(property.name) }
         
     | 
| 
       91 
92 
     | 
    
         
             
                end
         
     | 
| 
       92 
93 
     | 
    
         | 
| 
       93 
94 
     | 
    
         
             
                # @api semipublic
         
     | 
| 
         @@ -97,7 +98,7 @@ module DataMapper 
     | 
|
| 
       97 
98 
     | 
    
         | 
| 
       98 
99 
     | 
    
         
             
                # @api semipublic
         
     | 
| 
       99 
100 
     | 
    
         
             
                def set(resource, values)
         
     | 
| 
       100 
     | 
    
         
            -
                  zip(values) { |property, value| property. 
     | 
| 
      
 101 
     | 
    
         
            +
                  zip(values) { |property, value| resource.__send__("#{property.name}=", value) }
         
     | 
| 
       101 
102 
     | 
    
         
             
                end
         
     | 
| 
       102 
103 
     | 
    
         | 
| 
       103 
104 
     | 
    
         
             
                # @api semipublic
         
     | 
| 
         @@ -147,6 +148,11 @@ module DataMapper 
     | 
|
| 
       147 
148 
     | 
    
         
             
                  properties_in_context.flatten.uniq
         
     | 
| 
       148 
149 
     | 
    
         
             
                end
         
     | 
| 
       149 
150 
     | 
    
         | 
| 
      
 151 
     | 
    
         
            +
                # @api private
         
     | 
| 
      
 152 
     | 
    
         
            +
                def field_map
         
     | 
| 
      
 153 
     | 
    
         
            +
                  map { |property| [ property.field, property ] }.to_hash
         
     | 
| 
      
 154 
     | 
    
         
            +
                end
         
     | 
| 
      
 155 
     | 
    
         
            +
             
     | 
| 
       150 
156 
     | 
    
         
             
                private
         
     | 
| 
       151 
157 
     | 
    
         | 
| 
       152 
158 
     | 
    
         
             
                # @api semipublic
         
     | 
    
        data/lib/dm-core/query.rb
    CHANGED
    
    | 
         @@ -26,7 +26,7 @@ module DataMapper 
     | 
|
| 
       26 
26 
     | 
    
         
             
              # Generally Query objects can be found inside Collection objects.
         
     | 
| 
       27 
27 
     | 
    
         
             
              #
         
     | 
| 
       28 
28 
     | 
    
         
             
              class Query
         
     | 
| 
       29 
     | 
    
         
            -
                include  
     | 
| 
      
 29 
     | 
    
         
            +
                include DataMapper::Assertions
         
     | 
| 
       30 
30 
     | 
    
         
             
                extend Equalizer
         
     | 
| 
       31 
31 
     | 
    
         | 
| 
       32 
32 
     | 
    
         
             
                OPTIONS = [ :fields, :links, :conditions, :offset, :limit, :order, :unique, :add_reversed, :reload ].to_set.freeze
         
     | 
| 
         @@ -106,7 +106,7 @@ module DataMapper 
     | 
|
| 
       106 
106 
     | 
    
         
             
                  elsif source.kind_of?(Enumerable)
         
     | 
| 
       107 
107 
     | 
    
         
             
                    key        = model.key(repository.name)
         
     | 
| 
       108 
108 
     | 
    
         
             
                    conditions = Query.target_conditions(source, key, key)
         
     | 
| 
       109 
     | 
    
         
            -
                     
     | 
| 
      
 109 
     | 
    
         
            +
                    repository.new_query(model, :conditions => conditions)
         
     | 
| 
       110 
110 
     | 
    
         
             
                  else
         
     | 
| 
       111 
111 
     | 
    
         
             
                    raise ArgumentError, "+source+ must respond to #query or be an Enumerable, but was #{source.class}"
         
     | 
| 
       112 
112 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -349,13 +349,12 @@ module DataMapper 
     | 
|
| 
       349 
349 
     | 
    
         
             
                #
         
     | 
| 
       350 
350 
     | 
    
         
             
                # @api semipublic
         
     | 
| 
       351 
351 
     | 
    
         
             
                def update(other)
         
     | 
| 
       352 
     | 
    
         
            -
                  assert_kind_of 'other', other, self.class, Hash
         
     | 
| 
       353 
     | 
    
         
            -
             
     | 
| 
       354 
352 
     | 
    
         
             
                  other_options = if kind_of?(other.class)
         
     | 
| 
       355 
353 
     | 
    
         
             
                    return self if self.eql?(other)
         
     | 
| 
       356 
354 
     | 
    
         
             
                    assert_valid_other(other)
         
     | 
| 
       357 
355 
     | 
    
         
             
                    other.options
         
     | 
| 
       358 
356 
     | 
    
         
             
                  else
         
     | 
| 
      
 357 
     | 
    
         
            +
                    other = other.to_hash
         
     | 
| 
       359 
358 
     | 
    
         
             
                    return self if other.empty?
         
     | 
| 
       360 
359 
     | 
    
         
             
                    other
         
     | 
| 
       361 
360 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -401,7 +400,7 @@ module DataMapper 
     | 
|
| 
       401 
400 
     | 
    
         
             
                #
         
     | 
| 
       402 
401 
     | 
    
         
             
                # @api semipublic
         
     | 
| 
       403 
402 
     | 
    
         
             
                def relative(options)
         
     | 
| 
       404 
     | 
    
         
            -
                   
     | 
| 
      
 403 
     | 
    
         
            +
                  options = options.to_hash
         
     | 
| 
       405 
404 
     | 
    
         | 
| 
       406 
405 
     | 
    
         
             
                  offset = nil
         
     | 
| 
       407 
406 
     | 
    
         
             
                  limit  = self.limit
         
     | 
| 
         @@ -734,7 +733,7 @@ module DataMapper 
     | 
|
| 
       734 
733 
     | 
    
         
             
                  @offset       = @options.fetch :offset,       0
         
     | 
| 
       735 
734 
     | 
    
         
             
                  @limit        = @options.fetch :limit,        nil
         
     | 
| 
       736 
735 
     | 
    
         
             
                  @order        = @options.fetch :order,        @model.default_order(repository_name)
         
     | 
| 
       737 
     | 
    
         
            -
                  @unique       = @options.fetch :unique,        
     | 
| 
      
 736 
     | 
    
         
            +
                  @unique       = @options.fetch :unique,       true
         
     | 
| 
       738 
737 
     | 
    
         
             
                  @add_reversed = @options.fetch :add_reversed, false
         
     | 
| 
       739 
738 
     | 
    
         
             
                  @reload       = @options.fetch :reload,       false
         
     | 
| 
       740 
739 
     | 
    
         
             
                  @raw          = false
         
     | 
| 
         @@ -763,7 +762,7 @@ module DataMapper 
     | 
|
| 
       763 
762 
     | 
    
         
             
                #
         
     | 
| 
       764 
763 
     | 
    
         
             
                # @api private
         
     | 
| 
       765 
764 
     | 
    
         
             
                def assert_valid_options(options)
         
     | 
| 
       766 
     | 
    
         
            -
                   
     | 
| 
      
 765 
     | 
    
         
            +
                  options = options.to_hash
         
     | 
| 
       767 
766 
     | 
    
         | 
| 
       768 
767 
     | 
    
         
             
                  options.each do |attribute, value|
         
     | 
| 
       769 
768 
     | 
    
         
             
                    case attribute
         
     | 
| 
         @@ -785,7 +784,7 @@ module DataMapper 
     | 
|
| 
       785 
784 
     | 
    
         
             
                #
         
     | 
| 
       786 
785 
     | 
    
         
             
                # @api private
         
     | 
| 
       787 
786 
     | 
    
         
             
                def assert_valid_fields(fields, unique)
         
     | 
| 
       788 
     | 
    
         
            -
                   
     | 
| 
      
 787 
     | 
    
         
            +
                  fields = fields.to_ary
         
     | 
| 
       789 
788 
     | 
    
         | 
| 
       790 
789 
     | 
    
         
             
                  model = self.model
         
     | 
| 
       791 
790 
     | 
    
         | 
| 
         @@ -814,7 +813,7 @@ module DataMapper 
     | 
|
| 
       814 
813 
     | 
    
         
             
                #
         
     | 
| 
       815 
814 
     | 
    
         
             
                # @api private
         
     | 
| 
       816 
815 
     | 
    
         
             
                def assert_valid_links(links)
         
     | 
| 
       817 
     | 
    
         
            -
                   
     | 
| 
      
 816 
     | 
    
         
            +
                  links = links.to_ary
         
     | 
| 
       818 
817 
     | 
    
         | 
| 
       819 
818 
     | 
    
         
             
                  if links.empty?
         
     | 
| 
       820 
819 
     | 
    
         
             
                    raise ArgumentError, '+options[:links]+ should not be empty'
         
     | 
| 
         @@ -854,7 +853,7 @@ module DataMapper 
     | 
|
| 
       854 
853 
     | 
    
         
             
                        inspect = subject.inspect
         
     | 
| 
       855 
854 
     | 
    
         | 
| 
       856 
855 
     | 
    
         
             
                        case subject
         
     | 
| 
       857 
     | 
    
         
            -
                          when Symbol, String
         
     | 
| 
      
 856 
     | 
    
         
            +
                          when Symbol, ::String
         
     | 
| 
       858 
857 
     | 
    
         
             
                            unless subject.to_s.include?('.') || @properties.named?(subject) || @relationships.key?(subject)
         
     | 
| 
       859 
858 
     | 
    
         
             
                              raise ArgumentError, "condition #{inspect} does not map to a property or relationship in #{model}"
         
     | 
| 
       860 
859 
     | 
    
         
             
                            end
         
     | 
| 
         @@ -899,7 +898,7 @@ module DataMapper 
     | 
|
| 
       899 
898 
     | 
    
         
             
                # Verifies that query offset is non-negative and only used together with limit
         
     | 
| 
       900 
899 
     | 
    
         
             
                # @api private
         
     | 
| 
       901 
900 
     | 
    
         
             
                def assert_valid_offset(offset, limit)
         
     | 
| 
       902 
     | 
    
         
            -
                   
     | 
| 
      
 901 
     | 
    
         
            +
                  offset = offset.to_int
         
     | 
| 
       903 
902 
     | 
    
         | 
| 
       904 
903 
     | 
    
         
             
                  unless offset >= 0
         
     | 
| 
       905 
904 
     | 
    
         
             
                    raise ArgumentError, "+options[:offset]+ must be greater than or equal to 0, but was #{offset.inspect}"
         
     | 
| 
         @@ -917,7 +916,7 @@ module DataMapper 
     | 
|
| 
       917 
916 
     | 
    
         
             
                #
         
     | 
| 
       918 
917 
     | 
    
         
             
                # @api private
         
     | 
| 
       919 
918 
     | 
    
         
             
                def assert_valid_limit(limit)
         
     | 
| 
       920 
     | 
    
         
            -
                   
     | 
| 
      
 919 
     | 
    
         
            +
                  limit = limit.to_int
         
     | 
| 
       921 
920 
     | 
    
         | 
| 
       922 
921 
     | 
    
         
             
                  unless limit >= 0
         
     | 
| 
       923 
922 
     | 
    
         
             
                    raise ArgumentError, "+options[:limit]+ must be greater than or equal to 0, but was #{limit.inspect}"
         
     | 
| 
         @@ -1105,28 +1104,6 @@ module DataMapper 
     | 
|
| 
       1105 
1104 
     | 
    
         
             
                    if relationship.respond_to?(:links)
         
     | 
| 
       1106 
1105 
     | 
    
         
             
                      stack.concat(relationship.links)
         
     | 
| 
       1107 
1106 
     | 
    
         
             
                    elsif !@links.include?(relationship)
         
     | 
| 
       1108 
     | 
    
         
            -
                      repository_name = relationship.relative_target_repository_name
         
     | 
| 
       1109 
     | 
    
         
            -
                      model           = relationship.target_model
         
     | 
| 
       1110 
     | 
    
         
            -
             
     | 
| 
       1111 
     | 
    
         
            -
                      # TODO: see if this can handle extracting the :order option and sort the
         
     | 
| 
       1112 
     | 
    
         
            -
                      # resulting collection using the order specified by through relationships
         
     | 
| 
       1113 
     | 
    
         
            -
             
     | 
| 
       1114 
     | 
    
         
            -
                      model.current_scope.merge(relationship.query).each do |subject, value|
         
     | 
| 
       1115 
     | 
    
         
            -
                        # TODO: figure out how to merge Query options from links
         
     | 
| 
       1116 
     | 
    
         
            -
                        if OPTIONS.include?(subject)
         
     | 
| 
       1117 
     | 
    
         
            -
                          next  # skip for now
         
     | 
| 
       1118 
     | 
    
         
            -
                        end
         
     | 
| 
       1119 
     | 
    
         
            -
             
     | 
| 
       1120 
     | 
    
         
            -
                        # set @repository when appending conditions
         
     | 
| 
       1121 
     | 
    
         
            -
                        original, @repository = @repository, DataMapper.repository(repository_name)
         
     | 
| 
       1122 
     | 
    
         
            -
             
     | 
| 
       1123 
     | 
    
         
            -
                        begin
         
     | 
| 
       1124 
     | 
    
         
            -
                          append_condition(subject, value, model)
         
     | 
| 
       1125 
     | 
    
         
            -
                        ensure
         
     | 
| 
       1126 
     | 
    
         
            -
                          @repository = original
         
     | 
| 
       1127 
     | 
    
         
            -
                        end
         
     | 
| 
       1128 
     | 
    
         
            -
                      end
         
     | 
| 
       1129 
     | 
    
         
            -
             
     | 
| 
       1130 
1107 
     | 
    
         
             
                      @links << relationship
         
     | 
| 
       1131 
1108 
     | 
    
         
             
                    end
         
     | 
| 
       1132 
1109 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -1424,7 +1401,7 @@ module DataMapper 
     | 
|
| 
       1424 
1401 
     | 
    
         
             
                        model,
         
     | 
| 
       1425 
1402 
     | 
    
         
             
                        model,
         
     | 
| 
       1426 
1403 
     | 
    
         
             
                        self_relationship_options
         
     | 
| 
       1427 
     | 
    
         
            -
             
     | 
| 
      
 1404 
     | 
    
         
            +
                      )
         
     | 
| 
       1428 
1405 
     | 
    
         
             
                    end
         
     | 
| 
       1429 
1406 
     | 
    
         
             
                end
         
     | 
| 
       1430 
1407 
     | 
    
         | 
| 
         @@ -1440,8 +1417,8 @@ module DataMapper 
     | 
|
| 
       1440 
1417 
     | 
    
         
             
                  {
         
     | 
| 
       1441 
1418 
     | 
    
         
             
                    :child_key              => keys,
         
     | 
| 
       1442 
1419 
     | 
    
         
             
                    :parent_key             => keys,
         
     | 
| 
       1443 
     | 
    
         
            -
                    :child_repository_name  => repository,
         
     | 
| 
       1444 
     | 
    
         
            -
                    :parent_repository_name => repository,
         
     | 
| 
      
 1420 
     | 
    
         
            +
                    :child_repository_name  => repository.name,
         
     | 
| 
      
 1421 
     | 
    
         
            +
                    :parent_repository_name => repository.name,
         
     | 
| 
       1445 
1422 
     | 
    
         
             
                  }
         
     | 
| 
       1446 
1423 
     | 
    
         
             
                end
         
     | 
| 
       1447 
1424 
     | 
    
         | 
| 
         @@ -340,7 +340,7 @@ module DataMapper 
     | 
|
| 
       340 
340 
     | 
    
         | 
| 
       341 
341 
     | 
    
         
             
                    # @api private
         
     | 
| 
       342 
342 
     | 
    
         
             
                    def dump_property(value)
         
     | 
| 
       343 
     | 
    
         
            -
                      subject. 
     | 
| 
      
 343 
     | 
    
         
            +
                      subject.dump(value)
         
     | 
| 
       344 
344 
     | 
    
         
             
                    end
         
     | 
| 
       345 
345 
     | 
    
         | 
| 
       346 
346 
     | 
    
         
             
                    # Returns a value for the comparison +subject+
         
     | 
| 
         @@ -385,7 +385,7 @@ module DataMapper 
     | 
|
| 
       385 
385 
     | 
    
         
             
                    def record_value_from_hash(hash, subject, key_type)
         
     | 
| 
       386 
386 
     | 
    
         
             
                      hash.fetch subject, case subject
         
     | 
| 
       387 
387 
     | 
    
         
             
                        when Property
         
     | 
| 
       388 
     | 
    
         
            -
                          hash[subject.field]
         
     | 
| 
      
 388 
     | 
    
         
            +
                          subject.load(hash[subject.field])
         
     | 
| 
       389 
389 
     | 
    
         
             
                        when Associations::Relationship
         
     | 
| 
       390 
390 
     | 
    
         
             
                          subject.send(key_type).map { |property|
         
     | 
| 
       391 
391 
     | 
    
         
             
                            record_value_from_hash(hash, property, key_type)
         
     | 
| 
         @@ -471,8 +471,10 @@ module DataMapper 
     | 
|
| 
       471 
471 
     | 
    
         
             
                    #
         
     | 
| 
       472 
472 
     | 
    
         
             
                    # @api semipublic
         
     | 
| 
       473 
473 
     | 
    
         
             
                    def foreign_key_mapping
         
     | 
| 
       474 
     | 
    
         
            -
                       
     | 
| 
       475 
     | 
    
         
            -
                       
     | 
| 
      
 474 
     | 
    
         
            +
                      relationship = subject.inverse
         
     | 
| 
      
 475 
     | 
    
         
            +
                      relationship = relationship.links.first if relationship.respond_to?(:links)
         
     | 
| 
      
 476 
     | 
    
         
            +
             
     | 
| 
      
 477 
     | 
    
         
            +
                      Query.target_conditions(value, relationship.source_key, relationship.target_key)
         
     | 
| 
       476 
478 
     | 
    
         
             
                    end
         
     | 
| 
       477 
479 
     | 
    
         | 
| 
       478 
480 
     | 
    
         
             
                    private
         
     | 
| 
         @@ -624,7 +626,7 @@ module DataMapper 
     | 
|
| 
       624 
626 
     | 
    
         | 
| 
       625 
627 
     | 
    
         
             
                    # @api private
         
     | 
| 
       626 
628 
     | 
    
         
             
                    def valid_range?(range)
         
     | 
| 
       627 
     | 
    
         
            -
                      ( 
     | 
| 
      
 629 
     | 
    
         
            +
                      (range.any? || negated?) && valid_for_subject?(range.first) && valid_for_subject?(range.last)
         
     | 
| 
       628 
630 
     | 
    
         
             
                    end
         
     | 
| 
       629 
631 
     | 
    
         | 
| 
       630 
632 
     | 
    
         
             
                    # @api private
         
     | 
| 
         @@ -697,7 +699,7 @@ module DataMapper 
     | 
|
| 
       697 
699 
     | 
    
         
             
                    # @api private
         
     | 
| 
       698 
700 
     | 
    
         
             
                    def dump
         
     | 
| 
       699 
701 
     | 
    
         
             
                      loaded_value = self.loaded_value
         
     | 
| 
       700 
     | 
    
         
            -
                      if subject.respond_to?(: 
     | 
| 
      
 702 
     | 
    
         
            +
                      if subject.respond_to?(:dump) && loaded_value.respond_to?(:map) && !loaded_value.kind_of?(Range)
         
     | 
| 
       701 
703 
     | 
    
         
             
                        dumped_value = loaded_value.map { |value| dump_property(value) }
         
     | 
| 
       702 
704 
     | 
    
         
             
                        dumped_value.uniq!
         
     | 
| 
       703 
705 
     | 
    
         
             
                        dumped_value
         
     | 
| 
         @@ -66,7 +66,7 @@ module DataMapper 
     | 
|
| 
       66 
66 
     | 
    
         
             
                  end # class Operation
         
     | 
| 
       67 
67 
     | 
    
         | 
| 
       68 
68 
     | 
    
         
             
                  class AbstractOperation
         
     | 
| 
       69 
     | 
    
         
            -
                    include  
     | 
| 
      
 69 
     | 
    
         
            +
                    include DataMapper::Assertions
         
     | 
| 
       70 
70 
     | 
    
         
             
                    include Enumerable
         
     | 
| 
       71 
71 
     | 
    
         
             
                    extend Equalizer
         
     | 
| 
       72 
72 
     | 
    
         | 
| 
         @@ -132,6 +132,17 @@ module DataMapper 
     | 
|
| 
       132 
132 
     | 
    
         
             
                      self.class.slug
         
     | 
| 
       133 
133 
     | 
    
         
             
                    end
         
     | 
| 
       134 
134 
     | 
    
         | 
| 
      
 135 
     | 
    
         
            +
                    # Get the first operand
         
     | 
| 
      
 136 
     | 
    
         
            +
                    #
         
     | 
| 
      
 137 
     | 
    
         
            +
                    # @return [AbstractOperation, AbstractComparison, Array]
         
     | 
| 
      
 138 
     | 
    
         
            +
                    #   returns the first operand
         
     | 
| 
      
 139 
     | 
    
         
            +
                    #
         
     | 
| 
      
 140 
     | 
    
         
            +
                    # @api semipublic
         
     | 
| 
      
 141 
     | 
    
         
            +
                    def first
         
     | 
| 
      
 142 
     | 
    
         
            +
                      each { |operand| return operand }
         
     | 
| 
      
 143 
     | 
    
         
            +
                      nil
         
     | 
| 
      
 144 
     | 
    
         
            +
                    end
         
     | 
| 
      
 145 
     | 
    
         
            +
             
     | 
| 
       135 
146 
     | 
    
         
             
                    # Iterate through each operand in the operation
         
     | 
| 
       136 
147 
     | 
    
         
             
                    #
         
     | 
| 
       137 
148 
     | 
    
         
             
                    # @yield [operand]
         
     | 
| 
         @@ -149,6 +160,26 @@ module DataMapper 
     | 
|
| 
       149 
160 
     | 
    
         
             
                      self
         
     | 
| 
       150 
161 
     | 
    
         
             
                    end
         
     | 
| 
       151 
162 
     | 
    
         | 
| 
      
 163 
     | 
    
         
            +
                    # Test to see if there are operands
         
     | 
| 
      
 164 
     | 
    
         
            +
                    #
         
     | 
| 
      
 165 
     | 
    
         
            +
                    # @return [Boolean]
         
     | 
| 
      
 166 
     | 
    
         
            +
                    #   returns true if there are operands
         
     | 
| 
      
 167 
     | 
    
         
            +
                    #
         
     | 
| 
      
 168 
     | 
    
         
            +
                    # @api semipublic
         
     | 
| 
      
 169 
     | 
    
         
            +
                    def empty?
         
     | 
| 
      
 170 
     | 
    
         
            +
                      @operands.empty?
         
     | 
| 
      
 171 
     | 
    
         
            +
                    end
         
     | 
| 
      
 172 
     | 
    
         
            +
             
     | 
| 
      
 173 
     | 
    
         
            +
                    # Test to see if there is one operand
         
     | 
| 
      
 174 
     | 
    
         
            +
                    #
         
     | 
| 
      
 175 
     | 
    
         
            +
                    # @return [Boolean]
         
     | 
| 
      
 176 
     | 
    
         
            +
                    #   true if there is only one operand
         
     | 
| 
      
 177 
     | 
    
         
            +
                    #
         
     | 
| 
      
 178 
     | 
    
         
            +
                    # @api semipublic
         
     | 
| 
      
 179 
     | 
    
         
            +
                    def one?
         
     | 
| 
      
 180 
     | 
    
         
            +
                      @operands.size == 1
         
     | 
| 
      
 181 
     | 
    
         
            +
                    end
         
     | 
| 
      
 182 
     | 
    
         
            +
             
     | 
| 
       152 
183 
     | 
    
         
             
                    # Test if the operation is valid
         
     | 
| 
       153 
184 
     | 
    
         
             
                    #
         
     | 
| 
       154 
185 
     | 
    
         
             
                    # @return [Boolean]
         
     | 
| 
         @@ -359,7 +390,7 @@ module DataMapper 
     | 
|
| 
       359 
390 
     | 
    
         
             
                    # @return [AbstractOperation, AbstractComparison, Array]
         
     | 
| 
       360 
391 
     | 
    
         
             
                    #   the operand that was related to self
         
     | 
| 
       361 
392 
     | 
    
         
             
                    #
         
     | 
| 
       362 
     | 
    
         
            -
                    # @api  
     | 
| 
      
 393 
     | 
    
         
            +
                    # @api private
         
     | 
| 
       363 
394 
     | 
    
         
             
                    def relate_operand(operand)
         
     | 
| 
       364 
395 
     | 
    
         
             
                      operand.parent = self if operand.respond_to?(:parent=)
         
     | 
| 
       365 
396 
     | 
    
         
             
                      operand
         
     | 
| 
         @@ -8,7 +8,7 @@ 
     | 
|
| 
       8 
8 
     | 
    
         
             
            module DataMapper
         
     | 
| 
       9 
9 
     | 
    
         
             
              class Query
         
     | 
| 
       10 
10 
     | 
    
         
             
                class Operator
         
     | 
| 
       11 
     | 
    
         
            -
                  include  
     | 
| 
      
 11 
     | 
    
         
            +
                  include DataMapper::Assertions
         
     | 
| 
       12 
12 
     | 
    
         
             
                  extend Equalizer
         
     | 
| 
       13 
13 
     | 
    
         | 
| 
       14 
14 
     | 
    
         
             
                  equalize :target, :operator
         
     | 
| 
         @@ -28,10 +28,7 @@ module DataMapper 
     | 
|
| 
       28 
28 
     | 
    
         | 
| 
       29 
29 
     | 
    
         
             
                  # @api private
         
     | 
| 
       30 
30 
     | 
    
         
             
                  def initialize(target, operator)
         
     | 
| 
       31 
     | 
    
         
            -
                     
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
                    @target   = target
         
     | 
| 
       34 
     | 
    
         
            -
                    @operator = operator
         
     | 
| 
      
 31 
     | 
    
         
            +
                    @target, @operator = target, operator.to_sym
         
     | 
| 
       35 
32 
     | 
    
         
             
                  end
         
     | 
| 
       36 
33 
     | 
    
         
             
                end # class Operator
         
     | 
| 
       37 
34 
     | 
    
         
             
              end # class Query
         
     |