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
  module MongoMapper
2
3
  module Plugins
3
4
  def plugins
@@ -11,24 +12,32 @@ module MongoMapper
11
12
  plugins << mod
12
13
  end
13
14
 
14
- autoload :Callbacks, 'mongo_mapper/plugins/callbacks'
15
- autoload :Clone, 'mongo_mapper/plugins/clone'
16
- autoload :Descendants, 'mongo_mapper/plugins/descendants'
17
- autoload :Dirty, 'mongo_mapper/plugins/dirty'
18
- autoload :Equality, 'mongo_mapper/plugins/equality'
19
- autoload :IdentityMap, 'mongo_mapper/plugins/identity_map'
20
- autoload :Inspect, 'mongo_mapper/plugins/inspect'
21
- autoload :Keys, 'mongo_mapper/plugins/keys'
22
- autoload :Logger, 'mongo_mapper/plugins/logger'
23
- autoload :Modifiers, 'mongo_mapper/plugins/modifiers'
24
- autoload :Persistence, 'mongo_mapper/plugins/persistence'
25
- autoload :Protected, 'mongo_mapper/plugins/protected'
26
- autoload :Rails, 'mongo_mapper/plugins/rails'
27
- autoload :Serialization, 'mongo_mapper/plugins/serialization'
28
- autoload :Timestamps, 'mongo_mapper/plugins/timestamps'
29
- autoload :Userstamps, 'mongo_mapper/plugins/userstamps'
30
- autoload :Validations, 'mongo_mapper/plugins/validations'
31
- autoload :QueryLogger, 'mongo_mapper/plugins/query_logger'
15
+ autoload :Document, 'mongo_mapper/plugins/document'
16
+ autoload :EmbeddedDocument, 'mongo_mapper/plugins/embedded_document'
17
+
18
+ autoload :Callbacks, 'mongo_mapper/plugins/callbacks'
19
+ autoload :Clone, 'mongo_mapper/plugins/clone'
20
+ autoload :Descendants, 'mongo_mapper/plugins/descendants'
21
+ autoload :Dirty, 'mongo_mapper/plugins/dirty'
22
+ autoload :DynamicQuerying, 'mongo_mapper/plugins/dynamic_querying'
23
+ autoload :Equality, 'mongo_mapper/plugins/equality'
24
+ autoload :IdentityMap, 'mongo_mapper/plugins/identity_map'
25
+ autoload :Inspect, 'mongo_mapper/plugins/inspect'
26
+ autoload :Indexes, 'mongo_mapper/plugins/indexes'
27
+ autoload :Keys, 'mongo_mapper/plugins/keys'
28
+ autoload :Logger, 'mongo_mapper/plugins/logger'
29
+ autoload :Modifiers, 'mongo_mapper/plugins/modifiers'
30
+ autoload :Persistence, 'mongo_mapper/plugins/persistence'
31
+ autoload :Protected, 'mongo_mapper/plugins/protected'
32
+ autoload :Querying, 'mongo_mapper/plugins/querying'
33
+ autoload :Rails, 'mongo_mapper/plugins/rails'
34
+ autoload :Sci, 'mongo_mapper/plugins/sci'
35
+ autoload :Serialization, 'mongo_mapper/plugins/serialization'
36
+ autoload :Timestamps, 'mongo_mapper/plugins/timestamps'
37
+ autoload :Userstamps, 'mongo_mapper/plugins/userstamps'
38
+ autoload :Validations, 'mongo_mapper/plugins/validations'
39
+ autoload :QueryLogger, 'mongo_mapper/plugins/query_logger'
40
+
32
41
  end
33
42
  end
34
43
 
@@ -1,7 +1,13 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Associations
4
5
  module ClassMethods
6
+ def inherited(subclass)
7
+ subclass.associations = associations.dup
8
+ super
9
+ end
10
+
5
11
  def belongs_to(association_id, options={}, &extension)
6
12
  create_association(:belongs_to, association_id, options, &extension)
7
13
  end
@@ -22,11 +28,6 @@ module MongoMapper
22
28
  @associations = hash
23
29
  end
24
30
 
25
- def inherited(subclass)
26
- subclass.associations = associations.dup
27
- super
28
- end
29
-
30
31
  private
31
32
  def create_association(type, name, options, &extension)
32
33
  association = Associations::Base.new(type, name, options, &extension)
@@ -85,7 +86,7 @@ module MongoMapper
85
86
  proxy
86
87
  end
87
88
 
88
- def save_to_collection(options = {})
89
+ def save_to_collection(options={})
89
90
  super
90
91
  associations.each do |association_name, association|
91
92
  proxy = get_proxy(association)
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Associations
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Associations
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Associations
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Associations
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Associations
@@ -1,8 +1,9 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Associations
4
5
  class InArrayProxy < Collection
5
- include Support::Find
6
+ include MongoMapper::Plugins::DynamicQuerying::ClassMethods
6
7
 
7
8
  def find(*args)
8
9
  options = args.extract_options!
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Associations
@@ -1,8 +1,9 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Associations
4
5
  class ManyDocumentsProxy < Collection
5
- include Support::Find
6
+ include MongoMapper::Plugins::DynamicQuerying::ClassMethods
6
7
 
7
8
  def find(*args)
8
9
  options = args.extract_options!
@@ -82,14 +83,13 @@ module MongoMapper
82
83
  end
83
84
 
84
85
  def nullify
85
- criteria = Query.new(klass, scoped_conditions).criteria
86
- all(criteria).each do |doc|
86
+ all.each do |doc|
87
87
  doc.update_attributes(self.foreign_key => nil)
88
88
  end
89
89
  reset
90
90
  end
91
91
 
92
- def save_to_collection(options = {})
92
+ def save_to_collection(options={})
93
93
  @target.each { |doc| doc.save(options) } if @target
94
94
  end
95
95
 
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Associations
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Associations
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Associations
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Associations
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Associations
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Associations
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  # Almost all of this callback stuff is pulled directly from ActiveSupport
2
3
  # in the interest of support rails 2 and 3 at the same time and is the
3
4
  # same copyright as rails.
@@ -76,7 +77,7 @@ module MongoMapper
76
77
  result
77
78
  end
78
79
 
79
- def run_callbacks(kind, options = {}, &block)
80
+ def run_callbacks(kind, options={}, &block)
80
81
  callback_chain_method = "#{kind}_callback_chain"
81
82
  return unless self.class.respond_to?(callback_chain_method)
82
83
  self.class.send(callback_chain_method).run(self, options, &block)
@@ -122,7 +123,7 @@ module MongoMapper
122
123
  new(methods)
123
124
  end
124
125
 
125
- def run(object, options = {}, &terminator)
126
+ def run(object, options={}, &terminator)
126
127
  enumerator = options[:enumerator] || :each
127
128
 
128
129
  unless block_given?
@@ -169,7 +170,7 @@ module MongoMapper
169
170
  class Callback
170
171
  attr_reader :kind, :method, :identifier, :options
171
172
 
172
- def initialize(kind, method, options = {})
173
+ def initialize(kind, method, options={})
173
174
  @kind = kind
174
175
  @method = method
175
176
  @identifier = options[:identifier]
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Clone
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Descendants
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Dirty
@@ -0,0 +1,40 @@
1
+ module MongoMapper
2
+ module Plugins
3
+ module Document
4
+ module ClassMethods
5
+ def embeddable?
6
+ false
7
+ end
8
+ end
9
+
10
+ module InstanceMethods
11
+ def new?
12
+ @new
13
+ end
14
+
15
+ def destroyed?
16
+ @_destroyed == true
17
+ end
18
+
19
+ def reload
20
+ if doc = self.class.query(:_id => id).query.first
21
+ tap do |instance|
22
+ instance.class.associations.each_key do |association_name|
23
+ send(association_name).reset if respond_to?(association_name)
24
+ end
25
+ instance.attributes = doc
26
+ end
27
+ else
28
+ raise DocumentNotFound, "Document match #{_id.inspect} does not exist in #{collection.name} collection"
29
+ end
30
+ end
31
+
32
+ # Used by embedded docs to find root easily without if/respond_to? stuff.
33
+ # Documents are always root documents.
34
+ def _root_document
35
+ self
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,42 @@
1
+ module MongoMapper
2
+ module Plugins
3
+ module DynamicQuerying
4
+ autoload :DynamicFinder, 'mongo_mapper/plugins/dynamic_querying/dynamic_finder'
5
+
6
+ module ClassMethods
7
+ def dynamic_find(finder, args)
8
+ attributes = {}
9
+
10
+ finder.attributes.each_with_index do |attr, index|
11
+ attributes[attr] = args[index]
12
+ end
13
+
14
+ options = args.extract_options!.merge(attributes)
15
+
16
+ if result = send(finder.finder, options)
17
+ result
18
+ else
19
+ if finder.raise?
20
+ raise DocumentNotFound, "Couldn't find Document with #{attributes.inspect} in collection named #{collection.name}"
21
+ end
22
+
23
+ if finder.instantiator
24
+ self.send(finder.instantiator, attributes)
25
+ end
26
+ end
27
+ end
28
+
29
+ protected
30
+ def method_missing(method, *args, &block)
31
+ finder = DynamicFinder.new(method)
32
+
33
+ if finder.found?
34
+ dynamic_find(finder, args)
35
+ else
36
+ super
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -1,29 +1,6 @@
1
1
  module MongoMapper
2
- module Support
3
- # @api private
4
- module Find
5
- def dynamic_find(finder, args)
6
- attributes = {}
7
-
8
- finder.attributes.each_with_index do |attr, index|
9
- attributes[attr] = args[index]
10
- end
11
-
12
- options = args.extract_options!.merge(attributes)
13
-
14
- if result = send(finder.finder, options)
15
- result
16
- else
17
- if finder.raise?
18
- raise DocumentNotFound, "Couldn't find Document with #{attributes.inspect} in collection named #{collection.name}"
19
- end
20
-
21
- if finder.instantiator
22
- self.send(finder.instantiator, attributes)
23
- end
24
- end
25
- end
26
-
2
+ module Plugins
3
+ module DynamicQuerying
27
4
  class DynamicFinder
28
5
  attr_reader :method, :attributes, :finder, :bang, :instantiator
29
6
 
@@ -61,17 +38,6 @@ module MongoMapper
61
38
  @attributes = names && names.split('_and_')
62
39
  end
63
40
  end
64
-
65
- protected
66
- def method_missing(method, *args, &block)
67
- finder = DynamicFinder.new(method)
68
-
69
- if finder.found?
70
- dynamic_find(finder, args)
71
- else
72
- super
73
- end
74
- end
75
41
  end
76
42
  end
77
43
  end
@@ -0,0 +1,48 @@
1
+ module MongoMapper
2
+ module Plugins
3
+ module EmbeddedDocument
4
+ def self.configure(model)
5
+ model.class_eval do
6
+ attr_reader :_root_document, :_parent_document
7
+ end
8
+ end
9
+
10
+ module ClassMethods
11
+ def embeddable?
12
+ true
13
+ end
14
+
15
+ def embedded_in(owner_name)
16
+ define_method(owner_name) { _parent_document }
17
+ end
18
+ end
19
+
20
+ module InstanceMethods
21
+ def new?
22
+ _root_document.try(:new?) || @new
23
+ end
24
+
25
+ def destroyed?
26
+ !!_root_document.try(:destroyed?)
27
+ end
28
+
29
+ def save(options={})
30
+ _root_document.try(:save, options).tap do |result|
31
+ @new = false if result
32
+ end
33
+ end
34
+
35
+ def save!(options={})
36
+ _root_document.try(:save, options).tap do |result|
37
+ @new = false if result
38
+ end
39
+ end
40
+
41
+ def _parent_document=(value)
42
+ @_root_document = value._root_document
43
+ @_parent_document = value
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module Equality
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module MongoMapper
2
3
  module Plugins
3
4
  module IdentityMap
@@ -28,25 +29,25 @@ module MongoMapper
28
29
  end
29
30
 
30
31
  def find_one(options={})
31
- criteria, query_options = to_query(options)
32
-
33
- if simple_find?(criteria) && identity_map.key?(criteria[:_id])
34
- identity_map[criteria[:_id]]
32
+ query = query(options)
33
+
34
+ if query.simple? && identity_map.key?(query[:_id])
35
+ identity_map[query[:_id]]
35
36
  else
36
37
  super.tap do |document|
37
- remove_documents_from_map(document) if selecting_fields?(query_options)
38
+ remove_documents_from_map(document) if query.fields?
38
39
  end
39
40
  end
40
41
  end
41
42
 
42
43
  def find_many(options)
43
- criteria, query_options = to_query(options)
44
44
  super.tap do |documents|
45
- remove_documents_from_map(documents) if selecting_fields?(query_options)
45
+ remove_documents_from_map(documents) if query(options).fields?
46
46
  end
47
47
  end
48
48
 
49
49
  def load(attrs)
50
+ return nil if attrs.nil?
50
51
  document = identity_map[attrs['_id']]
51
52
 
52
53
  if document.nil? || identity_map_off?
@@ -91,10 +92,6 @@ module MongoMapper
91
92
  end
92
93
  end
93
94
 
94
- def simple_find?(criteria)
95
- criteria.keys == [:_id] || criteria.keys.to_set == [:_id, :_type].to_set
96
- end
97
-
98
95
  def selecting_fields?(options)
99
96
  !options[:fields].nil?
100
97
  end