mongoid 5.4.1 → 6.0.0.beta

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.
Files changed (264) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/lib/config/locales/en.yml +23 -16
  5. data/lib/mongoid.rb +4 -9
  6. data/lib/mongoid/atomic.rb +1 -1
  7. data/lib/mongoid/atomic/modifiers.rb +8 -12
  8. data/lib/mongoid/attributes.rb +9 -11
  9. data/lib/mongoid/attributes/dynamic.rb +5 -6
  10. data/lib/mongoid/attributes/nested.rb +1 -1
  11. data/lib/mongoid/attributes/processing.rb +4 -0
  12. data/lib/mongoid/attributes/readonly.rb +22 -0
  13. data/lib/mongoid/cacheable.rb +36 -0
  14. data/lib/mongoid/changeable.rb +37 -1
  15. data/lib/mongoid/clients.rb +0 -63
  16. data/lib/mongoid/clients/factory.rb +0 -2
  17. data/lib/mongoid/clients/options.rb +54 -249
  18. data/lib/mongoid/clients/storage_options.rb +1 -69
  19. data/lib/mongoid/composable.rb +26 -2
  20. data/lib/mongoid/config.rb +1 -1
  21. data/lib/mongoid/config/options.rb +1 -1
  22. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -0
  23. data/lib/mongoid/contextual/atomic.rb +6 -9
  24. data/lib/mongoid/contextual/geo_near.rb +2 -3
  25. data/lib/mongoid/contextual/map_reduce.rb +97 -24
  26. data/lib/mongoid/contextual/memory.rb +7 -4
  27. data/lib/mongoid/contextual/mongo.rb +63 -54
  28. data/lib/mongoid/contextual/none.rb +2 -2
  29. data/lib/mongoid/copyable.rb +19 -19
  30. data/lib/mongoid/criteria.rb +5 -4
  31. data/lib/mongoid/criteria/findable.rb +2 -3
  32. data/lib/mongoid/criteria/includable.rb +63 -16
  33. data/lib/mongoid/criteria/marshalable.rb +2 -2
  34. data/lib/mongoid/criteria/modifiable.rb +17 -1
  35. data/lib/mongoid/criteria/options.rb +25 -0
  36. data/lib/mongoid/criteria/queryable.rb +86 -0
  37. data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
  38. data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
  39. data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
  40. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
  41. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
  42. data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
  43. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
  44. data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
  45. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
  46. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
  47. data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
  48. data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
  49. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +45 -0
  50. data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
  51. data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
  52. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
  53. data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
  54. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
  55. data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
  56. data/lib/mongoid/criteria/queryable/key.rb +103 -0
  57. data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
  58. data/lib/mongoid/criteria/queryable/mergeable.rb +271 -0
  59. data/lib/mongoid/criteria/queryable/optional.rb +411 -0
  60. data/lib/mongoid/criteria/queryable/options.rb +136 -0
  61. data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
  62. data/lib/mongoid/criteria/queryable/selectable.rb +662 -0
  63. data/lib/mongoid/criteria/queryable/selector.rb +196 -0
  64. data/lib/mongoid/criteria/queryable/smash.rb +103 -0
  65. data/lib/mongoid/document.rb +9 -23
  66. data/lib/mongoid/errors.rb +2 -1
  67. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
  68. data/lib/mongoid/errors/delete_restriction.rb +2 -2
  69. data/lib/mongoid/errors/invalid_field.rb +2 -2
  70. data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
  71. data/lib/mongoid/errors/invalid_relation.rb +66 -0
  72. data/lib/mongoid/errors/inverse_not_found.rb +1 -1
  73. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  74. data/lib/mongoid/evolvable.rb +1 -1
  75. data/lib/mongoid/extensions.rb +0 -5
  76. data/lib/mongoid/extensions/big_decimal.rb +17 -8
  77. data/lib/mongoid/extensions/date.rb +4 -1
  78. data/lib/mongoid/extensions/hash.rb +2 -3
  79. data/lib/mongoid/extensions/object.rb +2 -2
  80. data/lib/mongoid/extensions/string.rb +4 -3
  81. data/lib/mongoid/extensions/time.rb +5 -2
  82. data/lib/mongoid/factory.rb +1 -0
  83. data/lib/mongoid/fields/foreign_key.rb +2 -2
  84. data/lib/mongoid/fields/localized.rb +3 -8
  85. data/lib/mongoid/fields/validators/macro.rb +18 -0
  86. data/lib/mongoid/findable.rb +3 -3
  87. data/lib/mongoid/indexable.rb +17 -16
  88. data/lib/mongoid/indexable/specification.rb +1 -1
  89. data/lib/mongoid/indexable/validators/options.rb +1 -2
  90. data/lib/mongoid/interceptable.rb +6 -17
  91. data/lib/mongoid/loggable.rb +1 -1
  92. data/lib/mongoid/matchable.rb +3 -10
  93. data/lib/mongoid/matchable/gt.rb +2 -0
  94. data/lib/mongoid/matchable/gte.rb +2 -0
  95. data/lib/mongoid/matchable/lt.rb +2 -0
  96. data/lib/mongoid/matchable/lte.rb +2 -0
  97. data/lib/mongoid/persistable.rb +6 -5
  98. data/lib/mongoid/persistable/creatable.rb +2 -0
  99. data/lib/mongoid/persistable/deletable.rb +7 -3
  100. data/lib/mongoid/persistable/settable.rb +3 -16
  101. data/lib/mongoid/persistable/updatable.rb +10 -12
  102. data/lib/mongoid/persistence_context.rb +216 -0
  103. data/lib/mongoid/query_cache.rb +5 -30
  104. data/lib/mongoid/relations/accessors.rb +6 -2
  105. data/lib/mongoid/relations/auto_save.rb +12 -4
  106. data/lib/mongoid/relations/bindings/embedded/in.rb +4 -0
  107. data/lib/mongoid/relations/bindings/embedded/many.rb +8 -1
  108. data/lib/mongoid/relations/bindings/embedded/one.rb +10 -0
  109. data/lib/mongoid/relations/bindings/referenced/many.rb +4 -0
  110. data/lib/mongoid/relations/builders.rb +2 -2
  111. data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
  112. data/lib/mongoid/relations/builders/nested_attributes/many.rb +1 -1
  113. data/lib/mongoid/relations/conversions.rb +1 -1
  114. data/lib/mongoid/relations/counter_cache.rb +28 -18
  115. data/lib/mongoid/relations/eager.rb +19 -7
  116. data/lib/mongoid/relations/eager/base.rb +5 -5
  117. data/lib/mongoid/relations/embedded/batchable.rb +9 -33
  118. data/lib/mongoid/relations/embedded/in.rb +16 -2
  119. data/lib/mongoid/relations/embedded/many.rb +23 -8
  120. data/lib/mongoid/relations/embedded/one.rb +17 -2
  121. data/lib/mongoid/relations/macros.rb +9 -2
  122. data/lib/mongoid/relations/metadata.rb +3 -3
  123. data/lib/mongoid/relations/nested_builder.rb +1 -1
  124. data/lib/mongoid/relations/options.rb +2 -2
  125. data/lib/mongoid/relations/proxy.rb +2 -33
  126. data/lib/mongoid/relations/referenced/in.rb +23 -11
  127. data/lib/mongoid/relations/referenced/many.rb +24 -16
  128. data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
  129. data/lib/mongoid/relations/referenced/one.rb +17 -1
  130. data/lib/mongoid/relations/reflections.rb +3 -5
  131. data/lib/mongoid/relations/touchable.rb +1 -1
  132. data/lib/mongoid/reloadable.rb +1 -1
  133. data/lib/mongoid/scopable.rb +3 -3
  134. data/lib/mongoid/serializable.rb +2 -3
  135. data/lib/mongoid/tasks/database.rb +1 -2
  136. data/lib/mongoid/threaded.rb +4 -4
  137. data/lib/mongoid/traversable.rb +1 -1
  138. data/lib/mongoid/validatable.rb +1 -1
  139. data/lib/mongoid/validatable/macros.rb +2 -4
  140. data/lib/mongoid/validatable/uniqueness.rb +1 -2
  141. data/lib/mongoid/version.rb +1 -1
  142. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -7
  143. data/spec/app/models/album.rb +5 -1
  144. data/spec/app/models/artist.rb +21 -0
  145. data/spec/app/models/band.rb +0 -1
  146. data/spec/app/models/church.rb +0 -2
  147. data/spec/app/models/ordered_post.rb +5 -0
  148. data/spec/app/models/oscar.rb +1 -2
  149. data/spec/app/models/person.rb +3 -1
  150. data/spec/app/models/post.rb +0 -1
  151. data/spec/app/models/princess.rb +2 -0
  152. data/spec/app/models/record.rb +1 -0
  153. data/spec/app/models/thing.rb +1 -1
  154. data/spec/config/mongoid.yml +1 -5
  155. data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
  156. data/spec/mongoid/atomic_spec.rb +17 -17
  157. data/spec/mongoid/attributes/nested_spec.rb +14 -14
  158. data/spec/mongoid/attributes/readonly_spec.rb +87 -44
  159. data/spec/mongoid/attributes_spec.rb +63 -0
  160. data/spec/mongoid/cacheable_spec.rb +112 -0
  161. data/spec/mongoid/changeable_spec.rb +58 -0
  162. data/spec/mongoid/clients/factory_spec.rb +3 -11
  163. data/spec/mongoid/clients/options_spec.rb +378 -96
  164. data/spec/mongoid/clients_spec.rb +207 -170
  165. data/spec/mongoid/composable_spec.rb +7 -0
  166. data/spec/mongoid/config_spec.rb +41 -21
  167. data/spec/mongoid/contextual/atomic_spec.rb +77 -343
  168. data/spec/mongoid/contextual/map_reduce_spec.rb +119 -111
  169. data/spec/mongoid/contextual/memory_spec.rb +56 -316
  170. data/spec/mongoid/contextual/mongo_spec.rb +104 -378
  171. data/spec/mongoid/copyable_spec.rb +8 -15
  172. data/spec/mongoid/criteria/modifiable_spec.rb +239 -7
  173. data/spec/mongoid/criteria/options_spec.rb +29 -0
  174. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
  175. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
  176. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
  177. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
  178. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
  179. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
  180. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
  181. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
  182. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
  183. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
  184. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
  185. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
  186. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
  187. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
  188. data/spec/mongoid/{extensions/origin/regexp_raw_spec.rb → criteria/queryable/extensions/regexp_spec.rb} +21 -20
  189. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
  190. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
  191. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
  192. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
  193. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
  194. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
  195. data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
  196. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
  197. data/spec/mongoid/criteria/queryable/optional_spec.rb +1786 -0
  198. data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
  199. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
  200. data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
  201. data/spec/mongoid/criteria/queryable/selectable_spec.rb +4159 -0
  202. data/spec/mongoid/criteria/queryable/selector_spec.rb +778 -0
  203. data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
  204. data/spec/mongoid/criteria_spec.rb +45 -63
  205. data/spec/mongoid/document_spec.rb +21 -88
  206. data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
  207. data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
  208. data/spec/mongoid/extensions/big_decimal_spec.rb +320 -18
  209. data/spec/mongoid/extensions/date_spec.rb +2 -6
  210. data/spec/mongoid/extensions/date_time_spec.rb +2 -6
  211. data/spec/mongoid/extensions/float_spec.rb +8 -1
  212. data/spec/mongoid/extensions/integer_spec.rb +8 -1
  213. data/spec/mongoid/extensions/object_spec.rb +11 -0
  214. data/spec/mongoid/extensions/string_spec.rb +21 -0
  215. data/spec/mongoid/extensions/time_spec.rb +4 -8
  216. data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
  217. data/spec/mongoid/fields/localized_spec.rb +0 -91
  218. data/spec/mongoid/findable_spec.rb +46 -1
  219. data/spec/mongoid/indexable_spec.rb +6 -46
  220. data/spec/mongoid/interceptable_spec.rb +49 -10
  221. data/spec/mongoid/matchable/gt_spec.rb +11 -0
  222. data/spec/mongoid/matchable/gte_spec.rb +10 -0
  223. data/spec/mongoid/matchable/lt_spec.rb +11 -0
  224. data/spec/mongoid/matchable/lte_spec.rb +11 -0
  225. data/spec/mongoid/matchable_spec.rb +1 -51
  226. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  227. data/spec/mongoid/persistable/deletable_spec.rb +1 -1
  228. data/spec/mongoid/persistable/destroyable_spec.rb +6 -2
  229. data/spec/mongoid/persistable/savable_spec.rb +30 -30
  230. data/spec/mongoid/persistable/settable_spec.rb +0 -185
  231. data/spec/mongoid/persistable/updatable_spec.rb +166 -5
  232. data/spec/mongoid/persistence_context_spec.rb +654 -0
  233. data/spec/mongoid/positional_spec.rb +10 -10
  234. data/spec/mongoid/query_cache_spec.rb +89 -65
  235. data/spec/mongoid/relations/accessors_spec.rb +1 -1
  236. data/spec/mongoid/relations/auto_save_spec.rb +39 -6
  237. data/spec/mongoid/relations/builders_spec.rb +37 -10
  238. data/spec/mongoid/relations/counter_cache_spec.rb +64 -15
  239. data/spec/mongoid/relations/cyclic_spec.rb +0 -22
  240. data/spec/mongoid/relations/embedded/many_spec.rb +9 -41
  241. data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
  242. data/spec/mongoid/relations/macros_spec.rb +395 -7
  243. data/spec/mongoid/relations/proxy_spec.rb +3 -1
  244. data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
  245. data/spec/mongoid/relations/referenced/many_spec.rb +6 -29
  246. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +6 -29
  247. data/spec/mongoid/relations/reflections_spec.rb +9 -9
  248. data/spec/mongoid/reloadable_spec.rb +51 -0
  249. data/spec/mongoid/scopable_spec.rb +0 -12
  250. data/spec/mongoid/serializable_spec.rb +0 -50
  251. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  252. data/spec/mongoid/validatable/uniqueness_spec.rb +16 -9
  253. data/spec/mongoid/validatable_spec.rb +16 -0
  254. data/spec/spec_helper.rb +10 -10
  255. metadata +536 -479
  256. metadata.gz.sig +0 -0
  257. data/lib/mongoid/clients/thread_options.rb +0 -19
  258. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +0 -20
  259. data/lib/mongoid/extensions/decimal128.rb +0 -39
  260. data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
  261. data/lib/mongoid/matchable/regexp.rb +0 -27
  262. data/spec/app/models/post_genre.rb +0 -6
  263. data/spec/mongoid/extensions/decimal128_spec.rb +0 -44
  264. data/spec/mongoid/matchable/regexp_spec.rb +0 -59
@@ -12,7 +12,7 @@ module Mongoid
12
12
  #
13
13
  # @param [ Class ] base The base class.
14
14
  # @param [ Symbol ] name The name of the relation.
15
- # @param [ Class ] klass The child class.
15
+ # @param [ Class ] The child class.
16
16
  # @param [ Symbol ] inverse The attempted inverse key.
17
17
  #
18
18
  # @since 3.0.0
@@ -19,7 +19,7 @@ module Mongoid
19
19
  # @return [ String ] The composed message.
20
20
  #
21
21
  # @since 3.0.0
22
- def compose_message(key, attributes = {})
22
+ def compose_message(key, attributes)
23
23
  @problem = translate_problem(key, attributes)
24
24
  @summary = translate_summary(key, attributes)
25
25
  @resolution = translate_resolution(key, attributes)
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
3
 
4
- # Contains behaviour specific to evolving for origin queries.
4
+ # Contains behaviour specific to evolving for queryable queries.
5
5
  module Evolvable
6
6
 
7
7
  # Evolve the document into an object id.
@@ -3,9 +3,6 @@ class BSON::ObjectId
3
3
  def as_json(options = nil)
4
4
  { "$oid" => to_s }
5
5
  end
6
- def to_xml(options = nil)
7
- ActiveSupport::XmlMini.to_tag(options[:root], self.to_s, options)
8
- end
9
6
  end
10
7
 
11
8
  class Symbol
@@ -30,7 +27,6 @@ require "mongoid/extensions/big_decimal"
30
27
  require "mongoid/extensions/boolean"
31
28
  require "mongoid/extensions/date"
32
29
  require "mongoid/extensions/date_time"
33
- require "mongoid/extensions/decimal128"
34
30
  require "mongoid/extensions/false_class"
35
31
  require "mongoid/extensions/float"
36
32
  require "mongoid/extensions/hash"
@@ -39,7 +35,6 @@ require "mongoid/extensions/module"
39
35
  require "mongoid/extensions/nil_class"
40
36
  require "mongoid/extensions/object"
41
37
  require "mongoid/extensions/object_id"
42
- require "mongoid/extensions/origin/regexp_raw"
43
38
  require "mongoid/extensions/range"
44
39
  require "mongoid/extensions/regexp"
45
40
  require "mongoid/extensions/set"
@@ -28,6 +28,18 @@ module Mongoid
28
28
  to_s
29
29
  end
30
30
 
31
+ # Is the BigDecimal a number?
32
+ #
33
+ # @example Is the object a number?.
34
+ # object.numeric?
35
+ #
36
+ # @return [ true ] Always true.
37
+ #
38
+ # @since 6.0.0
39
+ def numeric?
40
+ true
41
+ end
42
+
31
43
  module ClassMethods
32
44
 
33
45
  # Convert the object from its mongo friendly ruby type to this type.
@@ -37,28 +49,25 @@ module Mongoid
37
49
  #
38
50
  # @param [ Object ] object The object to demongoize.
39
51
  #
40
- # @return [ Object ] The object.
52
+ # @return [ BigDecimal, nil ] A BigDecimal derived from the object or nil.
41
53
  #
42
54
  # @since 3.0.0
43
55
  def demongoize(object)
44
- if object
45
- object.numeric? ? ::BigDecimal.new(object.to_s) : object
46
- end
56
+ object && object.numeric? ? ::BigDecimal.new(object.to_s) : nil
47
57
  end
48
58
 
49
- # Mongoize an object of any type to how it's stored in the db as a big
50
- # decimal.
59
+ # Mongoize an object of any type to how it's stored in the db as a String.
51
60
  #
52
61
  # @example Mongoize the object.
53
62
  # BigDecimal.mongoize(123)
54
63
  #
55
64
  # @param [ Object ] object The object to Mongoize
56
65
  #
57
- # @return [ String ] The mongoized object.
66
+ # @return [ String, nil ] A String representing the object or nil.
58
67
  #
59
68
  # @since 3.0.7
60
69
  def mongoize(object)
61
- object ? object.to_s : object
70
+ object && object.numeric? ? object.to_s : nil
62
71
  end
63
72
  end
64
73
  end
@@ -4,6 +4,9 @@ module Mongoid
4
4
  module Date
5
5
 
6
6
  # Constant for epoch - used when passing invalid times.
7
+ #
8
+ # @deprecated No longer used as a return value from #mongoize passed
9
+ # an invalid date string.
7
10
  EPOCH = ::Date.new(1970, 1, 1)
8
11
 
9
12
  # Convert the date into a time.
@@ -64,7 +67,7 @@ module Mongoid
64
67
  time = object.__mongoize_time__
65
68
  ::Time.utc(time.year, time.month, time.day)
66
69
  rescue ArgumentError
67
- EPOCH
70
+ nil
68
71
  end
69
72
  end
70
73
  end
@@ -161,11 +161,10 @@ module Mongoid
161
161
  # @api private
162
162
  #
163
163
  # @example Mongoize for the klass, field and value.
164
- # {}.mongoize_for("$push", Band, "name", "test")
164
+ # {}.mongoize_for(Band, "name", "test")
165
165
  #
166
- # @param [ String ] operator The operator.
167
166
  # @param [ Class ] klass The model class.
168
- # @param [ String, Symbol ] key The field key.
167
+ # @param [ String, Symbol ] The field key.
169
168
  # @param [ Object ] value The value to mongoize.
170
169
  #
171
170
  # @return [ Object ] The mongoized value.
@@ -94,7 +94,7 @@ module Mongoid
94
94
  # object.do_or_do_not(:use, "The Force")
95
95
  #
96
96
  # @param [ String, Symbol ] name The method name.
97
- # @param [ Array ] args The arguments.
97
+ # @param [ Array ] *args The arguments.
98
98
  #
99
99
  # @return [ Object, nil ] The result of the method call or nil if the
100
100
  # method does not exist.
@@ -209,7 +209,7 @@ module Mongoid
209
209
  # object.you_must(:use, "The Force")
210
210
  #
211
211
  # @param [ String, Symbol ] name The method name.
212
- # @param [ Array ] args The arguments.
212
+ # @param [ Array ] *args The arguments.
213
213
  #
214
214
  # @return [ Object, nil ] The result of the method call or nil if the
215
215
  # method does not exist. Nil if the object is frozen.
@@ -72,7 +72,8 @@ module Mongoid
72
72
  self =~ /\A(|_)id$/
73
73
  end
74
74
 
75
- # Is the string a number?
75
+ # Is the string a number? The literals "NaN", "Infinity", and "-Infinity"
76
+ # are counted as numbers.
76
77
  #
77
78
  # @example Is the string a number.
78
79
  # "1234.23".numeric?
@@ -81,7 +82,7 @@ module Mongoid
81
82
  #
82
83
  # @since 3.0.0
83
84
  def numeric?
84
- true if Float(self) rescue (self == "NaN")
85
+ true if Float(self) rescue (self =~ /^NaN|\-?Infinity$/)
85
86
  end
86
87
 
87
88
  # Get the string as a getter string.
@@ -117,7 +118,7 @@ module Mongoid
117
118
  #
118
119
  # @since 3.0.15
119
120
  def valid_method_name?
120
- /[@$"]/ !~ self
121
+ /[@$"-]/ !~ self
121
122
  end
122
123
 
123
124
  # Does the string end with _before_type_cast?
@@ -4,6 +4,9 @@ module Mongoid
4
4
  module Time
5
5
 
6
6
  # Constant for epoch - used when passing invalid times.
7
+ #
8
+ # @deprecated No longer used as a return value from #mongoize passed
9
+ # an invalid time string.
7
10
  EPOCH = ::Time.utc(1970, 1, 1, 0, 0, 0)
8
11
 
9
12
  # Turn the object from the ruby type we deal with to a Mongo friendly
@@ -27,7 +30,7 @@ module Mongoid
27
30
  # @example Get the configured time.
28
31
  # ::Time.configured
29
32
  #
30
- # @return [ Time ] The configured time.
33
+ # @retun [ Time ] The configured time.
31
34
  #
32
35
  # @since 3.0.0
33
36
  def configured
@@ -76,7 +79,7 @@ module Mongoid
76
79
  ::Time.at(time.to_i, time.usec).utc
77
80
  end
78
81
  rescue ArgumentError
79
- EPOCH
82
+ nil
80
83
  end
81
84
  end
82
85
  end
@@ -14,6 +14,7 @@ module Mongoid
14
14
  #
15
15
  # @param [ Class ] klass The class to instantiate from if _type is not present.
16
16
  # @param [ Hash ] attributes The document attributes.
17
+ # @param [ Hash ] options The mass assignment scoping options.
17
18
  #
18
19
  # @return [ Document ] The instantiated document.
19
20
  def build(klass, attributes = nil)
@@ -14,8 +14,8 @@ module Mongoid
14
14
  # @param [ String ] name The name of the field.
15
15
  # @param [ String ] key The atomic location of the field.
16
16
  # @param [ Hash ] mods The current modifications.
17
- # @param [ Array ] new_elements The new elements to add.
18
- # @param [ Array ] old_elements The old elements getting removed.
17
+ # @param [ Array ] new The new elements to add.
18
+ # @param [ Array ] old The old elements getting removed.
19
19
  #
20
20
  # @since 2.4.0
21
21
  def add_atomic_changes(document, name, key, mods, new_elements, old_elements)
@@ -77,14 +77,9 @@ module Mongoid
77
77
  # @since 3.0.0
78
78
  def lookup(object)
79
79
  locale = ::I18n.locale
80
-
81
- value = if object.key?(locale.to_s)
82
- object[locale.to_s]
83
- elsif object.key?(locale)
84
- object[locale]
85
- end
86
- return value unless value.nil?
87
- if fallbacks? && ::I18n.respond_to?(:fallbacks)
80
+ if value = object[locale.to_s]
81
+ value
82
+ elsif fallbacks? && ::I18n.respond_to?(:fallbacks)
88
83
  object[::I18n.fallbacks[locale].map(&:to_s).find{ |loc| object.has_key?(loc) }]
89
84
  end
90
85
  end
@@ -36,6 +36,24 @@ module Mongoid
36
36
  validate_options(klass, name, options)
37
37
  end
38
38
 
39
+ # Validate the relation definition.
40
+ #
41
+ # @example Validate the relation definition.
42
+ # Macro.validate(Model, :name)
43
+ #
44
+ # @param [ Class ] klass The model class.
45
+ # @param [ Symbol ] name The field name.
46
+ # @param [ Hash ] options The provided options.
47
+ #
48
+ # @since 6.0.0
49
+ def validate_relation(klass, name, options = {})
50
+ [name, "#{name}?".to_sym, "#{name}=".to_sym].each do |n|
51
+ if Mongoid.destructive_fields.include?(n)
52
+ raise Errors::InvalidRelation.new(klass, n)
53
+ end
54
+ end
55
+ end
56
+
39
57
  private
40
58
 
41
59
  # Determine if the field name is allowed, if not raise an error.
@@ -6,12 +6,12 @@ module Mongoid
6
6
  #
7
7
  # @since 4.0.0
8
8
  module Findable
9
- extend Origin::Forwardable
9
+ extend Mongoid::Criteria::Queryable::Forwardable
10
10
 
11
11
  select_with :with_default_scope
12
12
 
13
13
  # These are methods defined on the criteria that should also be accessible
14
- # directly from the the class level.
14
+ # directly from the class level.
15
15
  delegate \
16
16
  :aggregates,
17
17
  :avg,
@@ -71,7 +71,7 @@ module Mongoid
71
71
  # @example Do any documents exist for the conditions?
72
72
  # Person.exists?
73
73
  #
74
- # @return [ true, false ] If any documents exist for the conditions.
74
+ # @param [ Array ] args The conditions.
75
75
  def exists?
76
76
  with_default_scope.exists?
77
77
  end
@@ -31,8 +31,9 @@ module Mongoid
31
31
  index_specifications.each do |spec|
32
32
  key, options = spec.key, spec.options
33
33
  if database = options[:database]
34
- with(database: database).
35
- collection.indexes.create_one(key, options.except(:database))
34
+ with(database: database) do |klass|
35
+ klass.collection.indexes.create_one(key, options.except(:database))
36
+ end
36
37
  else
37
38
  collection.indexes.create_one(key, options)
38
39
  end
@@ -50,18 +51,19 @@ module Mongoid
50
51
  # @since 3.0.0
51
52
  def remove_indexes
52
53
  indexed_database_names.each do |database|
53
- collection = with(database: database).collection
54
- begin
55
- collection.indexes.each do |spec|
56
- unless spec["name"] == "_id_"
57
- collection.indexes.drop_one(spec["key"])
58
- logger.info(
59
- "MONGOID: Removed index '#{spec["name"]}' on collection " +
60
- "'#{collection.name}' in database '#{database}'."
61
- )
54
+ with(database: database) do |klass|
55
+ begin
56
+ klass.collection.indexes.each do |spec|
57
+ unless spec["name"] == "_id_"
58
+ klass.collection.indexes.drop_one(spec["key"])
59
+ logger.info(
60
+ "MONGOID: Removed index '#{spec["name"]}' on collection " +
61
+ "'#{klass.collection.name}' in database '#{database}'."
62
+ )
63
+ end
62
64
  end
63
- end
64
- rescue Mongo::Error::OperationFailure; end
65
+ rescue Mongo::Error::OperationFailure; end
66
+ end
65
67
  end and true
66
68
  end
67
69
 
@@ -90,7 +92,7 @@ module Mongoid
90
92
  # index({ name: 1 }, { background: true })
91
93
  # end
92
94
  #
93
- # @param [ Symbol ] spec The index spec.
95
+ # @param [ Symbol ] name The name of the field.
94
96
  # @param [ Hash ] options The index options.
95
97
  #
96
98
  # @return [ Hash ] The index options.
@@ -108,8 +110,7 @@ module Mongoid
108
110
  # @example Get the index specification.
109
111
  # Model.index_specification(name: 1)
110
112
  #
111
- # @param [ Hash ] index_hash The index key/direction pair.
112
- # @param [ String ] index_name The index name.
113
+ # @param [ Hash ] key The index key/direction pair.
113
114
  #
114
115
  # @return [ Specification ] The found specification.
115
116
  #
@@ -99,7 +99,7 @@ module Mongoid
99
99
  # @example Normalize the index options.
100
100
  # specification.normalize_options(drop_dups: true)
101
101
  #
102
- # @param [ Hash ] opts The index options.
102
+ # @param [ Hash ] options The index options.
103
103
  #
104
104
  # @return [ Hash ] The normalized options.
105
105
  #
@@ -27,8 +27,7 @@ module Mongoid
27
27
  :sphere_version,
28
28
  :text_version,
29
29
  :version,
30
- :partial_filter_expression,
31
- :collation
30
+ :partial_filter_expression
32
31
  ]
33
32
 
34
33
  VALID_TYPES = [
@@ -46,7 +46,7 @@ module Mongoid
46
46
  # @example Is the callback executable?
47
47
  # document.callback_executable?(:save)
48
48
  #
49
- # @param [ Symbol ] kind The type of callback.
49
+ # @param [ Symbol ] kin The type of callback.
50
50
  #
51
51
  # @return [ true, false ] If the callback can be executed.
52
52
  #
@@ -118,7 +118,7 @@ module Mongoid
118
118
  # end
119
119
  #
120
120
  # @param [ Symbol ] kind The type of callback to execute.
121
- # @param [ Array ] args Any options.
121
+ # @param [ Array ] *args Any options.
122
122
  #
123
123
  # @return [ Document ] The document
124
124
  #
@@ -259,22 +259,11 @@ module Mongoid
259
259
  send("_#{kind}_callbacks").each do |callback|
260
260
  chain.append(callback) if callback.kind == place
261
261
  end
262
-
263
- if Gem::Version.new("4.1.0") <= Gem::Version.new(ActiveSupport::VERSION::STRING)
264
- self.class.send :define_method, name do
265
- runner = ActiveSupport::Callbacks::Filters::Environment.new(self, false, nil)
266
- chain.compile.call(runner).value
267
- end
268
- self.class.send :protected, name
269
- else
270
- class_eval <<-EOM
271
- def #{name}()
272
- #{chain.compile}
273
- end
274
- protected :#{name}
275
- EOM
262
+ self.class.send :define_method, name do
263
+ runner = ActiveSupport::Callbacks::Filters::Environment.new(self, false, nil)
264
+ chain.compile.call(runner).value
276
265
  end
277
-
266
+ self.class.send :protected, name
278
267
  end
279
268
  send(name)
280
269
  end
@@ -25,7 +25,7 @@ module Mongoid
25
25
  # @example Set the logger.
26
26
  # Loggable.logger = Logger.new($stdout)
27
27
  #
28
- # @param [ Logger ] logger The logger to set.
28
+ # @param [ Logger ] The logger to set.
29
29
  #
30
30
  # @return [ Logger ] The new logger.
31
31
  #
@@ -12,7 +12,6 @@ require "mongoid/matchable/ne"
12
12
  require "mongoid/matchable/nin"
13
13
  require "mongoid/matchable/or"
14
14
  require "mongoid/matchable/size"
15
- require "mongoid/matchable/regexp"
16
15
 
17
16
  module Mongoid
18
17
 
@@ -82,7 +81,7 @@ module Mongoid
82
81
  #
83
82
  # @param [ Document ] document The document to check.
84
83
  # @param [ Symbol, String ] key The field name.
85
- # @param [ Object, Hash ] value The value or selector.
84
+ # @param [ Object, Hash ] The value or selector.
86
85
  #
87
86
  # @return [ Matcher ] The matcher.
88
87
  #
@@ -103,7 +102,7 @@ module Mongoid
103
102
  #
104
103
  # @param [ Document ] document The document to check.
105
104
  # @param [ Symbol, String ] key The field name.
106
- # @param [ Object, Hash ] value The value or selector.
105
+ # @param [ Object, Hash ] The value or selector.
107
106
  #
108
107
  # @return [ Matcher ] The matcher.
109
108
  #
@@ -116,8 +115,6 @@ module Mongoid
116
115
  else
117
116
  Default.new(extract_attribute(document, key))
118
117
  end
119
- elsif value.regexp?
120
- Regexp.new(extract_attribute(document, key))
121
118
  else
122
119
  case key.to_s
123
120
  when "$or" then Or.new(value, document)
@@ -146,11 +143,7 @@ module Mongoid
146
143
  if (key_string = key.to_s) =~ /.+\..+/
147
144
  key_string.split('.').inject(document.as_document) do |_attribs, _key|
148
145
  if _attribs.is_a?(::Array)
149
- if _key =~ /\A\d+\z/ && _attribs.none? {|doc| doc.is_a?(Hash)}
150
- _attribs.try(:[], _key.to_i)
151
- else
152
- _attribs.map { |doc| doc.try(:[], _key) }
153
- end
146
+ _attribs.map { |doc| doc.try(:[], _key) }
154
147
  else
155
148
  _attribs.try(:[], _key)
156
149
  end