mongo_mapper 0.12.0 → 0.13.0.beta1
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.
- checksums.yaml +7 -0
- data/README.rdoc +35 -13
- data/bin/mmconsole +1 -1
- data/lib/mongo_mapper.rb +4 -0
- data/lib/mongo_mapper/connection.rb +17 -6
- data/lib/mongo_mapper/document.rb +1 -0
- data/lib/mongo_mapper/exceptions.rb +4 -1
- data/lib/mongo_mapper/extensions/binary.rb +1 -1
- data/lib/mongo_mapper/extensions/boolean.rb +20 -23
- data/lib/mongo_mapper/extensions/date.rb +3 -3
- data/lib/mongo_mapper/extensions/integer.rb +5 -1
- data/lib/mongo_mapper/extensions/kernel.rb +2 -0
- data/lib/mongo_mapper/extensions/ordered_hash.rb +23 -0
- data/lib/mongo_mapper/extensions/string.rb +2 -2
- data/lib/mongo_mapper/extensions/time.rb +7 -5
- data/lib/mongo_mapper/middleware/identity_map.rb +3 -4
- data/lib/mongo_mapper/plugins.rb +1 -1
- data/lib/mongo_mapper/plugins/associations.rb +11 -5
- data/lib/mongo_mapper/plugins/associations/base.rb +5 -3
- data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +0 -0
- data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +8 -8
- data/lib/mongo_mapper/plugins/associations/collection.rb +2 -0
- data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +32 -7
- data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +2 -2
- data/lib/mongo_mapper/plugins/associations/one_proxy.rb +12 -12
- data/lib/mongo_mapper/plugins/associations/proxy.rb +5 -1
- data/lib/mongo_mapper/plugins/associations/single_association.rb +6 -6
- data/lib/mongo_mapper/plugins/clone.rb +4 -2
- data/lib/mongo_mapper/plugins/dirty.rb +22 -21
- data/lib/mongo_mapper/plugins/document.rb +4 -4
- data/lib/mongo_mapper/plugins/dumpable.rb +22 -0
- data/lib/mongo_mapper/plugins/embedded_callbacks.rb +58 -9
- data/lib/mongo_mapper/plugins/identity_map.rb +42 -32
- data/lib/mongo_mapper/plugins/keys.rb +133 -54
- data/lib/mongo_mapper/plugins/keys/key.rb +68 -22
- data/lib/mongo_mapper/plugins/modifiers.rb +26 -19
- data/lib/mongo_mapper/plugins/persistence.rb +15 -5
- data/lib/mongo_mapper/plugins/querying.rb +15 -40
- data/lib/mongo_mapper/plugins/querying/{decorator.rb → decorated_plucky_query.rb} +24 -4
- data/lib/mongo_mapper/plugins/rails.rb +22 -2
- data/lib/mongo_mapper/plugins/safe.rb +8 -5
- data/lib/mongo_mapper/plugins/sci.rb +26 -4
- data/lib/mongo_mapper/plugins/scopes.rb +5 -4
- data/lib/mongo_mapper/plugins/timestamps.rb +11 -4
- data/lib/mongo_mapper/plugins/validations.rb +1 -1
- data/lib/mongo_mapper/utils.rb +12 -0
- data/lib/mongo_mapper/version.rb +1 -1
- data/lib/rails/generators/mongo_mapper/config/config_generator.rb +20 -7
- data/lib/rails/generators/mongo_mapper/config/templates/mongo.yml +6 -0
- data/lib/rails/generators/mongo_mapper/model/model_generator.rb +18 -1
- data/lib/rails/generators/mongo_mapper/model/templates/model.rb +9 -5
- data/{test/functional/test_accessible.rb → spec/functional/accessible_spec.rb} +29 -29
- data/{test/functional/associations/test_belongs_to_polymorphic_proxy.rb → spec/functional/associations/belongs_to_polymorphic_proxy_spec.rb} +10 -10
- data/{test/functional/associations/test_belongs_to_proxy.rb → spec/functional/associations/belongs_to_proxy_spec.rb} +82 -64
- data/{test/functional/associations/test_in_array_proxy.rb → spec/functional/associations/in_array_proxy_spec.rb} +68 -68
- data/{test/functional/associations/test_many_documents_as_proxy.rb → spec/functional/associations/many_documents_as_proxy_spec.rb} +37 -38
- data/{test/functional/associations/test_many_documents_proxy.rb → spec/functional/associations/many_documents_proxy_spec.rb} +233 -146
- data/{test/functional/associations/test_many_embedded_polymorphic_proxy.rb → spec/functional/associations/many_embedded_polymorphic_proxy_spec.rb} +19 -20
- data/{test/functional/associations/test_many_embedded_proxy.rb → spec/functional/associations/many_embedded_proxy_spec.rb} +23 -24
- data/{test/functional/associations/test_many_polymorphic_proxy.rb → spec/functional/associations/many_polymorphic_proxy_spec.rb} +45 -46
- data/{test/functional/associations/test_one_as_proxy.rb → spec/functional/associations/one_as_proxy_spec.rb} +75 -77
- data/{test/functional/associations/test_one_embedded_polymorphic_proxy.rb → spec/functional/associations/one_embedded_polymorphic_proxy_spec.rb} +31 -32
- data/{test/functional/associations/test_one_embedded_proxy.rb → spec/functional/associations/one_embedded_proxy_spec.rb} +10 -10
- data/{test/functional/associations/test_one_proxy.rb → spec/functional/associations/one_proxy_spec.rb} +125 -102
- data/spec/functional/associations_spec.rb +48 -0
- data/{test/functional/test_binary.rb → spec/functional/binary_spec.rb} +6 -6
- data/spec/functional/caching_spec.rb +75 -0
- data/{test/functional/test_callbacks.rb → spec/functional/callbacks_spec.rb} +84 -26
- data/{test/functional/test_dirty.rb → spec/functional/dirty_spec.rb} +57 -42
- data/{test/functional/test_document.rb → spec/functional/document_spec.rb} +52 -52
- data/spec/functional/dumpable_spec.rb +24 -0
- data/{test/functional/test_dynamic_querying.rb → spec/functional/dynamic_querying_spec.rb} +14 -14
- data/{test/functional/test_embedded_document.rb → spec/functional/embedded_document_spec.rb} +51 -42
- data/{test/functional/test_equality.rb → spec/functional/equality_spec.rb} +4 -4
- data/spec/functional/extensions_spec.rb +16 -0
- data/{test/functional/test_identity_map.rb → spec/functional/identity_map_spec.rb} +73 -61
- data/spec/functional/indexes_spec.rb +48 -0
- data/spec/functional/keys_spec.rb +224 -0
- data/{test/functional/test_logger.rb → spec/functional/logger_spec.rb} +6 -6
- data/spec/functional/modifiers_spec.rb +550 -0
- data/spec/functional/pagination_spec.rb +89 -0
- data/spec/functional/protected_spec.rb +199 -0
- data/spec/functional/querying_spec.rb +1003 -0
- data/spec/functional/rails_spec.rb +55 -0
- data/spec/functional/safe_spec.rb +163 -0
- data/{test/functional/test_sci.rb → spec/functional/sci_spec.rb} +123 -34
- data/{test/functional/test_scopes.rb → spec/functional/scopes_spec.rb} +59 -26
- data/spec/functional/timestamps_spec.rb +97 -0
- data/{test/functional/test_touch.rb → spec/functional/touch_spec.rb} +13 -13
- data/spec/functional/userstamps_spec.rb +46 -0
- data/{test/functional/test_validations.rb → spec/functional/validations_spec.rb} +64 -64
- data/spec/spec_helper.rb +81 -0
- data/spec/support/matchers.rb +24 -0
- data/{test → spec/support}/models.rb +1 -6
- data/spec/unit/associations/base_spec.rb +146 -0
- data/spec/unit/associations/belongs_to_association_spec.rb +30 -0
- data/spec/unit/associations/many_association_spec.rb +64 -0
- data/spec/unit/associations/one_association_spec.rb +48 -0
- data/{test/unit/associations/test_proxy.rb → spec/unit/associations/proxy_spec.rb} +21 -21
- data/{test/unit/test_clone.rb → spec/unit/clone_spec.rb} +21 -11
- data/spec/unit/config_generator_spec.rb +24 -0
- data/{test/unit/test_document.rb → spec/unit/document_spec.rb} +42 -42
- data/{test/unit/test_dynamic_finder.rb → spec/unit/dynamic_finder_spec.rb} +28 -28
- data/{test/unit/test_embedded_document.rb → spec/unit/embedded_document_spec.rb} +102 -108
- data/{test/unit/test_equality.rb → spec/unit/equality_spec.rb} +7 -7
- data/{test/unit/test_exceptions.rb → spec/unit/exceptions_spec.rb} +3 -3
- data/{test/unit/test_extensions.rb → spec/unit/extensions_spec.rb} +85 -71
- data/spec/unit/identity_map_middleware_spec.rb +134 -0
- data/{test/unit/test_inspect.rb → spec/unit/inspect_spec.rb} +8 -8
- data/{test/unit/test_key.rb → spec/unit/key_spec.rb} +82 -52
- data/spec/unit/keys_spec.rb +155 -0
- data/spec/unit/model_generator_spec.rb +47 -0
- data/spec/unit/mongo_mapper_spec.rb +184 -0
- data/spec/unit/pagination_spec.rb +11 -0
- data/{test/unit/test_plugins.rb → spec/unit/plugins_spec.rb} +14 -14
- data/spec/unit/rails_compatibility_spec.rb +40 -0
- data/{test/unit/test_rails_reflect_on_association.rb → spec/unit/rails_reflect_on_association_spec.rb} +9 -9
- data/{test/unit/test_rails.rb → spec/unit/rails_spec.rb} +31 -31
- data/spec/unit/serialization_spec.rb +169 -0
- data/spec/unit/serializers/json_serializer_spec.rb +218 -0
- data/spec/unit/serializers/xml_serializer_spec.rb +198 -0
- data/{test/unit/test_time_zones.rb → spec/unit/time_zones_spec.rb} +8 -8
- data/{test/unit/test_translation.rb → spec/unit/translation_spec.rb} +6 -6
- data/{test/unit/test_validations.rb → spec/unit/validations_spec.rb} +72 -59
- metadata +199 -179
- data/test/_NOTE_ON_TESTING +0 -1
- data/test/functional/test_associations.rb +0 -46
- data/test/functional/test_caching.rb +0 -77
- data/test/functional/test_indexes.rb +0 -50
- data/test/functional/test_modifiers.rb +0 -537
- data/test/functional/test_pagination.rb +0 -91
- data/test/functional/test_protected.rb +0 -201
- data/test/functional/test_querying.rb +0 -935
- data/test/functional/test_safe.rb +0 -76
- data/test/functional/test_timestamps.rb +0 -62
- data/test/functional/test_userstamps.rb +0 -44
- data/test/support/railtie.rb +0 -4
- data/test/support/railtie/autoloaded.rb +0 -2
- data/test/support/railtie/not_autoloaded.rb +0 -3
- data/test/support/railtie/parent.rb +0 -3
- data/test/test_active_model_lint.rb +0 -18
- data/test/test_helper.rb +0 -93
- data/test/unit/associations/test_base.rb +0 -146
- data/test/unit/associations/test_belongs_to_association.rb +0 -29
- data/test/unit/associations/test_many_association.rb +0 -63
- data/test/unit/associations/test_one_association.rb +0 -47
- data/test/unit/serializers/test_json_serializer.rb +0 -216
- data/test/unit/serializers/test_xml_serializer.rb +0 -196
- data/test/unit/test_identity_map_middleware.rb +0 -132
- data/test/unit/test_keys.rb +0 -65
- data/test/unit/test_mongo_mapper.rb +0 -157
- data/test/unit/test_pagination.rb +0 -11
- data/test/unit/test_rails_compatibility.rb +0 -38
- data/test/unit/test_serialization.rb +0 -166
@@ -4,6 +4,11 @@ module MongoMapper
|
|
4
4
|
module Timestamps
|
5
5
|
extend ActiveSupport::Concern
|
6
6
|
|
7
|
+
included do
|
8
|
+
class_attribute :record_timestamps
|
9
|
+
self.record_timestamps = true
|
10
|
+
end
|
11
|
+
|
7
12
|
module ClassMethods
|
8
13
|
def timestamps!
|
9
14
|
key :created_at, Time
|
@@ -13,10 +18,12 @@ module MongoMapper
|
|
13
18
|
end
|
14
19
|
|
15
20
|
def update_timestamps
|
16
|
-
|
17
|
-
|
18
|
-
|
21
|
+
if self.record_timestamps
|
22
|
+
now = Time.now.utc
|
23
|
+
self[:created_at] = now if !persisted? && !created_at?
|
24
|
+
self[:updated_at] = now
|
25
|
+
end
|
19
26
|
end
|
20
27
|
end
|
21
28
|
end
|
22
|
-
end
|
29
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module MongoMapper
|
2
|
+
module Utils
|
3
|
+
def self.get_safe_options(options)
|
4
|
+
return {} unless options and options.key? :safe
|
5
|
+
safe = options[:safe]
|
6
|
+
safe = {:w => 1} if safe == true
|
7
|
+
safe = {:w => 0} if safe == false
|
8
|
+
safe = {:w => safe} if safe.is_a? Fixnum
|
9
|
+
safe
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/lib/mongo_mapper/version.rb
CHANGED
@@ -3,22 +3,35 @@
|
|
3
3
|
module MongoMapper
|
4
4
|
module Generators
|
5
5
|
class ConfigGenerator < Rails::Generators::Base
|
6
|
-
desc
|
6
|
+
desc 'creates the MongoMapper configuration at config/mongo.yml'
|
7
7
|
|
8
8
|
argument :database_name, :type => :string, :optional => true
|
9
9
|
|
10
10
|
def self.source_root
|
11
|
-
@source_root ||= File.expand_path(
|
12
|
-
end
|
13
|
-
|
14
|
-
def app_name
|
15
|
-
Rails::Application.subclasses.first.parent.to_s.underscore
|
11
|
+
@source_root ||= File.expand_path('../templates', __FILE__)
|
16
12
|
end
|
17
13
|
|
18
14
|
def create_config_file
|
19
|
-
template 'mongo.yml', File.join('config',
|
15
|
+
template 'mongo.yml', File.join('config', 'mongo.yml')
|
20
16
|
end
|
21
17
|
|
18
|
+
protected
|
19
|
+
|
20
|
+
def app_name
|
21
|
+
@app_name ||= defined_app_const_base? ? defined_app_name : File.basename(destination_root)
|
22
|
+
end
|
23
|
+
|
24
|
+
def defined_app_name
|
25
|
+
defined_app_const_base.underscore
|
26
|
+
end
|
27
|
+
|
28
|
+
def defined_app_const_base
|
29
|
+
Rails.respond_to?(:application) && defined?(Rails::Application) &&
|
30
|
+
Rails.application.is_a?(Rails::Application) && Rails.application.class.name.sub(/::Application$/, '')
|
31
|
+
end
|
32
|
+
|
33
|
+
alias :defined_app_const_base? :defined_app_const_base
|
34
|
+
|
22
35
|
end
|
23
36
|
end
|
24
37
|
end
|
@@ -1,6 +1,11 @@
|
|
1
1
|
defaults: &defaults
|
2
2
|
host: 127.0.0.1
|
3
3
|
port: 27017
|
4
|
+
options:
|
5
|
+
w: 1
|
6
|
+
pool_size: 1
|
7
|
+
slave_ok: false
|
8
|
+
ssl: false
|
4
9
|
|
5
10
|
development:
|
6
11
|
<<: *defaults
|
@@ -9,6 +14,7 @@ development:
|
|
9
14
|
test:
|
10
15
|
<<: *defaults
|
11
16
|
database: <%= database_name || app_name %>_test
|
17
|
+
w: 0
|
12
18
|
|
13
19
|
# set these environment variables on your prod server
|
14
20
|
production:
|
@@ -4,11 +4,15 @@ module MongoMapper
|
|
4
4
|
module Generators
|
5
5
|
class ModelGenerator < Rails::Generators::NamedBase
|
6
6
|
desc 'Creates a mongomapper model'
|
7
|
+
|
7
8
|
argument :name, :type => :string
|
8
9
|
argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
|
9
|
-
|
10
|
+
|
10
11
|
check_class_collision
|
11
12
|
|
13
|
+
class_option :timestamps, :type => :boolean
|
14
|
+
class_option :parent, :type => :string, :desc => "The parent class for the generated model"
|
15
|
+
|
12
16
|
def self.source_root
|
13
17
|
@source_root ||= File.expand_path("../templates", __FILE__)
|
14
18
|
end
|
@@ -18,6 +22,19 @@ module MongoMapper
|
|
18
22
|
end
|
19
23
|
|
20
24
|
hook_for :test_framework
|
25
|
+
|
26
|
+
protected
|
27
|
+
|
28
|
+
def parent_class_name
|
29
|
+
options[:parent]
|
30
|
+
end
|
31
|
+
|
32
|
+
# Rails 3.0.X compatibility
|
33
|
+
unless methods.include?(:module_namespacing)
|
34
|
+
def module_namespacing(&block)
|
35
|
+
yield if block
|
36
|
+
end
|
37
|
+
end
|
21
38
|
end
|
22
39
|
end
|
23
40
|
end
|
@@ -1,13 +1,17 @@
|
|
1
|
-
|
1
|
+
<%- module_namespacing do -%>
|
2
|
+
<%- if parent_class_name.present? -%>
|
3
|
+
class <%= class_name %> < <%= parent_class_name.classify %>
|
4
|
+
<%- else -%>
|
2
5
|
class <%= class_name %>
|
3
6
|
include MongoMapper::Document
|
7
|
+
<%- end -%>
|
4
8
|
|
5
|
-
|
9
|
+
<%- attributes.each do |attribute| -%>
|
6
10
|
key :<%= attribute.name %>, <%= attribute.type.to_s.camelcase %>
|
7
11
|
<% end -%>
|
8
|
-
|
12
|
+
<%- if options[:timestamps] -%>
|
9
13
|
timestamps!
|
10
|
-
|
14
|
+
<%- end -%>
|
11
15
|
|
12
16
|
end
|
13
|
-
|
17
|
+
<%- end -%>
|
@@ -1,8 +1,8 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
|
-
|
3
|
+
describe "Accessible" do
|
4
4
|
context 'A document with accessible attributes' do
|
5
|
-
|
5
|
+
before do
|
6
6
|
@doc_class = Doc do
|
7
7
|
key :name, String
|
8
8
|
key :admin, Boolean, :default => false
|
@@ -13,42 +13,42 @@ class AccessibleTest < Test::Unit::TestCase
|
|
13
13
|
@doc = @doc_class.create(:name => 'Steve Sloan')
|
14
14
|
end
|
15
15
|
|
16
|
-
should
|
16
|
+
it 'should have accessible attributes class method' do
|
17
17
|
@doc_class.accessible_attributes.should == [:name].to_set
|
18
18
|
end
|
19
19
|
|
20
|
-
should
|
20
|
+
it "should default accessible attributes to nil" do
|
21
21
|
Doc().accessible_attributes.should be_nil
|
22
22
|
end
|
23
23
|
|
24
|
-
should
|
24
|
+
it "should have accessible_attributes instance method" do
|
25
25
|
@doc.accessible_attributes.should equal(@doc_class.accessible_attributes)
|
26
26
|
end
|
27
27
|
|
28
|
-
should
|
28
|
+
it "should raise error if there are protected attributes" do
|
29
29
|
doc = Doc('Post')
|
30
30
|
doc.attr_protected :admin
|
31
31
|
lambda { doc.attr_accessible :name }.
|
32
32
|
should raise_error(/Declare either attr_protected or attr_accessible for Post/)
|
33
33
|
end
|
34
34
|
|
35
|
-
should
|
35
|
+
it "should know if using accessible attributes" do
|
36
36
|
@doc_class.accessible_attributes?.should be(true)
|
37
37
|
Doc().accessible_attributes?.should be(false)
|
38
38
|
end
|
39
39
|
|
40
|
-
should
|
40
|
+
it "should assign inaccessible attribute through accessor" do
|
41
41
|
@doc.admin = true
|
42
42
|
@doc.admin.should be_true
|
43
43
|
end
|
44
44
|
|
45
|
-
should
|
45
|
+
it "should ignore inaccessible attribute on #initialize" do
|
46
46
|
doc = @doc_class.new(:name => 'John', :admin => true)
|
47
47
|
doc.admin.should be_false
|
48
48
|
doc.name.should == 'John'
|
49
49
|
end
|
50
50
|
|
51
|
-
should
|
51
|
+
it "should not ignore inaccessible attributes on #initialize from the database" do
|
52
52
|
doc = @doc_class.new(:name => 'John')
|
53
53
|
doc.admin = true
|
54
54
|
doc.save!
|
@@ -58,7 +58,7 @@ class AccessibleTest < Test::Unit::TestCase
|
|
58
58
|
doc.name.should == 'John'
|
59
59
|
end
|
60
60
|
|
61
|
-
should
|
61
|
+
it "should not ignore inaccessible attributes on #reload" do
|
62
62
|
doc = @doc_class.new(:name => 'John')
|
63
63
|
doc.admin = true
|
64
64
|
doc.save!
|
@@ -68,40 +68,40 @@ class AccessibleTest < Test::Unit::TestCase
|
|
68
68
|
doc.name.should == 'John'
|
69
69
|
end
|
70
70
|
|
71
|
-
should
|
71
|
+
it "should not ignore inaccessible attribute on #update_attribute" do
|
72
72
|
@doc.update_attribute('admin', true)
|
73
73
|
@doc.admin.should be_true
|
74
74
|
end
|
75
75
|
|
76
|
-
should
|
76
|
+
it "should ignore inaccessible attribute on #update_attributes" do
|
77
77
|
@doc.update_attributes(:name => 'Ren Hoek', :admin => true)
|
78
78
|
@doc.name.should == 'Ren Hoek'
|
79
79
|
@doc.admin.should be_false
|
80
80
|
end
|
81
81
|
|
82
|
-
should
|
82
|
+
it "should ignore inaccessible attribute on #update_attributes!" do
|
83
83
|
@doc.update_attributes!(:name => 'Stimpson J. Cat', :admin => true)
|
84
84
|
@doc.name.should == 'Stimpson J. Cat'
|
85
85
|
@doc.admin.should be_false
|
86
86
|
end
|
87
87
|
|
88
|
-
should
|
88
|
+
it "should ignore inaccessible attribute on #attributes=" do
|
89
89
|
@doc.attributes = {:name => 'Ren Hoek', :admin => true}
|
90
90
|
@doc.name.should == 'Ren Hoek'
|
91
91
|
@doc.admin.should be_false
|
92
92
|
end
|
93
93
|
|
94
|
-
should
|
94
|
+
it "should be indifferent to whether the accessible keys are strings or symbols" do
|
95
95
|
@doc.update_attributes!("name" => 'Stimpson J. Cat', "admin" => true)
|
96
96
|
@doc.name.should == 'Stimpson J. Cat'
|
97
97
|
@doc.admin.should be_false
|
98
98
|
end
|
99
99
|
|
100
|
-
should
|
100
|
+
it "should accept nil as constructor's argument without raising exception" do
|
101
101
|
lambda { @doc_class.new(nil) }.should_not raise_error
|
102
102
|
end
|
103
103
|
|
104
|
-
should
|
104
|
+
it "should ignore all attributes if called with no args" do
|
105
105
|
@doc_class = Doc do
|
106
106
|
key :name
|
107
107
|
attr_accessible
|
@@ -112,7 +112,7 @@ class AccessibleTest < Test::Unit::TestCase
|
|
112
112
|
end
|
113
113
|
|
114
114
|
context "Single collection inherited accessible attributes" do
|
115
|
-
|
115
|
+
before do
|
116
116
|
class ::GrandParent
|
117
117
|
include MongoMapper::Document
|
118
118
|
attr_accessible :name
|
@@ -135,14 +135,14 @@ class AccessibleTest < Test::Unit::TestCase
|
|
135
135
|
end
|
136
136
|
end
|
137
137
|
|
138
|
-
|
138
|
+
after do
|
139
139
|
Object.send :remove_const, 'GrandParent' if defined?(::GrandParent)
|
140
140
|
Object.send :remove_const, 'Child' if defined?(::Child)
|
141
141
|
Object.send :remove_const, 'GrandChild' if defined?(::GrandChild)
|
142
142
|
Object.send :remove_const, 'OtherChild' if defined?(::OtherChild)
|
143
143
|
end
|
144
144
|
|
145
|
-
should
|
145
|
+
it "should share keys down the inheritance trail" do
|
146
146
|
GrandParent.accessible_attributes.should == [:name].to_set
|
147
147
|
Child.accessible_attributes.should == [:name, :position].to_set
|
148
148
|
GrandChild.accessible_attributes.should == [:name, :position].to_set
|
@@ -151,7 +151,7 @@ class AccessibleTest < Test::Unit::TestCase
|
|
151
151
|
end
|
152
152
|
|
153
153
|
context "An embedded document with accessible attributes" do
|
154
|
-
|
154
|
+
before do
|
155
155
|
@doc_class = Doc('Project')
|
156
156
|
@edoc_class = EDoc('Person') do
|
157
157
|
key :name, String
|
@@ -166,30 +166,30 @@ class AccessibleTest < Test::Unit::TestCase
|
|
166
166
|
@doc.people << @edoc
|
167
167
|
end
|
168
168
|
|
169
|
-
should
|
169
|
+
it "should have accessible attributes class method" do
|
170
170
|
@edoc_class.accessible_attributes.should == [:name].to_set
|
171
171
|
end
|
172
172
|
|
173
|
-
should
|
173
|
+
it "should default accessible attributes to nil" do
|
174
174
|
EDoc().accessible_attributes.should be_nil
|
175
175
|
end
|
176
176
|
|
177
|
-
should
|
177
|
+
it "should have accessible attributes instance method" do
|
178
178
|
@edoc.accessible_attributes.should equal(@edoc_class.accessible_attributes)
|
179
179
|
end
|
180
180
|
|
181
|
-
should
|
181
|
+
it "should assign inaccessible attribute through accessor" do
|
182
182
|
@edoc.admin = true
|
183
183
|
@edoc.admin.should be_true
|
184
184
|
end
|
185
185
|
|
186
|
-
should
|
186
|
+
it "should ignore inaccessible attribute on #update_attributes" do
|
187
187
|
@edoc.update_attributes(:name => 'Ren Hoek', :admin => true)
|
188
188
|
@edoc.name.should == 'Ren Hoek'
|
189
189
|
@edoc.admin.should be_false
|
190
190
|
end
|
191
191
|
|
192
|
-
should
|
192
|
+
it "should ignore inaccessible attribute on #update_attributes!" do
|
193
193
|
@edoc.update_attributes!(:name => 'Stimpson J. Cat', :admin => true)
|
194
194
|
@edoc.name.should == 'Stimpson J. Cat'
|
195
195
|
@edoc.admin.should be_false
|
@@ -1,19 +1,19 @@
|
|
1
|
-
require '
|
2
|
-
require 'models'
|
1
|
+
require 'spec_helper'
|
3
2
|
|
4
|
-
|
5
|
-
|
3
|
+
|
4
|
+
describe "BelongsToPolymorphicProxy" do
|
5
|
+
before do
|
6
6
|
Status.collection.remove
|
7
7
|
Project.collection.remove
|
8
8
|
end
|
9
9
|
|
10
|
-
should
|
10
|
+
it "should default to nil" do
|
11
11
|
status = Status.new
|
12
12
|
status.target.nil?.should be_true
|
13
13
|
status.target.inspect.should == "nil"
|
14
14
|
end
|
15
15
|
|
16
|
-
should
|
16
|
+
it "should have boolean presence method" do
|
17
17
|
status = Status.new
|
18
18
|
status.target?.should be_false
|
19
19
|
|
@@ -21,7 +21,7 @@ class BelongsToPolymorphicProxyTest < Test::Unit::TestCase
|
|
21
21
|
status.target?.should be_true
|
22
22
|
end
|
23
23
|
|
24
|
-
should
|
24
|
+
it "should be able to replace the association" do
|
25
25
|
status = Status.new(:name => 'Foo!')
|
26
26
|
project = Project.new(:name => "mongomapper")
|
27
27
|
status.target = project
|
@@ -34,7 +34,7 @@ class BelongsToPolymorphicProxyTest < Test::Unit::TestCase
|
|
34
34
|
status.target.name.should == "mongomapper"
|
35
35
|
end
|
36
36
|
|
37
|
-
should
|
37
|
+
it "should unset the association" do
|
38
38
|
status = Status.new(:name => 'Foo!')
|
39
39
|
project = Project.new(:name => "mongomapper")
|
40
40
|
status.target = project
|
@@ -48,7 +48,7 @@ class BelongsToPolymorphicProxyTest < Test::Unit::TestCase
|
|
48
48
|
end
|
49
49
|
|
50
50
|
context "association id set but document not found" do
|
51
|
-
|
51
|
+
before do
|
52
52
|
@status = Status.new(:name => 'Foo!')
|
53
53
|
project = Project.new(:name => "mongomapper")
|
54
54
|
@status.target = project
|
@@ -57,7 +57,7 @@ class BelongsToPolymorphicProxyTest < Test::Unit::TestCase
|
|
57
57
|
@status.reload
|
58
58
|
end
|
59
59
|
|
60
|
-
should
|
60
|
+
it "should return nil instead of raising error" do
|
61
61
|
@status.target.nil?.should be_true
|
62
62
|
end
|
63
63
|
end
|
@@ -1,25 +1,24 @@
|
|
1
|
-
require '
|
2
|
-
require 'models'
|
1
|
+
require 'spec_helper'
|
3
2
|
|
4
|
-
|
5
|
-
|
3
|
+
|
4
|
+
describe "BelongsToProxy" do
|
5
|
+
before do
|
6
6
|
@post_class = Doc()
|
7
7
|
@comment_class = Doc do
|
8
8
|
key :post_id, ObjectId
|
9
9
|
end
|
10
|
-
|
11
10
|
@comment_class.belongs_to :post, :class => @post_class
|
12
11
|
end
|
13
12
|
|
14
|
-
should
|
13
|
+
it "should default to nil" do
|
15
14
|
@comment_class.new.post.nil?.should be_true
|
16
15
|
end
|
17
16
|
|
18
|
-
should
|
17
|
+
it "should return nil instead of a proxy" do
|
19
18
|
nil.should === @comment_class.new.post
|
20
19
|
end
|
21
20
|
|
22
|
-
should
|
21
|
+
it "should have boolean presence method" do
|
23
22
|
comment = @comment_class.new(:name => 'Foo!')
|
24
23
|
comment.post?.should be_false
|
25
24
|
|
@@ -27,7 +26,7 @@ class BelongsToProxyTest < Test::Unit::TestCase
|
|
27
26
|
comment.post?.should be_true
|
28
27
|
end
|
29
28
|
|
30
|
-
should
|
29
|
+
it "should allow overriding association methods" do
|
31
30
|
@comment_class.class_eval do
|
32
31
|
def post?
|
33
32
|
super
|
@@ -40,7 +39,7 @@ class BelongsToProxyTest < Test::Unit::TestCase
|
|
40
39
|
instance.post?.should be_true
|
41
40
|
end
|
42
41
|
|
43
|
-
should
|
42
|
+
it "should be able to replace the association" do
|
44
43
|
post = @post_class.new(:name => 'mongomapper')
|
45
44
|
comment = @comment_class.new(:name => 'Foo!', :post => post)
|
46
45
|
comment.save.should be_true
|
@@ -49,25 +48,25 @@ class BelongsToProxyTest < Test::Unit::TestCase
|
|
49
48
|
comment.post.should == post
|
50
49
|
comment.post.nil?.should be_false
|
51
50
|
end
|
52
|
-
|
53
|
-
should
|
51
|
+
|
52
|
+
it "should not reload the association when replacing" do
|
54
53
|
post = @post_class.new(:name => 'mongomapper')
|
55
54
|
comment = @comment_class.new(:name => 'Foo!', :post => post)
|
56
55
|
comment.post.proxy_target.object_id.should == post.object_id
|
57
56
|
end
|
58
57
|
|
59
|
-
should
|
58
|
+
it "should properly assign the associated object when assigning the association with create" do
|
60
59
|
child_class = Doc('Child')
|
61
60
|
parent_class = Doc('Parent')
|
62
|
-
|
61
|
+
|
63
62
|
parent_class.one :child, :class => child_class
|
64
63
|
child_class.belongs_to :parent, :class => parent_class
|
65
|
-
|
64
|
+
|
66
65
|
child = child_class.create(:parent => parent_class.create)
|
67
66
|
child.parent.child.should == child
|
68
67
|
end
|
69
68
|
|
70
|
-
should
|
69
|
+
it "should generate a new proxy when replacing the association" do
|
71
70
|
post1 = @post_class.create(:name => 'post1')
|
72
71
|
post2 = @post_class.create(:name => 'post2')
|
73
72
|
|
@@ -87,7 +86,7 @@ class BelongsToProxyTest < Test::Unit::TestCase
|
|
87
86
|
original_post.name.should == 'post1'
|
88
87
|
end
|
89
88
|
|
90
|
-
should
|
89
|
+
it "should unset the association" do
|
91
90
|
post = @post_class.new(:name => 'mongomapper')
|
92
91
|
comment = @comment_class.new(:name => 'Foo!', :post => post)
|
93
92
|
comment.save.should be_true
|
@@ -97,19 +96,19 @@ class BelongsToProxyTest < Test::Unit::TestCase
|
|
97
96
|
comment.post.nil?.should be_true
|
98
97
|
end
|
99
98
|
|
100
|
-
should
|
99
|
+
it "should return nil if id set but document not found" do
|
101
100
|
id = BSON::ObjectId.new
|
102
101
|
@comment_class.new(:name => 'Foo', :post_id => id).post.nil?.should be_true
|
103
102
|
end
|
104
103
|
|
105
|
-
should
|
104
|
+
it "should define foreign key if it doesn't exist" do
|
106
105
|
@category_class = Doc()
|
107
106
|
@post_class.belongs_to :category, :class => @category_class
|
108
107
|
|
109
108
|
@post_class.key?(:category_id).should be_true
|
110
109
|
end
|
111
110
|
|
112
|
-
should
|
111
|
+
it "should not define foreign key if it already exists" do
|
113
112
|
@category_class = Doc()
|
114
113
|
@post_class.key :category_id, String
|
115
114
|
@post_class.belongs_to :category, :class => @category_class
|
@@ -118,7 +117,7 @@ class BelongsToProxyTest < Test::Unit::TestCase
|
|
118
117
|
end
|
119
118
|
|
120
119
|
context ":dependent" do
|
121
|
-
|
120
|
+
before do
|
122
121
|
# FIXME: make use of already defined models
|
123
122
|
class ::Property
|
124
123
|
include MongoMapper::Document
|
@@ -132,13 +131,13 @@ class BelongsToProxyTest < Test::Unit::TestCase
|
|
132
131
|
Thing.collection.remove
|
133
132
|
end
|
134
133
|
|
135
|
-
|
134
|
+
after do
|
136
135
|
Object.send :remove_const, 'Property' if defined?(::Property)
|
137
136
|
Object.send :remove_const, 'Thing' if defined?(::Thing)
|
138
137
|
end
|
139
138
|
|
140
139
|
context "=> destroy" do
|
141
|
-
|
140
|
+
before do
|
142
141
|
Property.key :thing_id, ObjectId
|
143
142
|
Property.belongs_to :thing, :dependent => :destroy
|
144
143
|
Thing.many :properties
|
@@ -152,7 +151,7 @@ class BelongsToProxyTest < Test::Unit::TestCase
|
|
152
151
|
@thing.properties << @property3
|
153
152
|
end
|
154
153
|
|
155
|
-
should
|
154
|
+
it "should not execute on a belongs_to association" do
|
156
155
|
Thing.count.should == 1
|
157
156
|
@property1.destroy
|
158
157
|
Thing.count.should == 1
|
@@ -160,60 +159,79 @@ class BelongsToProxyTest < Test::Unit::TestCase
|
|
160
159
|
end
|
161
160
|
end
|
162
161
|
|
163
|
-
|
164
|
-
@comment_class.
|
165
|
-
|
166
|
-
comment = @comment_class.create
|
167
|
-
post = comment.build_post(:title => 'Hello, world!')
|
168
|
-
comment.post.should be_instance_of(@post_class)
|
169
|
-
comment.post.should be_new
|
170
|
-
comment.post.title.should == 'Hello, world!'
|
171
|
-
comment.post.should == post
|
172
|
-
comment.post_id.should == post.id
|
173
|
-
end
|
174
|
-
|
175
|
-
should "be able to create" do
|
176
|
-
@comment_class.belongs_to :post, :class => @post_class
|
177
|
-
|
178
|
-
comment = @comment_class.create
|
179
|
-
post = comment.create_post(:title => 'Hello, world!')
|
180
|
-
comment.post.should be_instance_of(@post_class)
|
181
|
-
comment.post.should_not be_new
|
182
|
-
comment.post.title.should == 'Hello, world!'
|
183
|
-
comment.post.should == post
|
184
|
-
comment.post_id.should == post.id
|
185
|
-
end
|
162
|
+
context "when creating documents" do
|
163
|
+
let(:comment) { @comment_class.create }
|
186
164
|
|
187
|
-
|
188
|
-
setup do
|
165
|
+
before do
|
189
166
|
@post_class.key :title, String, :required => true
|
190
167
|
@comment_class.belongs_to :post, :class => @post_class
|
191
168
|
end
|
192
169
|
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
comment.
|
170
|
+
context "#build" do
|
171
|
+
it "should work" do
|
172
|
+
post = comment.build_post(:title => 'Hello, world!')
|
173
|
+
comment.post.should be_instance_of(@post_class)
|
174
|
+
comment.post.should be_new
|
175
|
+
comment.post.title.should == 'Hello, world!'
|
176
|
+
comment.post.should == post
|
177
|
+
comment.post_id.should == post.id
|
178
|
+
end
|
179
|
+
|
180
|
+
it "should accept a block" do
|
181
|
+
comment.build_post(:title => 'Hello, world!') do |post|
|
182
|
+
post.title = "Hello world!"
|
183
|
+
end
|
184
|
+
comment.post.title.should == "Hello world!"
|
197
185
|
end
|
198
186
|
end
|
199
187
|
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
188
|
+
context "#create" do
|
189
|
+
it "should work" do
|
190
|
+
post = comment.create_post(:title => 'Hello, world!')
|
191
|
+
comment.post.should be_instance_of(@post_class)
|
192
|
+
comment.post.should_not be_new
|
193
|
+
comment.post.title.should == 'Hello, world!'
|
194
|
+
comment.post.should == post
|
195
|
+
comment.post_id.should == post.id
|
196
|
+
end
|
197
|
+
|
198
|
+
it "should accept a block" do
|
199
|
+
comment.create_post(:title => 'Hello, world!') do |post|
|
200
|
+
post.title = "Hello world!"
|
201
|
+
end
|
202
|
+
comment.post.title.should == "Hello world!"
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
context "#create!" do
|
207
|
+
it "should accept a block" do
|
208
|
+
comment.create_post! do |post|
|
209
|
+
post.title = "Hello world!"
|
210
|
+
end
|
211
|
+
comment.post.title.should == "Hello world!"
|
212
|
+
end
|
213
|
+
|
214
|
+
it "should raise exception if invalid" do
|
215
|
+
expect { comment.create_post! }.to raise_error(MongoMapper::DocumentNotValid)
|
216
|
+
end
|
217
|
+
|
218
|
+
it "should work if valid" do
|
219
|
+
post = comment.create_post!(:title => 'Hello, world!')
|
220
|
+
comment.post.should be_instance_of(@post_class)
|
221
|
+
comment.post.should_not be_new
|
222
|
+
comment.post.title.should == 'Hello, world!'
|
223
|
+
comment.post.should == post
|
224
|
+
comment.post_id.should == post.id
|
225
|
+
end
|
208
226
|
end
|
209
227
|
end
|
210
228
|
|
211
229
|
context 'autosave' do
|
212
|
-
should
|
230
|
+
it 'should not be true by default' do
|
213
231
|
@comment_class.associations[:post].options[:autosave].should_not be_true
|
214
232
|
end
|
215
233
|
|
216
|
-
should
|
234
|
+
it 'should save parent changes when true' do
|
217
235
|
@comment_class.associations[:post].options[:autosave] = true
|
218
236
|
|
219
237
|
comment = @comment_class.create
|
@@ -225,7 +243,7 @@ class BelongsToProxyTest < Test::Unit::TestCase
|
|
225
243
|
post.reload.title.should == 'Hi, world.'
|
226
244
|
end
|
227
245
|
|
228
|
-
should
|
246
|
+
it 'should not save parent changes when false' do
|
229
247
|
comment = @comment_class.create
|
230
248
|
post = comment.create_post(:title => 'Hello, world!')
|
231
249
|
|