mongo_mapper 0.12.0 → 0.13.0.beta1

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 (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={})