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.
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