forked from mongomapper/mongomapper
-
Notifications
You must be signed in to change notification settings - Fork 1
/
mongo_mapper.rb
135 lines (114 loc) · 3.6 KB
/
mongo_mapper.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
require 'active_support'
require 'mongo'
require 'validatable'
module MongoMapper
# generic MM error
class MongoMapperError < StandardError; end
# raised when key expected to exist but not found
class KeyNotFound < MongoMapperError; end
# raised when document expected but not found
class DocumentNotFound < MongoMapperError; end
# raised when document not valid and using !
class DocumentNotValid < MongoMapperError
def initialize(document)
super("Validation failed: #{document.errors.full_messages.join(", ")}")
end
end
# @api public
def self.connection
@@connection ||= Mongo::Connection.new
end
# @api public
def self.connection=(new_connection)
@@connection = new_connection
end
# @api public
def self.logger
connection.logger
end
# @api public
def self.database=(name)
@@database = nil
@@database_name = name
end
# @api public
def self.database
if @@database_name.blank?
raise 'You forgot to set the default database name: MongoMapper.database = "foobar"'
end
@@database ||= MongoMapper.connection.db(@@database_name)
end
# @api private
def self.ensured_indexes
@@ensured_indexes ||= []
end
# @api private
def self.ensure_index(klass, keys, options={})
ensured_indexes << {:klass => klass, :keys => keys, :options => options}
end
# @api public
def self.ensure_indexes!
ensured_indexes.each do |index|
unique = index[:options].delete(:unique)
index[:klass].collection.create_index(index[:keys], unique)
end
end
# @api private
module Finders
def dynamic_find(finder, args)
attributes = {}
finder.attributes.each_with_index do |attr, index|
attributes[attr] = args[index]
end
options = args.extract_options!.merge(attributes)
result = find(finder.finder, options)
if result.nil?
if finder.bang
raise DocumentNotFound, "Couldn't find Document with #{attributes.inspect} in collection named #{collection.name}"
end
if finder.instantiator
self.send(finder.instantiator, attributes)
end
else
result
end
end
end
# @api private
def self.use_time_zone?
Time.respond_to?(:zone) && Time.zone ? true : false
end
# @api private
def self.time_class
use_time_zone? ? Time.zone : Time
end
def self.normalize_object_id(value)
value.is_a?(String) ? Mongo::ObjectID.from_string(value) : value
end
end
require 'mongo_mapper/support'
require 'mongo_mapper/types'
require 'mongo_mapper/associations'
require 'mongo_mapper/associations/base'
require 'mongo_mapper/associations/proxy'
require 'mongo_mapper/associations/many_documents_proxy'
require 'mongo_mapper/associations/belongs_to_proxy'
require 'mongo_mapper/associations/belongs_to_polymorphic_proxy'
require 'mongo_mapper/associations/many_proxy'
require 'mongo_mapper/associations/many_polymorphic_proxy'
require 'mongo_mapper/associations/many_embedded_proxy'
require 'mongo_mapper/associations/many_embedded_polymorphic_proxy'
require 'mongo_mapper/associations/many_documents_as_proxy'
require 'mongo_mapper/callbacks'
require 'mongo_mapper/finder_options'
require 'mongo_mapper/dirty'
require 'mongo_mapper/dynamic_finder'
require 'mongo_mapper/key'
require 'mongo_mapper/observing'
require 'mongo_mapper/pagination'
require 'mongo_mapper/serialization'
require 'mongo_mapper/validations'
require 'mongo_mapper/rails_compatibility/document'
require 'mongo_mapper/rails_compatibility/embedded_document'
require 'mongo_mapper/embedded_document'
require 'mongo_mapper/document'