lookout-mongo_mapper 0.11.3
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.
- data/LICENSE +20 -0
- data/README.rdoc +33 -0
- data/UPGRADES +26 -0
- data/bin/mmconsole +59 -0
- data/examples/attr_accessible.rb +22 -0
- data/examples/attr_protected.rb +22 -0
- data/examples/cache_key.rb +24 -0
- data/examples/custom_types.rb +24 -0
- data/examples/identity_map.rb +33 -0
- data/examples/identity_map/automatic.rb +2 -0
- data/examples/keys.rb +40 -0
- data/examples/modifiers/set.rb +25 -0
- data/examples/plugins.rb +38 -0
- data/examples/querying.rb +35 -0
- data/examples/safe.rb +43 -0
- data/examples/scopes.rb +52 -0
- data/examples/validating/embedded_docs.rb +29 -0
- data/lib/mongo_mapper.rb +94 -0
- data/lib/mongo_mapper/connection.rb +96 -0
- data/lib/mongo_mapper/document.rb +42 -0
- data/lib/mongo_mapper/embedded_document.rb +32 -0
- data/lib/mongo_mapper/exceptions.rb +30 -0
- data/lib/mongo_mapper/extensions/array.rb +19 -0
- data/lib/mongo_mapper/extensions/binary.rb +22 -0
- data/lib/mongo_mapper/extensions/boolean.rb +44 -0
- data/lib/mongo_mapper/extensions/date.rb +25 -0
- data/lib/mongo_mapper/extensions/float.rb +14 -0
- data/lib/mongo_mapper/extensions/hash.rb +14 -0
- data/lib/mongo_mapper/extensions/integer.rb +19 -0
- data/lib/mongo_mapper/extensions/kernel.rb +9 -0
- data/lib/mongo_mapper/extensions/nil_class.rb +18 -0
- data/lib/mongo_mapper/extensions/object.rb +26 -0
- data/lib/mongo_mapper/extensions/object_id.rb +32 -0
- data/lib/mongo_mapper/extensions/set.rb +20 -0
- data/lib/mongo_mapper/extensions/string.rb +18 -0
- data/lib/mongo_mapper/extensions/time.rb +28 -0
- data/lib/mongo_mapper/locale/en.yml +5 -0
- data/lib/mongo_mapper/middleware/identity_map.rb +16 -0
- data/lib/mongo_mapper/plugins.rb +22 -0
- data/lib/mongo_mapper/plugins/accessible.rb +52 -0
- data/lib/mongo_mapper/plugins/active_model.rb +18 -0
- data/lib/mongo_mapper/plugins/associations.rb +90 -0
- data/lib/mongo_mapper/plugins/associations/base.rb +92 -0
- data/lib/mongo_mapper/plugins/associations/belongs_to_association.rb +54 -0
- data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +34 -0
- data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +52 -0
- data/lib/mongo_mapper/plugins/associations/collection.rb +27 -0
- data/lib/mongo_mapper/plugins/associations/embedded_collection.rb +44 -0
- data/lib/mongo_mapper/plugins/associations/in_array_proxy.rb +133 -0
- data/lib/mongo_mapper/plugins/associations/many_association.rb +63 -0
- data/lib/mongo_mapper/plugins/associations/many_documents_as_proxy.rb +28 -0
- data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +118 -0
- data/lib/mongo_mapper/plugins/associations/many_embedded_polymorphic_proxy.rb +32 -0
- data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +24 -0
- data/lib/mongo_mapper/plugins/associations/many_polymorphic_proxy.rb +14 -0
- data/lib/mongo_mapper/plugins/associations/one_as_proxy.rb +22 -0
- data/lib/mongo_mapper/plugins/associations/one_association.rb +48 -0
- data/lib/mongo_mapper/plugins/associations/one_embedded_polymorphic_proxy.rb +30 -0
- data/lib/mongo_mapper/plugins/associations/one_embedded_proxy.rb +44 -0
- data/lib/mongo_mapper/plugins/associations/one_proxy.rb +95 -0
- data/lib/mongo_mapper/plugins/associations/proxy.rb +134 -0
- data/lib/mongo_mapper/plugins/associations/single_association.rb +46 -0
- data/lib/mongo_mapper/plugins/caching.rb +21 -0
- data/lib/mongo_mapper/plugins/callbacks.rb +29 -0
- data/lib/mongo_mapper/plugins/clone.rb +22 -0
- data/lib/mongo_mapper/plugins/dirty.rb +60 -0
- data/lib/mongo_mapper/plugins/document.rb +41 -0
- data/lib/mongo_mapper/plugins/dynamic_querying.rb +45 -0
- data/lib/mongo_mapper/plugins/dynamic_querying/dynamic_finder.rb +44 -0
- data/lib/mongo_mapper/plugins/embedded_callbacks.rb +56 -0
- data/lib/mongo_mapper/plugins/embedded_document.rb +53 -0
- data/lib/mongo_mapper/plugins/equality.rb +23 -0
- data/lib/mongo_mapper/plugins/identity_map.rb +128 -0
- data/lib/mongo_mapper/plugins/indexes.rb +13 -0
- data/lib/mongo_mapper/plugins/inspect.rb +16 -0
- data/lib/mongo_mapper/plugins/keys.rb +313 -0
- data/lib/mongo_mapper/plugins/keys/key.rb +61 -0
- data/lib/mongo_mapper/plugins/logger.rb +18 -0
- data/lib/mongo_mapper/plugins/modifiers.rb +134 -0
- data/lib/mongo_mapper/plugins/pagination.rb +16 -0
- data/lib/mongo_mapper/plugins/persistence.rb +69 -0
- data/lib/mongo_mapper/plugins/protected.rb +45 -0
- data/lib/mongo_mapper/plugins/querying.rb +165 -0
- data/lib/mongo_mapper/plugins/querying/decorator.rb +36 -0
- data/lib/mongo_mapper/plugins/rails.rb +58 -0
- data/lib/mongo_mapper/plugins/rails/active_record_association_adapter.rb +33 -0
- data/lib/mongo_mapper/plugins/safe.rb +28 -0
- data/lib/mongo_mapper/plugins/sci.rb +36 -0
- data/lib/mongo_mapper/plugins/scopes.rb +27 -0
- data/lib/mongo_mapper/plugins/serialization.rb +109 -0
- data/lib/mongo_mapper/plugins/timestamps.rb +22 -0
- data/lib/mongo_mapper/plugins/touch.rb +18 -0
- data/lib/mongo_mapper/plugins/userstamps.rb +18 -0
- data/lib/mongo_mapper/plugins/validations.rb +86 -0
- data/lib/mongo_mapper/railtie.rb +48 -0
- data/lib/mongo_mapper/railtie/database.rake +65 -0
- data/lib/mongo_mapper/translation.rb +10 -0
- data/lib/mongo_mapper/version.rb +4 -0
- data/lib/rails/generators/mongo_mapper/config/config_generator.rb +24 -0
- data/lib/rails/generators/mongo_mapper/config/templates/mongo.yml +18 -0
- data/lib/rails/generators/mongo_mapper/model/model_generator.rb +23 -0
- data/lib/rails/generators/mongo_mapper/model/templates/model.rb +13 -0
- data/test/_NOTE_ON_TESTING +1 -0
- data/test/functional/associations/test_belongs_to_polymorphic_proxy.rb +64 -0
- data/test/functional/associations/test_belongs_to_proxy.rb +238 -0
- data/test/functional/associations/test_in_array_proxy.rb +349 -0
- data/test/functional/associations/test_many_documents_as_proxy.rb +231 -0
- data/test/functional/associations/test_many_documents_proxy.rb +866 -0
- data/test/functional/associations/test_many_embedded_polymorphic_proxy.rb +239 -0
- data/test/functional/associations/test_many_embedded_proxy.rb +289 -0
- data/test/functional/associations/test_many_polymorphic_proxy.rb +303 -0
- data/test/functional/associations/test_one_as_proxy.rb +491 -0
- data/test/functional/associations/test_one_embedded_polymorphic_proxy.rb +208 -0
- data/test/functional/associations/test_one_embedded_proxy.rb +100 -0
- data/test/functional/associations/test_one_proxy.rb +383 -0
- data/test/functional/test_accessible.rb +198 -0
- data/test/functional/test_associations.rb +46 -0
- data/test/functional/test_binary.rb +27 -0
- data/test/functional/test_caching.rb +77 -0
- data/test/functional/test_callbacks.rb +232 -0
- data/test/functional/test_dirty.rb +301 -0
- data/test/functional/test_document.rb +282 -0
- data/test/functional/test_dynamic_querying.rb +75 -0
- data/test/functional/test_embedded_document.rb +288 -0
- data/test/functional/test_equality.rb +20 -0
- data/test/functional/test_identity_map.rb +513 -0
- data/test/functional/test_indexes.rb +50 -0
- data/test/functional/test_logger.rb +20 -0
- data/test/functional/test_modifiers.rb +537 -0
- data/test/functional/test_pagination.rb +91 -0
- data/test/functional/test_protected.rb +201 -0
- data/test/functional/test_querying.rb +935 -0
- data/test/functional/test_safe.rb +76 -0
- data/test/functional/test_sci.rb +240 -0
- data/test/functional/test_scopes.rb +171 -0
- data/test/functional/test_timestamps.rb +62 -0
- data/test/functional/test_touch.rb +125 -0
- data/test/functional/test_userstamps.rb +44 -0
- data/test/functional/test_validations.rb +414 -0
- data/test/models.rb +261 -0
- data/test/support/railtie.rb +4 -0
- data/test/support/railtie/autoloaded.rb +2 -0
- data/test/support/railtie/not_autoloaded.rb +3 -0
- data/test/support/railtie/parent.rb +3 -0
- data/test/test_active_model_lint.rb +18 -0
- data/test/test_helper.rb +93 -0
- data/test/unit/associations/test_base.rb +146 -0
- data/test/unit/associations/test_belongs_to_association.rb +29 -0
- data/test/unit/associations/test_many_association.rb +63 -0
- data/test/unit/associations/test_one_association.rb +47 -0
- data/test/unit/associations/test_proxy.rb +100 -0
- data/test/unit/serializers/test_json_serializer.rb +216 -0
- data/test/unit/serializers/test_xml_serializer.rb +196 -0
- data/test/unit/test_clone.rb +69 -0
- data/test/unit/test_document.rb +249 -0
- data/test/unit/test_dynamic_finder.rb +125 -0
- data/test/unit/test_embedded_document.rb +682 -0
- data/test/unit/test_equality.rb +38 -0
- data/test/unit/test_exceptions.rb +12 -0
- data/test/unit/test_extensions.rb +380 -0
- data/test/unit/test_identity_map_middleware.rb +34 -0
- data/test/unit/test_inspect.rb +47 -0
- data/test/unit/test_key.rb +205 -0
- data/test/unit/test_keys.rb +65 -0
- data/test/unit/test_mongo_mapper.rb +143 -0
- data/test/unit/test_pagination.rb +11 -0
- data/test/unit/test_plugins.rb +89 -0
- data/test/unit/test_rails.rb +183 -0
- data/test/unit/test_rails_compatibility.rb +38 -0
- data/test/unit/test_rails_reflect_on_association.rb +118 -0
- data/test/unit/test_railtie.rb +66 -0
- data/test/unit/test_serialization.rb +166 -0
- data/test/unit/test_time_zones.rb +44 -0
- data/test/unit/test_translation.rb +27 -0
- data/test/unit/test_validations.rb +562 -0
- metadata +285 -0
data/test/models.rb
ADDED
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
# custom type
|
|
2
|
+
class WindowSize
|
|
3
|
+
attr_reader :width, :height
|
|
4
|
+
|
|
5
|
+
def self.to_mongo(value)
|
|
6
|
+
value.to_a
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def self.from_mongo(value)
|
|
10
|
+
value.is_a?(self) ? value : WindowSize.new(value)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def initialize(*args)
|
|
14
|
+
@width, @height = args.flatten
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def to_a
|
|
18
|
+
[width, height]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def ==(other)
|
|
22
|
+
other.is_a?(self.class) && other.width == width && other.height == height
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
module AccountsExtensions
|
|
27
|
+
def inactive
|
|
28
|
+
all(:last_logged_in => nil)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
class Post
|
|
33
|
+
include MongoMapper::Document
|
|
34
|
+
|
|
35
|
+
key :title, String
|
|
36
|
+
key :body, String
|
|
37
|
+
|
|
38
|
+
many :comments, :as => :commentable, :class_name => 'PostComment'
|
|
39
|
+
|
|
40
|
+
timestamps!
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
class PostComment
|
|
44
|
+
include MongoMapper::Document
|
|
45
|
+
|
|
46
|
+
key :username, String, :default => 'Anonymous'
|
|
47
|
+
key :body, String
|
|
48
|
+
|
|
49
|
+
key :commentable_id, ObjectId
|
|
50
|
+
key :commentable_type, String
|
|
51
|
+
belongs_to :commentable, :polymorphic => true
|
|
52
|
+
|
|
53
|
+
timestamps!
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
class Address
|
|
57
|
+
include MongoMapper::EmbeddedDocument
|
|
58
|
+
|
|
59
|
+
key :address, String
|
|
60
|
+
key :city, String
|
|
61
|
+
key :state, String
|
|
62
|
+
key :zip, Integer
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
class Message
|
|
66
|
+
include MongoMapper::Document
|
|
67
|
+
|
|
68
|
+
key :body, String
|
|
69
|
+
key :position, Integer
|
|
70
|
+
key :room_id, ObjectId
|
|
71
|
+
|
|
72
|
+
belongs_to :room
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
class Enter < Message; end
|
|
76
|
+
class Exit < Message; end
|
|
77
|
+
class Chat < Message; end
|
|
78
|
+
|
|
79
|
+
class Room
|
|
80
|
+
include MongoMapper::Document
|
|
81
|
+
|
|
82
|
+
key :name, String
|
|
83
|
+
many :messages, :polymorphic => true, :order => 'position' do
|
|
84
|
+
def older
|
|
85
|
+
all(:position => {'$gt' => 5})
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
many :latest_messages, :class_name => 'Message', :order => 'position desc', :limit => 2
|
|
89
|
+
|
|
90
|
+
many :accounts, :polymorphic => true, :extend => AccountsExtensions
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
class Account
|
|
94
|
+
include MongoMapper::Document
|
|
95
|
+
|
|
96
|
+
key :room_id, ObjectId
|
|
97
|
+
key :last_logged_in, Time
|
|
98
|
+
|
|
99
|
+
belongs_to :room
|
|
100
|
+
end
|
|
101
|
+
class AccountUser < Account; end
|
|
102
|
+
class Bot < Account; end
|
|
103
|
+
|
|
104
|
+
class Answer
|
|
105
|
+
include MongoMapper::Document
|
|
106
|
+
|
|
107
|
+
key :body, String
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
module CollaboratorsExtensions
|
|
111
|
+
def top
|
|
112
|
+
first
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
class Project
|
|
117
|
+
include MongoMapper::Document
|
|
118
|
+
|
|
119
|
+
key :name, String
|
|
120
|
+
|
|
121
|
+
many :collaborators, :extend => CollaboratorsExtensions
|
|
122
|
+
many :statuses, :order => 'position' do
|
|
123
|
+
def open
|
|
124
|
+
all(:name => %w(New Assigned))
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
many :addresses do
|
|
129
|
+
def find_all_by_state(state)
|
|
130
|
+
# can't use select here for some reason
|
|
131
|
+
find_all { |a| a.state == state }
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
class Collaborator
|
|
137
|
+
include MongoMapper::Document
|
|
138
|
+
key :project_id, ObjectId
|
|
139
|
+
key :name, String
|
|
140
|
+
belongs_to :project
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
class Status
|
|
144
|
+
include MongoMapper::Document
|
|
145
|
+
|
|
146
|
+
scope :complete, where(:name => 'Complete')
|
|
147
|
+
|
|
148
|
+
def self.by_position(position)
|
|
149
|
+
where(:position => position)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
key :project_id, ObjectId
|
|
153
|
+
key :target_id, ObjectId
|
|
154
|
+
key :target_type, String
|
|
155
|
+
key :name, String, :required => true
|
|
156
|
+
key :position, Integer
|
|
157
|
+
|
|
158
|
+
belongs_to :project
|
|
159
|
+
belongs_to :target, :polymorphic => true
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
class Media
|
|
163
|
+
include MongoMapper::EmbeddedDocument
|
|
164
|
+
|
|
165
|
+
key :file, String
|
|
166
|
+
key :visible, Boolean
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
class Video < Media
|
|
170
|
+
key :length, Integer
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
class Image < Media
|
|
174
|
+
key :width, Integer
|
|
175
|
+
key :height, Integer
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
class Music < Media
|
|
179
|
+
key :bitrate, String
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
class Catalog
|
|
183
|
+
include MongoMapper::Document
|
|
184
|
+
|
|
185
|
+
many :medias, :polymorphic => true do
|
|
186
|
+
def visible
|
|
187
|
+
# for some reason we can't use select here
|
|
188
|
+
find_all { |m| m.visible? }
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
module TrModels
|
|
194
|
+
class Transport
|
|
195
|
+
include MongoMapper::EmbeddedDocument
|
|
196
|
+
|
|
197
|
+
key :license_plate, String
|
|
198
|
+
key :purchased_on, Date
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
class Car < TrModels::Transport
|
|
202
|
+
include MongoMapper::EmbeddedDocument
|
|
203
|
+
|
|
204
|
+
key :model, String
|
|
205
|
+
key :year, Integer
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
class Bus < TrModels::Transport
|
|
209
|
+
include MongoMapper::EmbeddedDocument
|
|
210
|
+
|
|
211
|
+
key :max_passengers, Integer
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
class Ambulance < TrModels::Transport
|
|
215
|
+
include MongoMapper::EmbeddedDocument
|
|
216
|
+
|
|
217
|
+
key :icu, Boolean
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
class Fleet
|
|
221
|
+
include MongoMapper::Document
|
|
222
|
+
|
|
223
|
+
module TransportsExtension
|
|
224
|
+
def to_be_replaced
|
|
225
|
+
# for some reason we can't use select
|
|
226
|
+
find_all { |t| t.purchased_on < 2.years.ago.to_date }
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
many :transports, :polymorphic => true, :class_name => "TrModels::Transport", :extend => TransportsExtension
|
|
231
|
+
key :name, String
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
module News
|
|
236
|
+
class Paper
|
|
237
|
+
include MongoMapper::Document
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
class Article
|
|
241
|
+
include MongoMapper::Document
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
class AltUser
|
|
246
|
+
include MongoMapper::Document
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
class Human
|
|
250
|
+
include MongoMapper::EmbeddedDocument
|
|
251
|
+
|
|
252
|
+
key :name, String
|
|
253
|
+
embedded_in :post
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
class Robot
|
|
257
|
+
include MongoMapper::EmbeddedDocument
|
|
258
|
+
|
|
259
|
+
key :serial_number, String
|
|
260
|
+
embedded_in :post
|
|
261
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
# For testing against edge rails also.
|
|
3
|
+
# $:.unshift '/Users/jnunemaker/dev/ruby/rails/activemodel/lib'
|
|
4
|
+
require 'active_model'
|
|
5
|
+
require 'models'
|
|
6
|
+
|
|
7
|
+
class ActiveModelLintTest < ActiveModel::TestCase
|
|
8
|
+
include ::ActiveModel::Lint::Tests
|
|
9
|
+
|
|
10
|
+
def setup
|
|
11
|
+
@model = Post.new
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_naming
|
|
15
|
+
Post.model_name.plural.should == 'posts'
|
|
16
|
+
Post.new.respond_to?(:model_name).should be_false
|
|
17
|
+
end
|
|
18
|
+
end
|
data/test/test_helper.rb
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
require 'rubygems'
|
|
2
|
+
require 'bundler/setup'
|
|
3
|
+
|
|
4
|
+
$:.unshift File.expand_path('../../lib', __FILE__)
|
|
5
|
+
require 'mongo_mapper'
|
|
6
|
+
require 'fileutils'
|
|
7
|
+
require 'ostruct'
|
|
8
|
+
|
|
9
|
+
Bundler.require(:default, :test)
|
|
10
|
+
|
|
11
|
+
class Test::Unit::TestCase
|
|
12
|
+
def Doc(name='Class', &block)
|
|
13
|
+
klass = Class.new
|
|
14
|
+
klass.class_eval do
|
|
15
|
+
include MongoMapper::Document
|
|
16
|
+
|
|
17
|
+
if name
|
|
18
|
+
class_eval "def self.name; '#{name}' end"
|
|
19
|
+
class_eval "def self.to_s; '#{name}' end"
|
|
20
|
+
else
|
|
21
|
+
set_collection_name :test
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
klass.class_eval(&block) if block_given?
|
|
26
|
+
klass.collection.remove
|
|
27
|
+
klass
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def EDoc(name='Class', &block)
|
|
31
|
+
klass = Class.new do
|
|
32
|
+
include MongoMapper::EmbeddedDocument
|
|
33
|
+
|
|
34
|
+
if name
|
|
35
|
+
class_eval "def self.name; '#{name}' end"
|
|
36
|
+
class_eval "def self.to_s; '#{name}' end"
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
klass.class_eval(&block) if block_given?
|
|
41
|
+
klass
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def drop_indexes(klass)
|
|
45
|
+
if klass.database.collection_names.include?(klass.collection.name)
|
|
46
|
+
klass.collection.drop_indexes
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
custom_matcher :be_true do |receiver, matcher, args|
|
|
51
|
+
matcher.positive_failure_message = "Expected #{receiver} to be true but it wasn't"
|
|
52
|
+
matcher.negative_failure_message = "Expected #{receiver} not to be true but it was"
|
|
53
|
+
receiver.eql?(true)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
custom_matcher :be_false do |receiver, matcher, args|
|
|
57
|
+
matcher.positive_failure_message = "Expected #{receiver} to be false but it wasn't"
|
|
58
|
+
matcher.negative_failure_message = "Expected #{receiver} not to be false but it was"
|
|
59
|
+
receiver.eql?(false)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
custom_matcher :have_error_on do |receiver, matcher, args|
|
|
63
|
+
receiver.valid?
|
|
64
|
+
attribute = args[0]
|
|
65
|
+
expected_message = args[1]
|
|
66
|
+
|
|
67
|
+
if expected_message.nil?
|
|
68
|
+
matcher.positive_failure_message = "#{receiver} had no errors on #{attribute}"
|
|
69
|
+
matcher.negative_failure_message = "#{receiver} had errors on #{attribute} #{receiver.errors.inspect}"
|
|
70
|
+
!receiver.errors[attribute].blank?
|
|
71
|
+
else
|
|
72
|
+
actual = receiver.errors[attribute]
|
|
73
|
+
matcher.positive_failure_message = %Q(Expected error on #{attribute} to be "#{expected_message}" but was "#{actual}")
|
|
74
|
+
matcher.negative_failure_message = %Q(Expected error on #{attribute} not to be "#{expected_message}" but was "#{actual}")
|
|
75
|
+
actual.include? expected_message
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
custom_matcher :have_index do |receiver, matcher, args|
|
|
80
|
+
index_name = args[0]
|
|
81
|
+
matcher.positive_failure_message = "#{receiver} does not have index named #{index_name}, but should"
|
|
82
|
+
matcher.negative_failure_message = "#{receiver} does have index named #{index_name}, but should not"
|
|
83
|
+
!receiver.collection.index_information.detect { |index| index[0] == index_name }.nil?
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
log_dir = File.expand_path('../../log', __FILE__)
|
|
88
|
+
FileUtils.mkdir_p(log_dir) unless File.exist?(log_dir)
|
|
89
|
+
logger = Logger.new(log_dir + '/test.log')
|
|
90
|
+
|
|
91
|
+
MongoMapper.connection = Mongo::Connection.new('127.0.0.1', 27017, :logger => logger)
|
|
92
|
+
MongoMapper.database = "test"
|
|
93
|
+
MongoMapper.database.collections.each { |c| c.drop_indexes }
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
require 'models'
|
|
3
|
+
|
|
4
|
+
class FooMonster; end
|
|
5
|
+
|
|
6
|
+
class AssociationBaseTest < Test::Unit::TestCase
|
|
7
|
+
include MongoMapper::Plugins::Associations
|
|
8
|
+
|
|
9
|
+
should "initialize with type and name" do
|
|
10
|
+
base = ManyAssociation.new(:foos)
|
|
11
|
+
base.name.should == :foos
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
should "also allow options when initializing" do
|
|
15
|
+
base = ManyAssociation.new(:foos, :polymorphic => true)
|
|
16
|
+
base.options[:polymorphic].should be_true
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
context "klass" do
|
|
20
|
+
should "default to class_name constantized" do
|
|
21
|
+
BelongsToAssociation.new(:foo_monster).klass.should == FooMonster
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
should "be the specified class" do
|
|
25
|
+
anonnymous_class = Class.new
|
|
26
|
+
BelongsToAssociation.new(:foo_monster, :class => anonnymous_class).klass.should == anonnymous_class
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
context "polymorphic?" do
|
|
31
|
+
should "be true if polymorphic" do
|
|
32
|
+
ManyAssociation.new(:foos, :polymorphic => true).polymorphic?.should be_true
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
should "be false if not polymorphic" do
|
|
36
|
+
ManyAssociation.new(:bars).polymorphic?.should be_false
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
context "as?" do
|
|
41
|
+
should "be true if one" do
|
|
42
|
+
OneAssociation.new(:foo, :as => :commentable).as?.should be_true
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
should "be false if not one" do
|
|
46
|
+
ManyAssociation.new(:foo).as?.should be_false
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
context "in_array?" do
|
|
51
|
+
should "be true if one" do
|
|
52
|
+
OneAssociation.new(:foo, :in => :list_ids).in_array?.should be_true
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
should "be false if not one" do
|
|
56
|
+
ManyAssociation.new(:foo).in_array?.should be_false
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
context "query_options" do
|
|
61
|
+
should "default to empty hash" do
|
|
62
|
+
base = ManyAssociation.new(:foos)
|
|
63
|
+
base.query_options.should == {}
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
should "work with order" do
|
|
67
|
+
base = ManyAssociation.new(:foos, :order => 'position')
|
|
68
|
+
base.query_options.should == {:order => 'position'}
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
should "correctly parse from options" do
|
|
72
|
+
base = ManyAssociation.new(:foos, :order => 'position', :somekey => 'somevalue')
|
|
73
|
+
base.query_options.should == {:order => 'position', :somekey => 'somevalue'}
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
context "type_key_name" do
|
|
78
|
+
should "be association name _ type for belongs_to" do
|
|
79
|
+
BelongsToAssociation.new(:foo).type_key_name.should == 'foo_type'
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
context "foreign_key" do
|
|
84
|
+
should "default to assocation name _id for belongs to" do
|
|
85
|
+
base = BelongsToAssociation.new(:foo)
|
|
86
|
+
base.foreign_key.should == 'foo_id'
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
should "be overridable with :foreign_key option" do
|
|
90
|
+
base = BelongsToAssociation.new(:foo, :foreign_key => 'foobar_id')
|
|
91
|
+
base.foreign_key.should == 'foobar_id'
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
should "have ivar that is association name" do
|
|
96
|
+
BelongsToAssociation.new(:foo).ivar.should == '@_foo'
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
context "embeddable?" do
|
|
100
|
+
should "be true if class is embeddable" do
|
|
101
|
+
base = ManyAssociation.new(:medias)
|
|
102
|
+
base.embeddable?.should be_true
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
should "be false if class is not embeddable" do
|
|
106
|
+
base = ManyAssociation.new(:statuses)
|
|
107
|
+
base.embeddable?.should be_false
|
|
108
|
+
|
|
109
|
+
base = BelongsToAssociation.new(:project)
|
|
110
|
+
base.embeddable?.should be_false
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
context "proxy_class" do
|
|
115
|
+
should "be BelongsToProxy for belongs_to" do
|
|
116
|
+
base = BelongsToAssociation.new(:project)
|
|
117
|
+
base.proxy_class.should == BelongsToProxy
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
should "be BelongsToPolymorphicProxy for polymorphic belongs_to" do
|
|
121
|
+
base = BelongsToAssociation.new(:target, :polymorphic => true)
|
|
122
|
+
base.proxy_class.should == BelongsToPolymorphicProxy
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
should "be OneProxy for one" do
|
|
126
|
+
base = OneAssociation.new(:status, :polymorphic => true)
|
|
127
|
+
base.proxy_class.should == OneProxy
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
should "be OneEmbeddedProxy for one embedded" do
|
|
131
|
+
base = OneAssociation.new(:media)
|
|
132
|
+
base.proxy_class.should == OneEmbeddedProxy
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
context "touch?" do
|
|
137
|
+
should "be true if touch" do
|
|
138
|
+
BelongsToAssociation.new(:car, :touch => true).touch?.should be_true
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
should "be false if not touch" do
|
|
142
|
+
BelongsToAssociation.new(:car).touch?.should be_false
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
end
|