mongoid 2.0.0.rc.6 → 2.0.0.rc.7

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 (64) hide show
  1. data/Rakefile +2 -2
  2. data/lib/config/locales/bg.yml +3 -6
  3. data/lib/config/locales/de.yml +2 -5
  4. data/lib/config/locales/en.yml +2 -5
  5. data/lib/config/locales/es.yml +2 -5
  6. data/lib/config/locales/fr.yml +2 -5
  7. data/lib/config/locales/hu.yml +2 -5
  8. data/lib/config/locales/it.yml +2 -5
  9. data/lib/config/locales/kr.yml +2 -5
  10. data/lib/config/locales/nl.yml +2 -5
  11. data/lib/config/locales/pl.yml +2 -5
  12. data/lib/config/locales/pt-br.yml +2 -5
  13. data/lib/config/locales/pt.yml +2 -5
  14. data/lib/config/locales/ro.yml +2 -5
  15. data/lib/config/locales/ru.yml +41 -0
  16. data/lib/config/locales/sv.yml +2 -5
  17. data/lib/config/locales/zh-CN.yml +3 -6
  18. data/lib/mongoid/atomicity.rb +2 -2
  19. data/lib/mongoid/attributes.rb +40 -69
  20. data/lib/mongoid/attributes/processing.rb +142 -0
  21. data/lib/mongoid/collections.rb +1 -0
  22. data/lib/mongoid/components.rb +1 -1
  23. data/lib/mongoid/config.rb +0 -1
  24. data/lib/mongoid/contexts/mongo.rb +13 -9
  25. data/lib/mongoid/criteria.rb +15 -1
  26. data/lib/mongoid/criterion/inclusion.rb +36 -11
  27. data/lib/mongoid/criterion/inspection.rb +3 -1
  28. data/lib/mongoid/criterion/optional.rb +2 -2
  29. data/lib/mongoid/dirty.rb +1 -0
  30. data/lib/mongoid/document.rb +11 -5
  31. data/lib/mongoid/extensions/integer/conversions.rb +2 -2
  32. data/lib/mongoid/extensions/object_id/conversions.rb +62 -32
  33. data/lib/mongoid/field.rb +5 -2
  34. data/lib/mongoid/identity.rb +2 -1
  35. data/lib/mongoid/matchers.rb +5 -32
  36. data/lib/mongoid/matchers/default.rb +53 -10
  37. data/lib/mongoid/matchers/or.rb +30 -0
  38. data/lib/mongoid/matchers/strategies.rb +63 -0
  39. data/lib/mongoid/multi_parameter_attributes.rb +4 -2
  40. data/lib/mongoid/nested_attributes.rb +8 -0
  41. data/lib/mongoid/persistence.rb +2 -1
  42. data/lib/mongoid/persistence/insert.rb +3 -3
  43. data/lib/mongoid/persistence/insert_embedded.rb +2 -1
  44. data/lib/mongoid/relations.rb +2 -1
  45. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -2
  46. data/lib/mongoid/relations/builders/nested_attributes/many.rb +2 -0
  47. data/lib/mongoid/relations/cascading.rb +1 -1
  48. data/lib/mongoid/relations/cascading/nullify.rb +1 -1
  49. data/lib/mongoid/relations/constraint.rb +42 -0
  50. data/lib/mongoid/relations/cyclic.rb +6 -0
  51. data/lib/mongoid/relations/embedded/many.rb +4 -4
  52. data/lib/mongoid/relations/macros.rb +1 -1
  53. data/lib/mongoid/relations/many.rb +1 -0
  54. data/lib/mongoid/relations/metadata.rb +12 -4
  55. data/lib/mongoid/relations/nested_builder.rb +1 -3
  56. data/lib/mongoid/relations/referenced/many.rb +11 -18
  57. data/lib/mongoid/relations/referenced/many_to_many.rb +19 -32
  58. data/lib/mongoid/relations/referenced/one.rb +3 -1
  59. data/lib/mongoid/timestamps.rb +1 -1
  60. data/lib/mongoid/validations/associated.rb +11 -9
  61. data/lib/mongoid/validations/uniqueness.rb +1 -1
  62. data/lib/mongoid/version.rb +1 -1
  63. data/lib/mongoid/versioning.rb +2 -2
  64. metadata +9 -4
data/Rakefile CHANGED
@@ -32,8 +32,8 @@ Rspec::Core::RakeTask.new("spec:unit") do |spec|
32
32
  spec.pattern = "spec/unit/**/*_spec.rb"
33
33
  end
34
34
 
35
- Rspec::Core::RakeTask.new("spec:integration") do |spec|
36
- spec.pattern = "spec/integration/**/*_spec.rb"
35
+ Rspec::Core::RakeTask.new("spec:functional") do |spec|
36
+ spec.pattern = "spec/functional/**/*_spec.rb"
37
37
  end
38
38
 
39
39
  Rspec::Core::RakeTask.new('spec:progress') do |spec|
@@ -1,12 +1,9 @@
1
1
  bg:
2
- activemodel:
3
- errors:
4
- messages:
5
- taken: е вече заето
6
-
7
2
  mongoid:
8
3
  errors:
9
4
  messages:
5
+ taken:
6
+ е вече заето
10
7
  document_not_found:
11
8
  Не е намерен документ %{klass} с id(та) %{identifiers}.
12
9
  invalid_database:
@@ -29,7 +26,7 @@ bg:
29
26
  Присвояването на вложини атрибути за %{association} е
30
27
  ограничено до %{limit} записа
31
28
  embedded_in_must_have_inverse_of:
32
- Опциите на embedded_in асоциацията трябва да съдържат invers_of.
29
+ Опциите на embedded_in асоциацията трябва да съдържат inverse_of.
33
30
  dependent_only_references_one_or_many:
34
31
  Опцията dependent => destroy|delete, която е посочена е
35
32
  валидна само за references_one или references_many връзки
@@ -1,12 +1,9 @@
1
1
  de:
2
- activemodel:
3
- errors:
4
- messages:
5
- taken: ist bereits vergeben
6
-
7
2
  mongoid:
8
3
  errors:
9
4
  messages:
5
+ taken:
6
+ ist bereits vergeben
10
7
  document_not_found:
11
8
  Dokument für Klasse %{klass} mit ID(s) %{identifiers} nicht gefunden.
12
9
  invalid_database:
@@ -1,12 +1,9 @@
1
1
  en:
2
- activemodel:
3
- errors:
4
- messages:
5
- taken: is already taken
6
-
7
2
  mongoid:
8
3
  errors:
9
4
  messages:
5
+ taken:
6
+ is already taken
10
7
  document_not_found:
11
8
  Document not found for class %{klass} with id(s) %{identifiers}.
12
9
  invalid_database:
@@ -1,12 +1,9 @@
1
1
  es:
2
- activemodel:
3
- errors:
4
- messages:
5
- taken: ya está en uso
6
-
7
2
  mongoid:
8
3
  errors:
9
4
  messages:
5
+ taken:
6
+ ya está en uso
10
7
  document_not_found:
11
8
  No se encontró ningún documento para la clase %{klass} con los id(s) %{identifiers}.
12
9
  invalid_database:
@@ -1,12 +1,9 @@
1
1
  fr:
2
- activemodel:
3
- errors:
4
- messages:
5
- taken: est déjà pris.
6
-
7
2
  mongoid:
8
3
  errors:
9
4
  messages:
5
+ taken:
6
+ est déjà pris.
10
7
  document_not_found:
11
8
  Document introuvable pour la classe %{klass} avec les ids %{identifiers}.
12
9
  invalid_database:
@@ -1,12 +1,9 @@
1
1
  hu:
2
- activemodel:
3
- errors:
4
- messages:
5
- taken: már foglalt
6
-
7
2
  mongoid:
8
3
  errors:
9
4
  messages:
5
+ taken:
6
+ már foglalt
10
7
  document_not_found:
11
8
  %{klass} osztályban, %{identifiers} id(k)-el nem található dokumentum.
12
9
  invalid_database:
@@ -1,12 +1,9 @@
1
1
  it:
2
- activemodel:
3
- errors:
4
- messages:
5
- taken: è già utilizzato
6
-
7
2
  mongoid:
8
3
  errors:
9
4
  messages:
5
+ taken:
6
+ è già utilizzato
10
7
  document_not_found:
11
8
  Documento non trovato per la classe %{klass} con id(s) %{identifiers}.
12
9
  invalid_database:
@@ -1,12 +1,9 @@
1
1
  kr:
2
- activemodel:
3
- errors:
4
- messages:
5
- taken: 이미 사용하고있습니다 #is already taken
6
-
7
2
  mongoid:
8
3
  errors:
9
4
  messages:
5
+ taken:
6
+ 이미 사용하고있습니다 #is already taken
10
7
  document_not_found:
11
8
  클라스 %{klass}와 id를 %{identifiers} 위한 문서를 찾을수 없습니다.
12
9
  #Document not found for class %{klass} with id(s) %{identifiers}.
@@ -1,12 +1,9 @@
1
1
  nl:
2
- activemodel:
3
- errors:
4
- messages:
5
- taken: al in gebruik
6
-
7
2
  mongoid:
8
3
  errors:
9
4
  messages:
5
+ taken:
6
+ al in gebruik
10
7
  document_not_found:
11
8
  Document niet gevonden voor class %{klass} met de id(s) %{identifiers}.
12
9
  invalid_database:
@@ -1,12 +1,9 @@
1
1
  pl:
2
- activemodel:
3
- errors:
4
- messages:
5
- taken: jest już zajęte
6
-
7
2
  mongoid:
8
3
  errors:
9
4
  messages:
5
+ taken:
6
+ jest już zajęte
10
7
  document_not_found:
11
8
  Nie znaleziono dokumentu dla klasy %{klass} o id %{identifiers}.
12
9
  invalid_database:
@@ -1,12 +1,9 @@
1
1
  pt-br:
2
- activemodel:
3
- errors:
4
- messages:
5
- taken: já está utilizada
6
-
7
2
  mongoid:
8
3
  errors:
9
4
  messages:
5
+ taken:
6
+ já está utilizada
10
7
  document_not_found:
11
8
  Nenhum documento encontrado para a classe %{klass} com os id(s) %{identifiers}.
12
9
  invalid_database:
@@ -1,12 +1,9 @@
1
1
  pt:
2
- activemodel:
3
- errors:
4
- messages:
5
- taken: já está utilizada
6
-
7
2
  mongoid:
8
3
  errors:
9
4
  messages:
5
+ taken:
6
+ já está utilizada
10
7
  document_not_found:
11
8
  Nenhum documento encontrado para a classe %{klass} com os id(s) %{identifiers}.
12
9
  invalid_database:
@@ -1,12 +1,9 @@
1
1
  ro:
2
- activemodel:
3
- errors:
4
- messages:
5
- taken: este deja folosit
6
-
7
2
  mongoid:
8
3
  errors:
9
4
  messages:
5
+ taken:
6
+ este deja folosit
10
7
  document_not_found:
11
8
  Nu există document în clasa %{klass} cu id %{identifiers}.
12
9
  invalid_database:
@@ -0,0 +1,41 @@
1
+ ru:
2
+ mongoid:
3
+ errors:
4
+ messages:
5
+ taken:
6
+ уже занят
7
+ document_not_found:
8
+ Документ класса %{klass} с id %{identifiers} не найден.
9
+ invalid_database:
10
+ База данных должная быть Mongo::DB, а не %{name}.
11
+ invalid_type:
12
+ Поле уже было определено в классе %{klass}, но получено как %{other}
13
+ со значением %{value}.
14
+ unsupported_version:
15
+ Версия MongoDB %{version} не поддерживается. Пожалуйста, обновитесь до
16
+ версии %{mongo_version}.
17
+ validations:
18
+ Документ не прошёл валидацию - %{errors}.
19
+ invalid_collection:
20
+ Доступ к коллекции для класса %{klass} запрещён, так как это вложенный
21
+ документ. Пожалуйста, обратитесь к коллекции через родительский документ.
22
+ invalid_field:
23
+ Определение поля с именем %{name} запрещено. Не определяйте поля
24
+ с именами совпадающими с внутренними атрибутами или методами Mongoid.
25
+ Используйте Document#instance_methods для просмотра запрещённых имён.
26
+ too_many_nested_attribute_records:
27
+ Accepting nested attributes для %{association} ограничено
28
+ %{limit} записями.
29
+ embedded_in_must_have_inverse_of:
30
+ Указание опции inverse_of для embedded_in ассоциации обязательно.
31
+ dependent_only_references_one_or_many:
32
+ Опция dependent => destroy|delete доступная только для
33
+ references_one или references_many ассоциаций.
34
+ association_cant_have_inverse_of:
35
+ Опция inverse_of не может использоваться с этой ассоциацией.
36
+ Используйте её с embedded_in или references_many ассоциациями.
37
+ calling_document_find_with_nil_is_invalid:
38
+ Вызов Document#find с nil запрещён
39
+ unsaved_document:
40
+ Вызов методов create или create! запрещён у реляционной ассоциации
41
+ (%{document}), у которой родитель (%{base}) не сохранён.
@@ -1,12 +1,9 @@
1
1
  sv:
2
- activemodel:
3
- errors:
4
- messages:
5
- taken: har redan använts
6
-
7
2
  mongoid:
8
3
  errors:
9
4
  messages:
5
+ taken:
6
+ har redan använts
10
7
  document_not_found:
11
8
  Inget dokument kunde hittas för klass %{klass} med id %{identifiers}.
12
9
  invalid_database:
@@ -1,12 +1,9 @@
1
- en:
2
- activemodel:
3
- errors:
4
- messages:
5
- taken: 已占用
6
-
1
+ zh-CN:
7
2
  mongoid:
8
3
  errors:
9
4
  messages:
5
+ taken:
6
+ 已占用
10
7
  document_not_found:
11
8
  没有发现类是%{klass}id(s)是%{identifiers}的文档
12
9
  invalid_database:
@@ -81,7 +81,7 @@ module Mongoid #:nodoc:
81
81
  #
82
82
  # @return [ Hash ] The $pushAll operations.
83
83
  def _pushes
84
- pushable? ? { _path => to_hash } : {}
84
+ pushable? ? { _path => as_document } : {}
85
85
  end
86
86
 
87
87
  # Determine if the document can be pushed.
@@ -104,7 +104,7 @@ module Mongoid #:nodoc:
104
104
  if changed? && !new_record?
105
105
  setters
106
106
  else
107
- embedded_one? && new_record? ? { _path => to_hash } : {}
107
+ embedded_one? && new_record? ? { _path => as_document } : {}
108
108
  end
109
109
  end
110
110
  end
@@ -1,9 +1,12 @@
1
1
  # encoding: utf-8
2
+ require "mongoid/attributes/processing"
3
+
2
4
  module Mongoid #:nodoc:
3
5
 
4
6
  # This module contains the logic for handling the internal attributes hash,
5
7
  # and how to get and set values.
6
8
  module Attributes
9
+ include Processing
7
10
 
8
11
  # Returns the object type. This corresponds to the name of the class that
9
12
  # this document is, which is used in determining the class to
@@ -13,6 +16,8 @@ module Mongoid #:nodoc:
13
16
  # person._type
14
17
  #
15
18
  # @return [ String ] The name of the class the document is.
19
+ #
20
+ # @since 1.0.0
16
21
  def _type
17
22
  @attributes["_type"]
18
23
  end
@@ -25,6 +30,8 @@ module Mongoid #:nodoc:
25
30
  # @param [ String ] new_type The name of the class.
26
31
  #
27
32
  # @return [ String ] the new type.
33
+ #
34
+ # @since 1.0.0
28
35
  def _type=(new_type)
29
36
  @attributes["_type"] = new_type
30
37
  end
@@ -37,6 +44,8 @@ module Mongoid #:nodoc:
37
44
  # @param [ String, Symbol ] name The name of the attribute.
38
45
  #
39
46
  # @return [ true, false ] True if present, false if not.
47
+ #
48
+ # @since 1.0.0
40
49
  def attribute_present?(name)
41
50
  !read_attribute(name).blank?
42
51
  end
@@ -48,6 +57,8 @@ module Mongoid #:nodoc:
48
57
  # person.id
49
58
  #
50
59
  # @return [ BSON::ObjectId, String ] The id of the document.
60
+ #
61
+ # @since 1.0.0
51
62
  def id
52
63
  @attributes["_id"]
53
64
  end
@@ -61,50 +72,13 @@ module Mongoid #:nodoc:
61
72
  # @param [ BSON::ObjectId, String ] new_id The new id.
62
73
  #
63
74
  # @return [ BSON::ObjectId, String ] The new id.
75
+ #
76
+ # @since 1.0.0
64
77
  def id=(new_id)
65
78
  @attributes["_id"] = _id_type.set(new_id)
66
79
  end
67
80
  alias :_id= :id=
68
81
 
69
- # Used for allowing accessor methods for dynamic attributes.
70
- #
71
- # @param [ String, Symbol ] name The name of the method.
72
- # @param [ Array ] *args The arguments to the method.
73
- def method_missing(name, *args)
74
- attr = name.to_s
75
- return super unless @attributes.has_key?(attr.reader)
76
- if attr.writer?
77
- # "args.size > 1" allows to simulate 1.8 behavior of "*args"
78
- write_attribute(attr.reader, (args.size > 1) ? args : args.first)
79
- else
80
- read_attribute(attr.reader)
81
- end
82
- end
83
-
84
- # Process the provided attributes casting them to their proper values if a
85
- # field exists for them on the document. This will be limited to only the
86
- # attributes provided in the suppied +Hash+ so that no extra nil values get
87
- # put into the document's attributes.
88
- #
89
- # @example Process the attributes.
90
- # person.process(:title => "sir", :age => 40)
91
- #
92
- # @param [ Hash ] attrs The attributes to set.
93
- def process(attrs = nil)
94
- pending = {}
95
- sanitize_for_mass_assignment(attrs || {}).each_pair do |key, value|
96
- if set_allowed?(key)
97
- write_attribute(key, value)
98
- else
99
- pending[key.to_s] = value and next if relations.has_key?(key.to_s)
100
- send("#{key}=", value)
101
- end
102
- end
103
- yield self if block_given?
104
- process_relations(pending)
105
- setup_modifications
106
- end
107
-
108
82
  # Read a value from the document attributes. If the value does not exist
109
83
  # it will return nil.
110
84
  #
@@ -117,6 +91,8 @@ module Mongoid #:nodoc:
117
91
  # @param [ String, Symbol ] name The name of the attribute to get.
118
92
  #
119
93
  # @return [ Object ] The value of the attribute.
94
+ #
95
+ # @since 1.0.0
120
96
  def read_attribute(name)
121
97
  access = name.to_s
122
98
  value = @attributes[access]
@@ -132,6 +108,8 @@ module Mongoid #:nodoc:
132
108
  # person.remove_attribute(:title)
133
109
  #
134
110
  # @param [ String, Symbol ] name The name of the attribute to remove.
111
+ #
112
+ # @since 1.0.0
135
113
  def remove_attribute(name)
136
114
  access = name.to_s
137
115
  modify(access, @attributes.delete(name.to_s), nil)
@@ -145,6 +123,8 @@ module Mongoid #:nodoc:
145
123
  # @param [ Array ] *args The name of the method.
146
124
  #
147
125
  # @return [ true, false ] True if it does, false if not.
126
+ #
127
+ # @since 1.0.0
148
128
  def respond_to?(*args)
149
129
  (Mongoid.allow_dynamic_fields &&
150
130
  @attributes &&
@@ -164,6 +144,8 @@ module Mongoid #:nodoc:
164
144
  #
165
145
  # @param [ String, Symbol ] name The name of the attribute to update.
166
146
  # @param [ Object ] value The value to set for the attribute.
147
+ #
148
+ # @since 1.0.0
167
149
  def write_attribute(name, value)
168
150
  access = name.to_s
169
151
  modify(access, @attributes[access], typed_value_for(access, value))
@@ -181,10 +163,11 @@ module Mongoid #:nodoc:
181
163
  # person.attributes = { :title => "Mr." }
182
164
  #
183
165
  # @param [ Hash ] attrs The new attributes to set.
166
+ #
167
+ # @since 1.0.0
184
168
  def write_attributes(attrs = nil)
185
- process(attrs || {})
186
- if new_record? && id.blank?
187
- identify
169
+ process(attrs) do |document|
170
+ document.identify if new? && id.blank?
188
171
  end
189
172
  end
190
173
  alias :attributes= :write_attributes
@@ -197,6 +180,8 @@ module Mongoid #:nodoc:
197
180
  # person.default_attributes
198
181
  #
199
182
  # @return [ Hash ] The default values for each field.
183
+ #
184
+ # @since 1.0.0
200
185
  def default_attributes
201
186
  default_values = defaults
202
187
  default_values.each_pair do |key, val|
@@ -205,34 +190,18 @@ module Mongoid #:nodoc:
205
190
  default_values || {}
206
191
  end
207
192
 
208
- # Process all the pending relations that needed to wait until ids were set
209
- # to fire off.
210
- #
211
- # @example Process the relations.
212
- # document.process_relations({ "addressable" => person })
213
- #
214
- # @param [ Hash ] pending The pending relation values.
215
- def process_relations(pending)
216
- pending.each_pair do |name, value|
217
- metadata = relations[name]
218
- if value.is_a?(Hash)
219
- metadata.nested_builder(value, {}).build(self)
220
- else
221
- send("#{name}=", value, :binding => true)
222
- end
223
- end
224
- end
225
-
226
- # Return true if dynamic field setting is enabled.
227
- #
228
- # @example Is a set allowed for this name?
229
- # person.set_allowed?(:title)
230
- #
231
- # @param [ String, Symbol ] key The name of the field.
193
+ # Used for allowing accessor methods for dynamic attributes.
232
194
  #
233
- # @return [ true, false ] True if allowed, false if not.
234
- def set_allowed?(key)
235
- Mongoid.allow_dynamic_fields && !respond_to?("#{key}=")
195
+ # @param [ String, Symbol ] name The name of the method.
196
+ # @param [ Array ] *args The arguments to the method.
197
+ def method_missing(name, *args)
198
+ attr = name.to_s
199
+ return super unless @attributes.has_key?(attr.reader)
200
+ if attr.writer?
201
+ write_attribute(attr.reader, (args.size > 1) ? args : args.first)
202
+ else
203
+ read_attribute(attr.reader)
204
+ end
236
205
  end
237
206
 
238
207
  # Return the typecasted value for a field.
@@ -244,6 +213,8 @@ module Mongoid #:nodoc:
244
213
  # @param [ Object ] value The uncast value.
245
214
  #
246
215
  # @return [ Object ] The cast value.
216
+ #
217
+ # @since 1.0.0
247
218
  def typed_value_for(key, value)
248
219
  fields.has_key?(key) ? fields[key].set(value) : value
249
220
  end