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