defmastership 1.3.2 → 1.3.4

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/Gemfile +9 -9
  3. data/Guardfile +2 -5
  4. data/Rakefile +1 -1
  5. data/config/mutant.yml +2 -1
  6. data/config/rubocop.yml +20 -8
  7. data/defmastership.gemspec +6 -15
  8. data/features/changeref.feature +108 -0
  9. data/features/definition_checksum.feature +118 -0
  10. data/features/definition_version.feature +168 -0
  11. data/features/export.feature +122 -22
  12. data/features/external_ref_checksum.feature +169 -0
  13. data/features/external_ref_version.feature +173 -0
  14. data/features/internal_ref_checksum.feature +77 -0
  15. data/features/internal_ref_version.feature +81 -0
  16. data/features/rename_included_files.feature +55 -0
  17. data/features/step_definitions/git_steps.rb +3 -0
  18. data/lib/defmastership/app.rb +35 -8
  19. data/lib/defmastership/comment_filter.rb +2 -0
  20. data/lib/defmastership/def_type_list.rb +25 -0
  21. data/lib/defmastership/definition_parser.rb +2 -6
  22. data/lib/defmastership/document.rb +6 -9
  23. data/lib/defmastership/export/csv/formatter.rb +8 -60
  24. data/lib/defmastership/export/formatter.rb +88 -0
  25. data/lib/defmastership/export/json/formatter.rb +34 -0
  26. data/lib/defmastership/export/xlsx/formatter.rb +87 -0
  27. data/lib/defmastership/export/yaml/formatter.rb +34 -0
  28. data/lib/defmastership/modifier/change_ref.rb +24 -39
  29. data/lib/defmastership/modifier/factory.rb +5 -1
  30. data/lib/defmastership/modifier/modifier_common.rb +4 -4
  31. data/lib/defmastership/modifier/rename_included_files.rb +16 -5
  32. data/lib/defmastership/modifier/replacement_formatter.rb +37 -0
  33. data/lib/defmastership/modifier/update_def.rb +7 -2
  34. data/lib/defmastership/modifier/update_eref_checksum.rb +46 -0
  35. data/lib/defmastership/modifier/update_eref_common.rb +78 -0
  36. data/lib/defmastership/modifier/update_eref_version.rb +46 -0
  37. data/lib/defmastership/modifier/update_iref_checksum.rb +52 -0
  38. data/lib/defmastership/modifier/update_iref_common.rb +45 -0
  39. data/lib/defmastership/modifier/update_iref_version.rb +59 -0
  40. data/lib/defmastership/version.rb +1 -1
  41. data/spec/spec_helper.rb +11 -10
  42. data/spec/unit/defmastership/app_spec.rb +57 -20
  43. data/spec/unit/defmastership/batch_modifier_spec.rb +9 -7
  44. data/spec/unit/defmastership/def_type_list_spec.rb +22 -0
  45. data/spec/unit/defmastership/definition_spec.rb +8 -51
  46. data/spec/unit/defmastership/document_spec.rb +12 -36
  47. data/spec/unit/defmastership/export/body_formatter_spec.rb +5 -18
  48. data/spec/unit/defmastership/export/csv/formatter_spec.rb +45 -231
  49. data/spec/unit/defmastership/export/formatter_spec.rb +97 -0
  50. data/spec/unit/defmastership/export/header_formatter_spec.rb +2 -6
  51. data/spec/unit/defmastership/export/json/formatter_spec.rb +85 -0
  52. data/spec/unit/defmastership/export/xlsx/formatter_spec.rb +82 -0
  53. data/spec/unit/defmastership/export/yaml/formatter_spec.rb +85 -0
  54. data/spec/unit/defmastership/hash_spec.rb +2 -0
  55. data/spec/unit/defmastership/modifier/change_ref_spec.rb +66 -97
  56. data/spec/unit/defmastership/modifier/factory_spec.rb +40 -17
  57. data/spec/unit/defmastership/modifier/modifier_common_spec.rb +7 -5
  58. data/spec/unit/defmastership/modifier/rename_included_files_spec.rb +105 -85
  59. data/spec/unit/defmastership/modifier/update_def_checksum_spec.rb +6 -13
  60. data/spec/unit/defmastership/modifier/update_def_spec.rb +79 -22
  61. data/spec/unit/defmastership/modifier/update_def_version_spec.rb +13 -37
  62. data/spec/unit/defmastership/modifier/update_eref_checksum_spec.rb +209 -0
  63. data/spec/unit/defmastership/modifier/update_eref_version_spec.rb +227 -0
  64. data/spec/unit/defmastership/modifier/update_iref_checksum_spec.rb +133 -0
  65. data/spec/unit/defmastership/modifier/update_iref_version_spec.rb +162 -0
  66. data/tasks/code_quality.rake +1 -8
  67. data/tasks/test.rake +15 -0
  68. metadata +59 -6
@@ -0,0 +1,162 @@
1
+ # Copyright (c) 2025 Jerome Arbez-Gindre
2
+ # frozen_string_literal: true
3
+
4
+ require('defmastership/modifier/update_iref_version')
5
+
6
+ RSpec.describe(Defmastership::Modifier::UpdateIrefVersion) do
7
+ subject(:modifier) { described_class.new({}) }
8
+
9
+ describe '.new' do
10
+ it { is_expected.not_to(be_nil) }
11
+ it { expect(described_class.ancestors).to(include(Defmastership::Modifier::ModifierCommon)) }
12
+ it { is_expected.to(have_attributes(config: {})) }
13
+ end
14
+
15
+ describe '.replacement_methods' do
16
+ it { expect(described_class.replacement_methods).to(eq(%i[replace_irefs])) }
17
+ end
18
+
19
+ describe '#do_modifications' do
20
+ let(:document) { instance_double(Defmastership::Document, 'document') }
21
+ let(:adoc_sources) do
22
+ {
23
+ 'file1.adoc' => 'pouet',
24
+ 'file2.adoc' => 'tagada'
25
+ }
26
+ end
27
+
28
+ before do
29
+ allow(Defmastership::Document).to(receive(:new).and_return(document))
30
+ allow(document).to(receive(:parse_file_with_preprocessor))
31
+ allow_any_instance_of(Defmastership::Modifier::ModifierCommon).to(receive(:do_modifications).and_return(adoc_sources))
32
+
33
+ modifier.do_modifications(adoc_sources)
34
+ end
35
+
36
+ it { expect(Defmastership::Document).to(have_received(:new)) }
37
+
38
+ it do
39
+ expect(document).to(
40
+ have_received(:parse_file_with_preprocessor)
41
+ .once.with('file1.adoc')
42
+ .once.with('file2.adoc')
43
+ )
44
+ end
45
+
46
+ it { expect(modifier.do_modifications(adoc_sources)).to(eq(adoc_sources)) }
47
+
48
+ it 'call the parent method' do
49
+ expect_any_instance_of(Defmastership::Modifier::ModifierCommon).to(receive(:do_modifications).with(adoc_sources))
50
+ modifier.do_modifications(adoc_sources)
51
+ end
52
+ end
53
+
54
+ describe '#replace_irefs' do
55
+ let(:document) { instance_double(Defmastership::Document, 'document') }
56
+ let(:definition) { instance_double(Defmastership::Definition, 'definition') }
57
+
58
+ before do
59
+ allow(Defmastership::Document).to(receive(:new).and_return(document))
60
+ end
61
+
62
+ context 'when the line is matching a good internal ref definition (with version)' do
63
+ before do
64
+ allow(document).to(receive(:ref_to_def).and_return(definition))
65
+ allow(definition).to(receive(:explicit_version).and_return('z'))
66
+ end
67
+
68
+ [
69
+ ['', '(z)'],
70
+ ['(~abcd1234)', '(z~abcd1234)'],
71
+ ['(a)', '(z)'],
72
+ ['(a~abcd1234)', '(z~abcd1234)']
73
+ ].each do |from, to|
74
+ it do
75
+ modifier.replace_irefs('', "whatever defs:iref[THE_REF#{from}] whatever")
76
+ expect(document).to(have_received(:ref_to_def).with('THE_REF'))
77
+ end
78
+
79
+ it do
80
+ modifier.replace_irefs('', "whatever defs:iref[THE_REF#{from}] whatever")
81
+ expect(definition).to(have_received(:explicit_version))
82
+ end
83
+
84
+ it {
85
+ expect(modifier.replace_irefs('', "whatever defs:iref[THE_REF#{from}] whatever"))
86
+ .to(eq("whatever defs:iref[THE_REF#{to}] whatever"))
87
+ }
88
+ end
89
+ end
90
+
91
+ context 'when the line is matching a good internal ref definition (without version)' do
92
+ before do
93
+ allow(document).to(receive(:ref_to_def).and_return(definition))
94
+ allow(definition).to(receive(:explicit_version).and_return(nil))
95
+ end
96
+
97
+ [
98
+ ['', ''],
99
+ ['(~abcd1234)', '(~abcd1234)'],
100
+ ['(a)', ''],
101
+ ['(a~abcd1234)', '(~abcd1234)']
102
+ ].each do |from, to|
103
+ it do
104
+ modifier.replace_irefs('', "whatever defs:iref[THE_REF#{from}] whatever")
105
+ expect(document).to(have_received(:ref_to_def).with('THE_REF'))
106
+ end
107
+
108
+ it do
109
+ modifier.replace_irefs('', "whatever defs:iref[THE_REF#{from}] whatever")
110
+ expect(definition).to(have_received(:explicit_version))
111
+ end
112
+
113
+ it {
114
+ expect(modifier.replace_irefs('', "whatever defs:iref[THE_REF#{from}] whatever"))
115
+ .to(eq("whatever defs:iref[THE_REF#{to}] whatever"))
116
+ }
117
+ end
118
+ end
119
+
120
+ context 'when the definition does not exist' do
121
+ before do
122
+ allow(document).to(receive(:ref_to_def).and_return(nil))
123
+ end
124
+
125
+ it do
126
+ modifier.replace_irefs('', 'whatever defs:iref[BAD_REF(a~abcd1234)] whatever')
127
+ expect(document).to(have_received(:ref_to_def).with('BAD_REF'))
128
+ end
129
+
130
+ it {
131
+ expect(modifier.replace_irefs('', 'whatever defs:iref[BAD_REF(a~abcd1234)] whatever'))
132
+ .to(eq('whatever defs:iref[BAD_REF(a~abcd1234)] whatever'))
133
+ }
134
+ end
135
+
136
+ context 'when the line is not a valid iref' do
137
+ it { expect(modifier.replace_irefs('', 'bla bla')).to(eq('bla bla')) }
138
+ end
139
+
140
+ context 'when the line is matching more than one iref' do
141
+ let(:other_definition) { instance_double(Defmastership::Definition, 'other_definition') }
142
+
143
+ before do
144
+ allow(document).to(receive(:ref_to_def).with('REF1').and_return(definition))
145
+ allow(document).to(receive(:ref_to_def).with('REF2').and_return(other_definition))
146
+ allow(definition).to(receive(:explicit_version).and_return('pouet'))
147
+ allow(other_definition).to(receive(:explicit_version).and_return('tagada'))
148
+ modifier.replace_irefs('', 'defs:iref[REF1], defs:iref[REF2]')
149
+ end
150
+
151
+ it { expect(document).to(have_received(:ref_to_def).with('REF1')) }
152
+ it { expect(document).to(have_received(:ref_to_def).with('REF2')) }
153
+ it { expect(definition).to(have_received(:explicit_version)) }
154
+ it { expect(other_definition).to(have_received(:explicit_version)) }
155
+
156
+ it {
157
+ expect(modifier.replace_irefs('', 'defs:iref[REF1], defs:iref[REF2]'))
158
+ .to(eq('defs:iref[REF1(pouet)], defs:iref[REF2(tagada)]'))
159
+ }
160
+ end
161
+ end
162
+ end
@@ -56,14 +56,7 @@ namespace 'quality' do
56
56
  end
57
57
 
58
58
  desc 'Runs all quality code check'
59
- task(
60
- all: [
61
- 'quality:rubocop',
62
- 'quality:reek',
63
- 'quality:flay',
64
- 'quality:rubycritic'
65
- ]
66
- )
59
+ task(all: ['quality:rubocop', 'quality:reek', 'quality:flay'])
67
60
  end
68
61
  # rubocop:enable Metrics/BlockLength
69
62
 
data/tasks/test.rake CHANGED
@@ -16,6 +16,18 @@ namespace 'test' do
16
16
  t.cucumber_opts = ['--profile wip']
17
17
  end
18
18
 
19
+ desc 'mutation testing'
20
+ task :mutation do
21
+ sh 'mutant run'
22
+ end
23
+
24
+ namespace 'mutation' do
25
+ desc 'mutation testing (fail fast)'
26
+ task :ff do
27
+ sh 'mutant run --fail-fast'
28
+ end
29
+ end
30
+
19
31
  desc 'Runs all unit tests and acceptance tests'
20
32
  task(all: ['test:spec', 'test:features'])
21
33
  end
@@ -28,3 +40,6 @@ task(test: 'test:all')
28
40
 
29
41
  desc('Test all features')
30
42
  task(cucumber: 'test:features')
43
+
44
+ desc 'Synonym for test:mutation'
45
+ task(mutation: 'test:mutation')
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: defmastership
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.2
4
+ version: 1.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jérôme Arbez-Gindre
@@ -57,14 +57,14 @@ dependencies:
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: '1.5'
60
+ version: 1.5.5
61
61
  type: :runtime
62
62
  prerelease: false
63
63
  version_requirements: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: '1.5'
67
+ version: 1.5.5
68
68
  - !ruby/object:Gem::Dependency
69
69
  name: facets
70
70
  requirement: !ruby/object:Gem::Requirement
@@ -85,14 +85,14 @@ dependencies:
85
85
  requirements:
86
86
  - - "~>"
87
87
  - !ruby/object:Gem::Version
88
- version: '3.1'
88
+ version: '4.0'
89
89
  type: :runtime
90
90
  prerelease: false
91
91
  version_requirements: !ruby/object:Gem::Requirement
92
92
  requirements:
93
93
  - - "~>"
94
94
  - !ruby/object:Gem::Version
95
- version: '3.1'
95
+ version: '4.0'
96
96
  - !ruby/object:Gem::Dependency
97
97
  name: gli
98
98
  requirement: !ruby/object:Gem::Requirement
@@ -107,6 +107,20 @@ dependencies:
107
107
  - - "~>"
108
108
  - !ruby/object:Gem::Version
109
109
  version: '2.22'
110
+ - !ruby/object:Gem::Dependency
111
+ name: memoist
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '0.16'
117
+ type: :runtime
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '0.16'
110
124
  - !ruby/object:Gem::Dependency
111
125
  name: ostruct
112
126
  requirement: !ruby/object:Gem::Requirement
@@ -121,6 +135,20 @@ dependencies:
121
135
  - - "~>"
122
136
  - !ruby/object:Gem::Version
123
137
  version: '0.6'
138
+ - !ruby/object:Gem::Dependency
139
+ name: rubyXL
140
+ requirement: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '3.4'
145
+ type: :runtime
146
+ prerelease: false
147
+ version_requirements: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '3.4'
124
152
  email: jeromearbezgindre@gmail.com
125
153
  executables:
126
154
  - defmastership
@@ -147,6 +175,10 @@ files:
147
175
  - features/defmastership.feature
148
176
  - features/defmastership_version.feature
149
177
  - features/export.feature
178
+ - features/external_ref_checksum.feature
179
+ - features/external_ref_version.feature
180
+ - features/internal_ref_checksum.feature
181
+ - features/internal_ref_version.feature
150
182
  - features/modify.feature
151
183
  - features/rename_included_files.feature
152
184
  - features/step_definitions/defmastership_steps.rb
@@ -156,12 +188,17 @@ files:
156
188
  - lib/defmastership/batch_modifier.rb
157
189
  - lib/defmastership/comment_filter.rb
158
190
  - lib/defmastership/config_preserver.rb
191
+ - lib/defmastership/def_type_list.rb
159
192
  - lib/defmastership/definition.rb
160
193
  - lib/defmastership/definition_parser.rb
161
194
  - lib/defmastership/document.rb
162
195
  - lib/defmastership/export/body_formatter.rb
163
196
  - lib/defmastership/export/csv/formatter.rb
197
+ - lib/defmastership/export/formatter.rb
164
198
  - lib/defmastership/export/header_formatter.rb
199
+ - lib/defmastership/export/json/formatter.rb
200
+ - lib/defmastership/export/xlsx/formatter.rb
201
+ - lib/defmastership/export/yaml/formatter.rb
165
202
  - lib/defmastership/filters.rb
166
203
  - lib/defmastership/hash_merge_no_new.rb
167
204
  - lib/defmastership/matching_line.rb
@@ -169,20 +206,32 @@ files:
169
206
  - lib/defmastership/modifier/factory.rb
170
207
  - lib/defmastership/modifier/modifier_common.rb
171
208
  - lib/defmastership/modifier/rename_included_files.rb
209
+ - lib/defmastership/modifier/replacement_formatter.rb
172
210
  - lib/defmastership/modifier/update_def.rb
173
211
  - lib/defmastership/modifier/update_def_checksum.rb
174
212
  - lib/defmastership/modifier/update_def_version.rb
213
+ - lib/defmastership/modifier/update_eref_checksum.rb
214
+ - lib/defmastership/modifier/update_eref_common.rb
215
+ - lib/defmastership/modifier/update_eref_version.rb
216
+ - lib/defmastership/modifier/update_iref_checksum.rb
217
+ - lib/defmastership/modifier/update_iref_common.rb
218
+ - lib/defmastership/modifier/update_iref_version.rb
175
219
  - lib/defmastership/version.rb
176
220
  - spec/spec_helper.rb
177
221
  - spec/unit/defmastership/app_spec.rb
178
222
  - spec/unit/defmastership/batch_modifier_spec.rb
179
223
  - spec/unit/defmastership/config_preserver_spec.rb
224
+ - spec/unit/defmastership/def_type_list_spec.rb
180
225
  - spec/unit/defmastership/definition_parser_spec.rb
181
226
  - spec/unit/defmastership/definition_spec.rb
182
227
  - spec/unit/defmastership/document_spec.rb
183
228
  - spec/unit/defmastership/export/body_formatter_spec.rb
184
229
  - spec/unit/defmastership/export/csv/formatter_spec.rb
230
+ - spec/unit/defmastership/export/formatter_spec.rb
185
231
  - spec/unit/defmastership/export/header_formatter_spec.rb
232
+ - spec/unit/defmastership/export/json/formatter_spec.rb
233
+ - spec/unit/defmastership/export/xlsx/formatter_spec.rb
234
+ - spec/unit/defmastership/export/yaml/formatter_spec.rb
186
235
  - spec/unit/defmastership/hash_spec.rb
187
236
  - spec/unit/defmastership/matching_line_spec.rb
188
237
  - spec/unit/defmastership/modifier/change_ref_spec.rb
@@ -192,6 +241,10 @@ files:
192
241
  - spec/unit/defmastership/modifier/update_def_checksum_spec.rb
193
242
  - spec/unit/defmastership/modifier/update_def_spec.rb
194
243
  - spec/unit/defmastership/modifier/update_def_version_spec.rb
244
+ - spec/unit/defmastership/modifier/update_eref_checksum_spec.rb
245
+ - spec/unit/defmastership/modifier/update_eref_version_spec.rb
246
+ - spec/unit/defmastership/modifier/update_iref_checksum_spec.rb
247
+ - spec/unit/defmastership/modifier/update_iref_version_spec.rb
195
248
  - spec/unit/defmastership/string_spec.rb
196
249
  - spec/unit/defmastership_spec.rb
197
250
  - tasks/code_quality.rake
@@ -219,7 +272,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
219
272
  - !ruby/object:Gem::Version
220
273
  version: '0'
221
274
  requirements: []
222
- rubygems_version: 3.6.9
275
+ rubygems_version: 4.0.2
223
276
  specification_version: 4
224
277
  summary: Handling of references and definitions with asciidoctor
225
278
  test_files: []