mongoid 3.0.23 → 3.1.0
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/CHANGELOG.md +253 -9
- data/LICENSE +1 -1
- data/README.md +4 -1
- data/lib/config/locales/en.yml +7 -6
- data/lib/mongoid.rb +18 -1
- data/lib/mongoid/atomic.rb +22 -20
- data/lib/mongoid/atomic/paths/embedded.rb +19 -5
- data/lib/mongoid/atomic/paths/root.rb +1 -1
- data/lib/mongoid/atomic/positionable.rb +73 -0
- data/lib/mongoid/attributes.rb +63 -1
- data/lib/mongoid/callbacks.rb +58 -4
- data/lib/mongoid/components.rb +8 -3
- data/lib/mongoid/config.rb +71 -23
- data/lib/mongoid/contextual.rb +2 -1
- data/lib/mongoid/contextual/aggregable/mongo.rb +27 -63
- data/lib/mongoid/contextual/atomic.rb +4 -3
- data/lib/mongoid/contextual/find_and_modify.rb +1 -1
- data/lib/mongoid/contextual/geo_near.rb +238 -0
- data/lib/mongoid/contextual/map_reduce.rb +12 -1
- data/lib/mongoid/contextual/memory.rb +36 -31
- data/lib/mongoid/contextual/mongo.rb +147 -91
- data/lib/mongoid/contextual/queryable.rb +25 -0
- data/lib/mongoid/copyable.rb +4 -1
- data/lib/mongoid/criteria.rb +23 -275
- data/lib/mongoid/criterion/findable.rb +179 -0
- data/lib/mongoid/criterion/modifiable.rb +191 -0
- data/lib/mongoid/criterion/scoping.rb +11 -6
- data/lib/mongoid/document.rb +7 -56
- data/lib/mongoid/equality.rb +66 -0
- data/lib/mongoid/errors/mongoid_error.rb +7 -3
- data/lib/mongoid/extensions/array.rb +13 -1
- data/lib/mongoid/extensions/date.rb +9 -2
- data/lib/mongoid/extensions/hash.rb +38 -2
- data/lib/mongoid/extensions/nil_class.rb +12 -0
- data/lib/mongoid/extensions/object.rb +24 -0
- data/lib/mongoid/extensions/string.rb +14 -2
- data/lib/mongoid/extensions/time.rb +4 -1
- data/lib/mongoid/fields.rb +49 -5
- data/lib/mongoid/fields/foreign_key.rb +12 -0
- data/lib/mongoid/fields/standard.rb +12 -0
- data/lib/mongoid/finders.rb +8 -0
- data/lib/mongoid/hierarchy.rb +19 -1
- data/lib/mongoid/indexes.rb +30 -4
- data/lib/mongoid/indexes/validators/options.rb +12 -2
- data/lib/mongoid/inspection.rb +2 -1
- data/lib/mongoid/matchers/strategies.rb +5 -5
- data/lib/mongoid/observer.rb +27 -36
- data/lib/mongoid/persistence.rb +42 -17
- data/lib/mongoid/persistence/atomic.rb +10 -5
- data/lib/mongoid/persistence/atomic/operation.rb +26 -9
- data/lib/mongoid/persistence/atomic/unset.rb +1 -1
- data/lib/mongoid/persistence/operations/embedded/insert.rb +5 -2
- data/lib/mongoid/persistence/operations/embedded/remove.rb +5 -2
- data/lib/mongoid/persistence/operations/update.rb +7 -3
- data/lib/mongoid/railties/database.rake +12 -19
- data/lib/mongoid/relations.rb +2 -0
- data/lib/mongoid/relations/accessors.rb +30 -8
- data/lib/mongoid/relations/binding.rb +5 -1
- data/lib/mongoid/relations/bindings/referenced/in.rb +1 -1
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +3 -3
- data/lib/mongoid/relations/counter_cache.rb +107 -0
- data/lib/mongoid/relations/embedded/batchable.rb +13 -4
- data/lib/mongoid/relations/embedded/many.rb +30 -1
- data/lib/mongoid/relations/macros.rb +2 -0
- data/lib/mongoid/relations/marshalable.rb +0 -1
- data/lib/mongoid/relations/metadata.rb +63 -11
- data/lib/mongoid/relations/options.rb +1 -0
- data/lib/mongoid/relations/proxy.rb +45 -2
- data/lib/mongoid/relations/referenced/in.rb +11 -2
- data/lib/mongoid/relations/referenced/many.rb +31 -3
- data/lib/mongoid/relations/referenced/many_to_many.rb +31 -3
- data/lib/mongoid/relations/referenced/one.rb +1 -1
- data/lib/mongoid/relations/targets/enumerable.rb +5 -1
- data/lib/mongoid/relations/touchable.rb +35 -6
- data/lib/mongoid/reloading.rb +5 -3
- data/lib/mongoid/scoping.rb +2 -2
- data/lib/mongoid/sessions.rb +57 -7
- data/lib/mongoid/sessions/factory.rb +22 -1
- data/lib/mongoid/threaded.rb +4 -30
- data/lib/mongoid/threaded/lifecycle.rb +12 -12
- data/lib/mongoid/timestamps.rb +1 -0
- data/lib/mongoid/timestamps/created.rb +2 -0
- data/lib/mongoid/timestamps/created/short.rb +19 -0
- data/lib/mongoid/timestamps/short.rb +10 -0
- data/lib/mongoid/timestamps/updated.rb +2 -0
- data/lib/mongoid/timestamps/updated/short.rb +19 -0
- data/lib/mongoid/validations.rb +2 -0
- data/lib/mongoid/validations/queryable.rb +2 -2
- data/lib/mongoid/validations/uniqueness.rb +1 -18
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/model/model_generator.rb +1 -0
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +3 -0
- data/lib/rails/mongoid.rb +53 -29
- data/lib/support/ruby_version.rb +26 -0
- metadata +18 -7
data/lib/mongoid/validations.rb
CHANGED
@@ -19,11 +19,11 @@ module Mongoid
|
|
19
19
|
def with_query(document)
|
20
20
|
klass = document.class
|
21
21
|
begin
|
22
|
-
Threaded.
|
22
|
+
Threaded.begin_execution("#{klass.name}-validate-with-query")
|
23
23
|
yield
|
24
24
|
ensure
|
25
25
|
klass.clear_persistence_options unless document.errors.empty?
|
26
|
-
Threaded.
|
26
|
+
Threaded.exit_execution("#{klass.name}-validate-with-query")
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
@@ -267,7 +267,7 @@ module Mongoid
|
|
267
267
|
# @since 2.4.10
|
268
268
|
def validate_root(document, attribute, value)
|
269
269
|
criteria = create_criteria(klass, document, attribute, value)
|
270
|
-
if criteria.with(
|
270
|
+
if criteria.with(consistency: :strong).exists?
|
271
271
|
add_error(document, attribute, value)
|
272
272
|
end
|
273
273
|
end
|
@@ -288,23 +288,6 @@ module Mongoid
|
|
288
288
|
document.send("attribute_changed?", attribute.to_s) ||
|
289
289
|
scope_value_changed?(document)
|
290
290
|
end
|
291
|
-
|
292
|
-
# Get the persistence options to perform to check, merging with any
|
293
|
-
# existing.
|
294
|
-
#
|
295
|
-
# @api private
|
296
|
-
#
|
297
|
-
# @example Get the persistence options.
|
298
|
-
# validator.persistence_options(criteria)
|
299
|
-
#
|
300
|
-
# @param [ Criteria ] criteria The criteria.
|
301
|
-
#
|
302
|
-
# @return [ Hash ] The persistence options.
|
303
|
-
#
|
304
|
-
# @since 3.0.23
|
305
|
-
def persistence_options(criteria)
|
306
|
-
(criteria.klass.persistence_options || {}).merge!(consistency: :strong)
|
307
|
-
end
|
308
291
|
end
|
309
292
|
end
|
310
293
|
end
|
data/lib/mongoid/version.rb
CHANGED
@@ -13,6 +13,7 @@ module Mongoid
|
|
13
13
|
class_option :timestamps, type: :boolean
|
14
14
|
class_option :parent, type: :string, desc: "The parent class for the generated model"
|
15
15
|
class_option :versioning, type: :boolean, default: false, desc: "Enable mongoid versioning"
|
16
|
+
class_option :collection, type: :string, desc: "The collection for storing model's documents"
|
16
17
|
|
17
18
|
def create_model_file
|
18
19
|
template "model.rb.tt", File.join("app/models", class_path, "#{file_name}.rb")
|
@@ -9,6 +9,9 @@ class <%= class_name %><%= " < #{options[:parent].classify}" if options[:parent]
|
|
9
9
|
<% if options[:versioning] -%>
|
10
10
|
include Mongoid::Versioning
|
11
11
|
<% end -%>
|
12
|
+
<% if options[:collection] -%>
|
13
|
+
store_in collection: "<%= options[:collection] %>"
|
14
|
+
<% end -%>
|
12
15
|
<% attributes.reject{|attr| attr.reference?}.each do |attribute| -%>
|
13
16
|
field :<%= attribute.name %>, type: <%= attribute.type_class %>
|
14
17
|
<% end -%>
|
data/lib/rails/mongoid.rb
CHANGED
@@ -3,20 +3,19 @@ module Rails
|
|
3
3
|
module Mongoid
|
4
4
|
extend self
|
5
5
|
|
6
|
-
# Create indexes for each model given the provided
|
6
|
+
# Create indexes for each model given the provided globs and the class is
|
7
7
|
# not embedded.
|
8
8
|
#
|
9
9
|
# @example Create all the indexes.
|
10
10
|
# Rails::Mongoid.create_indexes("app/models/**/*.rb")
|
11
11
|
#
|
12
|
-
# @param [ String ]
|
12
|
+
# @param [ Array<String> ] globs The file matching globs.
|
13
13
|
#
|
14
|
-
# @return [ Array<
|
14
|
+
# @return [ Array<Class> ] The indexed models.
|
15
15
|
#
|
16
16
|
# @since 2.1.0
|
17
|
-
def create_indexes(
|
18
|
-
|
19
|
-
models(pattern).each do |model|
|
17
|
+
def create_indexes(*globs)
|
18
|
+
models(*globs).each do |model|
|
20
19
|
next if model.index_options.empty?
|
21
20
|
unless model.embedded?
|
22
21
|
model.create_indexes
|
@@ -24,55 +23,76 @@ module Rails
|
|
24
23
|
model.index_options.each_pair do |index, options|
|
25
24
|
logger.info("MONGOID: Index: #{index}, Options: #{options}")
|
26
25
|
end
|
26
|
+
model
|
27
27
|
else
|
28
28
|
logger.info("MONGOID: Index ignored on: #{model}, please define in the root model.")
|
29
|
+
nil
|
29
30
|
end
|
30
|
-
end
|
31
|
+
end.compact
|
31
32
|
end
|
32
33
|
|
33
|
-
# Remove indexes for each model given the provided
|
34
|
+
# Remove indexes for each model given the provided globs and the class is
|
34
35
|
# not embedded.
|
35
36
|
#
|
36
37
|
# @example Remove all the indexes.
|
37
38
|
# Rails::Mongoid.create_indexes("app/models/**/*.rb")
|
38
39
|
#
|
39
|
-
# @param [ String ]
|
40
|
+
# @param [ Array<String> ] globs The file matching globs.
|
40
41
|
#
|
41
|
-
# @return [ Array<
|
42
|
+
# @return [ Array<Class> ] The un-indexed models.
|
42
43
|
#
|
43
|
-
def remove_indexes(
|
44
|
-
|
45
|
-
models(pattern).each do |model|
|
44
|
+
def remove_indexes(*globs)
|
45
|
+
models(*globs).each do |model|
|
46
46
|
next if model.embedded?
|
47
47
|
indexes = model.collection.indexes.map{ |doc| doc["name"] }
|
48
48
|
indexes.delete_one("_id_")
|
49
49
|
model.remove_indexes
|
50
50
|
logger.info("MONGOID: Removing indexes on: #{model} for: #{indexes.join(', ')}.")
|
51
|
-
|
51
|
+
model
|
52
|
+
end.compact
|
52
53
|
end
|
53
54
|
|
54
|
-
# Return all models matching the
|
55
|
+
# Return all models matching the globs or, if no globs are specified, all
|
56
|
+
# possible models known from engines, the app, any gems, etc.
|
55
57
|
#
|
56
|
-
# @example Return all models.
|
58
|
+
# @example Return *all* models. Return all models under app/models/
|
59
|
+
# Rails::Mongoid.models
|
57
60
|
# Rails::Mongoid.models("app/models/**/*.rb")
|
58
61
|
#
|
59
|
-
# @param [ String ]
|
62
|
+
# @param [ String ] glob The file matching glob.
|
60
63
|
#
|
61
64
|
# @return [ Array<Class> ] The models.
|
62
65
|
#
|
63
|
-
def models(
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
66
|
+
def models(*globs)
|
67
|
+
all_possible_models = globs.empty?
|
68
|
+
|
69
|
+
if globs.empty?
|
70
|
+
engines_models_paths = Rails.application.railties.engines.map{|engine| engine.paths["app/models"].expanded}
|
71
|
+
root_models_paths = Rails.application.paths["app/models"]
|
72
|
+
models_paths = engines_models_paths.push(root_models_paths).flatten
|
73
|
+
globs.replace(models_paths.map{|path| "#{path}/**/*.rb"})
|
74
|
+
end
|
75
|
+
|
76
|
+
models = []
|
77
|
+
|
78
|
+
globs.flatten.compact.each do |glob|
|
79
|
+
Dir.glob(glob).map do |file|
|
80
|
+
begin
|
81
|
+
model = determine_model(file, logger)
|
82
|
+
models.push(model)
|
83
|
+
rescue => e
|
84
|
+
logger.error(%Q{MONGOID: Failed to determine model from #{file}:
|
85
|
+
#{e.class}:#{e.message}
|
86
|
+
#{e.backtrace.join("\n")}
|
87
|
+
})
|
88
|
+
nil
|
89
|
+
end
|
74
90
|
end
|
75
|
-
end
|
91
|
+
end
|
92
|
+
|
93
|
+
models = (::Mongoid.models | models) if all_possible_models
|
94
|
+
|
95
|
+
models.compact.sort_by { |model| model.name || '' }
|
76
96
|
end
|
77
97
|
|
78
98
|
# Use the application configuration to get every model and require it, so
|
@@ -150,5 +170,9 @@ module Rails
|
|
150
170
|
end
|
151
171
|
klass if klass && klass.ancestors.include?(::Mongoid::Document)
|
152
172
|
end
|
173
|
+
|
174
|
+
def logger
|
175
|
+
@logger ||= Logger.new($stdout)
|
176
|
+
end
|
153
177
|
end
|
154
178
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# Go ahead and fail if not using Ruby 1.9.3, no since in letting people
|
2
|
+
# squarm for answers
|
3
|
+
def raise_version_error(message)
|
4
|
+
puts message
|
5
|
+
Rails.logger.info(message) if defined?(Rails)
|
6
|
+
raise
|
7
|
+
end
|
8
|
+
|
9
|
+
def invalid_version?
|
10
|
+
RUBY_VERSION =~ /([\d]+)\.([\d]+)\.([\d]+)/
|
11
|
+
major, minor, revision = $1.to_i, $2.to_i, $3.to_i
|
12
|
+
if defined?(JRUBY_VERSION)
|
13
|
+
major <= 1 && minor <= 9 && revision <= 1
|
14
|
+
else
|
15
|
+
major <= 1 && minor <= 9 && revision <= 2
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
if invalid_version?
|
20
|
+
message = %{
|
21
|
+
Mongoid requires MRI version 1.9.3+ or JRuby 1.6.0+ running in 1.9 mode.
|
22
|
+
You're current Ruby version is defined as #{RUBY_VERSION}. Please see:
|
23
|
+
http://mongoid.org/en/mongoid/docs/tips.html#ruby for details.
|
24
|
+
}
|
25
|
+
raise_version_error(message)
|
26
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongoid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0
|
4
|
+
version: 3.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-02-
|
12
|
+
date: 2013-02-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activemodel
|
@@ -18,7 +18,7 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: '3.
|
21
|
+
version: '3.2'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: '3.
|
29
|
+
version: '3.2'
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: tzinfo
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -50,7 +50,7 @@ dependencies:
|
|
50
50
|
requirements:
|
51
51
|
- - ~>
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version:
|
53
|
+
version: 1.4.2
|
54
54
|
type: :runtime
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -58,7 +58,7 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 1.4.2
|
62
62
|
- !ruby/object:Gem::Dependency
|
63
63
|
name: origin
|
64
64
|
requirement: !ruby/object:Gem::Requirement
|
@@ -90,6 +90,7 @@ files:
|
|
90
90
|
- lib/mongoid/atomic/paths/embedded.rb
|
91
91
|
- lib/mongoid/atomic/paths/root.rb
|
92
92
|
- lib/mongoid/atomic/paths.rb
|
93
|
+
- lib/mongoid/atomic/positionable.rb
|
93
94
|
- lib/mongoid/atomic.rb
|
94
95
|
- lib/mongoid/attributes/processing.rb
|
95
96
|
- lib/mongoid/attributes/readonly.rb
|
@@ -109,17 +110,22 @@ files:
|
|
109
110
|
- lib/mongoid/contextual/command.rb
|
110
111
|
- lib/mongoid/contextual/eager.rb
|
111
112
|
- lib/mongoid/contextual/find_and_modify.rb
|
113
|
+
- lib/mongoid/contextual/geo_near.rb
|
112
114
|
- lib/mongoid/contextual/map_reduce.rb
|
113
115
|
- lib/mongoid/contextual/memory.rb
|
114
116
|
- lib/mongoid/contextual/mongo.rb
|
117
|
+
- lib/mongoid/contextual/queryable.rb
|
115
118
|
- lib/mongoid/contextual.rb
|
116
119
|
- lib/mongoid/copyable.rb
|
117
120
|
- lib/mongoid/criteria.rb
|
121
|
+
- lib/mongoid/criterion/findable.rb
|
118
122
|
- lib/mongoid/criterion/inspection.rb
|
119
123
|
- lib/mongoid/criterion/marshalable.rb
|
124
|
+
- lib/mongoid/criterion/modifiable.rb
|
120
125
|
- lib/mongoid/criterion/scoping.rb
|
121
126
|
- lib/mongoid/dirty.rb
|
122
127
|
- lib/mongoid/document.rb
|
128
|
+
- lib/mongoid/equality.rb
|
123
129
|
- lib/mongoid/errors/ambiguous_relationship.rb
|
124
130
|
- lib/mongoid/errors/callback.rb
|
125
131
|
- lib/mongoid/errors/delete_restriction.rb
|
@@ -276,6 +282,7 @@ files:
|
|
276
282
|
- lib/mongoid/relations/cascading.rb
|
277
283
|
- lib/mongoid/relations/constraint.rb
|
278
284
|
- lib/mongoid/relations/conversions.rb
|
285
|
+
- lib/mongoid/relations/counter_cache.rb
|
279
286
|
- lib/mongoid/relations/cyclic.rb
|
280
287
|
- lib/mongoid/relations/embedded/batchable.rb
|
281
288
|
- lib/mongoid/relations/embedded/in.rb
|
@@ -312,8 +319,11 @@ files:
|
|
312
319
|
- lib/mongoid/state.rb
|
313
320
|
- lib/mongoid/threaded/lifecycle.rb
|
314
321
|
- lib/mongoid/threaded.rb
|
322
|
+
- lib/mongoid/timestamps/created/short.rb
|
315
323
|
- lib/mongoid/timestamps/created.rb
|
324
|
+
- lib/mongoid/timestamps/short.rb
|
316
325
|
- lib/mongoid/timestamps/timeless.rb
|
326
|
+
- lib/mongoid/timestamps/updated/short.rb
|
317
327
|
- lib/mongoid/timestamps/updated.rb
|
318
328
|
- lib/mongoid/timestamps.rb
|
319
329
|
- lib/mongoid/unit_of_work.rb
|
@@ -339,6 +349,7 @@ files:
|
|
339
349
|
- lib/rails/generators/mongoid/observer/templates/observer.rb.tt
|
340
350
|
- lib/rails/generators/mongoid_generator.rb
|
341
351
|
- lib/rails/mongoid.rb
|
352
|
+
- lib/support/ruby_version.rb
|
342
353
|
- CHANGELOG.md
|
343
354
|
- LICENSE
|
344
355
|
- README.md
|
@@ -364,7 +375,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
364
375
|
version: 1.3.6
|
365
376
|
requirements: []
|
366
377
|
rubyforge_project: mongoid
|
367
|
-
rubygems_version: 1.8.
|
378
|
+
rubygems_version: 1.8.24
|
368
379
|
signing_key:
|
369
380
|
specification_version: 3
|
370
381
|
summary: Elegant Persistance in Ruby for MongoDB.
|