mongo_mapper 0.12.0 → 0.13.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (154) hide show
  1. checksums.yaml +7 -0
  2. data/README.rdoc +35 -13
  3. data/bin/mmconsole +1 -1
  4. data/lib/mongo_mapper.rb +4 -0
  5. data/lib/mongo_mapper/connection.rb +17 -6
  6. data/lib/mongo_mapper/document.rb +1 -0
  7. data/lib/mongo_mapper/exceptions.rb +4 -1
  8. data/lib/mongo_mapper/extensions/binary.rb +1 -1
  9. data/lib/mongo_mapper/extensions/boolean.rb +20 -23
  10. data/lib/mongo_mapper/extensions/date.rb +3 -3
  11. data/lib/mongo_mapper/extensions/integer.rb +5 -1
  12. data/lib/mongo_mapper/extensions/kernel.rb +2 -0
  13. data/lib/mongo_mapper/extensions/ordered_hash.rb +23 -0
  14. data/lib/mongo_mapper/extensions/string.rb +2 -2
  15. data/lib/mongo_mapper/extensions/time.rb +7 -5
  16. data/lib/mongo_mapper/middleware/identity_map.rb +3 -4
  17. data/lib/mongo_mapper/plugins.rb +1 -1
  18. data/lib/mongo_mapper/plugins/associations.rb +11 -5
  19. data/lib/mongo_mapper/plugins/associations/base.rb +5 -3
  20. data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +0 -0
  21. data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +8 -8
  22. data/lib/mongo_mapper/plugins/associations/collection.rb +2 -0
  23. data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +32 -7
  24. data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +2 -2
  25. data/lib/mongo_mapper/plugins/associations/one_proxy.rb +12 -12
  26. data/lib/mongo_mapper/plugins/associations/proxy.rb +5 -1
  27. data/lib/mongo_mapper/plugins/associations/single_association.rb +6 -6
  28. data/lib/mongo_mapper/plugins/clone.rb +4 -2
  29. data/lib/mongo_mapper/plugins/dirty.rb +22 -21
  30. data/lib/mongo_mapper/plugins/document.rb +4 -4
  31. data/lib/mongo_mapper/plugins/dumpable.rb +22 -0
  32. data/lib/mongo_mapper/plugins/embedded_callbacks.rb +58 -9
  33. data/lib/mongo_mapper/plugins/identity_map.rb +42 -32
  34. data/lib/mongo_mapper/plugins/keys.rb +133 -54
  35. data/lib/mongo_mapper/plugins/keys/key.rb +68 -22
  36. data/lib/mongo_mapper/plugins/modifiers.rb +26 -19
  37. data/lib/mongo_mapper/plugins/persistence.rb +15 -5
  38. data/lib/mongo_mapper/plugins/querying.rb +15 -40
  39. data/lib/mongo_mapper/plugins/querying/{decorator.rb → decorated_plucky_query.rb} +24 -4
  40. data/lib/mongo_mapper/plugins/rails.rb +22 -2
  41. data/lib/mongo_mapper/plugins/safe.rb +8 -5
  42. data/lib/mongo_mapper/plugins/sci.rb +26 -4
  43. data/lib/mongo_mapper/plugins/scopes.rb +5 -4
  44. data/lib/mongo_mapper/plugins/timestamps.rb +11 -4
  45. data/lib/mongo_mapper/plugins/validations.rb +1 -1
  46. data/lib/mongo_mapper/utils.rb +12 -0
  47. data/lib/mongo_mapper/version.rb +1 -1
  48. data/lib/rails/generators/mongo_mapper/config/config_generator.rb +20 -7
  49. data/lib/rails/generators/mongo_mapper/config/templates/mongo.yml +6 -0
  50. data/lib/rails/generators/mongo_mapper/model/model_generator.rb +18 -1
  51. data/lib/rails/generators/mongo_mapper/model/templates/model.rb +9 -5
  52. data/{test/functional/test_accessible.rb → spec/functional/accessible_spec.rb} +29 -29
  53. data/{test/functional/associations/test_belongs_to_polymorphic_proxy.rb → spec/functional/associations/belongs_to_polymorphic_proxy_spec.rb} +10 -10
  54. data/{test/functional/associations/test_belongs_to_proxy.rb → spec/functional/associations/belongs_to_proxy_spec.rb} +82 -64
  55. data/{test/functional/associations/test_in_array_proxy.rb → spec/functional/associations/in_array_proxy_spec.rb} +68 -68
  56. data/{test/functional/associations/test_many_documents_as_proxy.rb → spec/functional/associations/many_documents_as_proxy_spec.rb} +37 -38
  57. data/{test/functional/associations/test_many_documents_proxy.rb → spec/functional/associations/many_documents_proxy_spec.rb} +233 -146
  58. data/{test/functional/associations/test_many_embedded_polymorphic_proxy.rb → spec/functional/associations/many_embedded_polymorphic_proxy_spec.rb} +19 -20
  59. data/{test/functional/associations/test_many_embedded_proxy.rb → spec/functional/associations/many_embedded_proxy_spec.rb} +23 -24
  60. data/{test/functional/associations/test_many_polymorphic_proxy.rb → spec/functional/associations/many_polymorphic_proxy_spec.rb} +45 -46
  61. data/{test/functional/associations/test_one_as_proxy.rb → spec/functional/associations/one_as_proxy_spec.rb} +75 -77
  62. data/{test/functional/associations/test_one_embedded_polymorphic_proxy.rb → spec/functional/associations/one_embedded_polymorphic_proxy_spec.rb} +31 -32
  63. data/{test/functional/associations/test_one_embedded_proxy.rb → spec/functional/associations/one_embedded_proxy_spec.rb} +10 -10
  64. data/{test/functional/associations/test_one_proxy.rb → spec/functional/associations/one_proxy_spec.rb} +125 -102
  65. data/spec/functional/associations_spec.rb +48 -0
  66. data/{test/functional/test_binary.rb → spec/functional/binary_spec.rb} +6 -6
  67. data/spec/functional/caching_spec.rb +75 -0
  68. data/{test/functional/test_callbacks.rb → spec/functional/callbacks_spec.rb} +84 -26
  69. data/{test/functional/test_dirty.rb → spec/functional/dirty_spec.rb} +57 -42
  70. data/{test/functional/test_document.rb → spec/functional/document_spec.rb} +52 -52
  71. data/spec/functional/dumpable_spec.rb +24 -0
  72. data/{test/functional/test_dynamic_querying.rb → spec/functional/dynamic_querying_spec.rb} +14 -14
  73. data/{test/functional/test_embedded_document.rb → spec/functional/embedded_document_spec.rb} +51 -42
  74. data/{test/functional/test_equality.rb → spec/functional/equality_spec.rb} +4 -4
  75. data/spec/functional/extensions_spec.rb +16 -0
  76. data/{test/functional/test_identity_map.rb → spec/functional/identity_map_spec.rb} +73 -61
  77. data/spec/functional/indexes_spec.rb +48 -0
  78. data/spec/functional/keys_spec.rb +224 -0
  79. data/{test/functional/test_logger.rb → spec/functional/logger_spec.rb} +6 -6
  80. data/spec/functional/modifiers_spec.rb +550 -0
  81. data/spec/functional/pagination_spec.rb +89 -0
  82. data/spec/functional/protected_spec.rb +199 -0
  83. data/spec/functional/querying_spec.rb +1003 -0
  84. data/spec/functional/rails_spec.rb +55 -0
  85. data/spec/functional/safe_spec.rb +163 -0
  86. data/{test/functional/test_sci.rb → spec/functional/sci_spec.rb} +123 -34
  87. data/{test/functional/test_scopes.rb → spec/functional/scopes_spec.rb} +59 -26
  88. data/spec/functional/timestamps_spec.rb +97 -0
  89. data/{test/functional/test_touch.rb → spec/functional/touch_spec.rb} +13 -13
  90. data/spec/functional/userstamps_spec.rb +46 -0
  91. data/{test/functional/test_validations.rb → spec/functional/validations_spec.rb} +64 -64
  92. data/spec/spec_helper.rb +81 -0
  93. data/spec/support/matchers.rb +24 -0
  94. data/{test → spec/support}/models.rb +1 -6
  95. data/spec/unit/associations/base_spec.rb +146 -0
  96. data/spec/unit/associations/belongs_to_association_spec.rb +30 -0
  97. data/spec/unit/associations/many_association_spec.rb +64 -0
  98. data/spec/unit/associations/one_association_spec.rb +48 -0
  99. data/{test/unit/associations/test_proxy.rb → spec/unit/associations/proxy_spec.rb} +21 -21
  100. data/{test/unit/test_clone.rb → spec/unit/clone_spec.rb} +21 -11
  101. data/spec/unit/config_generator_spec.rb +24 -0
  102. data/{test/unit/test_document.rb → spec/unit/document_spec.rb} +42 -42
  103. data/{test/unit/test_dynamic_finder.rb → spec/unit/dynamic_finder_spec.rb} +28 -28
  104. data/{test/unit/test_embedded_document.rb → spec/unit/embedded_document_spec.rb} +102 -108
  105. data/{test/unit/test_equality.rb → spec/unit/equality_spec.rb} +7 -7
  106. data/{test/unit/test_exceptions.rb → spec/unit/exceptions_spec.rb} +3 -3
  107. data/{test/unit/test_extensions.rb → spec/unit/extensions_spec.rb} +85 -71
  108. data/spec/unit/identity_map_middleware_spec.rb +134 -0
  109. data/{test/unit/test_inspect.rb → spec/unit/inspect_spec.rb} +8 -8
  110. data/{test/unit/test_key.rb → spec/unit/key_spec.rb} +82 -52
  111. data/spec/unit/keys_spec.rb +155 -0
  112. data/spec/unit/model_generator_spec.rb +47 -0
  113. data/spec/unit/mongo_mapper_spec.rb +184 -0
  114. data/spec/unit/pagination_spec.rb +11 -0
  115. data/{test/unit/test_plugins.rb → spec/unit/plugins_spec.rb} +14 -14
  116. data/spec/unit/rails_compatibility_spec.rb +40 -0
  117. data/{test/unit/test_rails_reflect_on_association.rb → spec/unit/rails_reflect_on_association_spec.rb} +9 -9
  118. data/{test/unit/test_rails.rb → spec/unit/rails_spec.rb} +31 -31
  119. data/spec/unit/serialization_spec.rb +169 -0
  120. data/spec/unit/serializers/json_serializer_spec.rb +218 -0
  121. data/spec/unit/serializers/xml_serializer_spec.rb +198 -0
  122. data/{test/unit/test_time_zones.rb → spec/unit/time_zones_spec.rb} +8 -8
  123. data/{test/unit/test_translation.rb → spec/unit/translation_spec.rb} +6 -6
  124. data/{test/unit/test_validations.rb → spec/unit/validations_spec.rb} +72 -59
  125. metadata +199 -179
  126. data/test/_NOTE_ON_TESTING +0 -1
  127. data/test/functional/test_associations.rb +0 -46
  128. data/test/functional/test_caching.rb +0 -77
  129. data/test/functional/test_indexes.rb +0 -50
  130. data/test/functional/test_modifiers.rb +0 -537
  131. data/test/functional/test_pagination.rb +0 -91
  132. data/test/functional/test_protected.rb +0 -201
  133. data/test/functional/test_querying.rb +0 -935
  134. data/test/functional/test_safe.rb +0 -76
  135. data/test/functional/test_timestamps.rb +0 -62
  136. data/test/functional/test_userstamps.rb +0 -44
  137. data/test/support/railtie.rb +0 -4
  138. data/test/support/railtie/autoloaded.rb +0 -2
  139. data/test/support/railtie/not_autoloaded.rb +0 -3
  140. data/test/support/railtie/parent.rb +0 -3
  141. data/test/test_active_model_lint.rb +0 -18
  142. data/test/test_helper.rb +0 -93
  143. data/test/unit/associations/test_base.rb +0 -146
  144. data/test/unit/associations/test_belongs_to_association.rb +0 -29
  145. data/test/unit/associations/test_many_association.rb +0 -63
  146. data/test/unit/associations/test_one_association.rb +0 -47
  147. data/test/unit/serializers/test_json_serializer.rb +0 -216
  148. data/test/unit/serializers/test_xml_serializer.rb +0 -196
  149. data/test/unit/test_identity_map_middleware.rb +0 -132
  150. data/test/unit/test_keys.rb +0 -65
  151. data/test/unit/test_mongo_mapper.rb +0 -157
  152. data/test/unit/test_pagination.rb +0 -11
  153. data/test/unit/test_rails_compatibility.rb +0 -38
  154. data/test/unit/test_serialization.rb +0 -166
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 157572885e8b22a43d1585eb772fcbf1c95f6aa1
4
+ data.tar.gz: 29cff77a4aba848e0ec1bde7a7fe2ba3f68b767a
5
+ SHA512:
6
+ metadata.gz: cc75dcd206c828239a06f49cb9374497f9e0b425201921a5dcdcc169b5d1eba5a1005fbc2ad299ee908b311b046c42c2e5b97e339e668117f7a0c5ab815d98d4
7
+ data.tar.gz: 003c0ac6bb4aaec67634ee5aedaa252f4d81f9a40d6e496ab108b5c408d22891495ec969e07d9bdc8b8315d25e0e309ac1ccdd0f29c2feac70257857a2c0e2a5
@@ -1,33 +1,55 @@
1
1
  = MongoMapper
2
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/jnunemaker/mongomapper.png?branch=master" alt="Build Status" />}[https://travis-ci.org/jnunemaker/mongomapper]
5
+ {<img src="https://coveralls.io/repos/jnunemaker/mongomapper/badge.png" alt="Coverage Status" />}[https://coveralls.io/r/jnunemaker/mongomapper]
6
+
3
7
  A Ruby Object Mapper for Mongo.
4
8
 
5
9
  == Install
6
10
 
7
11
  $ gem install mongo_mapper
8
12
 
9
- == Contributing
13
+ == Documentation
10
14
 
11
- * Fork the project.
12
- * Make your feature addition or bug fix.
13
- * Add tests for it. This is important so I don't break it in a future version unintentionally.
14
- * 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 I can ignore when I pull)
15
- * Send me a pull request. Bonus points for topic branches.
15
+ http://mongomapper.com/documentation/
16
+
17
+ http://rdoc.info/github/jnunemaker/mongomapper
18
+
19
+ == Compatibility
20
+
21
+ MongoMapper is tested against:
16
22
 
17
- == Development
23
+ * MRI 1.8.7
24
+ * MRI 1.9.3
25
+ * MRI 2.0.0
26
+ * JRuby (1.9)
18
27
 
19
- $ gem install bundler (if you don't have it)
28
+ Additionally, MongoMapper is tested against:
29
+
30
+ * Rails 3.0.x
31
+ * Rails 3.1.x
32
+ * Rails 3.2.x
33
+ * Rails 4.0.x
34
+
35
+ == Contributing & Development
36
+
37
+ $ git clone https://github.com/jnunemaker/mongomapper && cd mongomapper
20
38
  $ bundle install
21
39
  $ bundle exec rake
22
40
 
41
+ * Fork the project.
42
+ * Make your feature addition or bug fix. All specs should pass.
43
+ * Add specs for your changes. This is important so I don't break it in a future version unintentionally.
44
+ * 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.
45
+ * Send a pull request. Bonus points for topic branches.
46
+
23
47
  == Problems or Questions?
24
48
 
25
- Hit up the google group:
26
- http://groups.google.com/group/mongomapper
49
+ Hit up the Google group: http://groups.google.com/group/mongomapper
27
50
 
28
- Hop on IRC:
29
- irc://chat.freenode.net/#mongomapper
51
+ Hop on IRC: irc://chat.freenode.net/#mongomapper
30
52
 
31
- == Copyright
53
+ == License & Copyright
32
54
 
33
55
  See LICENSE for details.
@@ -31,7 +31,7 @@ Example 1:
31
31
  things.insert("name" => "Another Thing", "date" => Time.now)
32
32
 
33
33
  cursor = things.find("name" => "Raw Thing")
34
- puts cursor.next_object.inspect
34
+ puts cursor.next.inspect
35
35
 
36
36
  Example 2:
37
37
  class Thing
@@ -14,12 +14,15 @@ module MongoMapper
14
14
  autoload :InvalidScheme, 'mongo_mapper/exceptions'
15
15
  autoload :DocumentNotValid, 'mongo_mapper/exceptions'
16
16
  autoload :AccessibleOrProtected, 'mongo_mapper/exceptions'
17
+ autoload :InvalidKey, 'mongo_mapper/exceptions'
18
+ autoload :NotSupported, 'mongo_mapper/exceptions'
17
19
 
18
20
  autoload :Document, 'mongo_mapper/document'
19
21
  autoload :EmbeddedDocument, 'mongo_mapper/embedded_document'
20
22
  autoload :Plugins, 'mongo_mapper/plugins'
21
23
  autoload :Translation, 'mongo_mapper/translation'
22
24
  autoload :Version, 'mongo_mapper/version'
25
+ autoload :Utils, 'mongo_mapper/utils'
23
26
 
24
27
  module Middleware
25
28
  autoload :IdentityMap, 'mongo_mapper/middleware/identity_map'
@@ -35,6 +38,7 @@ module MongoMapper
35
38
  autoload :Dirty, 'mongo_mapper/plugins/dirty'
36
39
  autoload :Document, 'mongo_mapper/plugins/document'
37
40
  autoload :DynamicQuerying, 'mongo_mapper/plugins/dynamic_querying'
41
+ autoload :Dumpable, 'mongo_mapper/plugins/dumpable'
38
42
  autoload :EmbeddedCallbacks, 'mongo_mapper/plugins/embedded_callbacks'
39
43
  autoload :EmbeddedDocument, 'mongo_mapper/plugins/embedded_document'
40
44
  autoload :Equality, 'mongo_mapper/plugins/equality'
@@ -10,7 +10,11 @@ module MongoMapper
10
10
 
11
11
  # @api public
12
12
  def connection
13
- @@connection ||= Mongo::Connection.new
13
+ @@connection ||= Mongo::MongoClient.new
14
+ end
15
+
16
+ def connection?
17
+ !!@@connection
14
18
  end
15
19
 
16
20
  # @api public
@@ -65,18 +69,23 @@ module MongoMapper
65
69
  raise 'Set config before connecting. MongoMapper.config = {...}' if config.blank?
66
70
  env = config_for_environment(environment)
67
71
 
68
- if env['options'].is_a? Hash
72
+ if env['options'].is_a?(Hash)
69
73
  options = env['options'].symbolize_keys.merge(options)
70
74
  end
75
+ options[:read] = options[:read].to_sym if options[:read].is_a? String
76
+
77
+ if env.key?('ssl')
78
+ options[:ssl] = env['ssl']
79
+ end
71
80
 
72
81
  MongoMapper.connection = if env['hosts']
73
82
  if env['hosts'].first.is_a?(String)
74
- Mongo::ReplSetConnection.new( env['hosts'], options )
83
+ Mongo::MongoReplicaSetClient.new( env['hosts'], options )
75
84
  else
76
- Mongo::ReplSetConnection.new( *env['hosts'].push(options) )
85
+ Mongo::MongoReplicaSetClient.new( *env['hosts'].push(options) )
77
86
  end
78
87
  else
79
- Mongo::Connection.new(env['host'], env['port'], options)
88
+ Mongo::MongoClient.new(env['host'], env['port'], options)
80
89
  end
81
90
 
82
91
  MongoMapper.database = env['database']
@@ -90,11 +99,13 @@ module MongoMapper
90
99
  end
91
100
 
92
101
  def handle_passenger_forking
102
+ # :nocov:
93
103
  if defined?(PhusionPassenger)
94
104
  PhusionPassenger.on_event(:starting_worker_process) do |forked|
95
105
  connection.connect if forked
96
106
  end
97
107
  end
108
+ # :nocov:
98
109
  end
99
110
  end
100
- end
111
+ end
@@ -6,6 +6,7 @@ module MongoMapper
6
6
 
7
7
  include Plugins::ActiveModel
8
8
  include Plugins::Document
9
+ include Plugins::Dumpable
9
10
  include Plugins::Querying # for now needs to be before associations (save_to_collection)
10
11
  include Plugins::Associations
11
12
  include Plugins::Caching
@@ -12,10 +12,13 @@ module MongoMapper
12
12
  # raised when trying to do something not supported, mostly for edocs
13
13
  class NotSupported < Error; end
14
14
 
15
+ # raised when trying to create a key with an invalid name
16
+ class InvalidKey < Error; end
17
+
15
18
  # raised when document not valid and using !
16
19
  class DocumentNotValid < Error
17
20
  attr_reader :document
18
-
21
+
19
22
  def initialize(document)
20
23
  @document = document
21
24
  super("Validation failed: #{document.errors.full_messages.join(", ")}")
@@ -3,7 +3,7 @@ module MongoMapper
3
3
  module Extensions
4
4
  module Binary
5
5
  def to_mongo(value)
6
- if value.is_a?(::BSON::Binary)
6
+ if value.instance_of?(::BSON::Binary)
7
7
  value
8
8
  else
9
9
  value.nil? ? nil : ::BSON::Binary.new(value)
@@ -3,37 +3,34 @@ module MongoMapper
3
3
  module Extensions
4
4
  module Boolean
5
5
  Mapping = {
6
- true => true,
7
- 'true' => true,
8
- 'TRUE' => true,
9
- 'True' => true,
10
- 't' => true,
11
- 'T' => true,
12
- '1' => true,
13
- 1 => true,
6
+ true => true,
7
+ 'true' => true,
8
+ 'TRUE' => true,
9
+ 'True' => true,
10
+ 't' => true,
11
+ 'T' => true,
12
+ '1' => true,
13
+ 1 => true,
14
14
  1.0 => true,
15
- false => false,
16
- 'false' => false,
17
- 'FALSE' => false,
18
- 'False' => false,
19
- 'f' => false,
20
- 'F' => false,
21
- '0' => false,
22
- 0 => false,
23
- 0.0 => false,
15
+ false => false,
16
+ 'false' => false,
17
+ 'FALSE' => false,
18
+ 'False' => false,
19
+ 'f' => false,
20
+ 'F' => false,
21
+ '0' => false,
22
+ 0 => false,
23
+ 0.0 => false,
24
24
  nil => nil
25
25
  }
26
26
 
27
27
  def to_mongo(value)
28
- if value.is_a?(Boolean)
29
- value
30
- else
31
- Mapping[value]
32
- end
28
+ Mapping[value]
33
29
  end
34
30
 
35
31
  def from_mongo(value)
36
- value.nil? ? nil : !!value
32
+ return nil if value == nil
33
+ !!value
37
34
  end
38
35
  end
39
36
  end
@@ -3,10 +3,10 @@ module MongoMapper
3
3
  module Extensions
4
4
  module Date
5
5
  def to_mongo(value)
6
- if value.nil? || value == ''
6
+ if value.nil? || (value.instance_of?(String) && '' === value)
7
7
  nil
8
8
  else
9
- date = value.is_a?(::Date) || value.is_a?(::Time) ? value : ::Date.parse(value.to_s)
9
+ date = value.instance_of?(::Date) || value.instance_of?(::Time) ? value : ::Date.parse(value.to_s)
10
10
  ::Time.utc(date.year, date.month, date.day)
11
11
  end
12
12
  rescue
@@ -14,7 +14,7 @@ module MongoMapper
14
14
  end
15
15
 
16
16
  def from_mongo(value)
17
- value.to_date if value.present?
17
+ value.to_date if value
18
18
  end
19
19
  end
20
20
  end
@@ -10,10 +10,14 @@ module MongoMapper
10
10
  value_to_i
11
11
  end
12
12
  end
13
+
14
+ def from_mongo(value)
15
+ value && value.to_i
16
+ end
13
17
  end
14
18
  end
15
19
  end
16
20
 
17
21
  class Integer
18
22
  extend MongoMapper::Extensions::Integer
19
- end
23
+ end
@@ -1,4 +1,5 @@
1
1
  # encoding: UTF-8
2
+ # :nocov:
2
3
  module Kernel
3
4
  # Returns the object's singleton class.
4
5
  def singleton_class
@@ -7,3 +8,4 @@ module Kernel
7
8
  end
8
9
  end unless respond_to?(:singleton_class) # exists in 1.9.2
9
10
  end
11
+ # :nocov:
@@ -0,0 +1,23 @@
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:
@@ -3,11 +3,11 @@ module MongoMapper
3
3
  module Extensions
4
4
  module String
5
5
  def to_mongo(value)
6
- value.nil? ? nil : value.to_s
6
+ value && value.to_s
7
7
  end
8
8
 
9
9
  def from_mongo(value)
10
- value.nil? ? nil : value.to_s
10
+ value && value.to_s
11
11
  end
12
12
  end
13
13
  end
@@ -1,20 +1,22 @@
1
+ require 'active_support/core_ext/time/zones'
2
+
1
3
  # encoding: UTF-8
2
4
  module MongoMapper
3
5
  module Extensions
4
6
  module Time
5
7
  def to_mongo(value)
6
- if value.nil? || value == ''
8
+ if !value || '' == value
7
9
  nil
8
10
  else
9
- time_class = ::Time.try(:zone).present? ? ::Time.zone : ::Time
11
+ time_class = ::Time.zone || ::Time
10
12
  time = value.is_a?(::Time) ? value : time_class.parse(value.to_s)
11
- at(time.to_f).utc if time # ensure milliseconds are preserved with to_f (issue #308)
13
+ at(time.to_i, time.usec / 1000 * 1000).utc
12
14
  end
13
15
  end
14
16
 
15
17
  def from_mongo(value)
16
- if ::Time.try(:zone).present? && value.present?
17
- value.in_time_zone(::Time.zone)
18
+ if value and zone = ::Time.zone
19
+ value.in_time_zone(zone)
18
20
  else
19
21
  value
20
22
  end
@@ -9,15 +9,14 @@ module MongoMapper
9
9
  # You have to insert after callbacks so the entire request is wrapped.
10
10
  class IdentityMap
11
11
  class Body
12
+ extend Forwardable
13
+ def_delegator :@target, :each
14
+
12
15
  def initialize(target, original)
13
16
  @target = target
14
17
  @original = original
15
18
  end
16
19
 
17
- def each(&block)
18
- @target.each(&block)
19
- end
20
-
21
20
  def close
22
21
  @target.close if @target.respond_to?(:close)
23
22
  ensure
@@ -14,7 +14,7 @@ module MongoMapper
14
14
  plugins << mod
15
15
  end
16
16
 
17
- def included(base = nil, &block)
17
+ def included(base = nil)
18
18
  direct_descendants << base if base
19
19
  super
20
20
  end
@@ -27,15 +27,22 @@ module MongoMapper
27
27
  end
28
28
 
29
29
  def associations=(hash)
30
+ @embedded_associations = nil
30
31
  @associations = hash
31
32
  end
32
33
 
34
+ def embedded_associations
35
+ @embedded_associations ||= associations.values.select { |assoc| assoc.embeddable? }
36
+ end
37
+
33
38
  def associations_module_defined?
39
+ # :nocov:
34
40
  if method(:const_defined?).arity == 1 # Ruby 1.9 compat check
35
41
  const_defined?('MongoMapperAssociations')
36
42
  else
37
43
  const_defined?('MongoMapperAssociations', false)
38
44
  end
45
+ # :nocov:
39
46
  end
40
47
 
41
48
  def associations_module
@@ -51,6 +58,7 @@ module MongoMapper
51
58
 
52
59
  private
53
60
  def create_association(association)
61
+ @embedded_associations = nil
54
62
  associations[association.name] = association
55
63
  association.setup(self)
56
64
  end
@@ -61,7 +69,7 @@ module MongoMapper
61
69
  end
62
70
 
63
71
  def embedded_associations
64
- associations.values.select { |assoc| assoc.embeddable? }
72
+ self.class.embedded_associations
65
73
  end
66
74
 
67
75
  def build_proxy(association)
@@ -72,10 +80,8 @@ module MongoMapper
72
80
  end
73
81
 
74
82
  def get_proxy(association)
75
- unless proxy = self.instance_variable_get(association.ivar)
76
- proxy = build_proxy(association)
77
- end
78
- proxy
83
+ proxy = self.instance_variable_get(association.ivar) if instance_variable_defined?(association.ivar)
84
+ proxy ||= build_proxy(association)
79
85
  end
80
86
 
81
87
  def save_to_collection(options={})