pwnash-mongo_mapper 0.7.5 → 0.7.6
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/lib/mongo_mapper.rb +6 -8
- data/lib/mongo_mapper/document.rb +6 -281
- data/lib/mongo_mapper/embedded_document.rb +5 -45
- data/lib/mongo_mapper/extensions.rb +190 -0
- data/lib/mongo_mapper/plugins.rb +27 -18
- data/lib/mongo_mapper/plugins/associations.rb +7 -6
- data/lib/mongo_mapper/plugins/associations/base.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/collection.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/embedded_collection.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/in_array_proxy.rb +2 -1
- data/lib/mongo_mapper/plugins/associations/many_documents_as_proxy.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +4 -4
- data/lib/mongo_mapper/plugins/associations/many_embedded_polymorphic_proxy.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/many_polymorphic_proxy.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/one_embedded_proxy.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/one_proxy.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/proxy.rb +1 -0
- data/lib/mongo_mapper/plugins/callbacks.rb +4 -3
- data/lib/mongo_mapper/plugins/clone.rb +1 -0
- data/lib/mongo_mapper/plugins/descendants.rb +1 -0
- data/lib/mongo_mapper/plugins/dirty.rb +1 -0
- data/lib/mongo_mapper/plugins/document.rb +40 -0
- data/lib/mongo_mapper/plugins/dynamic_querying.rb +42 -0
- data/lib/mongo_mapper/{support/find.rb → plugins/dynamic_querying/dynamic_finder.rb} +2 -36
- data/lib/mongo_mapper/plugins/embedded_document.rb +48 -0
- data/lib/mongo_mapper/plugins/equality.rb +1 -0
- data/lib/mongo_mapper/plugins/identity_map.rb +8 -11
- data/lib/mongo_mapper/plugins/indexes.rb +11 -0
- data/lib/mongo_mapper/plugins/inspect.rb +1 -0
- data/lib/mongo_mapper/plugins/keys.rb +7 -9
- data/lib/mongo_mapper/plugins/keys/key.rb +12 -2
- data/lib/mongo_mapper/plugins/logger.rb +1 -0
- data/lib/mongo_mapper/plugins/modifiers.rb +3 -2
- data/lib/mongo_mapper/plugins/pagination.rb +1 -0
- data/lib/mongo_mapper/plugins/pagination/proxy.rb +1 -0
- data/lib/mongo_mapper/plugins/persistence.rb +1 -0
- data/lib/mongo_mapper/plugins/protected.rb +1 -0
- data/lib/mongo_mapper/plugins/query_logger.rb +5 -10
- data/lib/mongo_mapper/plugins/querying.rb +236 -0
- data/lib/mongo_mapper/plugins/rails.rb +1 -0
- data/lib/mongo_mapper/plugins/sci.rb +31 -0
- data/lib/mongo_mapper/plugins/serialization.rb +1 -0
- data/lib/mongo_mapper/plugins/timestamps.rb +1 -0
- data/lib/mongo_mapper/plugins/userstamps.rb +1 -0
- data/lib/mongo_mapper/plugins/validations.rb +5 -1
- data/lib/mongo_mapper/query.rb +53 -120
- data/lib/mongo_mapper/support.rb +2 -213
- data/lib/mongo_mapper/support/descendant_appends.rb +3 -6
- data/lib/mongo_mapper/version.rb +2 -1
- metadata +156 -190
- data/.gitignore +0 -10
- data/Rakefile +0 -37
- data/mongo_mapper.gemspec +0 -216
- data/performance/read_write.rb +0 -52
- data/specs.watchr +0 -51
- data/test/NOTE_ON_TESTING +0 -1
- data/test/active_model_lint_test.rb +0 -13
- data/test/functional/associations/test_belongs_to_polymorphic_proxy.rb +0 -63
- data/test/functional/associations/test_belongs_to_proxy.rb +0 -101
- data/test/functional/associations/test_in_array_proxy.rb +0 -325
- data/test/functional/associations/test_many_documents_as_proxy.rb +0 -229
- data/test/functional/associations/test_many_documents_proxy.rb +0 -536
- data/test/functional/associations/test_many_embedded_polymorphic_proxy.rb +0 -176
- data/test/functional/associations/test_many_embedded_proxy.rb +0 -256
- data/test/functional/associations/test_many_polymorphic_proxy.rb +0 -302
- data/test/functional/associations/test_one_embedded_proxy.rb +0 -68
- data/test/functional/associations/test_one_proxy.rb +0 -196
- data/test/functional/test_associations.rb +0 -44
- data/test/functional/test_binary.rb +0 -27
- data/test/functional/test_callbacks.rb +0 -151
- data/test/functional/test_dirty.rb +0 -163
- data/test/functional/test_document.rb +0 -1219
- data/test/functional/test_embedded_document.rb +0 -210
- data/test/functional/test_identity_map.rb +0 -507
- data/test/functional/test_indexing.rb +0 -44
- data/test/functional/test_logger.rb +0 -20
- data/test/functional/test_modifiers.rb +0 -416
- data/test/functional/test_pagination.rb +0 -93
- data/test/functional/test_protected.rb +0 -163
- data/test/functional/test_string_id_compatibility.rb +0 -67
- data/test/functional/test_timestamps.rb +0 -64
- data/test/functional/test_userstamps.rb +0 -28
- data/test/functional/test_validations.rb +0 -342
- data/test/models.rb +0 -227
- data/test/support/custom_matchers.rb +0 -37
- data/test/support/timing.rb +0 -16
- data/test/test_helper.rb +0 -64
- data/test/unit/associations/test_base.rb +0 -212
- data/test/unit/associations/test_proxy.rb +0 -105
- data/test/unit/serializers/test_json_serializer.rb +0 -202
- data/test/unit/test_descendant_appends.rb +0 -71
- data/test/unit/test_document.rb +0 -225
- data/test/unit/test_dynamic_finder.rb +0 -123
- data/test/unit/test_embedded_document.rb +0 -657
- data/test/unit/test_keys.rb +0 -216
- data/test/unit/test_mongo_mapper.rb +0 -118
- data/test/unit/test_pagination.rb +0 -160
- data/test/unit/test_plugins.rb +0 -50
- data/test/unit/test_query.rb +0 -374
- data/test/unit/test_rails.rb +0 -181
- data/test/unit/test_rails_compatibility.rb +0 -52
- data/test/unit/test_serialization.rb +0 -51
- data/test/unit/test_support.rb +0 -390
- data/test/unit/test_time_zones.rb +0 -39
- data/test/unit/test_validations.rb +0 -544
@@ -1,8 +1,12 @@
|
|
1
|
+
# encoding: UTF-8
|
1
2
|
module MongoMapper
|
2
3
|
module Plugins
|
3
4
|
module Validations
|
4
5
|
def self.configure(model)
|
5
|
-
model.class_eval
|
6
|
+
model.class_eval do
|
7
|
+
include Validatable
|
8
|
+
extend Plugins::Validations::DocumentMacros
|
9
|
+
end
|
6
10
|
end
|
7
11
|
|
8
12
|
module DocumentMacros
|
data/lib/mongo_mapper/query.rb
CHANGED
@@ -1,143 +1,76 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'forwardable'
|
1
3
|
module MongoMapper
|
2
|
-
# IMPORTANT
|
3
|
-
# This class is private to MongoMapper and should not be considered part of MongoMapper's public API.
|
4
|
-
#
|
5
4
|
class Query
|
6
|
-
|
5
|
+
extend Forwardable
|
7
6
|
|
8
|
-
attr_reader :model
|
7
|
+
attr_reader :query, :model
|
8
|
+
def_delegators :query, :count, :fields?, :simple?, :to_hash, :[], :[]=
|
9
9
|
|
10
|
-
def initialize(model
|
11
|
-
|
12
|
-
@
|
13
|
-
separate_options_and_conditions
|
14
|
-
add_sci_condition
|
10
|
+
def initialize(model)
|
11
|
+
@model = model
|
12
|
+
@query = Plucky::Query.new(model.collection).object_ids(model.object_id_keys)
|
15
13
|
end
|
16
14
|
|
17
|
-
def
|
18
|
-
|
15
|
+
def initialize_copy(source)
|
16
|
+
super
|
17
|
+
@query = @query.clone
|
19
18
|
end
|
20
19
|
|
21
|
-
def
|
22
|
-
|
23
|
-
skip = @options[:skip] || @options[:offset] || 0
|
24
|
-
limit = @options[:limit] || 0
|
25
|
-
sort = @options[:sort] || normalized_sort(@options[:order])
|
26
|
-
|
27
|
-
{:fields => to_fields(fields), :skip => skip.to_i, :limit => limit.to_i, :sort => sort}
|
20
|
+
def all(opts={})
|
21
|
+
spawn.update(opts).all.map { |doc| load(doc) }
|
28
22
|
end
|
29
23
|
|
30
|
-
def
|
31
|
-
|
24
|
+
def first(opts={})
|
25
|
+
load(spawn.update(opts).first)
|
32
26
|
end
|
33
27
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
key = key.respond_to?(:to_sym) ? key.to_sym : key
|
38
|
-
|
39
|
-
if OptionKeys.include?(key)
|
40
|
-
@options[key] = value
|
41
|
-
elsif key == :conditions
|
42
|
-
@conditions.update(value)
|
43
|
-
else
|
44
|
-
@conditions[key] = value
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
# adds _type single collection inheritance scope for models that need it
|
50
|
-
def add_sci_condition
|
51
|
-
@conditions[:_type] = model.to_s if model.single_collection_inherited?
|
52
|
-
end
|
53
|
-
|
54
|
-
def modifier?(field)
|
55
|
-
field.to_s =~ /^\$/
|
56
|
-
end
|
57
|
-
|
58
|
-
def symbol_operator?(object)
|
59
|
-
object.respond_to?(:field, :operator)
|
60
|
-
end
|
61
|
-
|
62
|
-
def to_criteria(conditions, parent_key=nil)
|
63
|
-
criteria = {}
|
64
|
-
|
65
|
-
conditions.each_pair do |key, value|
|
66
|
-
key = normalized_key(key)
|
67
|
-
|
68
|
-
if model.object_id_key?(key)
|
69
|
-
case value
|
70
|
-
when String
|
71
|
-
value = ObjectId.to_mongo(value)
|
72
|
-
when Array
|
73
|
-
value.map! { |id| ObjectId.to_mongo(id) }
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
if symbol_operator?(key)
|
78
|
-
key, value = normalized_key(key.field), {"$#{key.operator}" => value}
|
79
|
-
end
|
80
|
-
|
81
|
-
criteria[key] = normalized_value(criteria, key, value)
|
82
|
-
end
|
28
|
+
def last(opts={})
|
29
|
+
load(spawn.update(opts).last)
|
30
|
+
end
|
83
31
|
|
84
|
-
|
85
|
-
|
32
|
+
def spawn
|
33
|
+
query.clone
|
34
|
+
end
|
86
35
|
|
87
|
-
|
88
|
-
|
89
|
-
|
36
|
+
def update(*args)
|
37
|
+
query.update(*args)
|
38
|
+
self
|
39
|
+
end
|
90
40
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
end
|
96
|
-
end
|
41
|
+
def where(*args)
|
42
|
+
query.where(*args)
|
43
|
+
self
|
44
|
+
end
|
97
45
|
|
98
|
-
|
99
|
-
|
100
|
-
|
46
|
+
def fields(*args)
|
47
|
+
query.fields(*args)
|
48
|
+
self
|
49
|
+
end
|
101
50
|
|
102
|
-
|
103
|
-
|
104
|
-
|
51
|
+
def limit(*args)
|
52
|
+
query.limit(*args)
|
53
|
+
self
|
54
|
+
end
|
105
55
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
modifier?(key) ? value.to_a : {'$in' => value.to_a}
|
111
|
-
when Hash
|
112
|
-
if criteria[key].kind_of?(Hash)
|
113
|
-
criteria[key].dup.merge(to_criteria(value, key))
|
114
|
-
else
|
115
|
-
to_criteria(value, key)
|
116
|
-
end
|
117
|
-
when Time
|
118
|
-
value.utc
|
119
|
-
else
|
120
|
-
value
|
121
|
-
end
|
122
|
-
end
|
56
|
+
def skip(*args)
|
57
|
+
query.skip(*args)
|
58
|
+
self
|
59
|
+
end
|
123
60
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
61
|
+
def sort(*args)
|
62
|
+
query.sort(*args)
|
63
|
+
self
|
64
|
+
end
|
128
65
|
|
129
|
-
|
130
|
-
|
66
|
+
def reverse
|
67
|
+
query.reverse
|
68
|
+
self
|
69
|
+
end
|
131
70
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
[to_order(sort.field, sort.operator)]
|
136
|
-
else
|
137
|
-
sort.split(',').map do |str|
|
138
|
-
to_order(*str.strip.split(' '))
|
139
|
-
end
|
140
|
-
end
|
71
|
+
private
|
72
|
+
def load(doc)
|
73
|
+
model.load(doc)
|
141
74
|
end
|
142
75
|
end
|
143
|
-
end
|
76
|
+
end
|
data/lib/mongo_mapper/support.rb
CHANGED
@@ -1,218 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
value = value.respond_to?(:lines) ? value.lines : value
|
4
|
-
value.to_a
|
5
|
-
end
|
6
|
-
|
7
|
-
def self.from_mongo(value)
|
8
|
-
value || []
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
class Binary
|
13
|
-
def self.to_mongo(value)
|
14
|
-
if value.is_a?(BSON::Binary)
|
15
|
-
value
|
16
|
-
else
|
17
|
-
value.nil? ? nil : BSON::Binary.new(value)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def self.from_mongo(value)
|
22
|
-
value
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
class Boolean
|
27
|
-
BOOLEAN_MAPPING = {
|
28
|
-
true => true, 'true' => true, 'TRUE' => true, 'True' => true, 't' => true, 'T' => true, '1' => true, 1 => true, 1.0 => true,
|
29
|
-
false => false, 'false' => false, 'FALSE' => false, 'False' => false, 'f' => false, 'F' => false, '0' => false, 0 => false, 0.0 => false, nil => nil
|
30
|
-
}
|
31
|
-
|
32
|
-
def self.to_mongo(value)
|
33
|
-
if value.is_a?(Boolean)
|
34
|
-
value
|
35
|
-
else
|
36
|
-
BOOLEAN_MAPPING[value]
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def self.from_mongo(value)
|
41
|
-
!!value
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
class Date
|
46
|
-
def self.to_mongo(value)
|
47
|
-
if value.nil? || value == ''
|
48
|
-
nil
|
49
|
-
else
|
50
|
-
date = value.is_a?(Date) || value.is_a?(Time) ? value : Date.parse(value.to_s)
|
51
|
-
Time.utc(date.year, date.month, date.day)
|
52
|
-
end
|
53
|
-
rescue
|
54
|
-
nil
|
55
|
-
end
|
56
|
-
|
57
|
-
def self.from_mongo(value)
|
58
|
-
value.to_date if value.present?
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
class Float
|
63
|
-
def self.to_mongo(value)
|
64
|
-
value.nil? ? nil : value.to_f
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
class Hash
|
69
|
-
def self.from_mongo(value)
|
70
|
-
HashWithIndifferentAccess.new(value || {})
|
71
|
-
end
|
72
|
-
|
73
|
-
def to_mongo
|
74
|
-
self
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
class Integer
|
79
|
-
def self.to_mongo(value)
|
80
|
-
value_to_i = value.to_i
|
81
|
-
if value_to_i == 0 && value != value_to_i
|
82
|
-
value.to_s =~ /^(0x|0b)?0+/ ? 0 : nil
|
83
|
-
else
|
84
|
-
value_to_i
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
class NilClass
|
90
|
-
def to_mongo(value)
|
91
|
-
value
|
92
|
-
end
|
93
|
-
|
94
|
-
def from_mongo(value)
|
95
|
-
value
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
class Object
|
100
|
-
# The hidden singleton lurks behind everyone
|
101
|
-
def metaclass
|
102
|
-
class << self; self end
|
103
|
-
end
|
104
|
-
|
105
|
-
def meta_eval(&blk)
|
106
|
-
metaclass.instance_eval(&blk)
|
107
|
-
end
|
108
|
-
|
109
|
-
# Adds methods to a metaclass
|
110
|
-
def meta_def(name, &blk)
|
111
|
-
meta_eval { define_method(name, &blk) }
|
112
|
-
end
|
113
|
-
|
114
|
-
# Defines an instance method within a class
|
115
|
-
def class_def(name, &blk)
|
116
|
-
class_eval { define_method(name, &blk) }
|
117
|
-
end
|
118
|
-
|
119
|
-
def self.to_mongo(value)
|
120
|
-
value
|
121
|
-
end
|
122
|
-
|
123
|
-
def self.from_mongo(value)
|
124
|
-
value
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
class ObjectId
|
129
|
-
def self.to_mongo(value)
|
130
|
-
if value.blank?
|
131
|
-
nil
|
132
|
-
elsif value.is_a?(BSON::ObjectID)
|
133
|
-
value
|
134
|
-
else
|
135
|
-
BSON::ObjectID.from_string(value.to_s)
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
def self.from_mongo(value)
|
140
|
-
value
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
class Set
|
145
|
-
def self.to_mongo(value)
|
146
|
-
value.to_a
|
147
|
-
end
|
148
|
-
|
149
|
-
def self.from_mongo(value)
|
150
|
-
Set.new(value || [])
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
class String
|
155
|
-
def self.to_mongo(value)
|
156
|
-
value.nil? ? nil : value.to_s
|
157
|
-
end
|
158
|
-
|
159
|
-
def self.from_mongo(value)
|
160
|
-
value.nil? ? nil : value.to_s
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
class SymbolOperator
|
165
|
-
attr_reader :field, :operator
|
166
|
-
|
167
|
-
def initialize(field, operator, options={})
|
168
|
-
@field, @operator = field, operator
|
169
|
-
end unless method_defined?(:initialize)
|
170
|
-
end
|
171
|
-
|
172
|
-
class Symbol
|
173
|
-
%w(gt lt gte lte ne in nin mod all size where exists asc desc).each do |operator|
|
174
|
-
define_method(operator) do
|
175
|
-
SymbolOperator.new(self, operator)
|
176
|
-
end unless method_defined?(operator)
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
class Time
|
181
|
-
def self.to_mongo(value)
|
182
|
-
if value.nil? || value == ''
|
183
|
-
nil
|
184
|
-
else
|
185
|
-
time_class = Time.try(:zone).present? ? Time.zone : Time
|
186
|
-
time = value.is_a?(Time) ? value : time_class.parse(value.to_s)
|
187
|
-
# strip milliseconds as Ruby does micro and bson does milli and rounding rounded wrong
|
188
|
-
at(time.to_i).utc if time
|
189
|
-
end
|
190
|
-
end
|
191
|
-
|
192
|
-
def self.from_mongo(value)
|
193
|
-
if Time.try(:zone).present? && value.present?
|
194
|
-
value.in_time_zone(Time.zone)
|
195
|
-
else
|
196
|
-
value
|
197
|
-
end
|
198
|
-
end
|
199
|
-
end
|
200
|
-
|
201
|
-
class BSON::ObjectID
|
202
|
-
alias_method :original_to_json, :to_json
|
203
|
-
|
204
|
-
def as_json(options=nil)
|
205
|
-
to_s
|
206
|
-
end
|
207
|
-
|
208
|
-
def to_json(options = nil)
|
209
|
-
as_json.to_json
|
210
|
-
end
|
211
|
-
end
|
212
|
-
|
1
|
+
# encoding: UTF-8
|
2
|
+
# All the core extensions now live in extensions.rb.
|
213
3
|
module MongoMapper
|
214
4
|
module Support
|
215
5
|
autoload :DescendantAppends, 'mongo_mapper/support/descendant_appends'
|
216
|
-
autoload :Find, 'mongo_mapper/support/find'
|
217
6
|
end
|
218
7
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# encoding: UTF-8
|
1
2
|
module MongoMapper
|
2
3
|
module Support
|
3
4
|
module DescendantAppends
|
@@ -14,9 +15,7 @@ module MongoMapper
|
|
14
15
|
|
15
16
|
# @api public
|
16
17
|
def append_extensions(*extensions)
|
17
|
-
extra_extensions.concat
|
18
|
-
|
19
|
-
# Add the extension to existing descendants
|
18
|
+
extra_extensions.concat(extensions)
|
20
19
|
descendants.each do |model|
|
21
20
|
extensions.each { |extension| model.extend(extension) }
|
22
21
|
end
|
@@ -24,9 +23,7 @@ module MongoMapper
|
|
24
23
|
|
25
24
|
# @api public
|
26
25
|
def append_inclusions(*inclusions)
|
27
|
-
extra_inclusions.concat
|
28
|
-
|
29
|
-
# Add the inclusion to existing descendants
|
26
|
+
extra_inclusions.concat(inclusions)
|
30
27
|
descendants.each do |model|
|
31
28
|
inclusions.each { |inclusion| model.send(:include, inclusion) }
|
32
29
|
end
|