mongo_mapper 0.14.0 → 0.15.4

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 (120) hide show
  1. checksums.yaml +5 -5
  2. data/LICENSE +1 -1
  3. data/README.md +72 -0
  4. data/examples/keys.rb +1 -1
  5. data/examples/modifiers/set.rb +1 -1
  6. data/examples/querying.rb +1 -1
  7. data/examples/safe.rb +2 -2
  8. data/examples/scopes.rb +1 -1
  9. data/lib/mongo_mapper.rb +19 -17
  10. data/lib/mongo_mapper/connection.rb +16 -38
  11. data/lib/mongo_mapper/extensions/array.rb +1 -1
  12. data/lib/mongo_mapper/extensions/binary.rb +1 -1
  13. data/lib/mongo_mapper/extensions/date.rb +1 -1
  14. data/lib/mongo_mapper/extensions/float.rb +1 -1
  15. data/lib/mongo_mapper/extensions/hash.rb +1 -1
  16. data/lib/mongo_mapper/extensions/nil_class.rb +2 -2
  17. data/lib/mongo_mapper/extensions/object.rb +1 -1
  18. data/lib/mongo_mapper/extensions/object_id.rb +6 -2
  19. data/lib/mongo_mapper/extensions/set.rb +1 -1
  20. data/lib/mongo_mapper/extensions/string.rb +1 -1
  21. data/lib/mongo_mapper/plugins/accessible.rb +1 -1
  22. data/lib/mongo_mapper/plugins/associations/base.rb +10 -2
  23. data/lib/mongo_mapper/plugins/associations/belongs_to_association.rb +1 -1
  24. data/lib/mongo_mapper/plugins/associations/many_association.rb +6 -5
  25. data/lib/mongo_mapper/plugins/associations/{belongs_to_polymorphic_proxy.rb → proxy/belongs_to_polymorphic_proxy.rb} +0 -0
  26. data/lib/mongo_mapper/plugins/associations/{belongs_to_proxy.rb → proxy/belongs_to_proxy.rb} +6 -0
  27. data/lib/mongo_mapper/plugins/associations/proxy/collection.rb +55 -0
  28. data/lib/mongo_mapper/plugins/associations/{embedded_collection.rb → proxy/embedded_collection.rb} +0 -0
  29. data/lib/mongo_mapper/plugins/associations/{in_array_proxy.rb → proxy/in_array_proxy.rb} +36 -6
  30. data/lib/mongo_mapper/plugins/associations/proxy/in_foreign_array_proxy.rb +136 -0
  31. data/lib/mongo_mapper/plugins/associations/{many_documents_as_proxy.rb → proxy/many_documents_as_proxy.rb} +0 -0
  32. data/lib/mongo_mapper/plugins/associations/{many_documents_proxy.rb → proxy/many_documents_proxy.rb} +0 -4
  33. data/lib/mongo_mapper/plugins/associations/{many_embedded_polymorphic_proxy.rb → proxy/many_embedded_polymorphic_proxy.rb} +0 -0
  34. data/lib/mongo_mapper/plugins/associations/{many_embedded_proxy.rb → proxy/many_embedded_proxy.rb} +0 -0
  35. data/lib/mongo_mapper/plugins/associations/{many_polymorphic_proxy.rb → proxy/many_polymorphic_proxy.rb} +0 -0
  36. data/lib/mongo_mapper/plugins/associations/{one_as_proxy.rb → proxy/one_as_proxy.rb} +0 -0
  37. data/lib/mongo_mapper/plugins/associations/{one_embedded_polymorphic_proxy.rb → proxy/one_embedded_polymorphic_proxy.rb} +0 -0
  38. data/lib/mongo_mapper/plugins/associations/{one_embedded_proxy.rb → proxy/one_embedded_proxy.rb} +3 -1
  39. data/lib/mongo_mapper/plugins/associations/{one_proxy.rb → proxy/one_proxy.rb} +0 -0
  40. data/lib/mongo_mapper/plugins/associations/proxy/proxy.rb +164 -0
  41. data/lib/mongo_mapper/plugins/associations/single_association.rb +5 -13
  42. data/lib/mongo_mapper/plugins/dirty.rb +29 -37
  43. data/lib/mongo_mapper/plugins/document.rb +1 -1
  44. data/lib/mongo_mapper/plugins/dynamic_querying/dynamic_finder.rb +1 -1
  45. data/lib/mongo_mapper/plugins/embedded_callbacks.rb +1 -0
  46. data/lib/mongo_mapper/plugins/embedded_document.rb +2 -2
  47. data/lib/mongo_mapper/plugins/identity_map.rb +3 -1
  48. data/lib/mongo_mapper/plugins/indexes.rb +13 -6
  49. data/lib/mongo_mapper/plugins/keys.rb +12 -7
  50. data/lib/mongo_mapper/plugins/keys/key.rb +21 -13
  51. data/lib/mongo_mapper/plugins/modifiers.rb +39 -14
  52. data/lib/mongo_mapper/plugins/persistence.rb +6 -2
  53. data/lib/mongo_mapper/plugins/querying.rb +9 -3
  54. data/lib/mongo_mapper/plugins/querying/decorated_plucky_query.rb +6 -6
  55. data/lib/mongo_mapper/plugins/safe.rb +10 -4
  56. data/lib/mongo_mapper/plugins/scopes.rb +19 -3
  57. data/lib/mongo_mapper/plugins/stats.rb +1 -3
  58. data/lib/mongo_mapper/plugins/strong_parameters.rb +26 -0
  59. data/lib/mongo_mapper/plugins/validations.rb +1 -1
  60. data/lib/mongo_mapper/railtie.rb +1 -0
  61. data/lib/mongo_mapper/utils.rb +2 -2
  62. data/lib/mongo_mapper/version.rb +1 -1
  63. data/spec/examples.txt +1731 -0
  64. data/spec/functional/accessible_spec.rb +7 -1
  65. data/spec/functional/associations/belongs_to_polymorphic_proxy_spec.rb +2 -2
  66. data/spec/functional/associations/belongs_to_proxy_spec.rb +55 -5
  67. data/spec/functional/associations/in_array_proxy_spec.rb +149 -14
  68. data/spec/functional/associations/in_foreign_array_proxy_spec.rb +321 -0
  69. data/spec/functional/associations/many_documents_as_proxy_spec.rb +6 -6
  70. data/spec/functional/associations/many_documents_proxy_spec.rb +22 -22
  71. data/spec/functional/associations/many_embedded_polymorphic_proxy_spec.rb +2 -2
  72. data/spec/functional/associations/many_polymorphic_proxy_spec.rb +4 -4
  73. data/spec/functional/associations/one_as_proxy_spec.rb +8 -8
  74. data/spec/functional/associations/one_embedded_proxy_spec.rb +28 -0
  75. data/spec/functional/associations/one_proxy_spec.rb +19 -9
  76. data/spec/functional/associations_spec.rb +3 -3
  77. data/spec/functional/binary_spec.rb +2 -2
  78. data/spec/functional/caching_spec.rb +15 -22
  79. data/spec/functional/callbacks_spec.rb +2 -2
  80. data/spec/functional/counter_cache_spec.rb +10 -10
  81. data/spec/functional/dirty_spec.rb +48 -10
  82. data/spec/functional/dirty_with_callbacks_spec.rb +59 -0
  83. data/spec/functional/document_spec.rb +5 -8
  84. data/spec/functional/dumpable_spec.rb +1 -1
  85. data/spec/functional/embedded_document_spec.rb +5 -5
  86. data/spec/functional/identity_map_spec.rb +8 -8
  87. data/spec/functional/indexes_spec.rb +19 -18
  88. data/spec/functional/keys_spec.rb +64 -33
  89. data/spec/functional/logger_spec.rb +2 -2
  90. data/spec/functional/modifiers_spec.rb +81 -19
  91. data/spec/functional/partial_updates_spec.rb +8 -8
  92. data/spec/functional/protected_spec.rb +1 -1
  93. data/spec/functional/querying_spec.rb +70 -22
  94. data/spec/functional/safe_spec.rb +23 -27
  95. data/spec/functional/sci_spec.rb +7 -7
  96. data/spec/functional/scopes_spec.rb +89 -1
  97. data/spec/functional/static_keys_spec.rb +2 -2
  98. data/spec/functional/stats_spec.rb +28 -12
  99. data/spec/functional/strong_parameters_spec.rb +49 -0
  100. data/spec/functional/validations_spec.rb +8 -16
  101. data/spec/quality_spec.rb +1 -1
  102. data/spec/spec_helper.rb +39 -8
  103. data/spec/support/matchers.rb +1 -1
  104. data/spec/unit/associations/proxy_spec.rb +18 -10
  105. data/spec/unit/clone_spec.rb +1 -1
  106. data/spec/unit/document_spec.rb +3 -3
  107. data/spec/unit/embedded_document_spec.rb +4 -5
  108. data/spec/unit/extensions_spec.rb +12 -7
  109. data/spec/unit/identity_map_middleware_spec.rb +65 -96
  110. data/spec/unit/inspect_spec.rb +1 -1
  111. data/spec/unit/key_spec.rb +23 -18
  112. data/spec/unit/keys_spec.rb +17 -8
  113. data/spec/unit/mongo_mapper_spec.rb +41 -88
  114. data/spec/unit/rails_spec.rb +2 -2
  115. data/spec/unit/validations_spec.rb +18 -18
  116. metadata +70 -38
  117. data/README.rdoc +0 -56
  118. data/lib/mongo_mapper/extensions/ordered_hash.rb +0 -23
  119. data/lib/mongo_mapper/plugins/associations/collection.rb +0 -29
  120. data/lib/mongo_mapper/plugins/associations/proxy.rb +0 -141
metadata CHANGED
@@ -1,73 +1,101 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongo_mapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.0
4
+ version: 0.15.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Nunemaker
8
8
  - Chris Heald
9
9
  - Scott Taylor
10
- autorequire:
10
+ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2017-01-20 00:00:00.000000000 Z
13
+ date: 2021-06-18 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
- name: activemodel
16
+ name: mongo
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - "~>"
20
+ - !ruby/object:Gem::Version
21
+ version: '2.0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - "~>"
27
+ - !ruby/object:Gem::Version
28
+ version: '2.0'
29
+ - !ruby/object:Gem::Dependency
30
+ name: plucky
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - "~>"
34
+ - !ruby/object:Gem::Version
35
+ version: 0.8.0
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: 0.8.0
43
+ - !ruby/object:Gem::Dependency
44
+ name: activesupport
17
45
  requirement: !ruby/object:Gem::Requirement
18
46
  requirements:
19
47
  - - ">="
20
48
  - !ruby/object:Gem::Version
21
- version: 3.0.0
49
+ version: '5.0'
22
50
  type: :runtime
23
51
  prerelease: false
24
52
  version_requirements: !ruby/object:Gem::Requirement
25
53
  requirements:
26
54
  - - ">="
27
55
  - !ruby/object:Gem::Version
28
- version: 3.0.0
56
+ version: '5.0'
29
57
  - !ruby/object:Gem::Dependency
30
- name: activesupport
58
+ name: activemodel
31
59
  requirement: !ruby/object:Gem::Requirement
32
60
  requirements:
33
61
  - - ">="
34
62
  - !ruby/object:Gem::Version
35
- version: '3.0'
63
+ version: '5.0'
36
64
  type: :runtime
37
65
  prerelease: false
38
66
  version_requirements: !ruby/object:Gem::Requirement
39
67
  requirements:
40
68
  - - ">="
41
69
  - !ruby/object:Gem::Version
42
- version: '3.0'
70
+ version: '5.0'
43
71
  - !ruby/object:Gem::Dependency
44
- name: plucky
72
+ name: activemodel-serializers-xml
45
73
  requirement: !ruby/object:Gem::Requirement
46
74
  requirements:
47
75
  - - "~>"
48
76
  - !ruby/object:Gem::Version
49
- version: 0.7.0
77
+ version: '1.0'
50
78
  type: :runtime
51
79
  prerelease: false
52
80
  version_requirements: !ruby/object:Gem::Requirement
53
81
  requirements:
54
82
  - - "~>"
55
83
  - !ruby/object:Gem::Version
56
- version: 0.7.0
84
+ version: '1.0'
57
85
  - !ruby/object:Gem::Dependency
58
- name: mongo
86
+ name: rexml
59
87
  requirement: !ruby/object:Gem::Requirement
60
88
  requirements:
61
- - - "~>"
89
+ - - ">="
62
90
  - !ruby/object:Gem::Version
63
- version: '1.8'
91
+ version: '0'
64
92
  type: :runtime
65
93
  prerelease: false
66
94
  version_requirements: !ruby/object:Gem::Requirement
67
95
  requirements:
68
- - - "~>"
96
+ - - ">="
69
97
  - !ruby/object:Gem::Version
70
- version: '1.8'
98
+ version: '0'
71
99
  description: MongoMapper is a Object-Document Mapper for Ruby and Rails
72
100
  email:
73
101
  - nunemaker@gmail.com
@@ -79,7 +107,7 @@ extensions: []
79
107
  extra_rdoc_files: []
80
108
  files:
81
109
  - LICENSE
82
- - README.rdoc
110
+ - README.md
83
111
  - UPGRADES
84
112
  - bin/mmconsole
85
113
  - examples/attr_accessible.rb
@@ -111,7 +139,6 @@ files:
111
139
  - lib/mongo_mapper/extensions/nil_class.rb
112
140
  - lib/mongo_mapper/extensions/object.rb
113
141
  - lib/mongo_mapper/extensions/object_id.rb
114
- - lib/mongo_mapper/extensions/ordered_hash.rb
115
142
  - lib/mongo_mapper/extensions/set.rb
116
143
  - lib/mongo_mapper/extensions/string.rb
117
144
  - lib/mongo_mapper/extensions/symbol.rb
@@ -124,23 +151,24 @@ files:
124
151
  - lib/mongo_mapper/plugins/associations.rb
125
152
  - lib/mongo_mapper/plugins/associations/base.rb
126
153
  - lib/mongo_mapper/plugins/associations/belongs_to_association.rb
127
- - lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb
128
- - lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb
129
- - lib/mongo_mapper/plugins/associations/collection.rb
130
- - lib/mongo_mapper/plugins/associations/embedded_collection.rb
131
- - lib/mongo_mapper/plugins/associations/in_array_proxy.rb
132
154
  - lib/mongo_mapper/plugins/associations/many_association.rb
133
- - lib/mongo_mapper/plugins/associations/many_documents_as_proxy.rb
134
- - lib/mongo_mapper/plugins/associations/many_documents_proxy.rb
135
- - lib/mongo_mapper/plugins/associations/many_embedded_polymorphic_proxy.rb
136
- - lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb
137
- - lib/mongo_mapper/plugins/associations/many_polymorphic_proxy.rb
138
- - lib/mongo_mapper/plugins/associations/one_as_proxy.rb
139
155
  - lib/mongo_mapper/plugins/associations/one_association.rb
140
- - lib/mongo_mapper/plugins/associations/one_embedded_polymorphic_proxy.rb
141
- - lib/mongo_mapper/plugins/associations/one_embedded_proxy.rb
142
- - lib/mongo_mapper/plugins/associations/one_proxy.rb
143
- - lib/mongo_mapper/plugins/associations/proxy.rb
156
+ - lib/mongo_mapper/plugins/associations/proxy/belongs_to_polymorphic_proxy.rb
157
+ - lib/mongo_mapper/plugins/associations/proxy/belongs_to_proxy.rb
158
+ - lib/mongo_mapper/plugins/associations/proxy/collection.rb
159
+ - lib/mongo_mapper/plugins/associations/proxy/embedded_collection.rb
160
+ - lib/mongo_mapper/plugins/associations/proxy/in_array_proxy.rb
161
+ - lib/mongo_mapper/plugins/associations/proxy/in_foreign_array_proxy.rb
162
+ - lib/mongo_mapper/plugins/associations/proxy/many_documents_as_proxy.rb
163
+ - lib/mongo_mapper/plugins/associations/proxy/many_documents_proxy.rb
164
+ - lib/mongo_mapper/plugins/associations/proxy/many_embedded_polymorphic_proxy.rb
165
+ - lib/mongo_mapper/plugins/associations/proxy/many_embedded_proxy.rb
166
+ - lib/mongo_mapper/plugins/associations/proxy/many_polymorphic_proxy.rb
167
+ - lib/mongo_mapper/plugins/associations/proxy/one_as_proxy.rb
168
+ - lib/mongo_mapper/plugins/associations/proxy/one_embedded_polymorphic_proxy.rb
169
+ - lib/mongo_mapper/plugins/associations/proxy/one_embedded_proxy.rb
170
+ - lib/mongo_mapper/plugins/associations/proxy/one_proxy.rb
171
+ - lib/mongo_mapper/plugins/associations/proxy/proxy.rb
144
172
  - lib/mongo_mapper/plugins/associations/single_association.rb
145
173
  - lib/mongo_mapper/plugins/caching.rb
146
174
  - lib/mongo_mapper/plugins/callbacks.rb
@@ -175,6 +203,7 @@ files:
175
203
  - lib/mongo_mapper/plugins/scopes.rb
176
204
  - lib/mongo_mapper/plugins/serialization.rb
177
205
  - lib/mongo_mapper/plugins/stats.rb
206
+ - lib/mongo_mapper/plugins/strong_parameters.rb
178
207
  - lib/mongo_mapper/plugins/timestamps.rb
179
208
  - lib/mongo_mapper/plugins/touch.rb
180
209
  - lib/mongo_mapper/plugins/userstamps.rb
@@ -188,10 +217,12 @@ files:
188
217
  - lib/rails/generators/mongo_mapper/config/templates/mongo.yml
189
218
  - lib/rails/generators/mongo_mapper/model/model_generator.rb
190
219
  - lib/rails/generators/mongo_mapper/model/templates/model.rb
220
+ - spec/examples.txt
191
221
  - spec/functional/accessible_spec.rb
192
222
  - spec/functional/associations/belongs_to_polymorphic_proxy_spec.rb
193
223
  - spec/functional/associations/belongs_to_proxy_spec.rb
194
224
  - spec/functional/associations/in_array_proxy_spec.rb
225
+ - spec/functional/associations/in_foreign_array_proxy_spec.rb
195
226
  - spec/functional/associations/many_documents_as_proxy_spec.rb
196
227
  - spec/functional/associations/many_documents_proxy_spec.rb
197
228
  - spec/functional/associations/many_embedded_polymorphic_proxy_spec.rb
@@ -207,6 +238,7 @@ files:
207
238
  - spec/functional/callbacks_spec.rb
208
239
  - spec/functional/counter_cache_spec.rb
209
240
  - spec/functional/dirty_spec.rb
241
+ - spec/functional/dirty_with_callbacks_spec.rb
210
242
  - spec/functional/document_spec.rb
211
243
  - spec/functional/dumpable_spec.rb
212
244
  - spec/functional/dynamic_querying_spec.rb
@@ -228,6 +260,7 @@ files:
228
260
  - spec/functional/scopes_spec.rb
229
261
  - spec/functional/static_keys_spec.rb
230
262
  - spec/functional/stats_spec.rb
263
+ - spec/functional/strong_parameters_spec.rb
231
264
  - spec/functional/timestamps_spec.rb
232
265
  - spec/functional/touch_spec.rb
233
266
  - spec/functional/userstamps_spec.rb
@@ -270,7 +303,7 @@ homepage: http://mongomapper.com
270
303
  licenses:
271
304
  - MIT
272
305
  metadata: {}
273
- post_install_message:
306
+ post_install_message:
274
307
  rdoc_options: []
275
308
  require_paths:
276
309
  - lib
@@ -285,9 +318,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
285
318
  - !ruby/object:Gem::Version
286
319
  version: '0'
287
320
  requirements: []
288
- rubyforge_project:
289
- rubygems_version: 2.4.8
290
- signing_key:
321
+ rubygems_version: 3.1.6
322
+ signing_key:
291
323
  specification_version: 4
292
324
  summary: A Ruby Object Mapper for Mongo
293
325
  test_files: []
data/README.rdoc DELETED
@@ -1,56 +0,0 @@
1
- = MongoMapper
2
-
3
- {<img src="https://badge.fury.io/rb/mongo_mapper.png" alt="RubyGem" />}[https://rubygems.org/gems/mongo_mapper]
4
- {<img src="https://travis-ci.org/mongomapper/mongomapper.png?branch=master" alt="Build Status" />}[https://travis-ci.org/mongomapper/mongomapper]
5
- {<img src="https://coveralls.io/repos/mongomapper/mongomapper/badge.png" alt="Coverage Status" />}[https://coveralls.io/r/mongomapper/mongomapper]
6
-
7
- A Ruby Object Mapper for Mongo.
8
-
9
- == Install
10
-
11
- $ gem install mongo_mapper
12
-
13
- == Documentation
14
-
15
- http://mongomapper.com/documentation/
16
-
17
- http://rdoc.info/github/mongomapper/mongomapper
18
-
19
- == Compatibility
20
-
21
- MongoMapper is tested against:
22
-
23
- * MRI 1.8.7
24
- * MRI 1.9.3
25
- * MRI 2.0.0
26
- * MRI 2.1.1
27
- * JRuby (Versions with 1.9 compatibility)
28
-
29
- Additionally, MongoMapper is tested against:
30
-
31
- * Rails 3.0.x
32
- * Rails 3.1.x
33
- * Rails 3.2.x
34
- * Rails 4.0.x
35
-
36
- == Contributing & Development
37
-
38
- $ git clone https://github.com/mongomapper/mongomapper && cd mongomapper
39
- $ bundle install
40
- $ bundle exec rake
41
-
42
- * Fork the project.
43
- * Make your feature addition or bug fix. All specs should pass.
44
- * Add specs for your changes. This is important so I don't break it in a future version unintentionally.
45
- * Commit, do not mess with Rakefile, version, or history. If you want to have your own version, that is fine but bump version in a commit by itself in another branch so a maintainer ignore it when your pull request is merged.
46
- * Send a pull request. Bonus points for topic branches.
47
-
48
- == Problems or Questions?
49
-
50
- Hit up the Google group: http://groups.google.com/group/mongomapper
51
-
52
- Hop on IRC: irc://chat.freenode.net/#mongomapper
53
-
54
- == License & Copyright
55
-
56
- See LICENSE for details.
@@ -1,23 +0,0 @@
1
- # encoding: UTF-8
2
- # This class exists to make sure that Hash's extensions don't end up giving us unordered hashes.
3
- # :nocov:
4
- if RUBY_VERSION < "1.9"
5
- module MongoMapper
6
- module Extensions
7
- module OrderedHash
8
- def to_mongo(value)
9
- value
10
- end
11
-
12
- def from_mongo(value)
13
- value
14
- end
15
- end
16
- end
17
- end
18
-
19
- class BSON::OrderedHash
20
- extend MongoMapper::Extensions::OrderedHash
21
- end
22
- end
23
- # :nocov:
@@ -1,29 +0,0 @@
1
- # encoding: UTF-8
2
- module MongoMapper
3
- module Plugins
4
- module Associations
5
- class Collection < Proxy
6
- def to_ary
7
- load_target
8
- if target.is_a?(Array)
9
- target.to_ary
10
- else
11
- Array(target)
12
- end
13
- end
14
-
15
- alias_method :to_a, :to_ary
16
-
17
- def include?(*args)
18
- load_target
19
- target.include?(*args)
20
- end
21
-
22
- def reset
23
- super
24
- target = []
25
- end
26
- end
27
- end
28
- end
29
- end
@@ -1,141 +0,0 @@
1
- # encoding: UTF-8
2
- require 'forwardable'
3
- module MongoMapper
4
- module Plugins
5
- module Associations
6
- class Proxy
7
- extend Forwardable
8
-
9
- alias :proxy_respond_to? :respond_to?
10
- alias :proxy_extend :extend
11
-
12
- instance_methods.each { |m| undef_method m unless m =~ /(^__|^nil\?$|^send$|proxy_|^respond_to_missing\?$|^object_id$)/ }
13
-
14
- attr_reader :proxy_owner, :association, :target
15
-
16
- alias :proxy_target :target
17
- alias :proxy_association :association
18
-
19
- def_delegators :proxy_association, :klass, :options
20
- def_delegator :klass, :collection
21
-
22
- def initialize(owner, association)
23
- @proxy_owner, @association, @loaded = owner, association, false
24
- Array(association.options[:extend]).each { |ext| proxy_extend(ext) }
25
- reset
26
- end
27
-
28
- # Active support in rails 3 beta 4 can override to_json after this is loaded,
29
- # at least when run in mongomapper tests. The implementation was changed in master
30
- # some time after this, so not sure whether this is still a problem.
31
- #
32
- # In rails 2, this isn't a problem however it also solves an issue where
33
- # to_json isn't forwarded because it supports to_json itself
34
- def to_json(*options)
35
- load_target
36
- target.to_json(*options)
37
- end
38
-
39
- # see comments to to_json
40
- def as_json(*options)
41
- load_target
42
- target.as_json(*options)
43
- end
44
-
45
- def inspect
46
- load_target
47
- target.inspect
48
- end
49
-
50
- def loaded?
51
- @loaded
52
- end
53
-
54
- def loaded
55
- @loaded = true
56
- end
57
-
58
- def nil?
59
- load_target
60
- target.nil?
61
- end
62
-
63
- def blank?
64
- load_target
65
- target.blank?
66
- end
67
-
68
- def present?
69
- load_target
70
- target.present?
71
- end
72
-
73
- def reload
74
- reset
75
- load_target
76
- self unless target.nil?
77
- end
78
-
79
- # :nocov:
80
- def replace(v)
81
- raise NotImplementedError
82
- end
83
- # :nocov:
84
-
85
- def reset
86
- @loaded = false
87
- @target = nil
88
- end
89
-
90
- def respond_to?(*args)
91
- proxy_respond_to?(*args) || (load_target && target.respond_to?(*args))
92
- end
93
-
94
- def send(method, *args, &block)
95
- if proxy_respond_to?(method, true)
96
- super
97
- else
98
- load_target
99
- target.send(method, *args, &block)
100
- end
101
- end
102
-
103
- protected
104
-
105
- def load_target
106
- unless loaded?
107
- if @target.is_a?(Array) && @target.any?
108
- @target = find_target + @target.find_all { |record| !record.persisted? }
109
- else
110
- @target = find_target
111
- end
112
- loaded
113
- end
114
- @target
115
- rescue MongoMapper::DocumentNotFound
116
- reset
117
- end
118
-
119
- # :nocov:
120
- def find_target
121
- raise NotImplementedError
122
- end
123
- # :nocov:
124
-
125
- def flatten_deeper(array)
126
- array.collect do |element|
127
- (element.respond_to?(:flatten) && !element.is_a?(Hash)) ? element.flatten : element
128
- end.flatten
129
- end
130
-
131
- private
132
-
133
- def method_missing(method, *args, &block)
134
- if load_target
135
- target.send(method, *args, &block)
136
- end
137
- end
138
- end
139
- end
140
- end
141
- end