pwnash-mongo_mapper 0.7.5 → 0.7.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. data/lib/mongo_mapper.rb +6 -8
  2. data/lib/mongo_mapper/document.rb +6 -281
  3. data/lib/mongo_mapper/embedded_document.rb +5 -45
  4. data/lib/mongo_mapper/extensions.rb +190 -0
  5. data/lib/mongo_mapper/plugins.rb +27 -18
  6. data/lib/mongo_mapper/plugins/associations.rb +7 -6
  7. data/lib/mongo_mapper/plugins/associations/base.rb +1 -0
  8. data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +1 -0
  9. data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +1 -0
  10. data/lib/mongo_mapper/plugins/associations/collection.rb +1 -0
  11. data/lib/mongo_mapper/plugins/associations/embedded_collection.rb +1 -0
  12. data/lib/mongo_mapper/plugins/associations/in_array_proxy.rb +2 -1
  13. data/lib/mongo_mapper/plugins/associations/many_documents_as_proxy.rb +1 -0
  14. data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +4 -4
  15. data/lib/mongo_mapper/plugins/associations/many_embedded_polymorphic_proxy.rb +1 -0
  16. data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +1 -0
  17. data/lib/mongo_mapper/plugins/associations/many_polymorphic_proxy.rb +1 -0
  18. data/lib/mongo_mapper/plugins/associations/one_embedded_proxy.rb +1 -0
  19. data/lib/mongo_mapper/plugins/associations/one_proxy.rb +1 -0
  20. data/lib/mongo_mapper/plugins/associations/proxy.rb +1 -0
  21. data/lib/mongo_mapper/plugins/callbacks.rb +4 -3
  22. data/lib/mongo_mapper/plugins/clone.rb +1 -0
  23. data/lib/mongo_mapper/plugins/descendants.rb +1 -0
  24. data/lib/mongo_mapper/plugins/dirty.rb +1 -0
  25. data/lib/mongo_mapper/plugins/document.rb +40 -0
  26. data/lib/mongo_mapper/plugins/dynamic_querying.rb +42 -0
  27. data/lib/mongo_mapper/{support/find.rb → plugins/dynamic_querying/dynamic_finder.rb} +2 -36
  28. data/lib/mongo_mapper/plugins/embedded_document.rb +48 -0
  29. data/lib/mongo_mapper/plugins/equality.rb +1 -0
  30. data/lib/mongo_mapper/plugins/identity_map.rb +8 -11
  31. data/lib/mongo_mapper/plugins/indexes.rb +11 -0
  32. data/lib/mongo_mapper/plugins/inspect.rb +1 -0
  33. data/lib/mongo_mapper/plugins/keys.rb +7 -9
  34. data/lib/mongo_mapper/plugins/keys/key.rb +12 -2
  35. data/lib/mongo_mapper/plugins/logger.rb +1 -0
  36. data/lib/mongo_mapper/plugins/modifiers.rb +3 -2
  37. data/lib/mongo_mapper/plugins/pagination.rb +1 -0
  38. data/lib/mongo_mapper/plugins/pagination/proxy.rb +1 -0
  39. data/lib/mongo_mapper/plugins/persistence.rb +1 -0
  40. data/lib/mongo_mapper/plugins/protected.rb +1 -0
  41. data/lib/mongo_mapper/plugins/query_logger.rb +5 -10
  42. data/lib/mongo_mapper/plugins/querying.rb +236 -0
  43. data/lib/mongo_mapper/plugins/rails.rb +1 -0
  44. data/lib/mongo_mapper/plugins/sci.rb +31 -0
  45. data/lib/mongo_mapper/plugins/serialization.rb +1 -0
  46. data/lib/mongo_mapper/plugins/timestamps.rb +1 -0
  47. data/lib/mongo_mapper/plugins/userstamps.rb +1 -0
  48. data/lib/mongo_mapper/plugins/validations.rb +5 -1
  49. data/lib/mongo_mapper/query.rb +53 -120
  50. data/lib/mongo_mapper/support.rb +2 -213
  51. data/lib/mongo_mapper/support/descendant_appends.rb +3 -6
  52. data/lib/mongo_mapper/version.rb +2 -1
  53. metadata +156 -190
  54. data/.gitignore +0 -10
  55. data/Rakefile +0 -37
  56. data/mongo_mapper.gemspec +0 -216
  57. data/performance/read_write.rb +0 -52
  58. data/specs.watchr +0 -51
  59. data/test/NOTE_ON_TESTING +0 -1
  60. data/test/active_model_lint_test.rb +0 -13
  61. data/test/functional/associations/test_belongs_to_polymorphic_proxy.rb +0 -63
  62. data/test/functional/associations/test_belongs_to_proxy.rb +0 -101
  63. data/test/functional/associations/test_in_array_proxy.rb +0 -325
  64. data/test/functional/associations/test_many_documents_as_proxy.rb +0 -229
  65. data/test/functional/associations/test_many_documents_proxy.rb +0 -536
  66. data/test/functional/associations/test_many_embedded_polymorphic_proxy.rb +0 -176
  67. data/test/functional/associations/test_many_embedded_proxy.rb +0 -256
  68. data/test/functional/associations/test_many_polymorphic_proxy.rb +0 -302
  69. data/test/functional/associations/test_one_embedded_proxy.rb +0 -68
  70. data/test/functional/associations/test_one_proxy.rb +0 -196
  71. data/test/functional/test_associations.rb +0 -44
  72. data/test/functional/test_binary.rb +0 -27
  73. data/test/functional/test_callbacks.rb +0 -151
  74. data/test/functional/test_dirty.rb +0 -163
  75. data/test/functional/test_document.rb +0 -1219
  76. data/test/functional/test_embedded_document.rb +0 -210
  77. data/test/functional/test_identity_map.rb +0 -507
  78. data/test/functional/test_indexing.rb +0 -44
  79. data/test/functional/test_logger.rb +0 -20
  80. data/test/functional/test_modifiers.rb +0 -416
  81. data/test/functional/test_pagination.rb +0 -93
  82. data/test/functional/test_protected.rb +0 -163
  83. data/test/functional/test_string_id_compatibility.rb +0 -67
  84. data/test/functional/test_timestamps.rb +0 -64
  85. data/test/functional/test_userstamps.rb +0 -28
  86. data/test/functional/test_validations.rb +0 -342
  87. data/test/models.rb +0 -227
  88. data/test/support/custom_matchers.rb +0 -37
  89. data/test/support/timing.rb +0 -16
  90. data/test/test_helper.rb +0 -64
  91. data/test/unit/associations/test_base.rb +0 -212
  92. data/test/unit/associations/test_proxy.rb +0 -105
  93. data/test/unit/serializers/test_json_serializer.rb +0 -202
  94. data/test/unit/test_descendant_appends.rb +0 -71
  95. data/test/unit/test_document.rb +0 -225
  96. data/test/unit/test_dynamic_finder.rb +0 -123
  97. data/test/unit/test_embedded_document.rb +0 -657
  98. data/test/unit/test_keys.rb +0 -216
  99. data/test/unit/test_mongo_mapper.rb +0 -118
  100. data/test/unit/test_pagination.rb +0 -160
  101. data/test/unit/test_plugins.rb +0 -50
  102. data/test/unit/test_query.rb +0 -374
  103. data/test/unit/test_rails.rb +0 -181
  104. data/test/unit/test_rails_compatibility.rb +0 -52
  105. data/test/unit/test_serialization.rb +0 -51
  106. data/test/unit/test_support.rb +0 -390
  107. data/test/unit/test_time_zones.rb +0 -39
  108. data/test/unit/test_validations.rb +0 -544
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  require 'active_support/json'
2
3
 
3
4
  module MongoMapper
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Timestamps
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Userstamps
@@ -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 { include Validatable }
6
+ model.class_eval do
7
+ include Validatable
8
+ extend Plugins::Validations::DocumentMacros
9
+ end
6
10
  end
7
11
 
8
12
  module DocumentMacros
@@ -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
- OptionKeys = [:fields, :select, :skip, :offset, :limit, :sort, :order]
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, options)
11
- raise ArgumentError, "Options must be a hash" unless options.is_a?(Hash)
12
- @model, @options, @conditions, @original_options = model, {}, {}, options
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 criteria
18
- to_criteria(@conditions)
15
+ def initialize_copy(source)
16
+ super
17
+ @query = @query.clone
19
18
  end
20
19
 
21
- def options
22
- fields = @options[:fields] || @options[:select]
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 to_a
31
- [criteria, options]
24
+ def first(opts={})
25
+ load(spawn.update(opts).first)
32
26
  end
33
27
 
34
- private
35
- def separate_options_and_conditions
36
- @original_options.each_pair do |key, value|
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
- criteria
85
- end
32
+ def spawn
33
+ query.clone
34
+ end
86
35
 
87
- def to_fields(keys)
88
- return keys if keys.is_a?(Hash)
89
- return nil if keys.blank?
36
+ def update(*args)
37
+ query.update(*args)
38
+ self
39
+ end
90
40
 
91
- if keys.respond_to?(:flatten, :compact)
92
- keys.flatten.compact
93
- else
94
- keys.split(',').map { |key| key.strip }
95
- end
96
- end
41
+ def where(*args)
42
+ query.where(*args)
43
+ self
44
+ end
97
45
 
98
- def to_order(key, direction=nil)
99
- [normalized_key(key).to_s, normalized_direction(direction)]
100
- end
46
+ def fields(*args)
47
+ query.fields(*args)
48
+ self
49
+ end
101
50
 
102
- def normalized_key(key)
103
- key.to_s == 'id' ? :_id : key
104
- end
51
+ def limit(*args)
52
+ query.limit(*args)
53
+ self
54
+ end
105
55
 
106
- # TODO: this is getting heavy enough to move to a class
107
- def normalized_value(criteria, key, value)
108
- case value
109
- when Array, Set
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
- def normalized_direction(direction)
125
- direction ||= 'asc'
126
- direction.downcase == 'asc' ? Mongo::ASCENDING : Mongo::DESCENDING
127
- end
61
+ def sort(*args)
62
+ query.sort(*args)
63
+ self
64
+ end
128
65
 
129
- def normalized_sort(sort)
130
- return if sort.blank?
66
+ def reverse
67
+ query.reverse
68
+ self
69
+ end
131
70
 
132
- if sort.respond_to?(:all?) && sort.all? { |s| symbol_operator?(s) }
133
- sort.map { |s| to_order(s.field, s.operator) }
134
- elsif symbol_operator?(sort)
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
@@ -1,218 +1,7 @@
1
- class Array
2
- def self.to_mongo(value)
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 extensions
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 inclusions
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