mongo_mapper 0.13.0 → 0.15.1

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 (137) hide show
  1. checksums.yaml +5 -5
  2. data/LICENSE +1 -1
  3. data/README.md +61 -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 +7 -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 +15 -5
  19. data/lib/mongo_mapper/plugins/associations.rb +7 -6
  20. data/lib/mongo_mapper/plugins/associations/base.rb +27 -14
  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 +60 -29
  26. data/lib/mongo_mapper/plugins/associations/in_foreign_array_proxy.rb +136 -0
  27. data/lib/mongo_mapper/plugins/associations/many_association.rb +4 -2
  28. data/lib/mongo_mapper/plugins/associations/many_documents_as_proxy.rb +18 -16
  29. data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +55 -48
  30. data/lib/mongo_mapper/plugins/associations/many_embedded_polymorphic_proxy.rb +14 -13
  31. data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +7 -6
  32. data/lib/mongo_mapper/plugins/associations/many_polymorphic_proxy.rb +7 -5
  33. data/lib/mongo_mapper/plugins/associations/one_as_proxy.rb +14 -11
  34. data/lib/mongo_mapper/plugins/associations/one_embedded_polymorphic_proxy.rb +14 -13
  35. data/lib/mongo_mapper/plugins/associations/one_embedded_proxy.rb +9 -9
  36. data/lib/mongo_mapper/plugins/associations/one_proxy.rb +27 -26
  37. data/lib/mongo_mapper/plugins/associations/proxy.rb +36 -29
  38. data/lib/mongo_mapper/plugins/associations/single_association.rb +5 -4
  39. data/lib/mongo_mapper/plugins/callbacks.rb +13 -0
  40. data/lib/mongo_mapper/plugins/counter_cache.rb +97 -0
  41. data/lib/mongo_mapper/plugins/dirty.rb +29 -37
  42. data/lib/mongo_mapper/plugins/document.rb +1 -1
  43. data/lib/mongo_mapper/plugins/dynamic_querying.rb +10 -9
  44. data/lib/mongo_mapper/plugins/dynamic_querying/dynamic_finder.rb +18 -17
  45. data/lib/mongo_mapper/plugins/embedded_callbacks.rb +2 -1
  46. data/lib/mongo_mapper/plugins/embedded_document.rb +1 -1
  47. data/lib/mongo_mapper/plugins/identity_map.rb +4 -2
  48. data/lib/mongo_mapper/plugins/indexes.rb +14 -7
  49. data/lib/mongo_mapper/plugins/keys.rb +170 -151
  50. data/lib/mongo_mapper/plugins/keys/key.rb +27 -16
  51. data/lib/mongo_mapper/plugins/keys/static.rb +45 -0
  52. data/lib/mongo_mapper/plugins/modifiers.rb +64 -38
  53. data/lib/mongo_mapper/plugins/partial_updates.rb +86 -0
  54. data/lib/mongo_mapper/plugins/persistence.rb +13 -8
  55. data/lib/mongo_mapper/plugins/protected.rb +6 -5
  56. data/lib/mongo_mapper/plugins/querying.rb +85 -42
  57. data/lib/mongo_mapper/plugins/querying/decorated_plucky_query.rb +20 -15
  58. data/lib/mongo_mapper/plugins/rails.rb +1 -0
  59. data/lib/mongo_mapper/plugins/safe.rb +10 -4
  60. data/lib/mongo_mapper/plugins/sci.rb +0 -0
  61. data/lib/mongo_mapper/plugins/scopes.rb +78 -7
  62. data/lib/mongo_mapper/plugins/stats.rb +17 -0
  63. data/lib/mongo_mapper/plugins/strong_parameters.rb +26 -0
  64. data/lib/mongo_mapper/plugins/timestamps.rb +1 -0
  65. data/lib/mongo_mapper/plugins/validations.rb +1 -1
  66. data/lib/mongo_mapper/railtie.rb +4 -3
  67. data/lib/mongo_mapper/utils.rb +2 -2
  68. data/lib/mongo_mapper/version.rb +1 -1
  69. data/lib/rails/generators/mongo_mapper/config/config_generator.rb +12 -13
  70. data/lib/rails/generators/mongo_mapper/model/model_generator.rb +9 -9
  71. data/spec/examples.txt +1717 -0
  72. data/spec/functional/accessible_spec.rb +19 -13
  73. data/spec/functional/associations/belongs_to_polymorphic_proxy_spec.rb +13 -13
  74. data/spec/functional/associations/belongs_to_proxy_spec.rb +36 -20
  75. data/spec/functional/associations/in_array_proxy_spec.rb +145 -10
  76. data/spec/functional/associations/in_foreign_array_proxy_spec.rb +321 -0
  77. data/spec/functional/associations/many_documents_as_proxy_spec.rb +6 -6
  78. data/spec/functional/associations/many_documents_proxy_spec.rb +85 -14
  79. data/spec/functional/associations/many_embedded_polymorphic_proxy_spec.rb +13 -13
  80. data/spec/functional/associations/many_embedded_proxy_spec.rb +1 -1
  81. data/spec/functional/associations/many_polymorphic_proxy_spec.rb +4 -4
  82. data/spec/functional/associations/one_as_proxy_spec.rb +10 -10
  83. data/spec/functional/associations/one_embedded_polymorphic_proxy_spec.rb +9 -9
  84. data/spec/functional/associations/one_embedded_proxy_spec.rb +3 -3
  85. data/spec/functional/associations/one_proxy_spec.rb +10 -10
  86. data/spec/functional/associations_spec.rb +3 -3
  87. data/spec/functional/binary_spec.rb +2 -2
  88. data/spec/functional/caching_spec.rb +8 -15
  89. data/spec/functional/callbacks_spec.rb +89 -2
  90. data/spec/functional/counter_cache_spec.rb +235 -0
  91. data/spec/functional/dirty_spec.rb +63 -46
  92. data/spec/functional/document_spec.rb +30 -5
  93. data/spec/functional/dumpable_spec.rb +1 -1
  94. data/spec/functional/embedded_document_spec.rb +17 -17
  95. data/spec/functional/identity_map_spec.rb +29 -16
  96. data/spec/functional/indexes_spec.rb +19 -18
  97. data/spec/functional/keys_spec.rb +86 -28
  98. data/spec/functional/logger_spec.rb +3 -3
  99. data/spec/functional/modifiers_spec.rb +81 -19
  100. data/spec/functional/partial_updates_spec.rb +577 -0
  101. data/spec/functional/protected_spec.rb +14 -14
  102. data/spec/functional/querying_spec.rb +77 -28
  103. data/spec/functional/safe_spec.rb +23 -27
  104. data/spec/functional/sci_spec.rb +9 -9
  105. data/spec/functional/scopes_spec.rb +235 -2
  106. data/spec/functional/static_keys_spec.rb +153 -0
  107. data/spec/functional/stats_spec.rb +86 -0
  108. data/spec/functional/strong_parameters_spec.rb +49 -0
  109. data/spec/functional/touch_spec.rb +1 -1
  110. data/spec/functional/validations_spec.rb +51 -57
  111. data/spec/quality_spec.rb +51 -0
  112. data/spec/spec_helper.rb +37 -9
  113. data/spec/support/matchers.rb +5 -14
  114. data/spec/unit/associations/base_spec.rb +12 -12
  115. data/spec/unit/associations/belongs_to_association_spec.rb +2 -2
  116. data/spec/unit/associations/many_association_spec.rb +2 -2
  117. data/spec/unit/associations/one_association_spec.rb +2 -2
  118. data/spec/unit/associations/proxy_spec.rb +19 -20
  119. data/spec/unit/clone_spec.rb +1 -1
  120. data/spec/unit/document_spec.rb +8 -8
  121. data/spec/unit/dynamic_finder_spec.rb +8 -8
  122. data/spec/unit/embedded_document_spec.rb +18 -19
  123. data/spec/unit/extensions_spec.rb +41 -17
  124. data/spec/unit/identity_map_middleware_spec.rb +65 -96
  125. data/spec/unit/key_spec.rb +28 -26
  126. data/spec/unit/keys_spec.rb +20 -11
  127. data/spec/unit/model_generator_spec.rb +0 -0
  128. data/spec/unit/mongo_mapper_spec.rb +38 -85
  129. data/spec/unit/rails_spec.rb +5 -0
  130. data/spec/unit/serialization_spec.rb +1 -1
  131. data/spec/unit/time_zones_spec.rb +2 -2
  132. data/spec/unit/validations_spec.rb +46 -33
  133. metadata +66 -37
  134. data/README.rdoc +0 -59
  135. data/lib/mongo_mapper/connections/10gen.rb +0 -0
  136. data/lib/mongo_mapper/connections/moped.rb +0 -0
  137. data/lib/mongo_mapper/extensions/ordered_hash.rb +0 -23
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: cd7ff4dfcd2b6bce162c7b55ba45e8c00e38a461
4
- data.tar.gz: 673686bd40a1c139e2045b5397802239cd5d894c
2
+ SHA256:
3
+ metadata.gz: 77d669d6c4286995fb2afbed7cf23475c6dc496cb3faf97a57f3b8f115e263b3
4
+ data.tar.gz: d11040bb05eeb6cb57465c4585c0667b16d750b16d7fd5fedca5e03734b769ac
5
5
  SHA512:
6
- metadata.gz: 36943d83bc3ddff1cd8c82d8bddfdde2fa3dfae12800f4c93260480185925e1f34e5a8622b7682b176a318579ee723339286a5c5b99678e9731301e475fb183b
7
- data.tar.gz: 039605ede2145f91ef107e39dc91d43db57906be355737198fe0a1cff97a2eeb821a9a9460fa977f1a2cc520cdf07c1177994db5ad623e298203e50e6f5838a4
6
+ metadata.gz: 56a665e63c65da52238cc18348333a2a9c6b6d1c5acf564308f60f8fcec8a1be759c5b7546a0259092a7f6acc9170659d55c462ac59fffe6520f3339a650df15
7
+ data.tar.gz: 8dceac60d1ef1159585453450d2960e4d9d50e472ec7728f3b703da8e40e80af625b01bb6c4022327e16631960faa698da93c7d37c563cd1c839eb3ebfc28ddb
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,61 @@
1
+ # MongoMapper
2
+
3
+ A Ruby Object Mapper for Mongo.
4
+
5
+ [<img src="https://badge.fury.io/rb/mongo_mapper.svg" alt="RubyGems">](https://rubygems.org/gems/mongo_mapper)
6
+
7
+ [<img src="https://travis-ci.org/mongomapper/mongomapper.svg?branch=master" alt="Build Status" />](https://travis-ci.org/mongomapper/mongomapper)
8
+
9
+ [<img src="https://coveralls.io/repos/mongomapper/mongomapper/badge.svg" 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
+ ## Copyright
49
+
50
+ Copyright (c) 2009-2020 MongoMapper. See LICENSE for details.
51
+
52
+ ## Contributors
53
+
54
+ MongoMapper/Plucky is:
55
+
56
+ * John Nunemaker
57
+ * Chris Heald
58
+ * Scott Taylor
59
+
60
+ But all open source projects are a team effort and could not happen without
61
+ everyone who has contributed. See `CONTRIBUTORS` for the full list. Thank you!
@@ -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',
@@ -10,7 +10,7 @@ class User
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)
@@ -10,7 +10,7 @@ class User
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)
@@ -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,8 @@ 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'
65
+ autoload :StrongParameters, 'mongo_mapper/plugins/strong_parameters'
60
66
  autoload :Timestamps, 'mongo_mapper/plugins/timestamps'
61
67
  autoload :Userstamps, 'mongo_mapper/plugins/userstamps'
62
68
  autoload :Validations, 'mongo_mapper/plugins/validations'
@@ -82,6 +88,7 @@ module MongoMapper
82
88
  autoload :OneEmbeddedProxy, 'mongo_mapper/plugins/associations/one_embedded_proxy'
83
89
  autoload :OneEmbeddedPolymorphicProxy, 'mongo_mapper/plugins/associations/one_embedded_polymorphic_proxy'
84
90
  autoload :InArrayProxy, 'mongo_mapper/plugins/associations/in_array_proxy'
91
+ autoload :InForeignArrayProxy, 'mongo_mapper/plugins/associations/in_foreign_array_proxy'
85
92
  end
86
93
  end
87
94
 
@@ -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
@@ -42,11 +42,21 @@ module MongoMapper
42
42
  self.class.accessible_attributes?
43
43
  end
44
44
 
45
- protected
46
- def filter_inaccessible_attrs(attrs)
47
- return attrs if !accessible_attributes? || attrs.blank?
48
- attrs.dup.delete_if { |key, val| !accessible_attributes.include?(key.to_sym) }
45
+ protected
46
+
47
+ def filter_inaccessible_attrs(attrs)
48
+ return attrs if !accessible_attributes? || attrs.blank?
49
+ attrs.dup.delete_if { |key, val| attribute_inaccessible?(key.to_sym) }
50
+ end
51
+
52
+ def attribute_inaccessible?(attribute)
53
+ unless accessible_attributes.include?(attribute)
54
+ message = "Can't mass-assign protected attribute: #{attribute}"
55
+ MongoMapper.logger ? MongoMapper.logger.warn(message) : puts(message)
56
+
57
+ return true
49
58
  end
59
+ end
50
60
  end
51
61
  end
52
- end
62
+ end