defmastership 1.0.16 → 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 (68) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.gitlab-ci.yml +50 -7
  4. data/.rubocop.yml +14 -6
  5. data/Gemfile +51 -1
  6. data/Rakefile +16 -47
  7. data/bin/defmastership +12 -9
  8. data/config/mutant.yml +23 -3
  9. data/defmastership.gemspec +22 -27
  10. data/features/definition_checksum.feature +31 -1
  11. data/features/export.feature +43 -1
  12. data/features/rename_included_files.feature +28 -0
  13. data/lib/defmastership/batch_modifier.rb +17 -12
  14. data/lib/defmastership/change_ref_modifier.rb +89 -5
  15. data/lib/defmastership/comment_filter.rb +1 -1
  16. data/lib/defmastership/constants.rb +5 -4
  17. data/lib/defmastership/csv_formatter.rb +20 -16
  18. data/lib/defmastership/csv_formatter_body.rb +18 -15
  19. data/lib/defmastership/csv_formatter_header.rb +1 -1
  20. data/lib/defmastership/definition.rb +58 -19
  21. data/lib/defmastership/document.rb +109 -74
  22. data/lib/defmastership/matching_line.rb +17 -0
  23. data/lib/defmastership/modifier.rb +42 -0
  24. data/lib/defmastership/modifier_factory.rb +12 -0
  25. data/lib/defmastership/parsing_state.rb +15 -9
  26. data/lib/defmastership/rename_included_files_modifier.rb +172 -5
  27. data/lib/defmastership/set_join_hack.rb +11 -0
  28. data/lib/defmastership/update_def_checksum_modifier.rb +8 -13
  29. data/lib/defmastership/update_def_modifier.rb +49 -0
  30. data/lib/defmastership/update_def_version_modifier.rb +56 -15
  31. data/lib/defmastership/version.rb +1 -1
  32. data/lib/defmastership.rb +7 -17
  33. data/spec/spec_helper.rb +4 -2
  34. data/spec/unit/{defmastership → def_mastership}/batch_modifier_spec.rb +42 -39
  35. data/spec/unit/{defmastership/change_ref_line_modifier_spec.rb → def_mastership/change_ref_modifier_spec.rb} +44 -66
  36. data/spec/unit/{defmastership → def_mastership}/csv_formatter_body_spec.rb +61 -32
  37. data/spec/unit/{defmastership → def_mastership}/csv_formatter_header_spec.rb +2 -2
  38. data/spec/unit/{defmastership → def_mastership}/csv_formatter_spec.rb +81 -86
  39. data/spec/unit/{defmastership → def_mastership}/definition_parser_spec.rb +2 -2
  40. data/spec/unit/{defmastership → def_mastership}/definition_spec.rb +17 -7
  41. data/spec/unit/{defmastership → def_mastership}/document_spec.rb +108 -53
  42. data/spec/unit/def_mastership/matching_line_spec.rb +37 -0
  43. data/spec/unit/def_mastership/modifier_factory_spec.rb +37 -0
  44. data/spec/unit/def_mastership/modifier_spec.rb +83 -0
  45. data/spec/unit/{defmastership → def_mastership}/parsing_state_spec.rb +16 -16
  46. data/spec/unit/{defmastership/rename_included_files_line_modifier_spec.rb → def_mastership/rename_included_files_modifier_spec.rb} +72 -36
  47. data/spec/unit/{defmastership/comment_filter_spec.rb → def_mastership/string_spec.rb} +1 -1
  48. data/spec/unit/def_mastership/update_def_checksum_modifier_spec.rb +107 -0
  49. data/spec/unit/def_mastership/update_def_modifier_spec.rb +119 -0
  50. data/spec/unit/def_mastership/update_def_version_modifier_spec.rb +159 -0
  51. data/spec/unit/{defmastership_spec.rb → def_mastership_spec.rb} +1 -1
  52. data/tasks/console.rake +8 -0
  53. data/tasks/package.task +9 -0
  54. data/tasks/smelling_code.rake +38 -0
  55. data/tasks/test.rake +45 -0
  56. metadata +37 -145
  57. data/lib/defmastership/change_ref_line_modifier.rb +0 -82
  58. data/lib/defmastership/line_modifier_base.rb +0 -29
  59. data/lib/defmastership/modifier_base.rb +0 -29
  60. data/lib/defmastership/rename_included_files_line_modifier.rb +0 -126
  61. data/lib/defmastership/update_def_checksum_line_modifier.rb +0 -38
  62. data/lib/defmastership/update_def_version_line_modifier.rb +0 -58
  63. data/spec/unit/defmastership/change_ref_modifier_spec.rb +0 -76
  64. data/spec/unit/defmastership/rename_included_files_modifier_spec.rb +0 -67
  65. data/spec/unit/defmastership/update_def_checksum_line_modifier_spec.rb +0 -78
  66. data/spec/unit/defmastership/update_def_checksum_modifier_spec.rb +0 -75
  67. data/spec/unit/defmastership/update_def_version_line_modifier_spec.rb +0 -127
  68. data/spec/unit/defmastership/update_def_version_modifier_spec.rb +0 -80
@@ -1,40 +1,37 @@
1
1
  # Copyright (c) 2021 Jerome Arbez-Gindre
2
2
  # frozen_string_literal: true
3
3
 
4
- require('defmastership')
4
+ require('defmastership/rename_included_files_modifier')
5
5
 
6
- RSpec.describe(DefMastership::RenameIncludedFilesLineModifier) do
7
- subject(:includeschanger) { described_class.new }
6
+ RSpec.describe(DefMastership::RenameIncludedFilesModifier) do
7
+ subject(:includeschanger) { described_class.new({}) }
8
8
 
9
9
  describe '.new' do
10
- it { is_expected.not_to(be(nil)) }
10
+ it { expect(described_class.ancestors).to(include(DefMastership::Modifier)) }
11
+ it { is_expected.not_to(be_nil) }
11
12
  it { is_expected.to(have_attributes(from_regexp: '')) }
12
13
  it { is_expected.to(have_attributes(to_template: '')) }
13
- it { is_expected.to(have_attributes(changes: [])) }
14
- it { expect { includeschanger.user_defined_attribute }.to(raise_error(NoMethodError)) }
15
14
  end
16
15
 
17
- describe '.from_config' do
18
- subject(:includeschanger) do
19
- described_class.from_config(
20
- from_regexp: 'Whatever.+',
21
- to_template: 'Whatever'
22
- )
23
- end
16
+ describe '.replacement_methods' do
17
+ it { expect(described_class.replacement_methods).to(eq(%i[replace])) }
18
+ end
24
19
 
25
- it { is_expected.not_to(be(nil)) }
26
- it { is_expected.to(have_attributes(from_regexp: 'Whatever.+')) }
27
- it { is_expected.to(have_attributes(to_template: 'Whatever')) }
20
+ describe '.respond_to_missing?' do
21
+ it { expect(includeschanger.respond_to?(:add_new_definition)).to(be(true)) }
22
+ it { expect(includeschanger.respond_to?(:not_implemented_random_method)).to(be(false)) }
28
23
  end
29
24
 
30
25
  describe '#replace' do
31
26
  context 'when NOT valid include' do
32
- before do
33
- includeschanger.from_config(
27
+ subject(:includeschanger) do
28
+ described_class.new(
34
29
  from_regexp: 'orig',
35
- cancel_if_match: 'REF',
36
30
  to_template: 'dest'
37
31
  )
32
+ end
33
+
34
+ before do
38
35
  allow(File).to(receive(:rename))
39
36
  end
40
37
 
@@ -74,21 +71,35 @@ RSpec.describe(DefMastership::RenameIncludedFilesLineModifier) do
74
71
  end
75
72
  end
76
73
 
77
- context 'when the cancel regexp is met' do
74
+ context 'when the line is commented' do
78
75
  before do
79
- ['[define,requirement,REFERENCE]', '--'].each do |line|
80
- includeschanger.replace(line)
81
- end
76
+ includeschanger.replace('[define,requirement,REFERENCE]')
77
+ includeschanger.replace('--')
82
78
  end
83
79
 
84
80
  it do
85
- expect(includeschanger.replace('include::REFERENCE_orig[]'))
86
- .to(eq('include::REFERENCE_orig[]'))
81
+ expect(includeschanger.replace('// include::orig[]'))
82
+ .to(eq('// include::orig[]'))
83
+ end
84
+ end
85
+
86
+ context 'when the cancel regexp is met' do
87
+ subject(:includeschanger) do
88
+ described_class.new(
89
+ from_regexp: 'orig',
90
+ cancel_if_match: 'orig',
91
+ to_template: 'dest'
92
+ )
93
+ end
94
+
95
+ before do
96
+ includeschanger.replace('[define,requirement,REFERENCE]')
97
+ includeschanger.replace('--')
87
98
  end
88
99
 
89
100
  it do
90
- includeschanger.replace('include::REFERENCE_orig[]')
91
- expect(includeschanger).to(have_attributes(changes: []))
101
+ expect(includeschanger.replace("include::orig[]\n"))
102
+ .to(eq("include::orig[]\n"))
92
103
  end
93
104
  end
94
105
  end
@@ -99,12 +110,15 @@ RSpec.describe(DefMastership::RenameIncludedFilesLineModifier) do
99
110
  end
100
111
 
101
112
  context 'when really simple rule' do
102
- before do
103
- includeschanger.from_config(
113
+ subject(:includeschanger) do
114
+ described_class.new(
104
115
  from_regexp: 'orig',
105
- cancel_if_match: 'REF',
116
+ cancel_if_match: '_no_cancel_',
106
117
  to_template: 'dest'
107
118
  )
119
+ end
120
+
121
+ before do
108
122
  includeschanger.replace('[define,requirement,REFERENCE]')
109
123
  includeschanger.replace('--')
110
124
  end
@@ -119,6 +133,16 @@ RSpec.describe(DefMastership::RenameIncludedFilesLineModifier) do
119
133
  expect(File).to(have_received(:rename).with('orig', 'dest'))
120
134
  end
121
135
 
136
+ it do
137
+ expect(includeschanger.replace("include::orig[leveloffset=offset,lines=ranges]\n"))
138
+ .to(eq("include::dest[leveloffset=offset,lines=ranges]\n"))
139
+ end
140
+
141
+ it do
142
+ includeschanger.replace("include::orig[leveloffset=offset,lines=ranges]\n")
143
+ expect(File).to(have_received(:rename).with('orig', 'dest'))
144
+ end
145
+
122
146
  it do
123
147
  includeschanger.replace("include::orig[]\n")
124
148
  expect(includeschanger).to(have_attributes(changes: [%w[orig dest]]))
@@ -141,11 +165,14 @@ RSpec.describe(DefMastership::RenameIncludedFilesLineModifier) do
141
165
  end
142
166
 
143
167
  context 'when complex from_regexp' do
144
- before do
145
- includeschanger.from_config(
168
+ subject(:includeschanger) do
169
+ described_class.new(
146
170
  from_regexp: '(?<origin>.*\.extension)',
147
171
  to_template: '%<reference>s_%<origin>s'
148
172
  )
173
+ end
174
+
175
+ before do
149
176
  includeschanger.replace('[define,requirement,REF]')
150
177
  end
151
178
 
@@ -167,13 +194,17 @@ RSpec.describe(DefMastership::RenameIncludedFilesLineModifier) do
167
194
  end
168
195
 
169
196
  context 'when path with variable' do
170
- before do
171
- includeschanger.from_config(
197
+ subject(:includeschanger) do
198
+ described_class.new(
172
199
  from_regexp: 'orig',
173
200
  to_template: 'dest'
174
201
  )
202
+ end
203
+
204
+ before do
175
205
  includeschanger.replace(':any: one')
176
206
  includeschanger.replace(':path: two')
207
+ includeschanger.replace(':var: three')
177
208
  includeschanger.replace('[define,requirement,REFERENCE]')
178
209
  includeschanger.replace('--')
179
210
  end
@@ -184,8 +215,8 @@ RSpec.describe(DefMastership::RenameIncludedFilesLineModifier) do
184
215
  end
185
216
 
186
217
  it do
187
- includeschanger.replace('include::{any}/orig[]')
188
- expect(File).to(have_received(:rename).with('one/orig', 'one/dest'))
218
+ includeschanger.replace('include::{any}{var}/orig[]')
219
+ expect(File).to(have_received(:rename).with('onethree/orig', 'onethree/dest'))
189
220
  end
190
221
 
191
222
  it do
@@ -193,6 +224,11 @@ RSpec.describe(DefMastership::RenameIncludedFilesLineModifier) do
193
224
  expect(File).to(have_received(:rename).with('one_two/orig', 'one_two/dest'))
194
225
  end
195
226
 
227
+ it do
228
+ expect { includeschanger.replace('include::{bad_variable}/orig[]') }
229
+ .to(raise_error(KeyError, 'key not found: :bad_variable'))
230
+ end
231
+
196
232
  it do
197
233
  includeschanger.replace('include::{any}_{path}/orig[]')
198
234
  expect(includeschanger).to(have_attributes(changes: [%w[one_two/orig one_two/dest]]))
@@ -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/comment_filter')
5
5
 
6
6
  RSpec.describe(String) do
7
7
  context 'when .commented?' do
@@ -0,0 +1,107 @@
1
+ # Copyright (c) 2020 Jerome Arbez-Gindre
2
+ # frozen_string_literal: true
3
+
4
+ require('defmastership/update_def_checksum_modifier')
5
+
6
+ RSpec.describe(DefMastership::UpdateDefChecksumModifier) do
7
+ subject(:modifier) { 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(def_type: '')) }
13
+ end
14
+
15
+ describe '.replacement_methods' do
16
+ it { expect(described_class.replacement_methods).to(eq(%i[replace_reference])) }
17
+ end
18
+
19
+ describe '#do_modifications' do
20
+ subject(:modifier) { described_class.new({ def_type: 'req' }) }
21
+
22
+ let(:document) { instance_double(DefMastership::Document, 'document') }
23
+ let(:definition) { instance_double(DefMastership::Definition, 'definition') }
24
+ let(:definitions) { { 'REFERENCE' => definition } }
25
+ let(:adoc_sources) do
26
+ {
27
+ 'file1.adoc' => "[define,req,REFERENCE]\nfile1 line2",
28
+ 'file2.adoc' => "file2 line1\nfile2 line2"
29
+ }
30
+ end
31
+ let(:new_adoc_sources) { nil }
32
+
33
+ before do
34
+ allow(DefMastership::Document).to(receive(:new).and_return(document))
35
+ allow(document).to(receive(:parse_file_with_preprocessor))
36
+ allow(document).to(receive(:ref_to_def).with('REFERENCE').and_return(definition))
37
+ allow(definition).to(receive(:sha256_short).and_return('~abcd1234'))
38
+
39
+ modifier.do_modifications(adoc_sources)
40
+ end
41
+
42
+ it { expect(DefMastership::Document).to(have_received(:new)) }
43
+
44
+ it do
45
+ expect(document).to(
46
+ have_received(:parse_file_with_preprocessor)
47
+ .once.with('file1.adoc')
48
+ .once.with('file2.adoc')
49
+ )
50
+ end
51
+
52
+ it do
53
+ expect(modifier.do_modifications(adoc_sources).fetch('file1.adoc')).to(include('abcd1234'))
54
+ end
55
+ end
56
+
57
+ describe '#replace' do
58
+ subject(:modifier) do
59
+ described_class.new(
60
+ def_type: 'requirement'
61
+ )
62
+ end
63
+
64
+ let(:definition) { instance_double(DefMastership::Definition, 'definition') }
65
+ let(:document) { instance_double(DefMastership::Document, 'document') }
66
+ let(:definitions) { { 'REFERENCE' => definition } }
67
+
68
+ before do
69
+ allow(File).to(receive(:rename))
70
+ end
71
+
72
+ context 'when definition has not the good type' do
73
+ it do
74
+ expect(modifier.replace_reference('[define,req,REFERENCE]'))
75
+ .to(eq('[define,req,REFERENCE]'))
76
+ end
77
+ end
78
+
79
+ context 'when definition has the good type' do
80
+ before do
81
+ allow(DefMastership::Document).to(receive(:new).and_return(document))
82
+ allow(document).to(receive(:ref_to_def).with('REFERENCE').and_return(definition))
83
+ allow(definition).to(receive(:sha256_short).and_return('~abcd1234'))
84
+ end
85
+
86
+ it do
87
+ expect(modifier.replace_reference('[define,requirement,REFERENCE]'))
88
+ .to(eq('[define,requirement,REFERENCE(~abcd1234)]'))
89
+ end
90
+
91
+ it do
92
+ expect(modifier.replace_reference('[define,requirement,REFERENCE(~bad)]'))
93
+ .to(eq('[define,requirement,REFERENCE(~abcd1234)]'))
94
+ end
95
+
96
+ it do
97
+ expect(modifier.replace_reference('[define,requirement,REFERENCE(toto~bad)]'))
98
+ .to(eq('[define,requirement,REFERENCE(toto~abcd1234)]'))
99
+ end
100
+
101
+ it do
102
+ expect(modifier.replace_reference('[define,requirement,REFERENCE(toto)]'))
103
+ .to(eq('[define,requirement,REFERENCE(toto~abcd1234)]'))
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,119 @@
1
+ # Copyright (c) 2020 Jerome Arbez-Gindre
2
+ # frozen_string_literal: true
3
+
4
+ require('defmastership/update_def_modifier')
5
+
6
+ module DefMastership
7
+ class ConcreteRefModifier < UpdateDefModifier
8
+ private
9
+
10
+ def reference_replacement(reference, match)
11
+ "#{reference}_something_#{match[:explicit_version]}"
12
+ end
13
+ end
14
+ end
15
+
16
+ RSpec.describe(DefMastership::UpdateDefModifier) do
17
+ subject(:modifier) { DefMastership::ConcreteRefModifier.new({}) }
18
+
19
+ describe '.new' do
20
+ it { expect(described_class.ancestors).to(include(DefMastership::Modifier)) }
21
+ it { is_expected.not_to(be_nil) }
22
+ it { is_expected.to(have_attributes(def_type: '')) }
23
+ end
24
+
25
+ describe '.replacement_methods' do
26
+ it { expect(described_class.replacement_methods).to(eq(%i[replace_reference])) }
27
+ end
28
+
29
+ describe '#do_modifications' do
30
+ subject(:modifier) { DefMastership::ConcreteRefModifier.new({ def_type: 'req' }) }
31
+
32
+ let(:document) { instance_double(DefMastership::Document, 'document') }
33
+ let(:definition) { instance_double(DefMastership::Definition, 'definition') }
34
+ let(:definitions) { { 'REFERENCE' => definition } }
35
+ let(:adoc_sources) do
36
+ {
37
+ 'file1.adoc' => "[define,req,REFERENCE]\nfile1 line2",
38
+ 'file2.adoc' => "file2 line1\nfile2 line2"
39
+ }
40
+ end
41
+ let(:new_adoc_sources) { nil }
42
+
43
+ before do
44
+ allow(DefMastership::Document).to(receive(:new).and_return(document))
45
+ allow(document).to(receive(:parse_file_with_preprocessor).with('file1.adoc'))
46
+ allow(document).to(receive(:parse_file_with_preprocessor).with('file2.adoc'))
47
+
48
+ modifier.do_modifications(adoc_sources)
49
+ end
50
+
51
+ it { expect(DefMastership::Document).to(have_received(:new)) }
52
+
53
+ it do
54
+ expect(document).to(
55
+ have_received(:parse_file_with_preprocessor)
56
+ .once.with('file1.adoc')
57
+ .once.with('file2.adoc')
58
+ )
59
+ end
60
+
61
+ it do
62
+ expect(modifier.do_modifications(adoc_sources).fetch('file1.adoc'))
63
+ .to(include('REFERENCE_something_'))
64
+ end
65
+ end
66
+
67
+ describe '#replace_reference' do
68
+ subject(:modifier) do
69
+ DefMastership::ConcreteRefModifier.new(
70
+ def_type: 'requirement'
71
+ )
72
+ end
73
+
74
+ let(:definition) { instance_double(DefMastership::Definition, 'definition') }
75
+ let(:document) { instance_double(DefMastership::Document, 'document') }
76
+ let(:definitions) { { 'REFERENCE' => definition } }
77
+
78
+ before do
79
+ allow(File).to(receive(:rename))
80
+ end
81
+
82
+ context 'when line do not match' do
83
+ it do
84
+ expect(modifier.replace_reference('[define---,req,REFERENCE(abcd)]'))
85
+ .to(eq('[define---,req,REFERENCE(abcd)]'))
86
+ end
87
+ end
88
+
89
+ context 'when definition has not the good type' do
90
+ it do
91
+ expect(modifier.replace_reference('[define,req,REFERENCE(abcd)]'))
92
+ .to(eq('[define,req,REFERENCE(abcd)]'))
93
+ end
94
+ end
95
+
96
+ context 'when definition has the good type' do
97
+ before do
98
+ allow(DefMastership::Document).to(receive(:new).and_return(document))
99
+ allow(document).to(receive(:ref_to_def).with('REFERENCE').and_return(definition))
100
+ allow(definition).to(receive(:sha256_short).and_return('~abcd1234'))
101
+ end
102
+
103
+ it do
104
+ expect(modifier.replace_reference('[define,requirement,REFERENCE(abcd)]'))
105
+ .to(eq('[define,requirement,REFERENCE_something_abcd]'))
106
+ end
107
+
108
+ it do
109
+ expect(modifier.replace_reference('[define,requirement,REFERENCE(abcd~bad)]'))
110
+ .to(eq('[define,requirement,REFERENCE_something_abcd]'))
111
+ end
112
+
113
+ it do
114
+ expect(modifier.replace_reference('// [define,requirement,REFERENCE(abcd~bad)]'))
115
+ .to(eq('// [define,requirement,REFERENCE(abcd~bad)]'))
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,159 @@
1
+ # Copyright (c) 2020 Jerome Arbez-Gindre
2
+ # frozen_string_literal: true
3
+
4
+ require('defmastership/update_def_version_modifier')
5
+
6
+ RSpec.describe(DefMastership::UpdateDefVersionModifier) do
7
+ subject(:modifier) { 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(def_type: '')) }
13
+ it { is_expected.to(have_attributes(ref_document: '')) }
14
+ it { is_expected.to(have_attributes(first_version: '')) }
15
+ end
16
+
17
+ describe '.replacement_methods' do
18
+ it { expect(described_class.replacement_methods).to(eq(%i[replace_reference])) }
19
+ end
20
+
21
+ describe '#do_modifications' do
22
+ subject(:modifier) do
23
+ described_class.new(
24
+ ref_document: 'ref_doc.adoc',
25
+ def_type: 'req',
26
+ first_version: 'a'
27
+ )
28
+ end
29
+
30
+ let(:document) { instance_double(DefMastership::Document, 'document') }
31
+ let(:ref_document) { instance_double(DefMastership::Document, 'ref_document') }
32
+ let(:definition) { instance_double(DefMastership::Definition, 'definition') }
33
+ let(:ref_definition) { instance_double(DefMastership::Definition, 'ref_definitions') }
34
+ let(:adoc_sources) do
35
+ {
36
+ 'file1.adoc' => "[define,req,REFERENCE]\nfile1 line2",
37
+ 'file2.adoc' => "file2 line1\nfile2 line2"
38
+ }
39
+ end
40
+
41
+ before do
42
+ allow(DefMastership::Document).to(receive(:new).twice.and_return(ref_document, document))
43
+ allow(document).to(receive(:parse_file_with_preprocessor).with('file1.adoc'))
44
+ allow(document).to(receive(:parse_file_with_preprocessor).with('file2.adoc'))
45
+ allow(ref_document).to(receive(:parse_file_with_preprocessor).with('ref_doc.adoc'))
46
+ allow(document).to(receive(:ref_to_def).with('REFERENCE').and_return(definition))
47
+ allow(ref_document).to(receive(:ref_to_def).with('REFERENCE').and_return(ref_definition))
48
+ allow(ref_definition).to(receive(:explicit_version).with(no_args).and_return(nil))
49
+ allow(definition).to(receive(:sha256_short).with(no_args).and_return('something'))
50
+ allow(ref_definition).to(receive(:sha256_short).with(no_args).and_return('something_else'))
51
+
52
+ modifier.do_modifications(adoc_sources)
53
+ end
54
+
55
+ it { expect(DefMastership::Document).to(have_received(:new).twice) }
56
+ it { expect(document).to(have_received(:parse_file_with_preprocessor).twice) }
57
+ it { expect(ref_document).to(have_received(:parse_file_with_preprocessor).with('ref_doc.adoc')) }
58
+
59
+ it do
60
+ expect(modifier.do_modifications(adoc_sources).fetch('file1.adoc')).to(include('REFERENCE(a)'))
61
+ end
62
+ end
63
+
64
+ describe '#replace_reference' do
65
+ subject(:modifier) do
66
+ described_class.new(
67
+ def_type: 'requirement',
68
+ first_version: 'a'
69
+ )
70
+ end
71
+
72
+ let(:document) { instance_double(DefMastership::Document, 'document') }
73
+ let(:ref_document) { instance_double(DefMastership::Document, 'ref_document') }
74
+ let(:definition) { instance_double(DefMastership::Definition, 'definition') }
75
+ let(:ref_definition) { instance_double(DefMastership::Definition, 'ref_definitions') }
76
+
77
+ before do
78
+ allow(File).to(receive(:rename))
79
+ allow(DefMastership::Document).to(receive(:new).with(no_args).and_return(ref_document, document))
80
+ end
81
+
82
+ context 'when definition has not the good type' do
83
+ it do
84
+ expect(modifier.replace_reference('[define,req,REFERENCE]'))
85
+ .to(eq('[define,req,REFERENCE]'))
86
+ end
87
+ end
88
+
89
+ context 'when definition has the good type' do
90
+ before do
91
+ allow(document).to(receive(:ref_to_def).with('REFERENCE').and_return(definition))
92
+ allow(definition).to(receive(:sha256_short).and_return('~abcd1234'))
93
+ end
94
+
95
+ context 'when definition has NOT changed' do
96
+ before do
97
+ allow(ref_document).to(receive(:ref_to_def).with('REFERENCE').and_return(ref_definition))
98
+ allow(ref_definition).to(receive(:sha256_short).and_return('~abcd1234'))
99
+ end
100
+
101
+ it do
102
+ allow(ref_definition).to(receive(:explicit_version).and_return(nil))
103
+ expect(modifier.replace_reference('[define,requirement,REFERENCE]'))
104
+ .to(eq('[define,requirement,REFERENCE]'))
105
+ end
106
+
107
+ it do
108
+ allow(ref_definition).to(receive(:explicit_version).and_return('c'))
109
+ expect(modifier.replace_reference('[define,requirement,REFERENCE]'))
110
+ .to(eq('[define,requirement,REFERENCE(c)]'))
111
+ end
112
+
113
+ it do
114
+ allow(ref_definition).to(receive(:explicit_version).and_return('c'))
115
+ expect(modifier.replace_reference('[define,requirement,REFERENCE(tyty~1234)]'))
116
+ .to(eq('[define,requirement,REFERENCE(c~1234)]'))
117
+ end
118
+ end
119
+
120
+ context 'when definition has changed' do
121
+ before do
122
+ allow(ref_document).to(receive(:ref_to_def).with('REFERENCE').and_return(ref_definition))
123
+ allow(ref_definition).to(receive(:sha256_short).and_return('~4321aaaa'))
124
+ end
125
+
126
+ [
127
+ [nil, '', '(a)'],
128
+ ['c', '', '(d)'],
129
+ ['c', '(tyty~1234)', '(d~1234)'],
130
+ ['2', '', '(3)'],
131
+ ['1222', '', '(1223)'],
132
+ ['abb', '', '(abc)']
133
+ ].each do |ref, from, to|
134
+ it do
135
+ allow(ref_definition).to(receive(:explicit_version).and_return(ref))
136
+ expect(modifier.replace_reference("[define,requirement,REFERENCE#{from}]"))
137
+ .to(eq("[define,requirement,REFERENCE#{to}]"))
138
+ end
139
+ end
140
+ end
141
+
142
+ context 'when definition is new' do
143
+ before do
144
+ allow(ref_document).to(receive(:ref_to_def).with('REFERENCE').and_return(nil))
145
+ end
146
+
147
+ it do
148
+ expect(modifier.replace_reference('[define,requirement,REFERENCE(whatever)]'))
149
+ .to(eq('[define,requirement,REFERENCE]'))
150
+ end
151
+
152
+ it do
153
+ expect(modifier.replace_reference('[define,requirement,REFERENCE(~1234)]'))
154
+ .to(eq('[define,requirement,REFERENCE(~1234)]'))
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end
@@ -3,6 +3,6 @@
3
3
 
4
4
  RSpec.describe(DefMastership) do
5
5
  it 'has a version number' do
6
- expect(DefMastership::VERSION).not_to(be(nil))
6
+ expect(DefMastership::VERSION).not_to(be_nil)
7
7
  end
8
8
  end
@@ -0,0 +1,8 @@
1
+ # Copyright (c) 2023 Jerome Arbez-Gindre
2
+ # frozen_string_literal: true
3
+
4
+ desc 'Starts the interactive console'
5
+ task :console do
6
+ require 'pry'
7
+ Pry.start
8
+ end
@@ -0,0 +1,9 @@
1
+ # Copyright (c) 2023 Jerome Arbez-Gindre
2
+ # frozen_string_literal: true
3
+
4
+ require('rubygems')
5
+ require('rubygems/package_task')
6
+
7
+ spec = eval(File.read('defmastership.gemspec'))
8
+
9
+ Gem::PackageTask.new(spec)
@@ -0,0 +1,38 @@
1
+ # Copyright (c) 2023 Jerome Arbez-Gindre
2
+ # frozen_string_literal: true
3
+
4
+ namespace 'quality' do
5
+ begin
6
+ require('rubocop/rake_task')
7
+
8
+ RuboCop::RakeTask.new do |task|
9
+ task.options << '--display-cop-names'
10
+ end
11
+ rescue LoadError
12
+ task(:rubocop) do
13
+ puts('Install rubocop to run its rake tasks')
14
+ end
15
+ end
16
+
17
+ begin
18
+ require('reek/rake/task')
19
+
20
+ Reek::Rake::Task.new do |t|
21
+ t.fail_on_error = true
22
+ t.verbose = false
23
+ end
24
+ rescue LoadError
25
+ task(:reek) do
26
+ puts('Install reek to run its rake tasks')
27
+ end
28
+ end
29
+
30
+ desc 'Runs all quality code check'
31
+ task(all: ['quality:rubocop', 'quality:reek'])
32
+ end
33
+
34
+ desc 'Synonym for quality:rubocop'
35
+ task(rubocop: 'quality:rubocop')
36
+
37
+ desc 'Synonym for quality:reek'
38
+ task(reek: 'quality:reek')