mongo_mapper 0.7.6 → 0.8.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 (134) hide show
  1. data/README.rdoc +4 -8
  2. data/bin/mmconsole +1 -1
  3. data/examples/keys.rb +37 -0
  4. data/examples/plugins.rb +41 -0
  5. data/examples/querying.rb +35 -0
  6. data/examples/scopes.rb +52 -0
  7. data/lib/mongo_mapper.rb +77 -97
  8. data/lib/mongo_mapper/connection.rb +83 -0
  9. data/lib/mongo_mapper/document.rb +10 -252
  10. data/lib/mongo_mapper/embedded_document.rb +7 -46
  11. data/lib/mongo_mapper/exceptions.rb +30 -0
  12. data/lib/mongo_mapper/extensions/array.rb +19 -0
  13. data/lib/mongo_mapper/extensions/binary.rb +22 -0
  14. data/lib/mongo_mapper/extensions/boolean.rb +44 -0
  15. data/lib/mongo_mapper/extensions/date.rb +25 -0
  16. data/lib/mongo_mapper/extensions/float.rb +14 -0
  17. data/lib/mongo_mapper/extensions/hash.rb +14 -0
  18. data/lib/mongo_mapper/extensions/integer.rb +19 -0
  19. data/lib/mongo_mapper/extensions/kernel.rb +9 -0
  20. data/lib/mongo_mapper/extensions/nil_class.rb +18 -0
  21. data/lib/mongo_mapper/extensions/object.rb +27 -0
  22. data/lib/mongo_mapper/extensions/object_id.rb +30 -0
  23. data/lib/mongo_mapper/extensions/set.rb +20 -0
  24. data/lib/mongo_mapper/extensions/string.rb +18 -0
  25. data/lib/mongo_mapper/extensions/time.rb +29 -0
  26. data/lib/mongo_mapper/plugins.rb +1 -21
  27. data/lib/mongo_mapper/plugins/accessible.rb +44 -0
  28. data/lib/mongo_mapper/plugins/associations.rb +7 -24
  29. data/lib/mongo_mapper/plugins/associations/base.rb +1 -0
  30. data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +5 -6
  31. data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +5 -6
  32. data/lib/mongo_mapper/plugins/associations/collection.rb +1 -0
  33. data/lib/mongo_mapper/plugins/associations/embedded_collection.rb +2 -1
  34. data/lib/mongo_mapper/plugins/associations/in_array_proxy.rb +22 -39
  35. data/lib/mongo_mapper/plugins/associations/many_documents_as_proxy.rb +4 -4
  36. data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +22 -23
  37. data/lib/mongo_mapper/plugins/associations/many_embedded_polymorphic_proxy.rb +1 -0
  38. data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +1 -0
  39. data/lib/mongo_mapper/plugins/associations/many_polymorphic_proxy.rb +1 -0
  40. data/lib/mongo_mapper/plugins/associations/one_embedded_proxy.rb +2 -3
  41. data/lib/mongo_mapper/plugins/associations/one_proxy.rb +6 -7
  42. data/lib/mongo_mapper/plugins/associations/proxy.rb +8 -6
  43. data/lib/mongo_mapper/plugins/caching.rb +21 -0
  44. data/lib/mongo_mapper/plugins/callbacks.rb +4 -3
  45. data/lib/mongo_mapper/plugins/clone.rb +10 -4
  46. data/lib/mongo_mapper/plugins/descendants.rb +1 -0
  47. data/lib/mongo_mapper/plugins/dirty.rb +1 -0
  48. data/lib/mongo_mapper/plugins/document.rb +41 -0
  49. data/lib/mongo_mapper/plugins/dynamic_querying.rb +41 -0
  50. data/lib/mongo_mapper/{support/find.rb → plugins/dynamic_querying/dynamic_finder.rb} +3 -36
  51. data/lib/mongo_mapper/plugins/embedded_document.rb +49 -0
  52. data/lib/mongo_mapper/plugins/equality.rb +3 -9
  53. data/lib/mongo_mapper/plugins/identity_map.rb +8 -10
  54. data/lib/mongo_mapper/plugins/indexes.rb +12 -0
  55. data/lib/mongo_mapper/plugins/inspect.rb +1 -0
  56. data/lib/mongo_mapper/plugins/keys.rb +15 -27
  57. data/lib/mongo_mapper/plugins/keys/key.rb +14 -3
  58. data/lib/mongo_mapper/plugins/logger.rb +1 -0
  59. data/lib/mongo_mapper/plugins/modifiers.rb +3 -2
  60. data/lib/mongo_mapper/plugins/pagination.rb +5 -15
  61. data/lib/mongo_mapper/plugins/persistence.rb +12 -11
  62. data/lib/mongo_mapper/plugins/protected.rb +8 -0
  63. data/lib/mongo_mapper/plugins/querying.rb +236 -0
  64. data/lib/mongo_mapper/plugins/querying/decorator.rb +46 -0
  65. data/lib/mongo_mapper/plugins/rails.rb +1 -0
  66. data/lib/mongo_mapper/plugins/safe.rb +28 -0
  67. data/lib/mongo_mapper/plugins/sci.rb +32 -0
  68. data/lib/mongo_mapper/plugins/scopes.rb +21 -0
  69. data/lib/mongo_mapper/plugins/serialization.rb +1 -0
  70. data/lib/mongo_mapper/plugins/timestamps.rb +1 -0
  71. data/lib/mongo_mapper/plugins/userstamps.rb +1 -0
  72. data/lib/mongo_mapper/plugins/validations.rb +5 -1
  73. data/lib/mongo_mapper/support/descendant_appends.rb +5 -6
  74. data/lib/mongo_mapper/version.rb +2 -1
  75. data/test/NOTE_ON_TESTING +1 -0
  76. data/test/active_model_lint_test.rb +13 -0
  77. data/test/functional/associations/test_belongs_to_polymorphic_proxy.rb +63 -0
  78. data/test/functional/associations/test_belongs_to_proxy.rb +93 -0
  79. data/test/functional/associations/test_in_array_proxy.rb +319 -0
  80. data/test/functional/associations/test_many_documents_as_proxy.rb +229 -0
  81. data/test/functional/associations/test_many_documents_proxy.rb +536 -0
  82. data/test/functional/associations/test_many_embedded_polymorphic_proxy.rb +176 -0
  83. data/test/functional/associations/test_many_embedded_proxy.rb +256 -0
  84. data/test/functional/associations/test_many_polymorphic_proxy.rb +302 -0
  85. data/test/functional/associations/test_one_embedded_proxy.rb +58 -0
  86. data/test/functional/associations/test_one_proxy.rb +182 -0
  87. data/test/functional/test_accessible.rb +168 -0
  88. data/test/functional/test_associations.rb +44 -0
  89. data/test/functional/test_binary.rb +27 -0
  90. data/test/functional/test_caching.rb +76 -0
  91. data/test/functional/test_callbacks.rb +151 -0
  92. data/test/functional/test_dirty.rb +163 -0
  93. data/test/functional/test_document.rb +253 -0
  94. data/test/functional/test_dynamic_querying.rb +75 -0
  95. data/test/functional/test_embedded_document.rb +210 -0
  96. data/test/functional/test_identity_map.rb +506 -0
  97. data/test/functional/test_indexes.rb +42 -0
  98. data/test/functional/test_logger.rb +20 -0
  99. data/test/functional/test_modifiers.rb +416 -0
  100. data/test/functional/test_pagination.rb +91 -0
  101. data/test/functional/test_protected.rb +175 -0
  102. data/test/functional/test_querying.rb +873 -0
  103. data/test/functional/test_safe.rb +76 -0
  104. data/test/functional/test_sci.rb +230 -0
  105. data/test/functional/test_scopes.rb +171 -0
  106. data/test/functional/test_string_id_compatibility.rb +67 -0
  107. data/test/functional/test_timestamps.rb +62 -0
  108. data/test/functional/test_userstamps.rb +27 -0
  109. data/test/functional/test_validations.rb +342 -0
  110. data/test/models.rb +227 -0
  111. data/test/test_helper.rb +98 -0
  112. data/test/unit/associations/test_base.rb +212 -0
  113. data/test/unit/associations/test_proxy.rb +105 -0
  114. data/test/unit/serializers/test_json_serializer.rb +202 -0
  115. data/test/unit/test_clone.rb +69 -0
  116. data/test/unit/test_descendant_appends.rb +71 -0
  117. data/test/unit/test_document.rb +213 -0
  118. data/test/unit/test_dynamic_finder.rb +125 -0
  119. data/test/unit/test_embedded_document.rb +644 -0
  120. data/test/unit/test_extensions.rb +380 -0
  121. data/test/unit/test_key.rb +185 -0
  122. data/test/unit/test_keys.rb +55 -0
  123. data/test/unit/test_mongo_mapper.rb +110 -0
  124. data/test/unit/test_pagination.rb +11 -0
  125. data/test/unit/test_plugins.rb +50 -0
  126. data/test/unit/test_rails.rb +181 -0
  127. data/test/unit/test_rails_compatibility.rb +52 -0
  128. data/test/unit/test_serialization.rb +51 -0
  129. data/test/unit/test_time_zones.rb +39 -0
  130. data/test/unit/test_validations.rb +544 -0
  131. metadata +113 -44
  132. data/lib/mongo_mapper/plugins/pagination/proxy.rb +0 -72
  133. data/lib/mongo_mapper/query.rb +0 -23
  134. data/lib/mongo_mapper/support.rb +0 -196
@@ -2,8 +2,6 @@
2
2
 
3
3
  A Ruby Object Mapper for Mongo.
4
4
 
5
- Releases are tagged on github and released on gemcutter. Master is pushed to whenever I add a patch or a new feature, but I do not release a new gem version each time I push.
6
-
7
5
  == Note on Patches/Pull Requests
8
6
 
9
7
  * Fork the project.
@@ -18,14 +16,12 @@ Releases are tagged on github and released on gemcutter. Master is pushed to whe
18
16
 
19
17
  == Problems or Questions?
20
18
 
21
- Hit up the google group.
19
+ Hit up the google group:
22
20
  http://groups.google.com/group/mongomapper
23
21
 
24
- To see if the problem you are having is a verified issue, you can see the MM pivotal tracker project:
25
- http://www.pivotaltracker.com/projects/33576
26
-
27
- There is no need to request to join the Pivotal Tracker project as I am only granting access to a select few (easier to keep things organized). If you have a problem, please use the mailing list. If I confirm it to be a bug, I am happy to add it to PT. Thanks!
22
+ Hop on IRC:
23
+ irc://chat.freenode.net/#mongomapper
28
24
 
29
25
  == Copyright
30
26
 
31
- Copyright (c) 2009 John Nunemaker. See LICENSE for details.
27
+ See LICENSE for details.
@@ -18,7 +18,7 @@ irb.context.evaluate("require 'irb/completion'", 0)
18
18
  irb.context.evaluate(%@
19
19
  include MongoMapper
20
20
 
21
- MongoMapper.database = "mmtest"
21
+ MongoMapper.database = "mm-test"
22
22
  $db = MongoMapper.database
23
23
 
24
24
  @, 0)
@@ -0,0 +1,37 @@
1
+ $LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
2
+ require 'mongo_mapper'
3
+ require 'pp'
4
+
5
+ MongoMapper.database = 'testing'
6
+
7
+ class User
8
+ include MongoMapper::Document
9
+
10
+ key :first_name, String, :required => true
11
+ key :last_name, String, :required => true
12
+ key :token, String, :default => lambda { 'some random string' }
13
+ key :age, Integer
14
+ key :skills, Array
15
+ key :friend_ids, Array, :typecast => 'ObjectId'
16
+ timestamps!
17
+ end
18
+ User.collection.remove # empties collection
19
+
20
+ john = User.create({
21
+ :first_name => 'John',
22
+ :last_name => 'Nunemaker',
23
+ :age => 28,
24
+ :skills => ['ruby', 'mongo', 'javascript'],
25
+ })
26
+
27
+ steve = User.create({
28
+ :first_name => 'Steve',
29
+ :last_name => 'Smith',
30
+ :age => 29,
31
+ :skills => ['html', 'css', 'javascript', 'design'],
32
+ })
33
+
34
+ john.friend_ids << steve.id.to_s # will get typecast to ObjectId
35
+ john.save
36
+
37
+ pp john
@@ -0,0 +1,41 @@
1
+ $LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
2
+ require 'mongo_mapper'
3
+ require 'pp'
4
+
5
+ MongoMapper.database = 'testing'
6
+
7
+ # To create your own plugin, just create a module.
8
+ module FooPlugin
9
+
10
+ # ClassMethods module will automatically get extended
11
+ module ClassMethods
12
+ def foo
13
+ 'Foo class method!'
14
+ end
15
+ end
16
+
17
+ # InstanceMethods module will automatically get included
18
+ module InstanceMethods
19
+ def foo
20
+ 'Foo instance method!'
21
+ end
22
+ end
23
+
24
+ # If present, configure method will be called and passed the
25
+ # model as an argument. Feel free to class_eval or add keys.
26
+ # if method is not present, it doesn't call it.
27
+ def self.configure(model)
28
+ puts "Configuring #{model}..."
29
+ model.key :foo, String
30
+ end
31
+
32
+ end
33
+
34
+ class User
35
+ include MongoMapper::Document
36
+ plugin FooPlugin
37
+ end
38
+
39
+ puts User.foo
40
+ puts User.new.foo
41
+ puts User.key?(:foo)
@@ -0,0 +1,35 @@
1
+ $LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
2
+ require 'mongo_mapper'
3
+ require 'pp'
4
+
5
+ MongoMapper.database = 'testing'
6
+
7
+ class User
8
+ include MongoMapper::Document
9
+
10
+ key :name, String
11
+ key :tags, Array
12
+ end
13
+ User.collection.remove # empties collection
14
+
15
+ User.create(:name => 'John', :tags => %w[ruby mongo], :age => 28)
16
+ User.create(:name => 'Bill', :tags => %w[ruby mongo], :age => 30)
17
+ User.create(:name => 'Frank', :tags => %w[mongo], :age => 35)
18
+ User.create(:name => 'Steve', :tags => %w[html5 css3], :age => 27)
19
+
20
+ [
21
+
22
+ User.all(:name => 'John'),
23
+ User.all(:tags => %w[mongo]),
24
+ User.all(:tags.all => %w[ruby mongo]),
25
+ User.all(:age.gte => 30),
26
+
27
+ User.where(:age.gt => 27).sort(:age).all,
28
+ User.where(:age.gt => 27).sort(:age.desc).all,
29
+ User.where(:age.gt => 27).sort(:age).limit(1).all,
30
+ User.where(:age.gt => 27).sort(:age).skip(1).limit(1).all,
31
+
32
+ ].each do |result|
33
+ pp result
34
+ puts
35
+ end
@@ -0,0 +1,52 @@
1
+ $LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
2
+ require 'mongo_mapper'
3
+ require 'pp'
4
+
5
+ MongoMapper.database = 'testing'
6
+
7
+ class User
8
+ include MongoMapper::Document
9
+
10
+ # plain old vanilla scopes with fancy queries
11
+ scope :johns, where(:name => 'John')
12
+
13
+ # plain old vanilla scopes with hashes
14
+ scope :bills, :name => 'Bill'
15
+
16
+ # dynamic scopes with parameters
17
+ scope :by_name, lambda { |name| where(:name => name) }
18
+ scope :by_ages, lambda { |low, high| where(:age.gte => low, :age.lte => high) }
19
+
20
+ # Yep, even plain old methods work as long as they return a query
21
+ def self.by_tag(tag)
22
+ where(:tags => tag)
23
+ end
24
+
25
+ # You can even make a method that returns a scope
26
+ def self.twenties; by_ages(20, 29) end
27
+
28
+ key :name, String
29
+ key :tags, Array
30
+ end
31
+ User.collection.remove # empties collection
32
+
33
+ User.create(:name => 'John', :tags => %w[ruby mongo], :age => 28)
34
+ User.create(:name => 'Bill', :tags => %w[ruby mongo], :age => 30)
35
+ User.create(:name => 'Frank', :tags => %w[mongo], :age => 35)
36
+ User.create(:name => 'Steve', :tags => %w[html5 css3], :age => 27)
37
+
38
+ # simple scopes
39
+ pp User.johns.first
40
+ pp User.bills.first
41
+
42
+ # scope with arg
43
+ pp User.by_name('Frank').first
44
+
45
+ # scope with two args
46
+ pp User.by_ages(20, 29).all
47
+
48
+ # chaining class methods on scopes
49
+ pp User.by_ages(20, 40).by_tag('ruby').all
50
+
51
+ # scope made using method that returns scope
52
+ pp User.twenties.all
@@ -1,114 +1,94 @@
1
+ # encoding: UTF-8
1
2
  # Make sure you have the correct versions of the gems (see gemspec) in your load path.
2
- require 'set'
3
- require 'uri'
4
- require 'mongo'
5
3
  require 'plucky'
6
4
  require 'validatable'
7
5
  require 'active_support/all'
8
6
 
9
7
  module MongoMapper
10
- # generic MM error
11
- class MongoMapperError < StandardError; end
12
-
13
- # raised when key expected to exist but not found
14
- class KeyNotFound < MongoMapperError; end
15
-
16
- # raised when document expected but not found
17
- class DocumentNotFound < MongoMapperError; end
18
-
19
- # raised when trying to connect using uri with incorrect scheme
20
- class InvalidScheme < MongoMapperError; end
21
-
22
- # raised when document not valid and using !
23
- class DocumentNotValid < MongoMapperError
24
- def initialize(document)
25
- super("Validation failed: #{document.errors.full_messages.join(", ")}")
8
+ autoload :Connection, 'mongo_mapper/connection'
9
+
10
+ autoload :Error, 'mongo_mapper/exceptions'
11
+ autoload :KeyNotFound, 'mongo_mapper/exceptions'
12
+ autoload :DocumentNotFound, 'mongo_mapper/exceptions'
13
+ autoload :InvalidScheme, 'mongo_mapper/exceptions'
14
+ autoload :DocumentNotValid, 'mongo_mapper/exceptions'
15
+ autoload :AccessibleOrProtected, 'mongo_mapper/exceptions'
16
+
17
+ autoload :Document, 'mongo_mapper/document'
18
+ autoload :EmbeddedDocument, 'mongo_mapper/embedded_document'
19
+ autoload :Plugins, 'mongo_mapper/plugins'
20
+ autoload :Version, 'mongo_mapper/version'
21
+
22
+ module Plugins
23
+ autoload :Associations, 'mongo_mapper/plugins/associations'
24
+ autoload :Accessible, 'mongo_mapper/plugins/accessible'
25
+ autoload :Callbacks, 'mongo_mapper/plugins/callbacks'
26
+ autoload :Caching, 'mongo_mapper/plugins/caching'
27
+ autoload :Clone, 'mongo_mapper/plugins/clone'
28
+ autoload :Descendants, 'mongo_mapper/plugins/descendants'
29
+ autoload :Dirty, 'mongo_mapper/plugins/dirty'
30
+ autoload :Document, 'mongo_mapper/plugins/document'
31
+ autoload :DynamicQuerying, 'mongo_mapper/plugins/dynamic_querying'
32
+ autoload :EmbeddedDocument, 'mongo_mapper/plugins/embedded_document'
33
+ autoload :Equality, 'mongo_mapper/plugins/equality'
34
+ autoload :IdentityMap, 'mongo_mapper/plugins/identity_map'
35
+ autoload :Inspect, 'mongo_mapper/plugins/inspect'
36
+ autoload :Indexes, 'mongo_mapper/plugins/indexes'
37
+ autoload :Keys, 'mongo_mapper/plugins/keys'
38
+ autoload :Logger, 'mongo_mapper/plugins/logger'
39
+ autoload :Modifiers, 'mongo_mapper/plugins/modifiers'
40
+ autoload :Pagination, 'mongo_mapper/plugins/pagination'
41
+ autoload :Persistence, 'mongo_mapper/plugins/persistence'
42
+ autoload :Protected, 'mongo_mapper/plugins/protected'
43
+ autoload :Querying, 'mongo_mapper/plugins/querying'
44
+ autoload :Rails, 'mongo_mapper/plugins/rails'
45
+ autoload :Safe, 'mongo_mapper/plugins/safe'
46
+ autoload :Sci, 'mongo_mapper/plugins/sci'
47
+ autoload :Scopes, 'mongo_mapper/plugins/scopes'
48
+ autoload :Serialization, 'mongo_mapper/plugins/serialization'
49
+ autoload :Timestamps, 'mongo_mapper/plugins/timestamps'
50
+ autoload :Userstamps, 'mongo_mapper/plugins/userstamps'
51
+ autoload :Validations, 'mongo_mapper/plugins/validations'
52
+
53
+ module Associations
54
+ autoload :Base, 'mongo_mapper/plugins/associations/base'
55
+ autoload :Collection, 'mongo_mapper/plugins/associations/collection'
56
+ autoload :EmbeddedCollection, 'mongo_mapper/plugins/associations/embedded_collection'
57
+ autoload :ManyDocumentsProxy, 'mongo_mapper/plugins/associations/many_documents_proxy'
58
+ autoload :BelongsToProxy, 'mongo_mapper/plugins/associations/belongs_to_proxy'
59
+ autoload :BelongsToPolymorphicProxy, 'mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy'
60
+ autoload :ManyPolymorphicProxy, 'mongo_mapper/plugins/associations/many_polymorphic_proxy'
61
+ autoload :ManyEmbeddedProxy, 'mongo_mapper/plugins/associations/many_embedded_proxy'
62
+ autoload :ManyEmbeddedPolymorphicProxy, 'mongo_mapper/plugins/associations/many_embedded_polymorphic_proxy'
63
+ autoload :ManyDocumentsAsProxy, 'mongo_mapper/plugins/associations/many_documents_as_proxy'
64
+ autoload :OneProxy, 'mongo_mapper/plugins/associations/one_proxy'
65
+ autoload :OneEmbeddedProxy, 'mongo_mapper/plugins/associations/one_embedded_proxy'
66
+ autoload :InArrayProxy, 'mongo_mapper/plugins/associations/in_array_proxy'
26
67
  end
27
- end
28
-
29
- # @api public
30
- def self.connection
31
- @@connection ||= Mongo::Connection.new
32
- end
33
68
 
34
- # @api public
35
- def self.connection=(new_connection)
36
- @@connection = new_connection
37
- end
38
-
39
- # @api public
40
- def self.logger
41
- connection.logger
42
- end
43
-
44
- # @api public
45
- def self.database=(name)
46
- @@database = nil
47
- @@database_name = name
48
- end
49
-
50
- # @api public
51
- def self.database
52
- if @@database_name.blank?
53
- raise 'You forgot to set the default database name: MongoMapper.database = "foobar"'
69
+ module DynamicQuerying
70
+ autoload :DynamicFinder, 'mongo_mapper/plugins/dynamic_querying/dynamic_finder'
54
71
  end
55
72
 
56
- @@database ||= MongoMapper.connection.db(@@database_name)
57
- end
58
-
59
- def self.config=(hash)
60
- @@config = hash
61
- end
62
-
63
- def self.config
64
- raise 'Set config before connecting. MongoMapper.config = {...}' unless defined?(@@config)
65
- @@config
66
- end
67
-
68
- # @api private
69
- def self.config_for_environment(environment)
70
- env = config[environment]
71
- return env if env['uri'].blank?
72
-
73
- uri = URI.parse(env['uri'])
74
- raise InvalidScheme.new('must be mongodb') unless uri.scheme == 'mongodb'
75
- {
76
- 'host' => uri.host,
77
- 'port' => uri.port,
78
- 'database' => uri.path.gsub(/^\//, ''),
79
- 'username' => uri.user,
80
- 'password' => uri.password,
81
- }
82
- end
83
-
84
- def self.connect(environment, options={})
85
- raise 'Set config before connecting. MongoMapper.config = {...}' if config.blank?
86
- env = config_for_environment(environment)
87
- MongoMapper.connection = Mongo::Connection.new(env['host'], env['port'], options)
88
- MongoMapper.database = env['database']
89
- MongoMapper.database.authenticate(env['username'], env['password']) if env['username'] && env['password']
73
+ module Keys
74
+ autoload :Key, 'mongo_mapper/plugins/keys/key'
75
+ end
76
+
77
+ module Querying
78
+ autoload :Decorator, 'mongo_mapper/plugins/querying/decorator'
79
+ end
90
80
  end
91
81
 
92
- def self.setup(config, environment, options={})
93
- using_passenger = options.delete(:passenger)
94
- handle_passenger_forking if using_passenger
95
- self.config = config
96
- connect(environment, options)
82
+ module Support
83
+ autoload :DescendantAppends, 'mongo_mapper/support/descendant_appends'
97
84
  end
98
85
 
99
- def self.handle_passenger_forking
100
- if defined?(PhusionPassenger)
101
- PhusionPassenger.on_event(:starting_worker_process) do |forked|
102
- connection.connect_to_master if forked
103
- end
104
- end
105
- end
86
+ extend Connection
87
+ end
106
88
 
107
- autoload :Query, 'mongo_mapper/query'
108
- autoload :Document, 'mongo_mapper/document'
109
- autoload :EmbeddedDocument, 'mongo_mapper/embedded_document'
110
- autoload :Version, 'mongo_mapper/version'
89
+ Dir[File.join(File.dirname(__FILE__), 'mongo_mapper', 'extensions', '*.rb')].each do |extension|
90
+ require extension
111
91
  end
112
92
 
113
- require 'mongo_mapper/support'
114
- require 'mongo_mapper/plugins'
93
+ # FIXME: autoload with proxy is failing, need to investigate
94
+ require 'mongo_mapper/plugins/associations/proxy'
@@ -0,0 +1,83 @@
1
+ # encoding: UTF-8
2
+ require 'uri'
3
+
4
+ module MongoMapper
5
+ module Connection
6
+ # @api public
7
+ def connection
8
+ @@connection ||= Mongo::Connection.new
9
+ end
10
+
11
+ # @api public
12
+ def connection=(new_connection)
13
+ @@connection = new_connection
14
+ end
15
+
16
+ # @api public
17
+ def logger
18
+ connection.logger
19
+ end
20
+
21
+ # @api public
22
+ def database=(name)
23
+ @@database = nil
24
+ @@database_name = name
25
+ end
26
+
27
+ # @api public
28
+ def database
29
+ if @@database_name.blank?
30
+ raise 'You forgot to set the default database name: MongoMapper.database = "foobar"'
31
+ end
32
+
33
+ @@database ||= MongoMapper.connection.db(@@database_name)
34
+ end
35
+
36
+ def config=(hash)
37
+ @@config = hash
38
+ end
39
+
40
+ def config
41
+ raise 'Set config before connecting. MongoMapper.config = {...}' unless defined?(@@config)
42
+ @@config
43
+ end
44
+
45
+ # @api private
46
+ def config_for_environment(environment)
47
+ env = config[environment]
48
+ return env if env['uri'].blank?
49
+
50
+ uri = URI.parse(env['uri'])
51
+ raise InvalidScheme.new('must be mongodb') unless uri.scheme == 'mongodb'
52
+ {
53
+ 'host' => uri.host,
54
+ 'port' => uri.port,
55
+ 'database' => uri.path.gsub(/^\//, ''),
56
+ 'username' => uri.user,
57
+ 'password' => uri.password,
58
+ }
59
+ end
60
+
61
+ def connect(environment, options={})
62
+ raise 'Set config before connecting. MongoMapper.config = {...}' if config.blank?
63
+ env = config_for_environment(environment)
64
+ MongoMapper.connection = Mongo::Connection.new(env['host'], env['port'], options)
65
+ MongoMapper.database = env['database']
66
+ MongoMapper.database.authenticate(env['username'], env['password']) if env['username'] && env['password']
67
+ end
68
+
69
+ def setup(config, environment, options={})
70
+ handle_passenger_forking
71
+ self.config = config
72
+ connect(environment, options)
73
+ end
74
+
75
+ def handle_passenger_forking
76
+ if defined?(PhusionPassenger)
77
+ PhusionPassenger.on_event(:starting_worker_process) do |forked|
78
+ connection.connect_to_master if forked
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end