abstract_mapper 0.0.1 → 0.0.2
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 +4 -4
- data/.travis.yml +1 -0
- data/CHANGELOG.md +34 -0
- data/Gemfile +1 -3
- data/README.md +29 -13
- data/Rakefile +4 -7
- data/abstract_mapper.gemspec +3 -2
- data/config/metrics/STYLEGUIDE +14 -15
- data/lib/abstract_mapper.rb +4 -1
- data/lib/abstract_mapper/attributes.rb +65 -0
- data/lib/abstract_mapper/branch.rb +17 -7
- data/lib/abstract_mapper/builder.rb +7 -3
- data/lib/abstract_mapper/command.rb +68 -0
- data/lib/abstract_mapper/commands.rb +11 -31
- data/lib/abstract_mapper/errors/unknown_command.rb +1 -1
- data/lib/abstract_mapper/errors/wrong_node.rb +1 -1
- data/lib/abstract_mapper/errors/wrong_rule.rb +2 -2
- data/lib/abstract_mapper/functions.rb +32 -5
- data/lib/abstract_mapper/node.rb +21 -10
- data/lib/abstract_mapper/optimizer.rb +3 -3
- data/lib/abstract_mapper/pair_rule.rb +2 -4
- data/lib/abstract_mapper/rspec.rb +1 -2
- data/lib/abstract_mapper/rule.rb +23 -2
- data/lib/abstract_mapper/rules.rb +3 -10
- data/lib/abstract_mapper/settings.rb +3 -3
- data/lib/abstract_mapper/sole_rule.rb +2 -4
- data/lib/abstract_mapper/version.rb +1 -1
- data/lib/rspec/doubles.rb +16 -0
- data/lib/rspec/nodes.rb +29 -16
- data/lib/rspec/rules.rb +3 -3
- data/spec/integration/faceter.rb +16 -7
- data/spec/integration/mapper_definition_spec.rb +1 -1
- data/spec/integration/rspec_examples_spec.rb +4 -30
- data/spec/spec_helper.rb +1 -1
- data/spec/unit/abstract_mapper/branch_spec.rb +91 -14
- data/spec/unit/abstract_mapper/builder_spec.rb +66 -48
- data/spec/unit/abstract_mapper/command_spec.rb +92 -0
- data/spec/unit/abstract_mapper/commands_spec.rb +38 -79
- data/spec/unit/abstract_mapper/dsl_spec.rb +60 -55
- data/spec/unit/abstract_mapper/errors/wrong_rule_spec.rb +1 -1
- data/spec/unit/abstract_mapper/functions/compact_spec.rb +3 -3
- data/spec/unit/abstract_mapper/functions/filter_spec.rb +1 -1
- data/spec/unit/abstract_mapper/functions/identity_spec.rb +21 -0
- data/spec/unit/abstract_mapper/functions/restrict_spec.rb +16 -0
- data/spec/unit/abstract_mapper/functions/subclass_spec.rb +1 -1
- data/spec/unit/abstract_mapper/node_spec.rb +119 -48
- data/spec/unit/abstract_mapper/optimizer_spec.rb +38 -32
- data/spec/unit/abstract_mapper/pair_rule_spec.rb +4 -11
- data/spec/unit/abstract_mapper/rule_spec.rb +31 -15
- data/spec/unit/abstract_mapper/rules_spec.rb +2 -2
- data/spec/unit/abstract_mapper/settings_spec.rb +80 -73
- data/spec/unit/abstract_mapper/sole_rule_spec.rb +3 -10
- data/spec/unit/abstract_mapper_spec.rb +13 -5
- metadata +33 -12
- data/lib/rspec/functions.rb +0 -25
- data/lib/rspec/mapper.rb +0 -40
@@ -1,84 +1,155 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
|
3
|
+
class AbstractMapper # namespace
|
4
4
|
|
5
|
-
|
6
|
-
let(:node) { test.new(*attributes) }
|
7
|
-
let(:attributes) { [:foo, :bar] }
|
5
|
+
describe AbstractMapper::Node do
|
8
6
|
|
9
|
-
|
7
|
+
let(:test) do
|
8
|
+
Test::Node = Class.new(described_class) do
|
9
|
+
attribute "foo"
|
10
|
+
attribute :bar, default: :BAR
|
11
|
+
end
|
12
|
+
end
|
10
13
|
|
11
|
-
|
12
|
-
|
14
|
+
let(:node) { test.new(attributes, &block) }
|
15
|
+
let(:attributes) { { foo: :FOO } }
|
16
|
+
let(:block) { nil }
|
13
17
|
|
14
|
-
|
18
|
+
describe ".new" do
|
15
19
|
|
16
|
-
|
20
|
+
subject { node }
|
17
21
|
|
18
|
-
|
22
|
+
it "initializes attributes" do
|
23
|
+
expect(subject.foo).to eql :FOO
|
24
|
+
expect(subject.bar).to eql :BAR
|
25
|
+
end
|
19
26
|
|
20
|
-
|
21
|
-
it { is_expected.to be_frozen }
|
27
|
+
it { is_expected.to be_frozen }
|
22
28
|
|
23
|
-
|
24
|
-
|
25
|
-
|
29
|
+
it "doesn't freeze the source" do
|
30
|
+
expect { subject }.not_to change { attributes.frozen? }
|
31
|
+
end
|
32
|
+
|
33
|
+
end # describe .new
|
34
|
+
|
35
|
+
describe ".attributes" do
|
36
|
+
|
37
|
+
it "is declared via DSL" do
|
38
|
+
expect(test.attributes).to eql(foo: nil, bar: :BAR)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "is inheritable" do
|
42
|
+
subklass = Class.new(test)
|
43
|
+
expect(subklass.attributes).to eql(test.attributes)
|
44
|
+
end
|
45
|
+
|
46
|
+
end # describe .attributes
|
47
|
+
|
48
|
+
describe "#attributes" do
|
49
|
+
|
50
|
+
subject { node.attributes }
|
51
|
+
|
52
|
+
it { is_expected.to eql({ foo: nil, bar: :BAR }.merge(attributes)) }
|
53
|
+
|
54
|
+
context "by default" do
|
55
|
+
|
56
|
+
let(:node) { test.new }
|
57
|
+
it { is_expected.to eql(foo: nil, bar: :BAR) }
|
58
|
+
|
59
|
+
end # context
|
60
|
+
|
61
|
+
end # describe #attributes
|
62
|
+
|
63
|
+
describe "#block" do
|
64
|
+
|
65
|
+
subject { node.block }
|
66
|
+
|
67
|
+
context "when block is absent" do
|
68
|
+
|
69
|
+
it { is_expected.to eql nil }
|
70
|
+
|
71
|
+
end # context
|
72
|
+
|
73
|
+
context "when block is present" do
|
74
|
+
|
75
|
+
let(:block) { proc { :foo } }
|
76
|
+
it { is_expected.to eql block }
|
77
|
+
|
78
|
+
end # context
|
79
|
+
|
80
|
+
end # describe #block
|
81
|
+
|
82
|
+
describe "#to_s" do
|
83
|
+
|
84
|
+
subject { node.to_s }
|
85
|
+
|
86
|
+
context "with uninitialized attributes" do
|
87
|
+
|
88
|
+
let(:node) { test.new }
|
89
|
+
it { is_expected.to eql "Node(foo: nil, bar: :BAR)" }
|
90
|
+
|
91
|
+
end # context
|
92
|
+
|
93
|
+
context "with initialized attributes" do
|
94
|
+
|
95
|
+
let(:node) { test.new(attributes) }
|
96
|
+
it { is_expected.to eql "Node(foo: :FOO, bar: :BAR)" }
|
26
97
|
|
27
|
-
|
98
|
+
end # context
|
28
99
|
|
29
|
-
|
100
|
+
context "without attributes" do
|
30
101
|
|
31
|
-
|
102
|
+
let(:node) { described_class.new }
|
103
|
+
it { is_expected.to eql "Node" }
|
32
104
|
|
33
|
-
|
105
|
+
end # context
|
34
106
|
|
35
|
-
|
36
|
-
it { is_expected.to eql nil }
|
107
|
+
end # describe #to_s
|
37
108
|
|
38
|
-
|
109
|
+
describe "#==" do
|
39
110
|
|
40
|
-
|
111
|
+
subject { node == other }
|
41
112
|
|
42
|
-
|
43
|
-
let(:node) { test.new(*attributes, &block) }
|
44
|
-
it { is_expected.to eql block }
|
113
|
+
context "node with the same type and attributes" do
|
45
114
|
|
46
|
-
|
115
|
+
let(:other) { test.new(attributes) }
|
116
|
+
it { is_expected.to eql true }
|
47
117
|
|
48
|
-
|
118
|
+
end # context
|
49
119
|
|
50
|
-
|
120
|
+
context "node with other type" do
|
51
121
|
|
52
|
-
|
122
|
+
let(:other) { Class.new(test).new(attributes) }
|
123
|
+
it { is_expected.to eql false }
|
53
124
|
|
54
|
-
|
125
|
+
end # context
|
55
126
|
|
56
|
-
|
57
|
-
it { is_expected.to eql "Node" }
|
127
|
+
context "node with other attributes" do
|
58
128
|
|
59
|
-
|
129
|
+
let(:other) { test.new }
|
130
|
+
it { is_expected.to eql false }
|
60
131
|
|
61
|
-
|
132
|
+
end # context
|
62
133
|
|
63
|
-
|
64
|
-
it { is_expected.to eql "Node(:foo, :bar)" }
|
134
|
+
end # describe #==
|
65
135
|
|
66
|
-
|
136
|
+
describe "#inspect" do
|
67
137
|
|
68
|
-
|
138
|
+
subject { node.inspect }
|
139
|
+
it { is_expected.to eql "<Node(foo: :FOO, bar: :BAR)>" }
|
69
140
|
|
70
|
-
|
141
|
+
end # describe #inspect
|
71
142
|
|
72
|
-
|
73
|
-
it { is_expected.to eql "<Node(:foo, :bar)>" }
|
143
|
+
describe "#transproc" do
|
74
144
|
|
75
|
-
|
145
|
+
subject { node.transproc }
|
76
146
|
|
77
|
-
|
147
|
+
it "returns the identity function" do
|
148
|
+
expect(subject[:foo]).to eql :foo
|
149
|
+
end
|
78
150
|
|
79
|
-
|
80
|
-
it { is_expected.to eql :foo }
|
151
|
+
end # describe #transproc
|
81
152
|
|
82
|
-
end # describe
|
153
|
+
end # describe AbstractMapper::Node
|
83
154
|
|
84
|
-
end #
|
155
|
+
end # class AbstractMapper
|
@@ -1,48 +1,54 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
|
3
|
+
class AbstractMapper # namespace
|
4
4
|
|
5
|
-
|
6
|
-
let(:test) { Class.new(described_class) }
|
7
|
-
let(:rules) { AbstractMapper::Rules.new }
|
5
|
+
describe AbstractMapper::Optimizer do
|
8
6
|
|
9
|
-
|
7
|
+
let(:optimizer) { test.new rules }
|
8
|
+
let(:test) { Class.new(described_class) }
|
9
|
+
let(:rules) { Rules.new }
|
10
10
|
|
11
|
-
|
12
|
-
it { is_expected.to be_frozen }
|
11
|
+
describe ".new" do
|
13
12
|
|
14
|
-
|
13
|
+
subject { optimizer }
|
14
|
+
it { is_expected.to be_frozen }
|
15
15
|
|
16
|
-
|
16
|
+
end # describe .new
|
17
17
|
|
18
|
-
|
19
|
-
it { is_expected.to eql rules }
|
18
|
+
describe "#rules" do
|
20
19
|
|
21
|
-
|
20
|
+
subject { optimizer.rules }
|
21
|
+
it { is_expected.to eql rules }
|
22
22
|
|
23
|
-
|
23
|
+
end # describe #rules
|
24
24
|
|
25
|
-
|
25
|
+
describe "#update" do
|
26
26
|
|
27
|
-
|
28
|
-
let(:rule) { Class.new(AbstractMapper::PairRule) }
|
29
|
-
let(:tree) { AbstractMapper::Branch.new { [node3, node4] } }
|
30
|
-
let(:node1) { AbstractMapper::Node.new(1) }
|
31
|
-
let(:node2) { AbstractMapper::Node.new(2) }
|
32
|
-
let(:node3) { AbstractMapper::Node.new(3) }
|
33
|
-
let(:node4) { AbstractMapper::Test::Foo.new(4) { [node1, node2] } }
|
27
|
+
subject { optimizer.update(tree) }
|
34
28
|
|
35
|
-
|
36
|
-
|
37
|
-
|
29
|
+
let(:rules) { Rules.new([rule]) }
|
30
|
+
let(:rule) { Class.new(PairRule) }
|
31
|
+
let(:tree) { Branch.new { [foo3, bar1] } }
|
38
32
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
.to eql "<Root [<Foo(4) [<Node(2)>, <Node(1)>]>, <Node(3)>]>"
|
44
|
-
end
|
33
|
+
let(:foo1) { Test::Foo.new(n: 1) }
|
34
|
+
let(:foo2) { Test::Foo.new(n: 2) }
|
35
|
+
let(:foo3) { Test::Foo.new(n: 3) }
|
36
|
+
let(:bar1) { Test::Bar.new(n: 4) { [foo1, foo2] } }
|
45
37
|
|
46
|
-
|
38
|
+
before { Test::Foo = Class.new(Node) { attribute :n } }
|
39
|
+
before { Test::Bar = Class.new(Branch) }
|
40
|
+
before { rule.send(:define_method, :optimize?) { true } }
|
41
|
+
before { rule.send(:define_method, :optimize) { nodes.reverse } }
|
47
42
|
|
48
|
-
|
43
|
+
it "optimizes the tree deeply" do
|
44
|
+
expect(tree.inspect)
|
45
|
+
.to eql "<Root [<Foo(n: 3)>, <Bar [<Foo(n: 1)>, <Foo(n: 2)>]>]>"
|
46
|
+
expect(subject.inspect)
|
47
|
+
.to eql "<Root [<Bar [<Foo(n: 2)>, <Foo(n: 1)>]>, <Foo(n: 3)>]>"
|
48
|
+
end
|
49
|
+
|
50
|
+
end # describe #update
|
51
|
+
|
52
|
+
end # describe AbstractMapper::Optimize
|
53
|
+
|
54
|
+
end # class AbstractMapper
|
@@ -5,15 +5,8 @@ describe AbstractMapper::PairRule do
|
|
5
5
|
let(:rule) { test.new(left, right) }
|
6
6
|
let(:test) { AbstractMapper::Test::Rule = Class.new(described_class) }
|
7
7
|
let(:nodes) { [left, right] }
|
8
|
-
let(:left) {
|
9
|
-
let(:right) {
|
10
|
-
|
11
|
-
describe ".composer" do
|
12
|
-
|
13
|
-
subject { test.composer }
|
14
|
-
it { is_expected.to eql :compact }
|
15
|
-
|
16
|
-
end # describe .pair?
|
8
|
+
let(:left) { AbstractMapper::Node.new }
|
9
|
+
let(:right) { AbstractMapper::Node.new }
|
17
10
|
|
18
11
|
describe ".new" do
|
19
12
|
|
@@ -49,9 +42,9 @@ describe AbstractMapper::PairRule do
|
|
49
42
|
test.send(:define_method, :optimize) { left + right }
|
50
43
|
end
|
51
44
|
|
52
|
-
subject { test.transproc[array] }
|
53
|
-
|
54
45
|
let(:array) { [1, 1, 2, 5] }
|
46
|
+
|
47
|
+
subject { test.transproc[array] }
|
55
48
|
it { is_expected.to eql [4, 5] }
|
56
49
|
|
57
50
|
end # describe #transproc
|
@@ -5,7 +5,7 @@ describe AbstractMapper::Rule do
|
|
5
5
|
let(:rule) { test.new(*nodes) }
|
6
6
|
let(:test) { AbstractMapper::Test::Rule = Class.new(described_class) }
|
7
7
|
let(:nodes) { [node] }
|
8
|
-
let(:node) {
|
8
|
+
let(:node) { AbstractMapper::Node.new }
|
9
9
|
|
10
10
|
describe ".new" do
|
11
11
|
|
@@ -31,36 +31,41 @@ describe AbstractMapper::Rule do
|
|
31
31
|
|
32
32
|
subject { rule.call }
|
33
33
|
|
34
|
-
|
35
|
-
|
34
|
+
context "by default" do
|
35
|
+
|
36
|
+
it { is_expected.to eql nodes }
|
37
|
+
|
38
|
+
end # context
|
36
39
|
|
37
40
|
context "when #optimize? returns true" do
|
38
41
|
|
39
42
|
before { test.send(:define_method, :optimize?) { true } }
|
40
|
-
it { is_expected.to eql
|
43
|
+
it { is_expected.to eql nodes }
|
41
44
|
|
42
45
|
end # context
|
43
46
|
|
44
|
-
context "when #optimize
|
47
|
+
context "when #optimize is defined" do
|
45
48
|
|
46
|
-
before { test.send(:define_method, :optimize
|
47
|
-
it { is_expected.to eql
|
49
|
+
before { test.send(:define_method, :optimize) { :foo } }
|
50
|
+
it { is_expected.to eql nodes }
|
48
51
|
|
49
52
|
end # context
|
50
53
|
|
51
|
-
context "when #optimize returns
|
54
|
+
context "when #optimize? returns true and #optimize is defined" do
|
52
55
|
|
53
|
-
before { test.send(:define_method, :optimize) {
|
56
|
+
before { test.send(:define_method, :optimize?) { true } }
|
57
|
+
before { test.send(:define_method, :optimize) { :foo } }
|
54
58
|
it { is_expected.to eql [:foo] }
|
55
59
|
|
56
|
-
end #
|
60
|
+
end # context
|
57
61
|
|
58
62
|
context "when #optimize returns nils" do
|
59
63
|
|
64
|
+
before { test.send(:define_method, :optimize?) { true } }
|
60
65
|
before { test.send(:define_method, :optimize) { [nil, nil] } }
|
61
66
|
it { is_expected.to eql [] }
|
62
67
|
|
63
|
-
end #
|
68
|
+
end # context
|
64
69
|
|
65
70
|
end # describe #call
|
66
71
|
|
@@ -69,14 +74,25 @@ describe AbstractMapper::Rule do
|
|
69
74
|
before do
|
70
75
|
test.send(:define_method, :optimize?) { true }
|
71
76
|
test.send(:define_method, :optimize) { nodes.reverse }
|
72
|
-
allow(test).to receive(:composer) { :compact }
|
73
77
|
end
|
74
78
|
|
75
|
-
subject { test.transproc[array] }
|
76
|
-
|
77
79
|
let(:array) { [1, 2, 3] }
|
78
80
|
|
79
|
-
|
81
|
+
context "with default composer" do
|
82
|
+
|
83
|
+
subject { test.transproc[array] }
|
84
|
+
it { is_expected.to eql array }
|
85
|
+
|
86
|
+
end # context
|
87
|
+
|
88
|
+
context "with another composer" do
|
89
|
+
|
90
|
+
before { allow(test).to receive(:composer) { :compact } }
|
91
|
+
|
92
|
+
subject { test.transproc[array] }
|
93
|
+
it { is_expected.to eql [2, 3, 1] }
|
94
|
+
|
95
|
+
end # context
|
80
96
|
|
81
97
|
end # describe .transproc
|
82
98
|
|
@@ -78,8 +78,8 @@ describe AbstractMapper::Rules do
|
|
78
78
|
let(:nodes) { [1, 1, 2] }
|
79
79
|
|
80
80
|
subject { rules[nodes] }
|
81
|
-
it { is_expected.to eql [
|
82
|
-
# [1, 1, 2] -foo-> [2, 2, 3] -
|
81
|
+
it { is_expected.to eql [5, 4] }
|
82
|
+
# [1, 1, 2] -foo-> [2, 2, 3] -bar-> [4, 3] -foo-> [5, 4]
|
83
83
|
|
84
84
|
end # context
|
85
85
|
|
@@ -1,113 +1,120 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
3
|
+
class AbstractMapper
|
4
|
+
|
5
|
+
describe AbstractMapper::Settings do
|
6
|
+
|
7
|
+
let!(:rule) { Test::Rule = Class.new(SoleRule) }
|
8
|
+
let!(:node) { Test::Node = Class.new(Node) { attribute :foo } }
|
9
|
+
|
10
|
+
let(:settings) do
|
11
|
+
described_class.new do
|
12
|
+
command :foo, Test::Node do |value|
|
13
|
+
{ foo: value }
|
14
|
+
end
|
15
|
+
|
16
|
+
rule Test::Rule
|
17
|
+
end
|
16
18
|
end
|
17
|
-
end
|
18
19
|
|
19
|
-
|
20
|
+
describe ".new" do
|
20
21
|
|
21
|
-
|
22
|
+
context "with a valid block" do
|
22
23
|
|
23
|
-
|
24
|
-
|
24
|
+
subject { settings }
|
25
|
+
it { is_expected.to be_frozen }
|
25
26
|
|
26
|
-
|
27
|
+
end # context
|
27
28
|
|
28
|
-
|
29
|
+
context "with invalid command" do
|
29
30
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
expect
|
34
|
-
|
31
|
+
subject { described_class.new { command :foo, String } }
|
32
|
+
|
33
|
+
it "fails" do
|
34
|
+
expect { subject }.to raise_error do |error|
|
35
|
+
expect(error).to be_kind_of Errors::WrongNode
|
36
|
+
expect(error.message).to include "String"
|
37
|
+
end
|
35
38
|
end
|
36
|
-
end
|
37
39
|
|
38
|
-
|
40
|
+
end # context
|
41
|
+
|
42
|
+
context "with invalid rule" do
|
39
43
|
|
40
|
-
|
44
|
+
subject { described_class.new { rule String } }
|
41
45
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
46
|
+
it "fails" do
|
47
|
+
expect { subject }.to raise_error do |error|
|
48
|
+
expect(error).to be_kind_of Errors::WrongRule
|
49
|
+
expect(error.message).to include "String"
|
50
|
+
end
|
47
51
|
end
|
48
|
-
end
|
49
52
|
|
50
|
-
|
53
|
+
end # context
|
51
54
|
|
52
|
-
|
55
|
+
context "without a block" do
|
53
56
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
57
|
+
subject { described_class.new }
|
58
|
+
|
59
|
+
it "doesn't fail" do
|
60
|
+
expect { subject }.not_to raise_error
|
61
|
+
end
|
58
62
|
|
59
|
-
|
63
|
+
end # context
|
60
64
|
|
61
|
-
|
65
|
+
end # describe .new
|
62
66
|
|
63
|
-
|
67
|
+
describe "#commands" do
|
64
68
|
|
65
|
-
|
69
|
+
subject { settings.commands }
|
66
70
|
|
67
|
-
|
71
|
+
it { is_expected.to be_kind_of Commands }
|
68
72
|
|
69
|
-
|
70
|
-
|
71
|
-
|
73
|
+
it "contains registered commands" do
|
74
|
+
node = subject[:foo].call(:bar)
|
75
|
+
expect(node.inspect).to eql "<Node(foo: :bar)>"
|
76
|
+
end
|
72
77
|
|
73
|
-
|
78
|
+
end # describe #commands
|
74
79
|
|
75
|
-
|
80
|
+
describe "#rules" do
|
76
81
|
|
77
|
-
|
82
|
+
subject { settings.rules }
|
78
83
|
|
79
|
-
|
84
|
+
it { is_expected.to be_kind_of Rules }
|
80
85
|
|
81
|
-
|
82
|
-
|
83
|
-
|
86
|
+
it "contains registered rules" do
|
87
|
+
expect(subject.registry).to eql [rule]
|
88
|
+
end
|
84
89
|
|
85
|
-
|
90
|
+
end # describe #rules
|
86
91
|
|
87
|
-
|
92
|
+
describe "#builder" do
|
88
93
|
|
89
|
-
|
94
|
+
subject { settings.builder }
|
90
95
|
|
91
|
-
|
92
|
-
|
93
|
-
|
96
|
+
it "subclasses Builder" do
|
97
|
+
expect(subject.superclass).to eql Builder
|
98
|
+
end
|
94
99
|
|
95
|
-
|
96
|
-
|
97
|
-
|
100
|
+
it "uses registered commands" do
|
101
|
+
expect(subject.commands).to eql settings.commands
|
102
|
+
end
|
98
103
|
|
99
|
-
|
104
|
+
end # describe #builder
|
100
105
|
|
101
|
-
|
106
|
+
describe "#optimizer" do
|
102
107
|
|
103
|
-
|
108
|
+
subject { settings.optimizer }
|
104
109
|
|
105
|
-
|
110
|
+
it { is_expected.to be_kind_of Optimizer }
|
106
111
|
|
107
|
-
|
108
|
-
|
109
|
-
|
112
|
+
it "uses registered rules" do
|
113
|
+
expect(subject.rules).to eql settings.rules
|
114
|
+
end
|
115
|
+
|
116
|
+
end # describe #optimizer
|
110
117
|
|
111
|
-
end # describe
|
118
|
+
end # describe Settings
|
112
119
|
|
113
|
-
end #
|
120
|
+
end # class AbstractMapper
|