defmastership 1.0.17 → 1.0.18

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 (63) hide show
  1. checksums.yaml +4 -4
  2. data/.gitlab-ci.yml +22 -10
  3. data/Gemfile +51 -1
  4. data/Rakefile +16 -61
  5. data/bin/defmastership +9 -6
  6. data/config/mutant.yml +23 -3
  7. data/defmastership.gemspec +0 -10
  8. data/features/definition_checksum.feature +31 -1
  9. data/features/export.feature +43 -1
  10. data/features/rename_included_files.feature +28 -0
  11. data/lib/defmastership/batch_modifier.rb +17 -12
  12. data/lib/defmastership/change_ref_modifier.rb +88 -6
  13. data/lib/defmastership/comment_filter.rb +1 -1
  14. data/lib/defmastership/constants.rb +5 -4
  15. data/lib/defmastership/csv_formatter.rb +16 -12
  16. data/lib/defmastership/csv_formatter_body.rb +18 -15
  17. data/lib/defmastership/csv_formatter_header.rb +1 -1
  18. data/lib/defmastership/definition.rb +58 -19
  19. data/lib/defmastership/document.rb +109 -74
  20. data/lib/defmastership/matching_line.rb +17 -0
  21. data/lib/defmastership/modifier.rb +42 -0
  22. data/lib/defmastership/modifier_factory.rb +12 -0
  23. data/lib/defmastership/parsing_state.rb +15 -9
  24. data/lib/defmastership/rename_included_files_modifier.rb +172 -5
  25. data/lib/defmastership/set_join_hack.rb +11 -0
  26. data/lib/defmastership/update_def_checksum_modifier.rb +8 -13
  27. data/lib/defmastership/update_def_modifier.rb +49 -0
  28. data/lib/defmastership/update_def_version_modifier.rb +56 -15
  29. data/lib/defmastership/version.rb +1 -1
  30. data/lib/defmastership.rb +1 -6
  31. data/spec/spec_helper.rb +3 -1
  32. data/spec/unit/def_mastership/batch_modifier_spec.rb +38 -36
  33. data/spec/unit/def_mastership/change_ref_modifier_spec.rb +196 -51
  34. data/spec/unit/def_mastership/csv_formatter_body_spec.rb +60 -31
  35. data/spec/unit/def_mastership/csv_formatter_header_spec.rb +1 -1
  36. data/spec/unit/def_mastership/csv_formatter_spec.rb +79 -87
  37. data/spec/unit/def_mastership/definition_parser_spec.rb +1 -1
  38. data/spec/unit/def_mastership/definition_spec.rb +16 -6
  39. data/spec/unit/def_mastership/document_spec.rb +81 -38
  40. data/spec/unit/def_mastership/matching_line_spec.rb +37 -0
  41. data/spec/unit/def_mastership/modifier_factory_spec.rb +37 -0
  42. data/spec/unit/def_mastership/modifier_spec.rb +83 -0
  43. data/spec/unit/def_mastership/parsing_state_spec.rb +1 -1
  44. data/spec/unit/def_mastership/rename_included_files_modifier_spec.rb +219 -47
  45. data/spec/unit/def_mastership/string_spec.rb +1 -1
  46. data/spec/unit/def_mastership/update_def_checksum_modifier_spec.rb +82 -50
  47. data/spec/unit/def_mastership/update_def_modifier_spec.rb +119 -0
  48. data/spec/unit/def_mastership/update_def_version_modifier_spec.rb +135 -56
  49. data/tasks/console.rake +8 -0
  50. data/tasks/package.task +9 -0
  51. data/tasks/smelling_code.rake +38 -0
  52. data/tasks/test.rake +45 -0
  53. metadata +16 -153
  54. data/lib/defmastership/change_ref_line_modifier.rb +0 -85
  55. data/lib/defmastership/line_modifier_base.rb +0 -29
  56. data/lib/defmastership/modifier_base.rb +0 -36
  57. data/lib/defmastership/rename_included_files_line_modifier.rb +0 -126
  58. data/lib/defmastership/update_def_checksum_line_modifier.rb +0 -38
  59. data/lib/defmastership/update_def_version_line_modifier.rb +0 -58
  60. data/spec/unit/def_mastership/change_ref_line_modifier_spec.rb +0 -250
  61. data/spec/unit/def_mastership/rename_included_files_line_modifier_spec.rb +0 -207
  62. data/spec/unit/def_mastership/update_def_checksum_line_modifier_spec.rb +0 -82
  63. data/spec/unit/def_mastership/update_def_version_line_modifier_spec.rb +0 -131
@@ -1,76 +1,221 @@
1
1
  # Copyright (c) 2020 Jerome Arbez-Gindre
2
2
  # frozen_string_literal: true
3
3
 
4
- require('defmastership')
4
+ require('defmastership/change_ref_modifier')
5
5
 
6
6
  RSpec.describe(DefMastership::ChangeRefModifier) do
7
- subject(:modifier) do
8
- described_class.new(
9
- 'fake config'
10
- )
7
+ subject(:refchanger) { described_class.new({}) }
8
+
9
+ describe '.new' do
10
+ it { expect(described_class.ancestors).to(include(DefMastership::Modifier)) }
11
+ it { is_expected.not_to(be_nil) }
12
+ it { is_expected.to(have_attributes(from_regexp: '')) }
13
+ it { is_expected.to(have_attributes(to_template: '')) }
14
+ it { is_expected.to(have_attributes(next_ref: 0)) }
11
15
  end
12
16
 
13
- let(:adoc_texts) do
14
- {
15
- 'file1.adoc' => "file1 line1\nfile1 line2",
16
- 'file2.adoc' => "file2 line1\nfile2 line2"
17
- }
17
+ describe '.replacement_methods' do
18
+ it { expect(described_class.replacement_methods).to(eq(%i[replace_refdef replace_irefs])) }
18
19
  end
19
20
 
20
- describe '.new' do
21
- it { is_expected.not_to(be_nil) }
22
- it { is_expected.to(have_attributes(config: 'fake config')) }
23
- it { is_expected.to(have_attributes(changes: [])) }
21
+ describe '#config' do
22
+ context 'when not initalized' do
23
+ it do
24
+ expect(refchanger.config).to(
25
+ include(from_regexp: '', to_template: '', next_ref: 0)
26
+ )
27
+ end
28
+ end
24
29
  end
25
30
 
26
- describe '#do_modifications' do
27
- let(:line_modifier) { instance_double(DefMastership::ChangeRefLineModifier, 'lineModifier') }
31
+ describe '#replace_def' do
32
+ context 'when really simple rule' do
33
+ subject(:refchanger) do
34
+ described_class.new(
35
+ from_regexp: 'TEMP',
36
+ to_template: 'TUTU'
37
+ )
38
+ end
28
39
 
29
- before do
30
- allow(DefMastership::ChangeRefLineModifier).to(
31
- receive(:from_config).with('fake config').and_return(line_modifier)
32
- )
33
- allow(line_modifier).to(receive(:replace_refdef).with("file1 line1\n").and_return("new file1 line1\n"))
34
- allow(line_modifier).to(receive(:replace_refdef).with('file1 line2').and_return('new file1 line2'))
35
- allow(line_modifier).to(receive(:replace_refdef).with("file2 line1\n").and_return("new file2 line1\n"))
36
- allow(line_modifier).to(receive(:replace_refdef).with('file2 line2').and_return('new file2 line2'))
37
- allow(line_modifier).to(receive(:replace_irefs).with("new file1 line1\n").and_return("new2 file1 line1\n"))
38
- allow(line_modifier).to(receive(:replace_irefs).with('new file1 line2').and_return('new2 file1 line2'))
39
- allow(line_modifier).to(receive(:replace_irefs).with("new file2 line1\n").and_return("new2 file2 line1\n"))
40
- allow(line_modifier).to(receive(:replace_irefs).with('new file2 line2').and_return('new2 file2 line2'))
41
- allow(line_modifier).to(receive(:config).and_return('new fake config'))
42
- allow(line_modifier).to(receive(:changes).and_return([%w[from1 to1], %w[from2 to2]]))
40
+ context 'when valid definition' do
41
+ it do
42
+ expect(refchanger.replace_refdef('[define, whatever, TEMP]'))
43
+ .to(eq('[define, whatever, TUTU]'))
44
+ end
45
+ end
46
+
47
+ context 'when no valid definition' do
48
+ it do
49
+ expect(refchanger.replace_refdef('[pouet, whatever, TEMP]'))
50
+ .to(eq('[pouet, whatever, TEMP]'))
51
+ end
52
+ end
43
53
  end
44
54
 
45
- context 'when detailed expectations' do
46
- before { modifier.do_modifications(adoc_texts) }
55
+ context 'when template is variable' do
56
+ subject(:refchanger) do
57
+ described_class.new(
58
+ from_regexp: 'TEMP',
59
+ to_template: 'TOTO-%<next_ref>04d',
60
+ next_ref: 124
61
+ )
62
+ end
47
63
 
48
64
  it do
49
- expect(DefMastership::ChangeRefLineModifier).to(
50
- have_received(:from_config).with('fake config')
65
+ expect(refchanger.replace_refdef('[define, whatever, TEMP]'))
66
+ .to(eq('[define, whatever, TOTO-0124]'))
67
+ end
68
+
69
+ it do
70
+ refchanger.replace_refdef('[define, whatever, TEMP]')
71
+ expect(refchanger).to(have_attributes(next_ref: 125))
72
+ end
73
+ end
74
+
75
+ context 'when capture group in regexp' do
76
+ subject(:refchanger) do
77
+ described_class.new(
78
+ from_regexp: '(?<cg>TOTO|TITI)-TEMP[\d]*',
79
+ to_template: '%<cg>s-%<next_ref>04d',
80
+ next_ref: 132
81
+ )
82
+ end
83
+
84
+ it do
85
+ expect(refchanger.replace_refdef('[define, whatever, TOTO-TEMP]'))
86
+ .to(eq('[define, whatever, TOTO-0132]'))
87
+ end
88
+
89
+ it do
90
+ refchanger.replace_refdef('[define, whatever, TOTO-TEMP]')
91
+ expect(refchanger.replace_refdef('[define, whatever, TITI-TEMP]'))
92
+ .to(eq('[define, whatever, TITI-0133]'))
93
+ end
94
+
95
+ it do
96
+ refchanger.replace_refdef('[define, whatever, TOTO-TEMP1]')
97
+ refchanger.replace_refdef('[define, whatever, TITI-TEMP2]')
98
+ expect(refchanger).to(have_attributes(changes: [%w[TOTO-TEMP1 TOTO-0132], %w[TITI-TEMP2 TITI-0133]]))
99
+ end
100
+ end
101
+
102
+ context 'when definition is in literal block' do
103
+ subject(:refchanger) do
104
+ described_class.new(
105
+ from_regexp: 'TEMP',
106
+ to_template: 'TUTU'
107
+ )
108
+ end
109
+
110
+ before do
111
+ refchanger.replace_refdef('....')
112
+ end
113
+
114
+ it do
115
+ expect(refchanger.replace_refdef('[define, whatever, TEMP]'))
116
+ .to(eq('[define, whatever, TEMP]'))
117
+ end
118
+ end
119
+
120
+ context 'when defintion is after literal block' do
121
+ subject(:refchanger) do
122
+ described_class.new(
123
+ from_regexp: 'TEMP',
124
+ to_template: 'TUTU'
51
125
  )
52
126
  end
53
127
 
54
- it { expect(line_modifier).to(have_received(:replace_refdef).with("file1 line1\n")) }
55
- it { expect(line_modifier).to(have_received(:replace_refdef).with('file1 line2')) }
56
- it { expect(line_modifier).to(have_received(:replace_refdef).with("file2 line1\n")) }
57
- it { expect(line_modifier).to(have_received(:replace_refdef).with('file2 line2')) }
58
- it { expect(line_modifier).to(have_received(:replace_irefs).with("new file1 line1\n")) }
59
- it { expect(line_modifier).to(have_received(:replace_irefs).with('new file1 line2')) }
60
- it { expect(line_modifier).to(have_received(:replace_irefs).with("new file2 line1\n")) }
61
- it { expect(line_modifier).to(have_received(:replace_irefs).with('new file2 line2')) }
62
- it { expect(line_modifier).to(have_received(:config)) }
63
- it { expect(line_modifier).to(have_received(:changes)) }
64
- it { is_expected.to(have_attributes(config: 'new fake config')) }
65
- it { is_expected.to(have_attributes(changes: [%w[from1 to1], %w[from2 to2]])) }
128
+ before do
129
+ refchanger.replace_refdef("....\n")
130
+ refchanger.replace_refdef('[define, whatever, TEMP]')
131
+ refchanger.replace_refdef("....\n")
132
+ end
133
+
134
+ it do
135
+ expect(refchanger.replace_refdef('[define, whatever, TEMP]'))
136
+ .to(eq('[define, whatever, TUTU]'))
137
+ end
138
+ end
139
+ end
140
+
141
+ describe '#replace_irefs' do
142
+ subject(:refchanger) do
143
+ described_class.new(
144
+ from_regexp: '(?<cg>TOTO|TITI)-TEMP[\d]*',
145
+ to_template: '%<cg>s-%<next_ref>04d',
146
+ next_ref: 132
147
+ )
148
+ end
149
+
150
+ before do
151
+ refchanger.replace_refdef('[define, whatever, TOTO-TEMP123]')
152
+ refchanger.replace_refdef('[define, whatever, TITI-TEMP421]')
153
+ end
154
+
155
+ it do
156
+ expect(refchanger.replace_irefs('defs:iref[TOTO-TEMP1234]'))
157
+ .to(eq('defs:iref[TOTO-TEMP1234]'))
158
+ end
159
+
160
+ it do
161
+ expect(refchanger.replace_irefs('defs:iref[TOTO-TEMP123]'))
162
+ .to(eq('defs:iref[TOTO-0132]'))
163
+ end
164
+
165
+ it do
166
+ expect(
167
+ refchanger.replace_irefs(
168
+ 'defs:iref[TOTO-TEMP123] defs:iref[TITI-TEMP421] bla'
169
+ )
170
+ ).to(eq('defs:iref[TOTO-0132] defs:iref[TITI-0133] bla'))
171
+ end
172
+
173
+ it do
174
+ expect(
175
+ refchanger.replace_irefs(
176
+ 'defs:iref[TOTO-TEMP123] defs:iref[TOTO-TEMP123] bla'
177
+ )
178
+ ).to(eq('defs:iref[TOTO-0132] defs:iref[TOTO-0132] bla'))
179
+ end
180
+ end
181
+
182
+ describe '#replace' do
183
+ subject(:refchanger) do
184
+ described_class.new(
185
+ from_regexp: 'TEMP',
186
+ to_template: 'TUTU'
187
+ )
188
+ end
189
+
190
+ it do
191
+ expect(refchanger.replace(:refdef, '[define, whatever, TEMP]'))
192
+ .to(eq('[define, whatever, TUTU]'))
193
+ end
194
+
195
+ it do
196
+ expect(refchanger.replace(:refdef, '[define, whatever, TEMP(a~12345678)]'))
197
+ .to(eq('[define, whatever, TUTU(a~12345678)]'))
198
+ end
199
+
200
+ it do
201
+ expect(refchanger.replace(:refdef, '[define, whatever, TEMP(~12345678)]'))
202
+ .to(eq('[define, whatever, TUTU(~12345678)]'))
203
+ end
204
+
205
+ it do
206
+ expect(refchanger.replace(:refdef, '[define, whatever, TEMP(a)]'))
207
+ .to(eq('[define, whatever, TUTU(a)]'))
208
+ end
209
+
210
+ it do
211
+ refchanger.replace(:refdef, '[define, whatever, TEMP]')
212
+ expect(refchanger.replace(:irefs, 'defs:iref[TEMP] defs:iref[TEMP]'))
213
+ .to(eq('defs:iref[TUTU] defs:iref[TUTU]'))
66
214
  end
67
215
 
68
216
  it do
69
- expected_adoc = {
70
- 'file1.adoc' => "new2 file1 line1\nnew2 file1 line2",
71
- 'file2.adoc' => "new2 file2 line1\nnew2 file2 line2"
72
- }
73
- expect(modifier.do_modifications(adoc_texts)).to(eq(expected_adoc))
217
+ expect { refchanger.replace(:pouet, 'whatever') }
218
+ .to(raise_error(NoMethodError))
74
219
  end
75
220
  end
76
221
  end
@@ -1,10 +1,10 @@
1
1
  # Copyright (c) 2020 Jerome Arbez-Gindre
2
2
  # frozen_string_literal: true
3
3
 
4
- require('defmastership')
4
+ require('defmastership/csv_formatter_body')
5
5
 
6
6
  RSpec.describe(DefMastership::CSVFormatterBody) do
7
- subject(:formatter) { described_class.new(document) }
7
+ subject(:formatter) { described_class.new(document, definition) }
8
8
 
9
9
  let(:document) { instance_double(DefMastership::Document, 'document') }
10
10
  let(:definition) { instance_double(DefMastership::Definition, 'definition') }
@@ -18,35 +18,35 @@ RSpec.describe(DefMastership::CSVFormatterBody) do
18
18
  allow(definition).to(receive(:type).with(no_args).and_return('a'))
19
19
  allow(definition).to(receive(:reference).with(no_args).and_return('b'))
20
20
  allow(definition).to(receive(:value).with(no_args).and_return('c'))
21
- allow(definition).to(receive(:sha256).with(no_args).and_return('d'))
22
- formatter.fixed(definition)
21
+ allow(definition).to(receive(:sha256_short).with(no_args).and_return('d'))
22
+ formatter.fixed
23
23
  end
24
24
 
25
25
  it { expect(definition).to(have_received(:type).with(no_args)) }
26
26
  it { expect(definition).to(have_received(:reference).with(no_args)) }
27
27
  it { expect(definition).to(have_received(:value).with(no_args)) }
28
- it { expect(definition).to(have_received(:sha256).with(no_args)) }
29
- it { expect(formatter.fixed(definition)).to(eq(%w[a b c d])) }
28
+ it { expect(definition).to(have_received(:sha256_short).with(no_args)) }
29
+ it { expect(formatter.fixed).to(eq(%w[a b c d])) }
30
30
  end
31
31
 
32
32
  describe '#wrong_explicit_checksum' do
33
33
  context 'when no wrong_explicit checksum' do
34
34
  before do
35
35
  allow(definition).to(receive(:wrong_explicit_checksum).with(no_args).and_return(nil))
36
- formatter.wrong_explicit_checksum(definition)
36
+ formatter.wrong_explicit_checksum
37
37
  end
38
38
 
39
39
  it { expect(definition).to(have_received(:wrong_explicit_checksum).with(no_args)) }
40
- it { expect(formatter.wrong_explicit_checksum(definition)).to(eq([''])) }
40
+ it { expect(formatter.wrong_explicit_checksum).to(eq([''])) }
41
41
  end
42
42
 
43
43
  context 'when explicit checksum' do
44
44
  before do
45
45
  allow(definition).to(receive(:wrong_explicit_checksum).with(no_args).and_return('ab12'))
46
- formatter.wrong_explicit_checksum(definition)
46
+ formatter.wrong_explicit_checksum
47
47
  end
48
48
 
49
- it { expect(formatter.wrong_explicit_checksum(definition)).to(eq(['ab12'])) }
49
+ it { expect(formatter.wrong_explicit_checksum).to(eq(['ab12'])) }
50
50
  end
51
51
  end
52
52
 
@@ -54,20 +54,20 @@ RSpec.describe(DefMastership::CSVFormatterBody) do
54
54
  context 'when no explicit_version' do
55
55
  before do
56
56
  allow(definition).to(receive(:explicit_version).with(no_args).and_return(nil))
57
- formatter.explicit_version(definition)
57
+ formatter.explicit_version
58
58
  end
59
59
 
60
60
  it { expect(definition).to(have_received(:explicit_version).with(no_args)) }
61
- it { expect(formatter.explicit_version(definition)).to(eq([''])) }
61
+ it { expect(formatter.explicit_version).to(eq([''])) }
62
62
  end
63
63
 
64
64
  context 'when explicit_version' do
65
65
  before do
66
66
  allow(definition).to(receive(:explicit_version).with(no_args).and_return('ab12'))
67
- formatter.explicit_version(definition)
67
+ formatter.explicit_version
68
68
  end
69
69
 
70
- it { expect(formatter.explicit_version(definition)).to(eq(['ab12'])) }
70
+ it { expect(formatter.explicit_version).to(eq(['ab12'])) }
71
71
  end
72
72
  end
73
73
 
@@ -77,21 +77,21 @@ RSpec.describe(DefMastership::CSVFormatterBody) do
77
77
  context 'when no labels on definition' do
78
78
  before do
79
79
  allow(definition).to(receive(:labels).with(no_args).and_return([]))
80
- formatter.labels(definition)
80
+ formatter.labels
81
81
  end
82
82
 
83
83
  it { expect(definition).to(have_received(:labels).once.with(no_args)) }
84
- it { expect(formatter.labels(definition)).to(eq([''])) }
84
+ it { expect(formatter.labels).to(eq([''])) }
85
85
  end
86
86
 
87
87
  context 'when labels on definition' do
88
88
  before do
89
- allow(definition).to(receive(:labels).with(no_args).and_return(%w[toto tutu]))
90
- formatter.labels(definition)
89
+ allow(definition).to(receive(:labels).with(no_args).and_return(%w[toto tutu].to_set))
90
+ formatter.labels
91
91
  end
92
92
 
93
93
  it { expect(definition).to(have_received(:labels).once.with(no_args)) }
94
- it { expect(formatter.labels(definition)).to(eq(["toto\ntutu"])) }
94
+ it { expect(formatter.labels).to(eq(["toto\ntutu"])) }
95
95
  end
96
96
  end
97
97
 
@@ -99,11 +99,11 @@ RSpec.describe(DefMastership::CSVFormatterBody) do
99
99
  context 'when no eref on the document' do
100
100
  before do
101
101
  allow(document).to(receive(:eref).with(no_args).and_return({}))
102
- formatter.eref(definition)
102
+ formatter.eref
103
103
  end
104
104
 
105
105
  it { expect(document).to(have_received(:eref).with(no_args)) }
106
- it { expect(formatter.eref(nil)).to(eq([])) }
106
+ it { expect(formatter.eref).to(eq([])) }
107
107
  end
108
108
 
109
109
  context 'when eref on the document' do
@@ -114,11 +114,26 @@ RSpec.describe(DefMastership::CSVFormatterBody) do
114
114
  )
115
115
  )
116
116
  allow(definition).to(receive(:eref).with(no_args).and_return(a: %w[A B], b: [], c: ['C']))
117
- formatter.eref(definition)
117
+ formatter.eref
118
118
  end
119
119
 
120
120
  it { expect(definition).to(have_received(:eref).exactly(3).times.with(no_args)) }
121
- it { expect(formatter.eref(definition)).to(eq(["A\nB", '', 'C'])) }
121
+ it { expect(formatter.eref).to(eq(["A\nB", '', 'C'])) }
122
+ end
123
+
124
+ context 'when missing eref on the definition' do
125
+ before do
126
+ allow(document).to(
127
+ receive(:eref).with(no_args).and_return(
128
+ a: 'whatever', b: 'whatever'
129
+ )
130
+ )
131
+ allow(definition).to(receive(:eref).with(no_args).and_return(b: ['B']))
132
+ formatter.eref
133
+ end
134
+
135
+ it { expect(definition).to(have_received(:eref).exactly(2).times.with(no_args)) }
136
+ it { expect(formatter.eref).to(eq(['', 'B'])) }
122
137
  end
123
138
  end
124
139
 
@@ -128,21 +143,21 @@ RSpec.describe(DefMastership::CSVFormatterBody) do
128
143
  context 'when no iref on the definition' do
129
144
  before do
130
145
  allow(definition).to(receive(:iref).with(no_args).and_return([]))
131
- formatter.iref(definition)
146
+ formatter.iref
132
147
  end
133
148
 
134
149
  it { expect(definition).to(have_received(:iref).with(no_args)) }
135
- it { expect(formatter.iref(definition)).to(eq([''])) }
150
+ it { expect(formatter.iref).to(eq([''])) }
136
151
  end
137
152
 
138
153
  context 'when iref on the definition' do
139
154
  before do
140
155
  allow(definition).to(receive(:iref).with(no_args).and_return(%w[A B]))
141
- formatter.iref(definition)
156
+ formatter.iref
142
157
  end
143
158
 
144
159
  it { expect(definition).to(have_received(:iref).with(no_args)) }
145
- it { expect(formatter.iref(definition)).to(eq(["A\nB"])) }
160
+ it { expect(formatter.iref).to(eq(["A\nB"])) }
146
161
  end
147
162
  end
148
163
 
@@ -150,11 +165,11 @@ RSpec.describe(DefMastership::CSVFormatterBody) do
150
165
  context 'when no attributes on the document' do
151
166
  before do
152
167
  allow(document).to(receive(:attributes).with(no_args).and_return({}))
153
- formatter.attributes(definition)
168
+ formatter.attributes
154
169
  end
155
170
 
156
171
  it { expect(document).to(have_received(:attributes).with(no_args)) }
157
- it { expect(formatter.attributes(nil)).to(eq([])) }
172
+ it { expect(formatter.attributes).to(eq([])) }
158
173
  end
159
174
 
160
175
  context 'when attributes on the document' do
@@ -164,11 +179,25 @@ RSpec.describe(DefMastership::CSVFormatterBody) do
164
179
  .and_return(a: 'whatever', b: 'whatever', c: 'whatever')
165
180
  )
166
181
  allow(definition).to(receive(:attributes).and_return(a: 'X', b: '', c: 'Y'))
167
- formatter.attributes(definition)
182
+ formatter.attributes
183
+ end
184
+
185
+ it { expect(definition).to(have_received(:attributes).exactly(3).times) }
186
+ it { expect(formatter.attributes).to(eq(['X', '', 'Y'])) }
187
+ end
188
+
189
+ context 'when miing attribute on the definition' do
190
+ before do
191
+ allow(document).to(
192
+ receive(:attributes).with(no_args)
193
+ .and_return(a: 'whatever', b: 'whatever', c: 'whatever')
194
+ )
195
+ allow(definition).to(receive(:attributes).and_return(a: 'X', b: ''))
196
+ formatter.attributes
168
197
  end
169
198
 
170
199
  it { expect(definition).to(have_received(:attributes).exactly(3).times) }
171
- it { expect(formatter.attributes(definition)).to(eq(['X', '', 'Y'])) }
200
+ it { expect(formatter.attributes).to(eq(['X', '', ''])) }
172
201
  end
173
202
  end
174
203
  end
@@ -1,7 +1,7 @@
1
1
  # Copyright (c) 2020 Jerome Arbez-Gindre
2
2
  # frozen_string_literal: true
3
3
 
4
- require('defmastership')
4
+ require('defmastership/csv_formatter_header')
5
5
 
6
6
  RSpec.describe(DefMastership::CSVFormatterHeader) do
7
7
  subject(:formatter) { described_class.new(document) }