mongo_mapper 0.13.0.beta2 → 0.15.0

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 (132) hide show
  1. checksums.yaml +5 -5
  2. data/LICENSE +1 -1
  3. data/README.md +64 -0
  4. data/examples/keys.rb +3 -3
  5. data/examples/modifiers/set.rb +2 -2
  6. data/examples/querying.rb +3 -3
  7. data/examples/safe.rb +2 -2
  8. data/examples/scopes.rb +1 -1
  9. data/lib/mongo_mapper.rb +5 -0
  10. data/lib/mongo_mapper/connection.rb +16 -37
  11. data/lib/mongo_mapper/document.rb +4 -0
  12. data/lib/mongo_mapper/extensions/array.rb +14 -6
  13. data/lib/mongo_mapper/extensions/hash.rb +15 -3
  14. data/lib/mongo_mapper/extensions/object.rb +4 -0
  15. data/lib/mongo_mapper/extensions/object_id.rb +5 -1
  16. data/lib/mongo_mapper/extensions/string.rb +13 -5
  17. data/lib/mongo_mapper/extensions/symbol.rb +18 -0
  18. data/lib/mongo_mapper/plugins/accessible.rb +14 -4
  19. data/lib/mongo_mapper/plugins/associations.rb +7 -6
  20. data/lib/mongo_mapper/plugins/associations/base.rb +18 -13
  21. data/lib/mongo_mapper/plugins/associations/belongs_to_association.rb +10 -1
  22. data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +9 -8
  23. data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +12 -11
  24. data/lib/mongo_mapper/plugins/associations/embedded_collection.rb +4 -4
  25. data/lib/mongo_mapper/plugins/associations/in_array_proxy.rb +24 -23
  26. data/lib/mongo_mapper/plugins/associations/many_documents_as_proxy.rb +18 -16
  27. data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +55 -48
  28. data/lib/mongo_mapper/plugins/associations/many_embedded_polymorphic_proxy.rb +14 -13
  29. data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +7 -6
  30. data/lib/mongo_mapper/plugins/associations/many_polymorphic_proxy.rb +7 -5
  31. data/lib/mongo_mapper/plugins/associations/one_as_proxy.rb +17 -14
  32. data/lib/mongo_mapper/plugins/associations/one_embedded_polymorphic_proxy.rb +14 -13
  33. data/lib/mongo_mapper/plugins/associations/one_embedded_proxy.rb +9 -9
  34. data/lib/mongo_mapper/plugins/associations/one_proxy.rb +27 -26
  35. data/lib/mongo_mapper/plugins/associations/proxy.rb +31 -28
  36. data/lib/mongo_mapper/plugins/callbacks.rb +14 -1
  37. data/lib/mongo_mapper/plugins/counter_cache.rb +97 -0
  38. data/lib/mongo_mapper/plugins/dirty.rb +29 -37
  39. data/lib/mongo_mapper/plugins/document.rb +1 -1
  40. data/lib/mongo_mapper/plugins/dynamic_querying.rb +10 -9
  41. data/lib/mongo_mapper/plugins/dynamic_querying/dynamic_finder.rb +18 -17
  42. data/lib/mongo_mapper/plugins/embedded_callbacks.rb +2 -1
  43. data/lib/mongo_mapper/plugins/embedded_document.rb +1 -1
  44. data/lib/mongo_mapper/plugins/identity_map.rb +1 -1
  45. data/lib/mongo_mapper/plugins/indexes.rb +37 -2
  46. data/lib/mongo_mapper/plugins/keys.rb +202 -142
  47. data/lib/mongo_mapper/plugins/keys/key.rb +22 -13
  48. data/lib/mongo_mapper/plugins/keys/static.rb +45 -0
  49. data/lib/mongo_mapper/plugins/modifiers.rb +59 -28
  50. data/lib/mongo_mapper/plugins/partial_updates.rb +86 -0
  51. data/lib/mongo_mapper/plugins/persistence.rb +13 -8
  52. data/lib/mongo_mapper/plugins/protected.rb +6 -5
  53. data/lib/mongo_mapper/plugins/querying.rb +85 -42
  54. data/lib/mongo_mapper/plugins/querying/decorated_plucky_query.rb +32 -9
  55. data/lib/mongo_mapper/plugins/rails.rb +1 -0
  56. data/lib/mongo_mapper/plugins/safe.rb +10 -4
  57. data/lib/mongo_mapper/plugins/sci.rb +4 -1
  58. data/lib/mongo_mapper/plugins/scopes.rb +78 -7
  59. data/lib/mongo_mapper/plugins/stats.rb +17 -0
  60. data/lib/mongo_mapper/plugins/timestamps.rb +1 -0
  61. data/lib/mongo_mapper/plugins/touch.rb +1 -1
  62. data/lib/mongo_mapper/plugins/validations.rb +7 -2
  63. data/lib/mongo_mapper/railtie.rb +20 -0
  64. data/lib/mongo_mapper/railtie/database.rake +1 -1
  65. data/lib/mongo_mapper/utils.rb +2 -2
  66. data/lib/mongo_mapper/version.rb +1 -1
  67. data/lib/rails/generators/mongo_mapper/config/config_generator.rb +12 -13
  68. data/lib/rails/generators/mongo_mapper/model/model_generator.rb +9 -9
  69. data/spec/examples.txt +1643 -0
  70. data/spec/functional/accessible_spec.rb +13 -13
  71. data/spec/functional/associations/belongs_to_polymorphic_proxy_spec.rb +13 -13
  72. data/spec/functional/associations/belongs_to_proxy_spec.rb +18 -19
  73. data/spec/functional/associations/in_array_proxy_spec.rb +10 -10
  74. data/spec/functional/associations/many_documents_as_proxy_spec.rb +6 -6
  75. data/spec/functional/associations/many_documents_proxy_spec.rb +85 -14
  76. data/spec/functional/associations/many_embedded_polymorphic_proxy_spec.rb +13 -13
  77. data/spec/functional/associations/many_embedded_proxy_spec.rb +1 -1
  78. data/spec/functional/associations/many_polymorphic_proxy_spec.rb +4 -4
  79. data/spec/functional/associations/one_as_proxy_spec.rb +10 -10
  80. data/spec/functional/associations/one_embedded_polymorphic_proxy_spec.rb +9 -9
  81. data/spec/functional/associations/one_embedded_proxy_spec.rb +3 -3
  82. data/spec/functional/associations/one_proxy_spec.rb +10 -10
  83. data/spec/functional/associations_spec.rb +3 -3
  84. data/spec/functional/binary_spec.rb +2 -2
  85. data/spec/functional/caching_spec.rb +8 -15
  86. data/spec/functional/callbacks_spec.rb +89 -2
  87. data/spec/functional/counter_cache_spec.rb +235 -0
  88. data/spec/functional/dirty_spec.rb +63 -46
  89. data/spec/functional/document_spec.rb +30 -2
  90. data/spec/functional/dumpable_spec.rb +1 -1
  91. data/spec/functional/embedded_document_spec.rb +18 -18
  92. data/spec/functional/identity_map_spec.rb +27 -14
  93. data/spec/functional/indexes_spec.rb +44 -19
  94. data/spec/functional/keys_spec.rb +117 -15
  95. data/spec/functional/logger_spec.rb +3 -3
  96. data/spec/functional/modifiers_spec.rb +67 -19
  97. data/spec/functional/partial_updates_spec.rb +577 -0
  98. data/spec/functional/protected_spec.rb +14 -14
  99. data/spec/functional/querying_spec.rb +55 -28
  100. data/spec/functional/safe_spec.rb +23 -27
  101. data/spec/functional/sci_spec.rb +49 -14
  102. data/spec/functional/scopes_spec.rb +235 -2
  103. data/spec/functional/static_keys_spec.rb +153 -0
  104. data/spec/functional/stats_spec.rb +86 -0
  105. data/spec/functional/touch_spec.rb +6 -6
  106. data/spec/functional/validations_spec.rb +51 -57
  107. data/spec/quality_spec.rb +51 -0
  108. data/spec/spec_helper.rb +37 -9
  109. data/spec/support/matchers.rb +5 -14
  110. data/spec/unit/associations/base_spec.rb +12 -12
  111. data/spec/unit/associations/belongs_to_association_spec.rb +2 -2
  112. data/spec/unit/associations/many_association_spec.rb +2 -2
  113. data/spec/unit/associations/one_association_spec.rb +2 -2
  114. data/spec/unit/associations/proxy_spec.rb +19 -16
  115. data/spec/unit/clone_spec.rb +1 -1
  116. data/spec/unit/document_spec.rb +8 -8
  117. data/spec/unit/dynamic_finder_spec.rb +8 -8
  118. data/spec/unit/embedded_document_spec.rb +18 -19
  119. data/spec/unit/extensions_spec.rb +41 -17
  120. data/spec/unit/identity_map_middleware_spec.rb +65 -96
  121. data/spec/unit/inspect_spec.rb +4 -4
  122. data/spec/unit/key_spec.rb +28 -26
  123. data/spec/unit/keys_spec.rb +10 -10
  124. data/spec/unit/model_generator_spec.rb +2 -4
  125. data/spec/unit/mongo_mapper_spec.rb +38 -85
  126. data/spec/unit/rails_spec.rb +5 -0
  127. data/spec/unit/serialization_spec.rb +1 -1
  128. data/spec/unit/time_zones_spec.rb +2 -2
  129. data/spec/unit/validations_spec.rb +28 -15
  130. metadata +188 -161
  131. data/README.rdoc +0 -55
  132. data/lib/mongo_mapper/extensions/ordered_hash.rb +0 -23
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: c064a0c4fc8a69754fd97b1d4d111b47533c5a9f
4
- data.tar.gz: 93299ab0ef2f65d42de3a218315c4575ea6569a9
2
+ SHA256:
3
+ metadata.gz: 143438e47efd4cc910b443067a35aff261a7c32baa12bbe8836b0505edb6c8ad
4
+ data.tar.gz: 0d8d33172da4805fa47544585d2ea5369a82e9154be19dcd9be2789b5c2747cb
5
5
  SHA512:
6
- metadata.gz: 2552482a4e28cdc65871040dc6425ddf1a6030e9a1896ddb1b4bdd0442ca11c3fd0a01edf3838768fde2102376ddb957af2ce7ae563d07b92ab623ab71d6c2fc
7
- data.tar.gz: e9a796fbf22d16874f9f862ff030e2aa29eb53fadc373cba5affdfd8fafee02fef0a04d33805520dac387fc6c4c9b935689cbf65ade1633152eacc4ffc085432
6
+ metadata.gz: 50b970107ed41cc982e24fe9d171fed471847c593db3c5239b7e60fa88fb67ef799473eb1a088d2eb92d6d2cda49d8ec391b61a24e92bb5b9a9e7eea399ed61b
7
+ data.tar.gz: 1674cc8cdc27d2f3bc7460a8f32017903bde7263feeae62bf3074386d5fa0b080b3fc52c4407c200a7b4df8fb083fd917e6b5611b19f8538ec10033c789667ab
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2009 John Nunemaker
1
+ Copyright (c) 2009-2020 MongoMapper: John Nunemaker, Chris Heald, Scott Taylor
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
@@ -0,0 +1,64 @@
1
+ # MongoMapper
2
+
3
+ A Ruby Object Mapper for Mongo.
4
+
5
+ [<img src="https://badge.fury.io/rb/mongo_mapper.png" alt="RubyGems">](https://rubygems.org/gems/mongo_mapper)
6
+
7
+ [<img src="https://travis-ci.org/mongomapper/mongomapper.png?branch=master" alt="Build Status" />](https://travis-ci.org/mongomapper/mongomapper)
8
+
9
+ [<img src="https://coveralls.io/repos/mongomapper/mongomapper/badge.png" alt="Coverage Status" />](https://coveralls.io/r/mongomapper/mongomapper)
10
+
11
+ ## Install
12
+
13
+ $ gem install mongo_mapper
14
+
15
+ ## Documentation
16
+
17
+ http://mongomapper.com/documentation/
18
+
19
+ http://rdoc.info/github/mongomapper/mongomapper
20
+
21
+ ## Compatibility
22
+
23
+ MongoMapper is tested against:
24
+
25
+ * MRI 2.4 - 2.7
26
+ * JRuby (Versions with 1.9 compatibility)
27
+
28
+ Additionally, MongoMapper is tested against:
29
+
30
+ * Rails 5.0+ - 6.0
31
+
32
+ ## Contributing & Development
33
+
34
+ $ git clone https://github.com/mongomapper/mongomapper && cd mongomapper
35
+ $ bundle install
36
+ $ bundle exec rake
37
+
38
+ * Fork the project.
39
+ * Make your feature addition or bug fix. All specs should pass.
40
+ * Add specs for your changes. This is important so I don't break it in a future version unintentionally.
41
+ * 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.
42
+ * Send a pull request. Bonus points for topic branches.
43
+
44
+ ## Problems or Questions?
45
+
46
+ Hit up the Google group: http://groups.google.com/group/mongomapper
47
+
48
+ Hop on IRC: irc://chat.freenode.net/#mongomapper
49
+
50
+ ## Copyright
51
+
52
+ Copyright (c) 2009-2020 MongoMapper. See LICENSE for details.
53
+
54
+ ## Contributors
55
+
56
+ MongoMapper/Plucky is:
57
+
58
+ * John Nunemaker
59
+ * Chris Heald
60
+ * Scott Taylor
61
+
62
+ With contributions from:
63
+
64
+ * Frederick Cheung
@@ -16,7 +16,7 @@ class User
16
16
  key :links, Hash
17
17
  timestamps!
18
18
  end
19
- User.collection.remove # empties collection
19
+ User.collection.drop # empties collection
20
20
 
21
21
  john = User.create({
22
22
  :first_name => 'John',
@@ -24,7 +24,7 @@ john = User.create({
24
24
  :age => 28,
25
25
  :skills => ['ruby', 'mongo', 'javascript'],
26
26
  :links => {"Google" => "http://www.google.com"}
27
- })
27
+ })
28
28
 
29
29
  steve = User.create({
30
30
  :first_name => 'Steve',
@@ -37,4 +37,4 @@ john.friend_ids << steve.id.to_s # will get typecast to ObjectId
37
37
  john.links["Ruby on Rails"] = "http://www.rubyonrails.com"
38
38
  john.save
39
39
 
40
- pp john
40
+ pp john
@@ -6,11 +6,11 @@ MongoMapper.database = 'testing'
6
6
 
7
7
  class User
8
8
  include MongoMapper::Document
9
-
9
+
10
10
  key :name, String
11
11
  key :tags, Array
12
12
  end
13
- User.collection.remove # empties collection
13
+ User.collection.drop # empties collection
14
14
 
15
15
  john = User.create(:name => 'John', :tags => %w[ruby mongo], :age => 28)
16
16
  bill = User.create(:name => 'Bill', :tags => %w[ruby mongo], :age => 30)
@@ -6,11 +6,11 @@ MongoMapper.database = 'testing'
6
6
 
7
7
  class User
8
8
  include MongoMapper::Document
9
-
9
+
10
10
  key :name, String
11
11
  key :tags, Array
12
12
  end
13
- User.collection.remove # empties collection
13
+ User.collection.drop # empties collection
14
14
 
15
15
  User.create(:name => 'John', :tags => %w[ruby mongo], :age => 28)
16
16
  User.create(:name => 'Bill', :tags => %w[ruby mongo], :age => 30)
@@ -32,4 +32,4 @@ User.create(:name => 'Steve', :tags => %w[html5 css3], :age => 27)
32
32
  ].each do |result|
33
33
  pp result
34
34
  puts
35
- end
35
+ end
@@ -22,7 +22,7 @@ puts
22
22
  begin
23
23
  user = User.new(:email => 'nunemaker@gmail.com')
24
24
  user.save(:safe => true)
25
- rescue Mongo::OperationFailure => e
25
+ rescue Mongo::Error::OperationFailure => e
26
26
  puts 'Mongo Operation failure raised because duplicate email was entered'
27
27
  puts e.inspect
28
28
  puts
@@ -37,7 +37,7 @@ User.safe
37
37
 
38
38
  begin
39
39
  User.create(:email => 'nunemaker@gmail.com')
40
- rescue Mongo::OperationFailure => e
40
+ rescue Mongo::Error::OperationFailure => e
41
41
  puts 'Mongo Operation failure raised because duplicate email was entered'
42
42
  puts e.inspect
43
43
  end
@@ -28,7 +28,7 @@ class User
28
28
  key :name, String
29
29
  key :tags, Array
30
30
  end
31
- User.collection.remove # empties collection
31
+ User.collection.drop # empties collection
32
32
 
33
33
  User.create(:name => 'John', :tags => %w[ruby mongo], :age => 28)
34
34
  User.create(:name => 'Bill', :tags => %w[ruby mongo], :age => 30)
@@ -1,7 +1,9 @@
1
1
  # encoding: UTF-8
2
2
  require 'plucky'
3
+ require 'active_support'
3
4
  require 'active_support/core_ext'
4
5
  require 'active_model'
6
+ require 'activemodel-serializers-xml'
5
7
  require "mongo_mapper/railtie" if defined?(Rails)
6
8
 
7
9
  I18n.load_path << File.expand_path('../mongo_mapper/locale/en.yml', __FILE__)
@@ -35,6 +37,7 @@ module MongoMapper
35
37
  autoload :Callbacks, 'mongo_mapper/plugins/callbacks'
36
38
  autoload :Caching, 'mongo_mapper/plugins/caching'
37
39
  autoload :Clone, 'mongo_mapper/plugins/clone'
40
+ autoload :CounterCache, 'mongo_mapper/plugins/counter_cache'
38
41
  autoload :Dirty, 'mongo_mapper/plugins/dirty'
39
42
  autoload :Document, 'mongo_mapper/plugins/document'
40
43
  autoload :DynamicQuerying, 'mongo_mapper/plugins/dynamic_querying'
@@ -49,6 +52,7 @@ module MongoMapper
49
52
  autoload :Logger, 'mongo_mapper/plugins/logger'
50
53
  autoload :Modifiers, 'mongo_mapper/plugins/modifiers'
51
54
  autoload :Pagination, 'mongo_mapper/plugins/pagination'
55
+ autoload :PartialUpdates, 'mongo_mapper/plugins/partial_updates'
52
56
  autoload :Persistence, 'mongo_mapper/plugins/persistence'
53
57
  autoload :Protected, 'mongo_mapper/plugins/protected'
54
58
  autoload :Querying, 'mongo_mapper/plugins/querying'
@@ -57,6 +61,7 @@ module MongoMapper
57
61
  autoload :Sci, 'mongo_mapper/plugins/sci'
58
62
  autoload :Scopes, 'mongo_mapper/plugins/scopes'
59
63
  autoload :Serialization, 'mongo_mapper/plugins/serialization'
64
+ autoload :Stats, 'mongo_mapper/plugins/stats'
60
65
  autoload :Timestamps, 'mongo_mapper/plugins/timestamps'
61
66
  autoload :Userstamps, 'mongo_mapper/plugins/userstamps'
62
67
  autoload :Validations, 'mongo_mapper/plugins/validations'
@@ -4,13 +4,12 @@ require 'uri'
4
4
  module MongoMapper
5
5
  module Connection
6
6
  @@connection = nil
7
- @@database = nil
8
- @@database_name = nil
9
7
  @@config = nil
8
+ @@database = nil
10
9
 
11
10
  # @api public
12
11
  def connection
13
- @@connection ||= Mongo::MongoClient.new
12
+ @@connection ||= Mongo::Client.new ['127.0.0.1:27017']
14
13
  end
15
14
 
16
15
  def connection?
@@ -29,15 +28,12 @@ module MongoMapper
29
28
 
30
29
  # @api public
31
30
  def database=(name)
32
- @@database = nil
33
- @@database_name = name
31
+ @@database = connection.use(name).database
34
32
  end
35
33
 
36
34
  # @api public
37
35
  def database
38
- return nil if @@database_name.blank?
39
-
40
- @@database ||= MongoMapper.connection.db(@@database_name)
36
+ @@database ||= connection.database
41
37
  end
42
38
 
43
39
  def config=(hash)
@@ -51,45 +47,28 @@ module MongoMapper
51
47
 
52
48
  # @api private
53
49
  def config_for_environment(environment)
54
- env = config[environment.to_s] || {}
55
- return env if env['uri'].blank?
56
-
57
- uri = URI.parse(env['uri'])
58
- raise InvalidScheme.new('must be mongodb') unless uri.scheme == 'mongodb'
59
- {
60
- 'host' => uri.host,
61
- 'port' => uri.port,
62
- 'database' => uri.path.gsub(/^\//, ''),
63
- 'username' => uri.user,
64
- 'password' => uri.password,
65
- }
50
+ config[environment.to_s]
66
51
  end
67
52
 
68
53
  def connect(environment, options={})
69
54
  raise 'Set config before connecting. MongoMapper.config = {...}' if config.blank?
70
- env = config_for_environment(environment)
55
+ env = config_for_environment(environment).dup
56
+ addresses_or_uri = env.delete('hosts') ||
57
+ env.delete('uri') ||
58
+ [env.delete('host')].compact
71
59
 
72
60
  if env['options'].is_a?(Hash)
73
- options = env['options'].symbolize_keys.merge(options)
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']
61
+ options = env.delete('options').symbolize_keys.merge(options)
79
62
  end
63
+ #database etc are all options to Mongo::Client.new now
64
+ options = env.symbolize_keys.merge(options)
80
65
 
81
- MongoMapper.connection = if env['hosts']
82
- if env['hosts'].first.is_a?(String)
83
- Mongo::MongoReplicaSetClient.new( env['hosts'], options )
84
- else
85
- Mongo::MongoReplicaSetClient.new( *env['hosts'].push(options) )
86
- end
87
- else
88
- Mongo::MongoClient.new(env['host'], env['port'], options)
66
+ if options[:port]
67
+ raise "port should be specified as part of the host or uri"
89
68
  end
90
69
 
91
- MongoMapper.database = env['database']
92
- MongoMapper.database.authenticate(env['username'], env['password']) if env['username'] && env['password']
70
+ options[:read] = options[:read].to_sym if options[:read].is_a? String
71
+ MongoMapper.connection = Mongo::Client.new(addresses_or_uri, options)
93
72
  end
94
73
 
95
74
  def setup(config, environment, options={})
@@ -16,6 +16,7 @@ module MongoMapper
16
16
  include Plugins::Inspect
17
17
  include Plugins::Indexes
18
18
  include Plugins::Keys
19
+ include Plugins::Keys::Static
19
20
  include Plugins::Dirty # for now dirty needs to be after keys
20
21
  include Plugins::Logger
21
22
  include Plugins::Modifiers
@@ -28,13 +29,16 @@ module MongoMapper
28
29
  include Plugins::Sci
29
30
  include Plugins::Scopes
30
31
  include Plugins::Serialization
32
+ include Plugins::Stats
31
33
  include Plugins::Timestamps
32
34
  include Plugins::Userstamps
33
35
  include Plugins::Touch
34
36
  include Plugins::Validations
35
37
  include Plugins::EmbeddedCallbacks
36
38
  include Plugins::Callbacks # for now callbacks needs to be after validations
39
+ include Plugins::PartialUpdates
37
40
  include Plugins::IdentityMap
41
+ include Plugins::CounterCache
38
42
 
39
43
  included do
40
44
  extend Plugins
@@ -2,18 +2,26 @@
2
2
  module MongoMapper
3
3
  module Extensions
4
4
  module Array
5
- def to_mongo(value)
6
- value = value.respond_to?(:lines) ? value.lines : value
7
- value.to_a
5
+ extend ActiveSupport::Concern
6
+
7
+ module ClassMethods
8
+ def to_mongo(value)
9
+ value = value.respond_to?(:lines) ? value.lines : value
10
+ value.to_a
11
+ end
12
+
13
+ def from_mongo(value)
14
+ value || []
15
+ end
8
16
  end
9
17
 
10
- def from_mongo(value)
11
- value || []
18
+ def _mongo_mapper_deep_copy_
19
+ map { |value| value._mongo_mapper_deep_copy_ }
12
20
  end
13
21
  end
14
22
  end
15
23
  end
16
24
 
17
25
  class Array
18
- extend MongoMapper::Extensions::Array
26
+ include MongoMapper::Extensions::Array
19
27
  end
@@ -2,13 +2,25 @@
2
2
  module MongoMapper
3
3
  module Extensions
4
4
  module Hash
5
- def from_mongo(value)
6
- HashWithIndifferentAccess.new(value || {})
5
+ extend ActiveSupport::Concern
6
+
7
+ module ClassMethods
8
+ def from_mongo(value)
9
+ HashWithIndifferentAccess.new(value || {})
10
+ end
11
+ end
12
+
13
+ def _mongo_mapper_deep_copy_
14
+ self.class.new.tap do |new_hash|
15
+ each do |key, value|
16
+ new_hash[key._mongo_mapper_deep_copy_] = value._mongo_mapper_deep_copy_
17
+ end
18
+ end
7
19
  end
8
20
  end
9
21
  end
10
22
  end
11
23
 
12
24
  class Hash
13
- extend MongoMapper::Extensions::Hash
25
+ include MongoMapper::Extensions::Hash
14
26
  end
@@ -17,6 +17,10 @@ module MongoMapper
17
17
  def to_mongo
18
18
  self.class.to_mongo(self)
19
19
  end
20
+
21
+ def _mongo_mapper_deep_copy_
22
+ self
23
+ end
20
24
  end
21
25
  end
22
26
  end
@@ -18,7 +18,7 @@ class ObjectId
18
18
  end
19
19
 
20
20
  class BSON::ObjectId
21
- alias_method :original_to_json, :to_json
21
+ alias_method :original_as_json, :as_json
22
22
 
23
23
  def as_json(options=nil)
24
24
  to_s
@@ -29,4 +29,8 @@ class BSON::ObjectId
29
29
  end
30
30
 
31
31
  alias to_str to_s
32
+
33
+ def original_to_json(*args)
34
+ original_as_json.to_json(*args)
35
+ end
32
36
  end
@@ -2,17 +2,25 @@
2
2
  module MongoMapper
3
3
  module Extensions
4
4
  module String
5
- def to_mongo(value)
6
- value && value.to_s
5
+ extend ActiveSupport::Concern
6
+
7
+ module ClassMethods
8
+ def to_mongo(value)
9
+ value && value.to_s
10
+ end
11
+
12
+ def from_mongo(value)
13
+ value && value.to_s
14
+ end
7
15
  end
8
16
 
9
- def from_mongo(value)
10
- value && value.to_s
17
+ def _mongo_mapper_deep_copy_
18
+ self.dup
11
19
  end
12
20
  end
13
21
  end
14
22
  end
15
23
 
16
24
  class String
17
- extend MongoMapper::Extensions::String
25
+ include MongoMapper::Extensions::String
18
26
  end
@@ -0,0 +1,18 @@
1
+ # encoding: UTF-8
2
+ module MongoMapper
3
+ module Extensions
4
+ module Symbol
5
+ def to_mongo(value)
6
+ value && value.to_s.to_sym
7
+ end
8
+
9
+ def from_mongo(value)
10
+ value && value.to_s.to_sym
11
+ end
12
+ end
13
+ end
14
+ end
15
+
16
+ class Symbol
17
+ extend MongoMapper::Extensions::Symbol
18
+ end