flat_map 0.0.3 → 0.1.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.
- checksums.yaml +9 -9
- data/lib/flat_map.rb +8 -3
- data/lib/flat_map/{mapper.rb → model_mapper.rb} +3 -22
- data/lib/flat_map/{mapper/targeting.rb → model_mapper/persistence.rb} +5 -27
- data/lib/flat_map/{mapper → model_mapper}/skipping.rb +4 -4
- data/lib/flat_map/{base_mapper.rb → open_mapper.rb} +28 -10
- data/lib/flat_map/{base_mapper → open_mapper}/attribute_methods.rb +13 -12
- data/lib/flat_map/{base_mapper → open_mapper}/factory.rb +62 -57
- data/lib/flat_map/{base_mapper → open_mapper}/mapping.rb +3 -3
- data/lib/flat_map/{base_mapper → open_mapper}/mounting.rb +16 -16
- data/lib/flat_map/{base_mapper → open_mapper}/persistence.rb +47 -14
- data/lib/flat_map/{base_mapper → open_mapper}/skipping.rb +9 -5
- data/lib/flat_map/{base_mapper → open_mapper}/traits.rb +15 -14
- data/lib/flat_map/version.rb +1 -1
- data/spec/flat_map/mapper/factory_spec.rb +57 -38
- data/spec/flat_map/mapper/persistence_spec.rb +152 -0
- metadata +38 -17
- data/lib/flat_map/empty_mapper.rb +0 -29
- data/spec/flat_map/empty_mapper_spec.rb +0 -36
@@ -2,7 +2,7 @@ module FlatMap
|
|
2
2
|
# This module hosts all definitions required to define and use mapping
|
3
3
|
# functionality within mapper classes. This includes mapping definition
|
4
4
|
# methods and basic reading and writing methods.
|
5
|
-
module
|
5
|
+
module OpenMapper::Mapping
|
6
6
|
extend ActiveSupport::Concern
|
7
7
|
|
8
8
|
# Mapping class macros
|
@@ -65,7 +65,7 @@ module FlatMap
|
|
65
65
|
# Send passed +params+ +write_from_params+ method of each
|
66
66
|
# of the mappings of +self+.
|
67
67
|
#
|
68
|
-
# Overloaded in {
|
68
|
+
# Overloaded in {OpenMapper::Mounting}.
|
69
69
|
#
|
70
70
|
# @param [Hash] params
|
71
71
|
# @return [Hash] params
|
@@ -109,7 +109,7 @@ module FlatMap
|
|
109
109
|
# @param [Symbol] name
|
110
110
|
# @return [FlatMap::Mapping]
|
111
111
|
def mapping(name)
|
112
|
-
mappings.find{ |
|
112
|
+
mappings.find{ |mapping| mapping.name == name }
|
113
113
|
end
|
114
114
|
|
115
115
|
# Return a list of mappings associated to +self+.
|
@@ -6,7 +6,7 @@ module FlatMap
|
|
6
6
|
#
|
7
7
|
# Also, the +method_missing+ method is defined here to delegate the missing
|
8
8
|
# method to the very first mounted mapper that responds to it.
|
9
|
-
module
|
9
|
+
module OpenMapper::Mounting
|
10
10
|
extend ActiveSupport::Concern
|
11
11
|
|
12
12
|
included do
|
@@ -21,14 +21,14 @@ module FlatMap
|
|
21
21
|
# mapper.
|
22
22
|
#
|
23
23
|
# @param [*Object] args
|
24
|
-
# @return [Array<FlatMap::
|
24
|
+
# @return [Array<FlatMap::OpenMapper::Factory>]
|
25
25
|
def mount(*args, &block)
|
26
|
-
mountings << FlatMap::
|
26
|
+
mountings << FlatMap::OpenMapper::Factory.new(*args, &block)
|
27
27
|
end
|
28
28
|
|
29
29
|
# List of mountings (factories) of a class.
|
30
30
|
#
|
31
|
-
# @return [Array<FlatMap::
|
31
|
+
# @return [Array<FlatMap::OpenMapper>]
|
32
32
|
def mountings
|
33
33
|
@mountings ||= []
|
34
34
|
end
|
@@ -68,14 +68,14 @@ module FlatMap
|
|
68
68
|
|
69
69
|
# Return list of mappings to be saved before saving target of +self+
|
70
70
|
#
|
71
|
-
# @return [Array<FlatMap::
|
71
|
+
# @return [Array<FlatMap::OpenMapper>]
|
72
72
|
def before_save_mountings
|
73
73
|
nearest_mountings.select{ |mount| mount.save_order == :before }
|
74
74
|
end
|
75
75
|
|
76
76
|
# Return list of mappings to be saved after target of +self+ was saved
|
77
77
|
#
|
78
|
-
# @return [Array<FlatMap::
|
78
|
+
# @return [Array<FlatMap::OpenMapper>]
|
79
79
|
def after_save_mountings
|
80
80
|
nearest_mountings.reject{ |mount| mount.save_order == :before }
|
81
81
|
end
|
@@ -83,16 +83,16 @@ module FlatMap
|
|
83
83
|
# Return all mountings that are mouted on +self+ directly or through
|
84
84
|
# traits.
|
85
85
|
#
|
86
|
-
# @return [Array<FlatMap::
|
86
|
+
# @return [Array<FlatMap::OpenMapper>]
|
87
87
|
def nearest_mountings
|
88
88
|
mountings.map{ |mount| mount.owned? ? mount.nearest_mountings : mount }.flatten
|
89
89
|
end
|
90
90
|
|
91
91
|
# Return a list of all mountings (mapper objects) associated with +self+.
|
92
92
|
#
|
93
|
-
# Overridden in {Traits}.
|
93
|
+
# Overridden in {Traits}. Left here for consistency.
|
94
94
|
#
|
95
|
-
# @return [Array<FlatMap::
|
95
|
+
# @return [Array<FlatMap::OpenMapper>]
|
96
96
|
def mountings
|
97
97
|
@mountings ||= self.class.mountings.map{ |factory| factory.create(self) }
|
98
98
|
end
|
@@ -110,7 +110,7 @@ module FlatMap
|
|
110
110
|
# list of all mountings of the owner. This will allow separate traits
|
111
111
|
# to share methods via method_missing pattern.
|
112
112
|
#
|
113
|
-
# @return [Array<FlatMap::
|
113
|
+
# @return [Array<FlatMap::OpenMapper>] mounted mappers (including traits)
|
114
114
|
def all_mountings
|
115
115
|
return all_nested_mountings.unshift(self) unless owned?
|
116
116
|
owner.all_mountings
|
@@ -119,7 +119,7 @@ module FlatMap
|
|
119
119
|
|
120
120
|
# Return a list of mountings that are accessible by a named mapper.
|
121
121
|
#
|
122
|
-
# @return [Array<FlatMap::
|
122
|
+
# @return [Array<FlatMap::OpenMapper>]
|
123
123
|
def all_nested_mountings
|
124
124
|
mountings.dup.concat(mountings.map{ |mount| mount.send(:all_nested_mountings) }).flatten
|
125
125
|
end
|
@@ -149,20 +149,20 @@ module FlatMap
|
|
149
149
|
protected :all_nested_mappings
|
150
150
|
|
151
151
|
# Delegate missing method to any mounted mapping that respond to it,
|
152
|
-
# unless those methods are protected methods of FlatMap::
|
152
|
+
# unless those methods are protected methods of FlatMap::OpenMapper.
|
153
153
|
#
|
154
154
|
# NOTE: :to_ary method is called internally by Ruby 1.9.3 when we call
|
155
155
|
# something like [mapper].flatten. And we DO want default behavior
|
156
156
|
# for handling this missing method.
|
157
157
|
def method_missing(name, *args, &block)
|
158
158
|
return super if name == :to_ary ||
|
159
|
-
|
159
|
+
self.class.protected_instance_methods.include?(name)
|
160
160
|
|
161
161
|
return self[name] if mapping(name).present?
|
162
162
|
|
163
|
-
|
164
|
-
return super if
|
165
|
-
|
163
|
+
mounting = all_mountings.find{ |mount| mount.respond_to?(name) }
|
164
|
+
return super if mounting.nil?
|
165
|
+
mounting.send(name, *args, &block)
|
166
166
|
end
|
167
167
|
end
|
168
168
|
end
|
@@ -1,18 +1,37 @@
|
|
1
1
|
module FlatMap
|
2
|
-
# This module provides
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# saving operation as a work flow of applying parameters to mapper
|
6
|
-
# and all of its mounted mappers in a right way, running callbacks,
|
7
|
-
# etc.
|
8
|
-
#
|
9
|
-
# See {Mapper::Targeting} for a place where mapper targets are
|
10
|
-
# actually get persisted / updated.
|
2
|
+
# This module provides some integration between mapper and its target,
|
3
|
+
# which is usually an ActiveRecord model, as well as some integration
|
4
|
+
# between mapper and Rails forms.
|
11
5
|
#
|
12
6
|
# In particular, validation and save methods are defined here. And
|
13
7
|
# the <tt>save</tt> method itself is defined as a callback. Also, Rails
|
14
8
|
# multiparam attributes extraction is defined within this module.
|
15
|
-
module
|
9
|
+
module OpenMapper::Persistence
|
10
|
+
extend ActiveSupport::Concern
|
11
|
+
|
12
|
+
included do
|
13
|
+
define_callbacks :save
|
14
|
+
end
|
15
|
+
|
16
|
+
# ModelMethods class macros
|
17
|
+
module ClassMethods
|
18
|
+
# Create a new mapper object wrapped around new instance of its
|
19
|
+
# +target_class+, with a list of passed +traits+ applied to it.
|
20
|
+
#
|
21
|
+
# @param [*Symbol] traits
|
22
|
+
# @return [FlatMap::OpenMapper] mapper
|
23
|
+
def build(*traits, &block)
|
24
|
+
new(target_class.new, *traits, &block)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Default target class for OpenMapper is OpenStruct.
|
28
|
+
#
|
29
|
+
# @return [Class] class
|
30
|
+
def target_class
|
31
|
+
OpenStruct
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
16
35
|
# Write a passed set of +params+. Then try to save the model if +self+
|
17
36
|
# passes validation. Saving is performed in a transaction.
|
18
37
|
#
|
@@ -63,6 +82,13 @@ module FlatMap
|
|
63
82
|
before_res && target_res && after_res
|
64
83
|
end
|
65
84
|
|
85
|
+
# Return +true+ since OpenStruct is always 'saved'.
|
86
|
+
#
|
87
|
+
# @return [true]
|
88
|
+
def save_target
|
89
|
+
true
|
90
|
+
end
|
91
|
+
|
66
92
|
# Perform target save with callbacks call
|
67
93
|
#
|
68
94
|
# @return [Boolean]
|
@@ -70,10 +96,17 @@ module FlatMap
|
|
70
96
|
run_callbacks(:save){ save_target }
|
71
97
|
end
|
72
98
|
|
99
|
+
# Return +true+ if target was updated.
|
100
|
+
#
|
101
|
+
# @return [Boolean]
|
102
|
+
def persisted?
|
103
|
+
target != OpenStruct.new
|
104
|
+
end
|
105
|
+
|
73
106
|
# Send <tt>:save</tt> method to all mountings in list. Will return +true+
|
74
107
|
# only if all savings are positive.
|
75
108
|
#
|
76
|
-
# @param [Array<FlatMap::
|
109
|
+
# @param [Array<FlatMap::OpenMapper>] mountings
|
77
110
|
# @return [Boolean]
|
78
111
|
def save_mountings(mountings)
|
79
112
|
mountings.map{ |mount| mount.save }.all?
|
@@ -128,9 +161,9 @@ module FlatMap
|
|
128
161
|
|
129
162
|
next if param_keys.empty?
|
130
163
|
|
131
|
-
args = param_keys.inject([]) do |values,
|
132
|
-
value = params.delete
|
133
|
-
type =
|
164
|
+
args = param_keys.inject([]) do |values, key|
|
165
|
+
value = params.delete key
|
166
|
+
type = key[/\(\d+(\w*)\)/, 1]
|
134
167
|
value = value.send("to_#{type}") unless type.blank?
|
135
168
|
|
136
169
|
values.push value
|
@@ -1,7 +1,11 @@
|
|
1
1
|
module FlatMap
|
2
2
|
# This helper module provides helper functionality that allow to
|
3
3
|
# exclude specific mapper from a processing chain.
|
4
|
-
module
|
4
|
+
module OpenMapper::Skipping
|
5
|
+
extend ActiveSupport::Autoload
|
6
|
+
|
7
|
+
autoload :ActiveRecord
|
8
|
+
|
5
9
|
# Mark self as skipped, i.e. it will not be subject of
|
6
10
|
# validation and saving chain.
|
7
11
|
#
|
@@ -25,7 +29,7 @@ module FlatMap
|
|
25
29
|
!!@_skip_processing
|
26
30
|
end
|
27
31
|
|
28
|
-
# Override {FlatMap::
|
32
|
+
# Override {FlatMap::OpenMapper::Persistence#valid?} to
|
29
33
|
# force it to return +true+ if +self+ is marked for skipping.
|
30
34
|
#
|
31
35
|
# @param [Symbol] context useless context parameter to make it compatible with
|
@@ -36,7 +40,7 @@ module FlatMap
|
|
36
40
|
skipped? || super
|
37
41
|
end
|
38
42
|
|
39
|
-
# Override {FlatMap::
|
43
|
+
# Override {FlatMap::OpenMapper::Persistence#save} method to
|
40
44
|
# force it to return +true+ if +self+ is marked for skipping.
|
41
45
|
#
|
42
46
|
# @return [Boolean]
|
@@ -44,7 +48,7 @@ module FlatMap
|
|
44
48
|
skipped? || super
|
45
49
|
end
|
46
50
|
|
47
|
-
# Override {FlatMap::
|
51
|
+
# Override {FlatMap::OpenMapper::Persistence#shallow_save} method
|
48
52
|
# to make it possible to skip traits.
|
49
53
|
#
|
50
54
|
# @return [Boolean]
|
@@ -53,7 +57,7 @@ module FlatMap
|
|
53
57
|
end
|
54
58
|
|
55
59
|
# Mark self as used and then delegated to original
|
56
|
-
# {FlatMap::
|
60
|
+
# {FlatMap::OpenMapper::Persistence#write}.
|
57
61
|
def write(*)
|
58
62
|
use!
|
59
63
|
super
|
@@ -1,7 +1,10 @@
|
|
1
1
|
module FlatMap
|
2
2
|
# This small module allows mappers to define traits, which technically
|
3
3
|
# means mounting anonymous mappers, attached to host one.
|
4
|
-
|
4
|
+
#
|
5
|
+
# Also, FlatMap::OpenMapper::Mounting#mountings completely overridden
|
6
|
+
# here to support special trait behavior.
|
7
|
+
module OpenMapper::Traits
|
5
8
|
extend ActiveSupport::Concern
|
6
9
|
|
7
10
|
# Traits class macros
|
@@ -13,7 +16,7 @@ module FlatMap
|
|
13
16
|
#
|
14
17
|
# @param [Symbol] name
|
15
18
|
def trait(name, &block)
|
16
|
-
base_class = self < FlatMap::Mapper ? FlatMap::Mapper : FlatMap::
|
19
|
+
base_class = self < FlatMap::Mapper ? FlatMap::Mapper : FlatMap::OpenMapper
|
17
20
|
mapper_class = Class.new(base_class, &block)
|
18
21
|
mapper_class_name = "#{ancestors.first.name}#{name.to_s.camelize}Trait"
|
19
22
|
mapper_class.singleton_class.send(:define_method, :name){ mapper_class_name }
|
@@ -21,19 +24,17 @@ module FlatMap
|
|
21
24
|
end
|
22
25
|
end
|
23
26
|
|
24
|
-
# Override the original {FlatMap::
|
27
|
+
# Override the original {FlatMap::OpenMapper::Mounting#mountings}
|
25
28
|
# method to filter out those traited mappers that are not required for
|
26
29
|
# trait setup of +self+. Also, handle any inline extension that may be
|
27
30
|
# defined on the mounting mapper, which is attached as a singleton trait.
|
28
31
|
#
|
29
|
-
# @return [Array<FlatMap::
|
32
|
+
# @return [Array<FlatMap::OpenMapper>]
|
30
33
|
def mountings
|
31
34
|
@mountings ||= begin
|
32
|
-
mountings = self.class.mountings.
|
33
|
-
|
34
|
-
|
35
|
-
!factory.required_for_any_trait?(traits)
|
36
|
-
}
|
35
|
+
mountings = self.class.mountings.reject do |factory|
|
36
|
+
factory.traited? && !factory.required_for_any_trait?(traits)
|
37
|
+
end
|
37
38
|
mountings.concat(singleton_class.mountings)
|
38
39
|
mountings.map{ |factory| factory.create(self, *traits) }
|
39
40
|
end
|
@@ -42,7 +43,7 @@ module FlatMap
|
|
42
43
|
# Return a list of all mountings that represent full picture of +self+, i.e.
|
43
44
|
# +self+ and all traits, including deeply nested, that are mounted on self
|
44
45
|
#
|
45
|
-
# @return [Array<FlatMap::
|
46
|
+
# @return [Array<FlatMap::OpenMapper>]
|
46
47
|
def self_mountings
|
47
48
|
mountings.select(&:owned?).map{ |mount| mount.self_mountings }.flatten.concat [self]
|
48
49
|
end
|
@@ -52,21 +53,21 @@ module FlatMap
|
|
52
53
|
# in some scenarios.
|
53
54
|
#
|
54
55
|
# @param [Symbol] trait_name
|
55
|
-
# @return [FlatMap::
|
56
|
+
# @return [FlatMap::OpenMapper, nil]
|
56
57
|
def trait(trait_name)
|
57
58
|
self_mountings.find{ |mount| mount.class.name.underscore =~ /#{trait_name}_trait$/ }
|
58
59
|
end
|
59
60
|
|
60
61
|
# Return :extension trait, if present
|
61
62
|
#
|
62
|
-
# @return [FlatMap::
|
63
|
+
# @return [FlatMap::OpenMapper]
|
63
64
|
def extension
|
64
65
|
trait(:extension)
|
65
66
|
end
|
66
67
|
|
67
68
|
# Return only mountings that are actually traits for host mapper.
|
68
69
|
#
|
69
|
-
# @return [Array<FlatMap::
|
70
|
+
# @return [Array<FlatMap::OpenMapper>]
|
70
71
|
def trait_mountings
|
71
72
|
result = mountings.select{ |mount| mount.owned? }
|
72
73
|
# mapper extension has more priority then traits, and
|
@@ -78,7 +79,7 @@ module FlatMap
|
|
78
79
|
|
79
80
|
# Return only mountings that correspond to external mappers.
|
80
81
|
#
|
81
|
-
# @return [Array<FlatMap::
|
82
|
+
# @return [Array<FlatMap::OpenMapper>]
|
82
83
|
def mapper_mountings
|
83
84
|
mountings.select{ |mount| !mount.owned? }
|
84
85
|
end
|
data/lib/flat_map/version.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
module FlatMap
|
4
|
-
describe
|
5
|
-
let(:trait_class){ Class.new(
|
6
|
-
let(:
|
7
|
-
|
8
|
-
let(:
|
9
|
-
let(:
|
10
|
-
let(:
|
4
|
+
describe OpenMapper::Factory do
|
5
|
+
let(:trait_class){ Class.new(FlatMap::OpenMapper) }
|
6
|
+
let(:mapper){ OpenMapper.build }
|
7
|
+
|
8
|
+
let(:mount_factory){ OpenMapper::Factory.new(:spec_mount, :traits => :used_traits) }
|
9
|
+
let(:trait_factory){ OpenMapper::Factory.new(trait_class, :trait_name => :a_trait) }
|
10
|
+
let(:open_factory){ OpenMapper::Factory.new(:some_mount, :open => true) }
|
11
11
|
|
12
12
|
context 'when used for a trait' do
|
13
13
|
subject{ trait_factory }
|
@@ -27,21 +27,36 @@ module FlatMap
|
|
27
27
|
its(:traits){ should == [:used_traits] }
|
28
28
|
end
|
29
29
|
|
30
|
+
context 'when used for an open mapper' do
|
31
|
+
it "should have descendant of OpenMapper as mapper_class" do
|
32
|
+
open_factory.mapper_class.should < OpenMapper
|
33
|
+
open_factory.mapper_class.name.should == 'SomeMountMapper'
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should create and instance of OpenMapper with open struct as a target" do
|
37
|
+
mounted = open_factory.create(mapper)
|
38
|
+
mounted.target.should be_a(OpenStruct)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
30
42
|
describe 'behavior' do
|
43
|
+
let(:target) { mapper.target }
|
44
|
+
let(:other_target) { Object.new }
|
45
|
+
|
31
46
|
describe '#mapper_class for mounted mappers' do
|
32
|
-
class ::SpecMountMapper <
|
33
|
-
class
|
47
|
+
class ::SpecMountMapper < FlatMap::ModelMapper; end
|
48
|
+
class OpenMapper::Factory::SpecMountMapper < FlatMap::OpenMapper; end
|
34
49
|
|
35
50
|
it "should be able to fetch class name from name" do
|
36
51
|
mount_factory.mapper_class.should == ::SpecMountMapper
|
37
52
|
end
|
38
53
|
|
39
54
|
it "should use options if specified" do
|
40
|
-
factory =
|
55
|
+
factory = OpenMapper::Factory.new(
|
41
56
|
:spec_mount,
|
42
|
-
:mapper_class_name => 'FlatMap::
|
57
|
+
:mapper_class_name => 'FlatMap::OpenMapper::Factory::SpecMountMapper'
|
43
58
|
)
|
44
|
-
factory.mapper_class.should == ::FlatMap::
|
59
|
+
factory.mapper_class.should == ::FlatMap::OpenMapper::Factory::SpecMountMapper
|
45
60
|
end
|
46
61
|
end
|
47
62
|
|
@@ -52,19 +67,28 @@ module FlatMap
|
|
52
67
|
|
53
68
|
context 'explicit target' do
|
54
69
|
it "should use explicitly specified if applicable" do
|
55
|
-
factory =
|
70
|
+
factory = OpenMapper::Factory.new(:spec_mount, :target => other_target)
|
56
71
|
factory.fetch_target_from(mapper).should == other_target
|
57
72
|
end
|
58
73
|
|
59
74
|
it "should call Proc and pass owner target to it if Proc is specified as :target" do
|
60
|
-
factory =
|
75
|
+
factory = OpenMapper::Factory.new(:spec_mount, :target => lambda{ |obj| obj.foo })
|
61
76
|
target.should_receive(:foo).and_return(other_target)
|
62
77
|
factory.fetch_target_from(mapper).should == other_target
|
63
78
|
end
|
79
|
+
|
80
|
+
it "should call a method if Symbol is used" do
|
81
|
+
factory = OpenMapper::Factory.new(:spec_mount, :target => :foo)
|
82
|
+
mapper.should_receive(:foo).and_return(other_target)
|
83
|
+
factory.fetch_target_from(mapper).should == other_target
|
84
|
+
end
|
64
85
|
end
|
65
86
|
|
66
87
|
context 'target from association' do
|
67
|
-
before
|
88
|
+
before do
|
89
|
+
target.stub(:is_a?).and_call_original
|
90
|
+
target.stub(:is_a?).with(ActiveRecord::Base).and_return(true)
|
91
|
+
end
|
68
92
|
|
69
93
|
let(:has_one_current_reflection) {
|
70
94
|
double('reflection', :macro => :has_one, :options => {:is_current => true})
|
@@ -153,16 +177,6 @@ module FlatMap
|
|
153
177
|
new_one.owner.should == mapper
|
154
178
|
end
|
155
179
|
|
156
|
-
context 'mounted empty mapper' do
|
157
|
-
class ::SpecEmptyMountMapper < EmptyMapper; end
|
158
|
-
let(:factory){ BaseMapper::Factory.new(:spec_empty_mount) }
|
159
|
-
|
160
|
-
it 'should not call fetch_target_from' do
|
161
|
-
factory.should_not_receive(:fetch_target_from)
|
162
|
-
factory.create(mapper)
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
180
|
context 'mounted mapper' do
|
167
181
|
let(:mount_class){ Class.new(Mapper) }
|
168
182
|
let(:factory){ mount_factory }
|
@@ -188,7 +202,7 @@ module FlatMap
|
|
188
202
|
end
|
189
203
|
|
190
204
|
context 'when suffix is defined' do
|
191
|
-
let(:factory){
|
205
|
+
let(:factory){ OpenMapper::Factory.new(:spec_mount, :suffix => :foo) }
|
192
206
|
|
193
207
|
it "should adjust properties with suffix" do
|
194
208
|
new_one = factory.create(mapper)
|
@@ -199,7 +213,7 @@ module FlatMap
|
|
199
213
|
|
200
214
|
context 'when extension is present' do
|
201
215
|
let(:extension){ Proc.new{} }
|
202
|
-
let(:factory){
|
216
|
+
let(:factory){ OpenMapper::Factory.new(:spec_mount, &extension) }
|
203
217
|
|
204
218
|
it "should pass it to mapper initialization" do
|
205
219
|
mount_class.should_receive(:new).
|
@@ -210,26 +224,31 @@ module FlatMap
|
|
210
224
|
end
|
211
225
|
|
212
226
|
describe 'save order' do
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
it 'should fetch from options, if possible' do
|
217
|
-
new_one = factory.create(mapper)
|
218
|
-
new_one.save_order.should == :before
|
219
|
-
end
|
227
|
+
before do
|
228
|
+
mapper.stub(:is_a?).and_call_original
|
229
|
+
mapper.stub(:is_a?).with(ModelMapper).and_return(true)
|
220
230
|
end
|
221
231
|
|
222
232
|
it 'should be :before for belongs_to association' do
|
223
|
-
|
224
|
-
|
233
|
+
factory.stub(:reflection_from_target).
|
234
|
+
and_return(double('reflection', :macro => :belongs_to))
|
225
235
|
factory.fetch_save_order(mapper).should == :before
|
226
236
|
end
|
227
237
|
|
228
238
|
it 'should be :after for other cases' do
|
229
|
-
|
230
|
-
|
239
|
+
factory.stub(:reflection_from_target).
|
240
|
+
and_return(double('reflection', :macro => :has_one))
|
231
241
|
factory.fetch_save_order(mapper).should == :after
|
232
242
|
end
|
243
|
+
|
244
|
+
context 'when explicitly set' do
|
245
|
+
let(:factory){ OpenMapper::Factory.new(:spec_mount, :save => :before) }
|
246
|
+
|
247
|
+
it 'should fetch from options, if possible' do
|
248
|
+
new_one = factory.create(mapper)
|
249
|
+
new_one.save_order.should == :before
|
250
|
+
end
|
251
|
+
end
|
233
252
|
end
|
234
253
|
end
|
235
254
|
end
|