mongomodel 0.5.5 → 0.5.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (156) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +23 -11
  3. data/gemfiles/rails-3.2.gemfile +2 -2
  4. data/gemfiles/rails-4-observers.gemfile +1 -1
  5. data/gemfiles/rails-4.1.gemfile +2 -2
  6. data/gemfiles/{mongoid.gemfile → rails-4.2.gemfile} +2 -3
  7. data/gemfiles/{mongo_mapper.gemfile → rails-5.0.gemfile} +2 -3
  8. data/gemfiles/rails-5.1.gemfile +10 -0
  9. data/gemfiles/rails-5.2.gemfile +10 -0
  10. data/lib/mongomodel.rb +15 -15
  11. data/lib/mongomodel/attributes/mongo.rb +7 -7
  12. data/lib/mongomodel/attributes/store.rb +4 -4
  13. data/lib/mongomodel/attributes/typecasting.rb +7 -7
  14. data/lib/mongomodel/compatibility/mongo_mapper.rb +3 -3
  15. data/lib/mongomodel/compatibility/mongoid.rb +3 -3
  16. data/lib/mongomodel/concerns/abstract_class.rb +3 -3
  17. data/lib/mongomodel/concerns/activemodel.rb +4 -4
  18. data/lib/mongomodel/concerns/associations.rb +8 -8
  19. data/lib/mongomodel/concerns/associations/base/association.rb +5 -5
  20. data/lib/mongomodel/concerns/associations/base/definition.rb +4 -4
  21. data/lib/mongomodel/concerns/associations/base/proxy.rb +1 -1
  22. data/lib/mongomodel/concerns/associations/belongs_to.rb +19 -19
  23. data/lib/mongomodel/concerns/associations/has_many_by_foreign_key.rb +36 -36
  24. data/lib/mongomodel/concerns/associations/has_many_by_ids.rb +34 -34
  25. data/lib/mongomodel/concerns/attribute_methods.rb +10 -10
  26. data/lib/mongomodel/concerns/attribute_methods/before_type_cast.rb +4 -4
  27. data/lib/mongomodel/concerns/attribute_methods/dirty.rb +95 -13
  28. data/lib/mongomodel/concerns/attribute_methods/forbidden.rb +1 -1
  29. data/lib/mongomodel/concerns/attribute_methods/multi_parameter_assignment.rb +6 -6
  30. data/lib/mongomodel/concerns/attribute_methods/nested.rb +18 -18
  31. data/lib/mongomodel/concerns/attribute_methods/protected.rb +3 -3
  32. data/lib/mongomodel/concerns/attribute_methods/query.rb +3 -3
  33. data/lib/mongomodel/concerns/attribute_methods/read.rb +4 -4
  34. data/lib/mongomodel/concerns/attribute_methods/write.rb +4 -4
  35. data/lib/mongomodel/concerns/attributes.rb +18 -18
  36. data/lib/mongomodel/concerns/callbacks.rb +7 -7
  37. data/lib/mongomodel/concerns/document_parent.rb +2 -2
  38. data/lib/mongomodel/concerns/logging.rb +2 -2
  39. data/lib/mongomodel/concerns/map_reduce.rb +11 -11
  40. data/lib/mongomodel/concerns/pretty_inspect.rb +3 -3
  41. data/lib/mongomodel/concerns/properties.rb +18 -18
  42. data/lib/mongomodel/concerns/record_status.rb +9 -13
  43. data/lib/mongomodel/concerns/serialization.rb +4 -4
  44. data/lib/mongomodel/concerns/timestamps.rb +4 -4
  45. data/lib/mongomodel/concerns/translation.rb +2 -2
  46. data/lib/mongomodel/concerns/validations.rb +5 -5
  47. data/lib/mongomodel/concerns/validations/associated.rb +1 -1
  48. data/lib/mongomodel/document.rb +6 -6
  49. data/lib/mongomodel/document/callbacks.rb +15 -21
  50. data/lib/mongomodel/document/collection_modifiers.rb +5 -5
  51. data/lib/mongomodel/document/dynamic_finders.rb +1 -1
  52. data/lib/mongomodel/document/indexes.rb +19 -19
  53. data/lib/mongomodel/document/optimistic_locking.rb +7 -7
  54. data/lib/mongomodel/document/persistence.rb +23 -23
  55. data/lib/mongomodel/document/scopes.rb +20 -20
  56. data/lib/mongomodel/document/validations.rb +6 -6
  57. data/lib/mongomodel/document/validations/uniqueness.rb +11 -11
  58. data/lib/mongomodel/embedded_document.rb +11 -11
  59. data/lib/mongomodel/locale/en.yml +0 -1
  60. data/lib/mongomodel/log_subscriber.rb +5 -5
  61. data/lib/mongomodel/railtie.rb +13 -13
  62. data/lib/mongomodel/support/collection.rb +31 -31
  63. data/lib/mongomodel/support/configuration.rb +11 -11
  64. data/lib/mongomodel/support/core_extensions.rb +1 -1
  65. data/lib/mongomodel/support/dynamic_finder.rb +12 -12
  66. data/lib/mongomodel/support/exceptions.rb +6 -6
  67. data/lib/mongomodel/support/instrumented_collection.rb +20 -20
  68. data/lib/mongomodel/support/map.rb +33 -33
  69. data/lib/mongomodel/support/mongo_operator.rb +6 -6
  70. data/lib/mongomodel/support/mongo_options.rb +18 -18
  71. data/lib/mongomodel/support/mongo_order.rb +16 -16
  72. data/lib/mongomodel/support/paginator.rb +8 -8
  73. data/lib/mongomodel/support/reference.rb +10 -10
  74. data/lib/mongomodel/support/scope.rb +37 -37
  75. data/lib/mongomodel/support/scope/array_methods.rb +1 -1
  76. data/lib/mongomodel/support/scope/batches.rb +1 -1
  77. data/lib/mongomodel/support/scope/dynamic_finders.rb +1 -1
  78. data/lib/mongomodel/support/scope/finder_methods.rb +7 -7
  79. data/lib/mongomodel/support/scope/load_methods.rb +1 -1
  80. data/lib/mongomodel/support/scope/pagination.rb +1 -1
  81. data/lib/mongomodel/support/scope/query_methods.rb +6 -6
  82. data/lib/mongomodel/support/scope/spawn_methods.rb +8 -8
  83. data/lib/mongomodel/support/types.rb +2 -2
  84. data/lib/mongomodel/support/types/array.rb +1 -1
  85. data/lib/mongomodel/support/types/boolean.rb +3 -3
  86. data/lib/mongomodel/support/types/custom.rb +3 -3
  87. data/lib/mongomodel/support/types/date.rb +2 -2
  88. data/lib/mongomodel/support/types/date_time.rb +6 -16
  89. data/lib/mongomodel/support/types/float.rb +1 -1
  90. data/lib/mongomodel/support/types/hash.rb +1 -1
  91. data/lib/mongomodel/support/types/integer.rb +13 -10
  92. data/lib/mongomodel/support/types/object.rb +5 -5
  93. data/lib/mongomodel/support/types/rational.rb +3 -3
  94. data/lib/mongomodel/support/types/time.rb +2 -2
  95. data/lib/mongomodel/version.rb +1 -1
  96. data/lib/rails/generators/mongo_model/config/templates/mongomodel.yml +3 -4
  97. data/lib/rails/generators/mongo_model/model/model_generator.rb +3 -3
  98. data/mongomodel.gemspec +5 -4
  99. data/spec/mongomodel/attributes/store_spec.rb +21 -21
  100. data/spec/mongomodel/concerns/activemodel_spec.rb +4 -4
  101. data/spec/mongomodel/concerns/associations/base/association_spec.rb +12 -12
  102. data/spec/mongomodel/concerns/associations/belongs_to_spec.rb +34 -21
  103. data/spec/mongomodel/concerns/associations/has_many_by_foreign_key_spec.rb +53 -53
  104. data/spec/mongomodel/concerns/associations/has_many_by_ids_spec.rb +30 -30
  105. data/spec/mongomodel/concerns/attribute_methods/before_type_cast_spec.rb +7 -7
  106. data/spec/mongomodel/concerns/attribute_methods/dirty_spec.rb +45 -41
  107. data/spec/mongomodel/concerns/attribute_methods/multi_parameter_assignment_spec.rb +7 -7
  108. data/spec/mongomodel/concerns/attribute_methods/nested_spec.rb +31 -31
  109. data/spec/mongomodel/concerns/attribute_methods/protected_spec.rb +15 -15
  110. data/spec/mongomodel/concerns/attribute_methods/query_spec.rb +19 -19
  111. data/spec/mongomodel/concerns/attribute_methods/read_spec.rb +9 -9
  112. data/spec/mongomodel/concerns/attribute_methods/write_spec.rb +6 -6
  113. data/spec/mongomodel/concerns/attribute_methods_spec.rb +13 -13
  114. data/spec/mongomodel/concerns/attributes_spec.rb +34 -34
  115. data/spec/mongomodel/concerns/callbacks_spec.rb +25 -21
  116. data/spec/mongomodel/concerns/logging_spec.rb +5 -3
  117. data/spec/mongomodel/concerns/map_reduce_spec.rb +19 -19
  118. data/spec/mongomodel/concerns/observing_spec.rb +3 -3
  119. data/spec/mongomodel/concerns/pretty_inspect_spec.rb +10 -10
  120. data/spec/mongomodel/concerns/properties_spec.rb +11 -11
  121. data/spec/mongomodel/concerns/serialization/json_serialization_spec.rb +13 -13
  122. data/spec/mongomodel/concerns/timestamps_spec.rb +39 -39
  123. data/spec/mongomodel/concerns/validations_spec.rb +41 -38
  124. data/spec/mongomodel/document/callbacks_spec.rb +20 -16
  125. data/spec/mongomodel/document/collection_modifiers_spec.rb +16 -16
  126. data/spec/mongomodel/document/dynamic_finders_spec.rb +46 -46
  127. data/spec/mongomodel/document/finders_spec.rb +15 -15
  128. data/spec/mongomodel/document/indexes_spec.rb +29 -29
  129. data/spec/mongomodel/document/optimistic_locking_spec.rb +16 -16
  130. data/spec/mongomodel/document/persistence_spec.rb +39 -39
  131. data/spec/mongomodel/document/scopes_spec.rb +17 -17
  132. data/spec/mongomodel/document/validations/uniqueness_spec.rb +46 -46
  133. data/spec/mongomodel/document/validations_spec.rb +35 -35
  134. data/spec/mongomodel/document_spec.rb +19 -19
  135. data/spec/mongomodel/embedded_document_spec.rb +19 -19
  136. data/spec/mongomodel/mongomodel_spec.rb +7 -6
  137. data/spec/mongomodel/support/collection_spec.rb +54 -54
  138. data/spec/mongomodel/support/configuration_spec.rb +1 -1
  139. data/spec/mongomodel/support/map_spec.rb +66 -66
  140. data/spec/mongomodel/support/mongo_operator_spec.rb +5 -5
  141. data/spec/mongomodel/support/mongo_options_spec.rb +42 -42
  142. data/spec/mongomodel/support/mongo_order_spec.rb +24 -24
  143. data/spec/mongomodel/support/paginator_spec.rb +15 -15
  144. data/spec/mongomodel/support/property_spec.rb +29 -23
  145. data/spec/mongomodel/support/scope_spec.rb +205 -204
  146. data/spec/spec_helper.rb +13 -2
  147. data/spec/support/callbacks.rb +3 -8
  148. data/spec/support/helpers/define_class.rb +7 -7
  149. data/spec/support/helpers/document_finder_stubs.rb +6 -6
  150. data/spec/support/helpers/specs_for.rb +1 -1
  151. data/spec/support/helpers/validations.rb +1 -1
  152. data/spec/support/matchers/find_with.rb +8 -8
  153. data/spec/support/matchers/respond_to_boolean.rb +3 -3
  154. data/spec/support/matchers/run_callbacks.rb +6 -9
  155. data/spec/support/models.rb +5 -5
  156. metadata +23 -7
@@ -16,42 +16,42 @@ module MongoModel
16
16
  def initialize(options)
17
17
  @options = DEFAULTS.merge(options).stringify_keys
18
18
  end
19
-
19
+
20
20
  def host
21
21
  options['host']
22
22
  end
23
-
23
+
24
24
  def port
25
25
  options['port']
26
26
  end
27
-
27
+
28
28
  def database
29
29
  options['database']
30
30
  end
31
-
31
+
32
32
  def username
33
33
  options['username']
34
34
  end
35
-
35
+
36
36
  def password
37
37
  options['password']
38
38
  end
39
-
39
+
40
40
  def replicas
41
41
  options['replicas'] || []
42
42
  end
43
-
43
+
44
44
  def establish_connection
45
45
  @database = connection.db(database)
46
46
  @database.authenticate(username, password) if username.present?
47
47
  @database
48
48
  end
49
-
49
+
50
50
  def use_database(database)
51
51
  options['database'] = database
52
52
  establish_connection
53
53
  end
54
-
54
+
55
55
  def connection
56
56
  if replicas.any?
57
57
  @connection ||= Mongo::MongoReplicaSetClient.new(replicas, connection_options)
@@ -59,11 +59,11 @@ module MongoModel
59
59
  @connection ||= Mongo::MongoClient.new(host, port, connection_options)
60
60
  end
61
61
  end
62
-
62
+
63
63
  def connection_options
64
64
  options.except('host', 'port', 'database', 'username', 'password', 'replicas').symbolize_keys
65
65
  end
66
-
66
+
67
67
  def self.defaults
68
68
  new({})
69
69
  end
@@ -4,7 +4,7 @@ class Symbol
4
4
  [:lt, :lte, :gt, :gte, :ne, :in, :nin, :mod, :all, :size, :exists, :near].each do |operator|
5
5
  define_method(operator) { MongoModel::MongoOperator.new(self, operator) } unless method_defined?(operator)
6
6
  end
7
-
7
+
8
8
  define_method(:asc) { MongoModel::MongoOrder::Clause.new(self, :ascending) } unless method_defined?(:asc)
9
9
  define_method(:desc) { MongoModel::MongoOrder::Clause.new(self, :descending) } unless method_defined?(:desc)
10
10
  end
@@ -3,13 +3,13 @@ module MongoModel
3
3
  def initialize(scope, attribute_names, finder=:first, bang=false)
4
4
  @scope, @attribute_names, @finder, @bang = scope, attribute_names, finder, bang
5
5
  end
6
-
6
+
7
7
  def execute(*args)
8
8
  options = args.extract_options!
9
9
  conditions = build_conditions(args)
10
-
10
+
11
11
  result = @scope.where(conditions).send(instantiator? ? :first : @finder)
12
-
12
+
13
13
  if result.nil?
14
14
  if bang?
15
15
  raise DocumentNotFound, "Couldn't find #{@scope.klass.to_s} with #{conditions.inspect}"
@@ -17,22 +17,22 @@ module MongoModel
17
17
  return @scope.send(@finder, conditions)
18
18
  end
19
19
  end
20
-
20
+
21
21
  result
22
22
  end
23
-
23
+
24
24
  def bang?
25
25
  @bang
26
26
  end
27
-
27
+
28
28
  def instantiator?
29
29
  @finder == :new || @finder == :create
30
30
  end
31
-
31
+
32
32
  def self.match(scope, method)
33
33
  finder = :first
34
34
  bang = false
35
-
35
+
36
36
  case method.to_s
37
37
  when /^find_(all_by|last_by|by)_([_a-zA-Z]\w*)$/
38
38
  finder = :last if $1 == 'last_by'
@@ -47,21 +47,21 @@ module MongoModel
47
47
  else
48
48
  return nil
49
49
  end
50
-
50
+
51
51
  names = names.split('_and_')
52
52
  if names.all? { |n| scope.klass.properties.include?(n.to_sym) }
53
53
  new(scope, names, finder, bang)
54
54
  end
55
55
  end
56
-
56
+
57
57
  private
58
58
  def build_conditions(args)
59
59
  result = {}
60
-
60
+
61
61
  @attribute_names.zip(args) do |attribute, value|
62
62
  result[attribute.to_sym] = value
63
63
  end
64
-
64
+
65
65
  result
66
66
  end
67
67
  end
@@ -1,8 +1,8 @@
1
1
  module MongoModel
2
2
  class DocumentNotFound < StandardError; end
3
-
3
+
4
4
  class DocumentNotSaved < StandardError; end
5
-
5
+
6
6
  # Raised by <tt>save!</tt> and <tt>create!</tt> when the document is invalid. Use the
7
7
  # +document+ method to retrieve the document which did not validate.
8
8
  # begin
@@ -12,16 +12,16 @@ module MongoModel
12
12
  # end
13
13
  class DocumentInvalid < DocumentNotSaved
14
14
  attr_reader :document
15
-
15
+
16
16
  def initialize(document)
17
17
  @document = document
18
-
18
+
19
19
  errors = @document.errors.full_messages.join(I18n.t('support.array.words_connector', :default => ', '))
20
20
  super(I18n.t('mongomodel.errors.messages.document_invalid', :errors => errors))
21
21
  end
22
22
  end
23
-
23
+
24
24
  class AssociationTypeMismatch < StandardError; end
25
-
25
+
26
26
  class TooManyDocuments < StandardError; end
27
27
  end
@@ -6,46 +6,46 @@
6
6
  module MongoModel
7
7
  class InstrumentedCursor
8
8
  attr_reader :cursor
9
-
9
+
10
10
  def initialize(cursor)
11
11
  @cursor = cursor
12
12
  end
13
-
13
+
14
14
  def to_a
15
15
  instrument(query_description) do
16
16
  cursor.to_a
17
17
  end
18
18
  end
19
-
19
+
20
20
  def count
21
21
  instrument("count(#{cursor.selector.inspect})") do
22
22
  cursor.count
23
23
  end
24
24
  end
25
-
25
+
26
26
  private
27
27
  def method_missing(method, *args, &block)
28
28
  cursor.send(method, *args, &block)
29
29
  end
30
-
30
+
31
31
  def query_description
32
32
  "find(#{cursor.selector.inspect}, #{cursor.fields ? cursor.fields.inspect : '{}'})" +
33
33
  "#{cursor.skip != 0 ? ('.skip(' + cursor.skip.to_s + ')') : ''}#{cursor.limit != 0 ? ('.limit(' + cursor.limit.to_s + ')') : ''}" +
34
34
  "#{cursor.order ? ('.sort(' + cursor.order.inspect + ')') : ''}"
35
35
  end
36
-
36
+
37
37
  def instrument(query, &block)
38
38
  ActiveSupport::Notifications.instrument("query.mongomodel", :collection => cursor.collection.name, :query => query, &block)
39
39
  end
40
40
  end
41
-
41
+
42
42
  class InstrumentedCollection
43
43
  attr_reader :collection
44
-
44
+
45
45
  def initialize(collection)
46
46
  @collection = collection
47
47
  end
48
-
48
+
49
49
  def ==(other)
50
50
  case other
51
51
  when self.class
@@ -54,10 +54,10 @@ module MongoModel
54
54
  collection == other
55
55
  end
56
56
  end
57
-
57
+
58
58
  def find(selector={}, options={})
59
59
  cursor = InstrumentedCursor.new(collection.find(selector, options))
60
-
60
+
61
61
  if block_given?
62
62
  yield cursor
63
63
  cursor.close
@@ -66,7 +66,7 @@ module MongoModel
66
66
  cursor
67
67
  end
68
68
  end
69
-
69
+
70
70
  def save(doc, options={})
71
71
  if doc.has_key?(:_id) || doc.has_key?('_id')
72
72
  selector = { '_id' => doc[:_id] || doc['_id'] }
@@ -79,48 +79,48 @@ module MongoModel
79
79
  end
80
80
  end
81
81
  end
82
-
82
+
83
83
  def remove(selector={}, options={})
84
84
  instrument("remove(#{selector.inspect})") do
85
85
  collection.remove(selector, options)
86
86
  end
87
87
  end
88
-
88
+
89
89
  def update(selector, document, options={})
90
90
  instrument("update(#{selector.inspect}, #{document.inspect})") do
91
91
  collection.update(selector, document, options)
92
92
  end
93
93
  end
94
-
94
+
95
95
  def create_index(spec, options={})
96
96
  instrument("create_index(#{spec.inspect})") do
97
97
  collection.create_index(spec, options)
98
98
  end
99
99
  end
100
-
100
+
101
101
  def group(options, condition={}, initial={}, reduce=nil, finalize=nil)
102
102
  instrument("group(#{options.inspect})") do
103
103
  collection.group(options, condition, initial, reduce, finalize)
104
104
  end
105
105
  end
106
-
106
+
107
107
  def distinct(key, query=nil)
108
108
  instrument("distinct(#{key.inspect}#{query.present? ? ', ' + query.inspect : ''})") do
109
109
  collection.distinct(key, query)
110
110
  end
111
111
  end
112
-
112
+
113
113
  def map_reduce(map, reduce, options={})
114
114
  instrument("map_reduce(#{options.inspect})") do
115
115
  collection.map_reduce(map, reduce, options)
116
116
  end
117
117
  end
118
-
118
+
119
119
  private
120
120
  def method_missing(method, *args, &block)
121
121
  collection.send(method, *args, &block)
122
122
  end
123
-
123
+
124
124
  def instrument(query, &block)
125
125
  ActiveSupport::Notifications.instrument("query.mongomodel", :collection => collection.name, :query => query, &block)
126
126
  end
@@ -5,30 +5,30 @@ module MongoModel
5
5
  module PropertyDefaults
6
6
  def property(name, *args, &block) #:nodoc:
7
7
  property = super(name, *args, &block)
8
-
8
+
9
9
  if property.type <= Map
10
10
  property.options[:default] ||= lambda { property.type.new }
11
11
  end
12
-
12
+
13
13
  property
14
14
  end
15
15
  end
16
-
16
+
17
17
  class_attribute :from
18
18
  self.from = String
19
-
19
+
20
20
  class_attribute :to
21
21
  self.to = Object
22
-
22
+
23
23
  HASH_CONVERTER = Types.converter_for(Hash)
24
-
24
+
25
25
  class << self
26
26
  def [](mapping)
27
27
  raise "Exactly one mapping must be specified" unless mapping.keys.size == 1
28
-
28
+
29
29
  from = mapping.keys.first
30
30
  to = mapping.values.first
31
-
31
+
32
32
  @map_class_cache ||= {}
33
33
  @map_class_cache[[from, to]] ||= begin
34
34
  map = Class.new(Map)
@@ -37,13 +37,13 @@ module MongoModel
37
37
  map
38
38
  end
39
39
  end
40
-
40
+
41
41
  def from_mongo(hash)
42
42
  result = new
43
43
  hash.each_pair { |k, v| result[from_converter.from_mongo(k)] = instantiate(v) }
44
44
  result
45
45
  end
46
-
46
+
47
47
  def inspect
48
48
  if self == Map
49
49
  "Map"
@@ -51,15 +51,15 @@ module MongoModel
51
51
  "Map[#{from} => #{to}]"
52
52
  end
53
53
  end
54
-
54
+
55
55
  def from_converter
56
56
  @from_converter ||= Types.converter_for(from)
57
57
  end
58
-
58
+
59
59
  def to_converter
60
60
  @to_converter ||= Types.converter_for(to)
61
61
  end
62
-
62
+
63
63
  private
64
64
  def instantiate(item)
65
65
  if item.is_a?(Hash) && item['_type']
@@ -69,85 +69,85 @@ module MongoModel
69
69
  end
70
70
  end
71
71
  end
72
-
72
+
73
73
  def initialize(hash={})
74
74
  super()
75
75
  update(hash)
76
76
  end
77
-
77
+
78
78
  def to_mongo
79
79
  HASH_CONVERTER.to_mongo(self)
80
80
  end
81
-
81
+
82
82
  def [](key)
83
83
  super(convert_key(key))
84
84
  end
85
-
85
+
86
86
  def []=(key, value)
87
87
  super(convert_key(key), convert_value(value))
88
88
  end
89
-
89
+
90
90
  def store(key, value)
91
91
  super(convert_key(key), convert_value(value))
92
92
  end
93
-
93
+
94
94
  def delete(key)
95
95
  super(convert_key(key))
96
96
  end
97
-
97
+
98
98
  def fetch(key, *args, &block)
99
99
  super(convert_key(key), *args, &block)
100
100
  end
101
-
101
+
102
102
  def key?(key)
103
103
  super(convert_key(key))
104
104
  end
105
-
105
+
106
106
  alias_method :include?, :key?
107
107
  alias_method :has_key?, :key?
108
108
  alias_method :member?, :key?
109
-
109
+
110
110
  def value?(value)
111
111
  super(convert_value(value))
112
112
  end
113
-
113
+
114
114
  alias_method :has_value?, :value?
115
-
115
+
116
116
  def index(value)
117
117
  super(convert_value(value))
118
118
  end
119
-
119
+
120
120
  def key(value)
121
121
  super(convert_value(value))
122
122
  end
123
-
123
+
124
124
  def update(hash)
125
125
  hash.each_pair { |k, v| self[k] = v }
126
126
  self
127
127
  end
128
-
128
+
129
129
  def replace(hash)
130
130
  clear
131
131
  update(hash)
132
132
  end
133
-
133
+
134
134
  def merge(hash)
135
135
  dup.update(super(hash))
136
136
  end
137
-
137
+
138
138
  def merge!(hash)
139
139
  update(merge(hash))
140
140
  end
141
-
141
+
142
142
  def values_at(*keys)
143
143
  super(*keys.map { |k| convert_key(k) })
144
144
  end
145
-
145
+
146
146
  private
147
147
  def convert_key(key)
148
148
  self.class.from_converter.cast(key)
149
149
  end
150
-
150
+
151
151
  def convert_value(value)
152
152
  self.class.to_converter.cast(value)
153
153
  end