defmastership 1.0.6 → 1.0.7
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/bin/defmastership +12 -7
- data/features/checksum.feature +244 -0
- data/features/export.feature +0 -53
- data/lib/defmastership.rb +3 -0
- data/lib/defmastership/change_ref_modifier.rb +2 -2
- data/lib/defmastership/document.rb +22 -12
- data/lib/defmastership/modifier_base.rb +1 -1
- data/lib/defmastership/rename_included_files_modifier.rb +2 -17
- data/lib/defmastership/update_def_checksum_line_modifier.rb +39 -0
- data/lib/defmastership/update_def_checksum_modifier.rb +21 -0
- data/lib/defmastership/version.rb +1 -1
- data/spec/unit/defmastership/document_spec.rb +59 -2
- data/spec/unit/defmastership/update_def_checksum_line_modifier_spec.rb +68 -0
- data/spec/unit/defmastership/update_def_checksum_modifier_spec.rb +75 -0
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0341f43f016456f897b3382a1a8356dd7dc5d35b37059bccfd254f5cd9ccf65d
|
4
|
+
data.tar.gz: 442ebad69c76c21f8bfb972bd53d7ce83e6431795026f7b4abc760a70b450bf7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7106dd56ff07b88ca64e67f3dbd62b46f09a078dff05a955f80a5a1473ca3ff918ff038346a9e598c8355de761e1e5dcc1270db811eadacb875d51de57032b09
|
7
|
+
data.tar.gz: 719a47a9bb86aca473565693a645a85b72ade6036a2ed1ee47cdafc00c85640c52a747e2394d59e8f2ed08803406d49f03914a1b5d74026d20ae01de56b8c474
|
data/bin/defmastership
CHANGED
@@ -2,7 +2,6 @@
|
|
2
2
|
# Copyright (c) 2020 Jerome Arbez-Gindre
|
3
3
|
# frozen_string_literal: true
|
4
4
|
|
5
|
-
require('asciidoctor')
|
6
5
|
require('csv')
|
7
6
|
require('defmastership')
|
8
7
|
require('gli')
|
@@ -52,18 +51,24 @@ module DefMastership
|
|
52
51
|
arg_name 'asciidoctor_files'
|
53
52
|
command :export, :exp, :e do |c|
|
54
53
|
c.flag(%i[separator sep s], default_value: ',', desc: 'CSV separator')
|
54
|
+
c.switch(%i[no-fail], desc: 'Exit succes even in case of wrong explicit checksum')
|
55
|
+
|
55
56
|
c.action do |_global_options, options, args|
|
56
|
-
doc = Asciidoctor.load_file(args[0], safe: :unsafe, parse: false)
|
57
|
-
# FIXME: also escape ifdef, ifndef, ifeval and endif directives
|
58
|
-
# FIXME: do this more carefully by reading line by line; if input
|
59
|
-
# differs by output by leading backslash, restore original line
|
60
|
-
lines = doc.reader.read_lines
|
61
57
|
my_doc = DefMastership::Document.new
|
62
|
-
my_doc.
|
58
|
+
my_doc.parse_file_with_preprocessor(args[0])
|
63
59
|
|
64
60
|
output_file = args[0].sub(/\.adoc$/, '.csv')
|
65
61
|
|
66
62
|
DefMastership::CSVFormatter.new(my_doc, options['separator']).export_to(output_file)
|
63
|
+
|
64
|
+
if my_doc.wrong_explicit_checksum?
|
65
|
+
my_doc.definitions.each do |definition|
|
66
|
+
next if definition.wrong_explicit_checksum.nil?
|
67
|
+
|
68
|
+
warn("WARNING: #{definition.reference} has a wrong explicit checksum (should be #{definition.sha256})")
|
69
|
+
end
|
70
|
+
exit 1 unless options[:"no-fail"]
|
71
|
+
end
|
67
72
|
end
|
68
73
|
end
|
69
74
|
|
@@ -0,0 +1,244 @@
|
|
1
|
+
Feature: checksum
|
2
|
+
As a Responsible of definitions for a given document
|
3
|
+
In order to detect modifications of defintiions
|
4
|
+
I want defmastership to export and update checksum in definitions
|
5
|
+
|
6
|
+
Scenario: Extract one definition with WRONG explicit checksum to CSV
|
7
|
+
Given a file named "thedoc.adoc" with:
|
8
|
+
"""
|
9
|
+
[define, requirement, TOTO-0001(babe1234)]
|
10
|
+
def one
|
11
|
+
"""
|
12
|
+
When I run `defmastership export thedoc.adoc`
|
13
|
+
Then it should fail with:
|
14
|
+
"""
|
15
|
+
WARNING: TOTO-0001 has a wrong explicit checksum (should be d27cb5c3)
|
16
|
+
"""
|
17
|
+
And the file "thedoc.csv" should contain:
|
18
|
+
"""
|
19
|
+
Type,Reference,Value,sha256,Wrong explicit checksum
|
20
|
+
requirement,TOTO-0001,def one,d27cb5c3,babe1234
|
21
|
+
"""
|
22
|
+
And the stdout should not contain anything
|
23
|
+
|
24
|
+
Scenario: Extract two definitions with one WRONG explicit checksum to CSV
|
25
|
+
Given a file named "thedoc.adoc" with:
|
26
|
+
"""
|
27
|
+
[define, requirement, TOTO-0001(d27cb5c3)]
|
28
|
+
def one
|
29
|
+
|
30
|
+
[define, requirement, TOTO-0002(babe1234)]
|
31
|
+
def two
|
32
|
+
"""
|
33
|
+
When I run `defmastership export thedoc.adoc`
|
34
|
+
Then it should fail with:
|
35
|
+
"""
|
36
|
+
WARNING: TOTO-0002 has a wrong explicit checksum (should be b80e1be5)
|
37
|
+
"""
|
38
|
+
Then the file "thedoc.csv" should contain:
|
39
|
+
"""
|
40
|
+
Type,Reference,Value,sha256,Wrong explicit checksum
|
41
|
+
requirement,TOTO-0001,def one,d27cb5c3,\"\"
|
42
|
+
requirement,TOTO-0002,def two,b80e1be5,babe1234
|
43
|
+
"""
|
44
|
+
And the stdout should not contain anything
|
45
|
+
|
46
|
+
Scenario: Export not failing even if WRONG explicit checksum
|
47
|
+
Given a file named "thedoc.adoc" with:
|
48
|
+
"""
|
49
|
+
[define, requirement, TOTO-0001(d27cb5c3)]
|
50
|
+
def one
|
51
|
+
|
52
|
+
[define, requirement, TOTO-0002(babe1234)]
|
53
|
+
def two
|
54
|
+
"""
|
55
|
+
When I successfully run `defmastership export --no-fail thedoc.adoc`
|
56
|
+
Then the file "thedoc.csv" should contain:
|
57
|
+
"""
|
58
|
+
Type,Reference,Value,sha256,Wrong explicit checksum
|
59
|
+
requirement,TOTO-0001,def one,d27cb5c3,\"\"
|
60
|
+
requirement,TOTO-0002,def two,b80e1be5,babe1234
|
61
|
+
"""
|
62
|
+
And the stdout should not contain anything
|
63
|
+
And the stderr should contain:
|
64
|
+
"""
|
65
|
+
WARNING: TOTO-0002 has a wrong explicit checksum (should be b80e1be5)
|
66
|
+
"""
|
67
|
+
|
68
|
+
Scenario: Extract one definition with explicit checksum to CSV
|
69
|
+
Given a file named "thedoc.adoc" with:
|
70
|
+
"""
|
71
|
+
[define, requirement, TOTO-0001(b86dcbde)]
|
72
|
+
--
|
73
|
+
Exemple of multiline requirement.
|
74
|
+
Second line.
|
75
|
+
--
|
76
|
+
"""
|
77
|
+
When I successfully run `defmastership export thedoc.adoc`
|
78
|
+
Then the file "thedoc.csv" should contain:
|
79
|
+
"""
|
80
|
+
Type,Reference,Value,sha256
|
81
|
+
requirement,TOTO-0001,"Exemple of multiline requirement.
|
82
|
+
Second line.",b86dcbde
|
83
|
+
"""
|
84
|
+
And the stdout should not contain anything
|
85
|
+
And the stderr should not contain anything
|
86
|
+
|
87
|
+
Scenario: Change one modifier
|
88
|
+
Given a file named "modifications.yml" with:
|
89
|
+
"""
|
90
|
+
---
|
91
|
+
:update_requirement_checksum:
|
92
|
+
:type: update_def_checksum
|
93
|
+
:config:
|
94
|
+
:def_type: requirement
|
95
|
+
"""
|
96
|
+
And a file named "thedoc.adoc" with:
|
97
|
+
"""
|
98
|
+
[define, requirement, TOTO-TEMP-XXX1]
|
99
|
+
--
|
100
|
+
the requirement value.
|
101
|
+
--
|
102
|
+
"""
|
103
|
+
When I successfully run `defmastership modify --modifications update_requirement_checksum thedoc.adoc`
|
104
|
+
Then the stdout should not contain anything
|
105
|
+
And the stderr should not contain anything
|
106
|
+
And the file "thedoc.adoc" should contain:
|
107
|
+
"""
|
108
|
+
[define, requirement, TOTO-TEMP-XXX1(244eed18)]
|
109
|
+
--
|
110
|
+
the requirement value.
|
111
|
+
--
|
112
|
+
"""
|
113
|
+
|
114
|
+
Scenario: Change one modifier with already set checksum
|
115
|
+
Given a file named "modifications.yml" with:
|
116
|
+
"""
|
117
|
+
---
|
118
|
+
:update_requirement_checksum:
|
119
|
+
:type: update_def_checksum
|
120
|
+
:config:
|
121
|
+
:def_type: requirement
|
122
|
+
"""
|
123
|
+
And a file named "thedoc.adoc" with:
|
124
|
+
"""
|
125
|
+
[define, requirement, TOTO-TEMP-XXX1(abcd1234)]
|
126
|
+
--
|
127
|
+
the requirement value.
|
128
|
+
--
|
129
|
+
"""
|
130
|
+
When I successfully run `defmastership modify --modifications update_requirement_checksum thedoc.adoc`
|
131
|
+
Then the stdout should not contain anything
|
132
|
+
And the stderr should not contain anything
|
133
|
+
And the file "thedoc.adoc" should contain:
|
134
|
+
"""
|
135
|
+
[define, requirement, TOTO-TEMP-XXX1(244eed18)]
|
136
|
+
--
|
137
|
+
the requirement value.
|
138
|
+
--
|
139
|
+
"""
|
140
|
+
|
141
|
+
Scenario: Checksum is calculated on included file for export
|
142
|
+
Given a file named "thedoc.adoc" with:
|
143
|
+
"""
|
144
|
+
[define, requirement, TOTO-0001]
|
145
|
+
--
|
146
|
+
include::included.txt[]
|
147
|
+
--
|
148
|
+
"""
|
149
|
+
And a file named "included.txt" with:
|
150
|
+
"""
|
151
|
+
Exemple of multiline requirement.
|
152
|
+
Second line.
|
153
|
+
"""
|
154
|
+
When I successfully run `defmastership export thedoc.adoc`
|
155
|
+
Then the file "thedoc.csv" should contain:
|
156
|
+
"""
|
157
|
+
Type,Reference,Value,sha256
|
158
|
+
requirement,TOTO-0001,"Exemple of multiline requirement.
|
159
|
+
Second line.",b86dcbde
|
160
|
+
"""
|
161
|
+
And the stdout should not contain anything
|
162
|
+
And the stderr should not contain anything
|
163
|
+
|
164
|
+
Scenario: Checksum is calculated on included file in ref modifcation
|
165
|
+
Given a file named "modifications.yml" with:
|
166
|
+
"""
|
167
|
+
---
|
168
|
+
:update_requirement_checksum:
|
169
|
+
:type: update_def_checksum
|
170
|
+
:config:
|
171
|
+
:def_type: requirement
|
172
|
+
"""
|
173
|
+
And a file named "thedoc.adoc" with:
|
174
|
+
"""
|
175
|
+
[define, requirement, TOTO-0001]
|
176
|
+
--
|
177
|
+
include::included.txt[]
|
178
|
+
--
|
179
|
+
"""
|
180
|
+
And a file named "included.txt" with:
|
181
|
+
"""
|
182
|
+
Exemple of multiline requirement.
|
183
|
+
Second line.
|
184
|
+
"""
|
185
|
+
When I successfully run `defmastership modify --modifications update_requirement_checksum thedoc.adoc`
|
186
|
+
Then the file "thedoc.adoc" should contain:
|
187
|
+
"""
|
188
|
+
[define, requirement, TOTO-0001(b86dcbde)]
|
189
|
+
--
|
190
|
+
include::included.txt[]
|
191
|
+
--
|
192
|
+
"""
|
193
|
+
And the stdout should not contain anything
|
194
|
+
And the stderr should not contain anything
|
195
|
+
|
196
|
+
Scenario: Checksum take into account variables in CSV export
|
197
|
+
Given a file named "thedoc.adoc" with:
|
198
|
+
"""
|
199
|
+
:variable: multiline
|
200
|
+
[define, requirement, TOTO-0001]
|
201
|
+
--
|
202
|
+
Exemple of {variable} requirement.
|
203
|
+
Second line.
|
204
|
+
--
|
205
|
+
"""
|
206
|
+
When I successfully run `defmastership export thedoc.adoc`
|
207
|
+
Then the file "thedoc.csv" should contain:
|
208
|
+
"""
|
209
|
+
Type,Reference,Value,sha256
|
210
|
+
requirement,TOTO-0001,"Exemple of multiline requirement.
|
211
|
+
Second line.",b86dcbde
|
212
|
+
"""
|
213
|
+
And the stdout should not contain anything
|
214
|
+
And the stderr should not contain anything
|
215
|
+
|
216
|
+
Scenario: Checksum take into account variables in ref modifcation
|
217
|
+
Given a file named "modifications.yml" with:
|
218
|
+
"""
|
219
|
+
---
|
220
|
+
:update_requirement_checksum:
|
221
|
+
:type: update_def_checksum
|
222
|
+
:config:
|
223
|
+
:def_type: requirement
|
224
|
+
"""
|
225
|
+
And a file named "thedoc.adoc" with:
|
226
|
+
"""
|
227
|
+
:variable: multiline
|
228
|
+
[define, requirement, TOTO-0001]
|
229
|
+
--
|
230
|
+
Exemple of {variable} requirement.
|
231
|
+
Second line.
|
232
|
+
--
|
233
|
+
"""
|
234
|
+
When I successfully run `defmastership modify --modifications update_requirement_checksum thedoc.adoc`
|
235
|
+
Then the file "thedoc.adoc" should contain:
|
236
|
+
"""
|
237
|
+
[define, requirement, TOTO-0001(b86dcbde)]
|
238
|
+
--
|
239
|
+
Exemple of {variable} requirement.
|
240
|
+
Second line.
|
241
|
+
--
|
242
|
+
"""
|
243
|
+
And the stdout should not contain anything
|
244
|
+
And the stderr should not contain anything
|
data/features/export.feature
CHANGED
@@ -22,59 +22,6 @@ Feature: The extract command
|
|
22
22
|
And the stdout should not contain anything
|
23
23
|
And the stderr should not contain anything
|
24
24
|
|
25
|
-
Scenario: Extract one definition with WRONG explicit checksum to CSV
|
26
|
-
Given a file named "toto.adoc" with:
|
27
|
-
"""
|
28
|
-
[define, requirement, TOTO-0001(babe1234)]
|
29
|
-
def one
|
30
|
-
"""
|
31
|
-
When I successfully run `defmastership export toto.adoc`
|
32
|
-
Then the file "toto.csv" should contain:
|
33
|
-
"""
|
34
|
-
Type,Reference,Value,sha256,Wrong explicit checksum
|
35
|
-
requirement,TOTO-0001,def one,d27cb5c3,babe1234
|
36
|
-
"""
|
37
|
-
And the stdout should not contain anything
|
38
|
-
And the stderr should not contain anything
|
39
|
-
|
40
|
-
Scenario: Extract two definitions with one WRONG explicit checksum to CSV
|
41
|
-
Given a file named "toto.adoc" with:
|
42
|
-
"""
|
43
|
-
[define, requirement, TOTO-0001(d27cb5c3)]
|
44
|
-
def one
|
45
|
-
|
46
|
-
[define, requirement, TOTO-0002(babe1234)]
|
47
|
-
def two
|
48
|
-
"""
|
49
|
-
When I successfully run `defmastership export toto.adoc`
|
50
|
-
Then the file "toto.csv" should contain:
|
51
|
-
"""
|
52
|
-
Type,Reference,Value,sha256,Wrong explicit checksum
|
53
|
-
requirement,TOTO-0001,def one,d27cb5c3,\"\"
|
54
|
-
requirement,TOTO-0002,def two,b80e1be5,babe1234
|
55
|
-
"""
|
56
|
-
And the stdout should not contain anything
|
57
|
-
And the stderr should not contain anything
|
58
|
-
|
59
|
-
Scenario: Extract one definition with explicit checksum to CSV
|
60
|
-
Given a file named "toto.adoc" with:
|
61
|
-
"""
|
62
|
-
[define, requirement, TOTO-0001(b86dcbde)]
|
63
|
-
--
|
64
|
-
Exemple of multiline requirement.
|
65
|
-
Second line.
|
66
|
-
--
|
67
|
-
"""
|
68
|
-
When I successfully run `defmastership export toto.adoc`
|
69
|
-
Then the file "toto.csv" should contain:
|
70
|
-
"""
|
71
|
-
Type,Reference,Value,sha256
|
72
|
-
requirement,TOTO-0001,"Exemple of multiline requirement.
|
73
|
-
Second line.",b86dcbde
|
74
|
-
"""
|
75
|
-
And the stdout should not contain anything
|
76
|
-
And the stderr should not contain anything
|
77
|
-
|
78
25
|
Scenario: Extract to CSV with alternative CSV separator
|
79
26
|
Given a file named "toto.adoc" with:
|
80
27
|
"""
|
data/lib/defmastership.rb
CHANGED
@@ -22,3 +22,6 @@ require('defmastership/change_ref_line_modifier')
|
|
22
22
|
|
23
23
|
require('defmastership/rename_included_files_modifier')
|
24
24
|
require('defmastership/rename_included_files_line_modifier')
|
25
|
+
|
26
|
+
require('defmastership/update_def_checksum_modifier')
|
27
|
+
require('defmastership/update_def_checksum_line_modifier')
|
@@ -1,6 +1,8 @@
|
|
1
1
|
# Copyright (c) 2020 Jerome Arbez-Gindre
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
+
require('asciidoctor')
|
5
|
+
|
4
6
|
module DefMastership
|
5
7
|
# Contains the content of a DefMastership document: mainly definitions
|
6
8
|
|
@@ -20,6 +22,22 @@ module DefMastership
|
|
20
22
|
@definition_parser = DefinitionParser.new(self)
|
21
23
|
end
|
22
24
|
|
25
|
+
def parse(lines)
|
26
|
+
lines.reject(&:commented?).each do |line|
|
27
|
+
(@in_literal ? FILTERS : FILTERS_IN_LITERAL).each do |filter|
|
28
|
+
next unless line.match(filter.regexp)
|
29
|
+
|
30
|
+
line = generate_event(filter.event, Regexp.last_match, line)
|
31
|
+
|
32
|
+
break if filter.consumed_line
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def parse_file_with_preprocessor(adoc_file)
|
38
|
+
parse(Asciidoctor.load_file(adoc_file, safe: :unsafe, parse: false).reader.read_lines)
|
39
|
+
end
|
40
|
+
|
23
41
|
def wrong_explicit_checksum?
|
24
42
|
@definitions.reduce(false) do |res, definition|
|
25
43
|
res || !definition.wrong_explicit_checksum.nil?
|
@@ -38,6 +56,10 @@ module DefMastership
|
|
38
56
|
line
|
39
57
|
end
|
40
58
|
|
59
|
+
def ref_to_def(ref)
|
60
|
+
@definitions.find { |definition| definition.reference == ref }
|
61
|
+
end
|
62
|
+
|
41
63
|
def add_line(_match, line)
|
42
64
|
@definitions.last << line
|
43
65
|
line
|
@@ -96,18 +118,6 @@ module DefMastership
|
|
96
118
|
new_line
|
97
119
|
end
|
98
120
|
|
99
|
-
def parse(lines)
|
100
|
-
lines.reject(&:commented?).each do |line|
|
101
|
-
(@in_literal ? FILTERS : FILTERS_IN_LITERAL).each do |filter|
|
102
|
-
next unless line.match(filter.regexp)
|
103
|
-
|
104
|
-
line = generate_event(filter.event, Regexp.last_match, line)
|
105
|
-
|
106
|
-
break if filter.consumed_line
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
121
|
private
|
112
122
|
|
113
123
|
def generate_event(event, match, line)
|
@@ -4,27 +4,12 @@
|
|
4
4
|
module DefMastership
|
5
5
|
# Change included filenames
|
6
6
|
class RenameIncludedFilesModifier < ModifierBase
|
7
|
-
def do_modifications(adoc_texts)
|
8
|
-
line_modifier = line_modifier_class.from_config(@config)
|
9
|
-
|
10
|
-
adoc_texts =
|
11
|
-
replacements.reduce(adoc_texts) do |texts, method|
|
12
|
-
texts.transform_values do |text|
|
13
|
-
text.lines.map { |line| line_modifier.public_send(method, line) }.join
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
@config = line_modifier.config
|
18
|
-
@changes = line_modifier.changes
|
19
|
-
adoc_texts
|
20
|
-
end
|
21
|
-
|
22
7
|
def replacements
|
23
8
|
%i[replace]
|
24
9
|
end
|
25
10
|
|
26
|
-
def
|
27
|
-
RenameIncludedFilesLineModifier
|
11
|
+
def new_line_modifier(config, _adoc_texts)
|
12
|
+
RenameIncludedFilesLineModifier.from_config(config)
|
28
13
|
end
|
29
14
|
end
|
30
15
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# Copyright (c) 2020 Jerome Arbez-Gindre
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module DefMastership
|
5
|
+
# modify one line after another
|
6
|
+
class UpdateDefChecksumLineModifier < LineModifierBase
|
7
|
+
attr_accessor :document
|
8
|
+
|
9
|
+
def self.from_config(hash)
|
10
|
+
new.from_config(hash)
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
super
|
15
|
+
@config = {
|
16
|
+
def_type: ''
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
def replace(line)
|
21
|
+
match = matched?(line)
|
22
|
+
|
23
|
+
return line unless match
|
24
|
+
return line unless match[:type] == def_type
|
25
|
+
|
26
|
+
explicit_checksum_str = match[:explicit_checksum].nil? ? '' : "(#{match[:explicit_checksum]})"
|
27
|
+
line.gsub("#{match[:reference]}#{explicit_checksum_str}") do
|
28
|
+
"#{match[:reference]}(#{@document.ref_to_def(match[:reference]).sha256})"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def matched?(line)
|
33
|
+
return if line.commented?
|
34
|
+
return unless line =~ DMRegexp::DEFINITION
|
35
|
+
|
36
|
+
Regexp.last_match
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# Copyright (c) 2020 Jerome Arbez-Gindre
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module DefMastership
|
5
|
+
# Update definition checksum wih calculated one
|
6
|
+
class UpdateDefChecksumModifier < ModifierBase
|
7
|
+
def replacements
|
8
|
+
%i[replace]
|
9
|
+
end
|
10
|
+
|
11
|
+
def new_line_modifier(config, adoc_texts)
|
12
|
+
document = Document.new
|
13
|
+
adoc_texts.each do |adoc_file, _|
|
14
|
+
document.parse_file_with_preprocessor(adoc_file)
|
15
|
+
end
|
16
|
+
line_modifier = UpdateDefChecksumLineModifier.from_config(config)
|
17
|
+
line_modifier.document = document
|
18
|
+
line_modifier
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -426,9 +426,38 @@ RSpec.describe(DefMastership::Document) do
|
|
426
426
|
end
|
427
427
|
end
|
428
428
|
|
429
|
-
describe '#
|
430
|
-
|
429
|
+
describe '#parse_file_with_preprocessor' do
|
430
|
+
let(:definition) { instance_double(DefMastership::Definition, 'definition') }
|
431
|
+
let(:input_lines) { ['[define, requirement, TOTO-0001]'] }
|
432
|
+
let(:adoc_doc) { instance_double(Asciidoctor::Document, 'adoc_doc') }
|
433
|
+
let(:adoc_reader) { instance_double(Asciidoctor::Reader, 'adoc_reader') }
|
434
|
+
|
435
|
+
before do
|
436
|
+
allow(Asciidoctor).to(
|
437
|
+
receive(:load_file).with('the_file.adoc', { parse: false, safe: :unsafe }).and_return(adoc_doc)
|
438
|
+
)
|
439
|
+
allow(adoc_doc).to(receive(:reader).and_return(adoc_reader))
|
440
|
+
allow(adoc_reader).to(receive(:read_lines).and_return(input_lines))
|
441
|
+
allow(DefMastership::Definition).to(receive(:new).and_return(definition))
|
442
|
+
allow(definition).to(receive(:<<).and_return(definition))
|
443
|
+
allow(definition).to(receive(:labels).and_return(Set.new))
|
444
|
+
document.parse_file_with_preprocessor('the_file.adoc')
|
445
|
+
end
|
446
|
+
|
447
|
+
it { expect(Asciidoctor).to(have_received(:load_file).with('the_file.adoc', { parse: false, safe: :unsafe })) }
|
448
|
+
it { expect(adoc_doc).to(have_received(:reader).with(no_args)) }
|
449
|
+
it { expect(adoc_reader).to(have_received(:read_lines).with(no_args)) }
|
450
|
+
|
451
|
+
it do
|
452
|
+
expect(DefMastership::Definition).to(
|
453
|
+
have_received(:new).with(
|
454
|
+
matchdata_including(type: 'requirement', reference: 'TOTO-0001')
|
455
|
+
)
|
456
|
+
)
|
457
|
+
end
|
458
|
+
end
|
431
459
|
|
460
|
+
describe '#wrong_explicit_checksum?' do
|
432
461
|
let(:def1) { instance_double(DefMastership::Definition, 'definition') }
|
433
462
|
let(:def2) { instance_double(DefMastership::Definition, 'definition') }
|
434
463
|
let(:input_lines) do
|
@@ -473,4 +502,32 @@ RSpec.describe(DefMastership::Document) do
|
|
473
502
|
it { expect(document.wrong_explicit_checksum?).to(eq(true)) }
|
474
503
|
end
|
475
504
|
end
|
505
|
+
|
506
|
+
describe '#ref_to_def?' do
|
507
|
+
let(:def1) { instance_double(DefMastership::Definition, 'definition') }
|
508
|
+
let(:def2) { instance_double(DefMastership::Definition, 'definition') }
|
509
|
+
let(:input_lines) do
|
510
|
+
[
|
511
|
+
'[define, requirement, TOTO-0001]',
|
512
|
+
'def one',
|
513
|
+
'',
|
514
|
+
'[define, requirement, TOTO-0002(1234)]',
|
515
|
+
'def two'
|
516
|
+
]
|
517
|
+
end
|
518
|
+
|
519
|
+
before do
|
520
|
+
allow(DefMastership::Definition).to(receive(:new).twice.and_return(def1, def2))
|
521
|
+
allow(def1).to(receive(:labels)).and_return([])
|
522
|
+
allow(def2).to(receive(:labels)).and_return([])
|
523
|
+
allow(def1).to(receive(:<<).and_return(def1))
|
524
|
+
allow(def2).to(receive(:<<).and_return(def2))
|
525
|
+
allow(def1).to(receive(:reference).and_return('TOTO-0001'))
|
526
|
+
allow(def2).to(receive(:reference).and_return('TOTO-0002'))
|
527
|
+
document.parse(input_lines)
|
528
|
+
end
|
529
|
+
|
530
|
+
it { expect(document.ref_to_def('TOTO-0001')).to(eq(def1)) }
|
531
|
+
it { expect(document.ref_to_def('TOTO-0002')).to(eq(def2)) }
|
532
|
+
end
|
476
533
|
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# Copyright (c) 2020 Jerome Arbez-Gindre
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require('defmastership')
|
5
|
+
|
6
|
+
RSpec.describe(DefMastership::UpdateDefChecksumLineModifier) do
|
7
|
+
subject(:linemodifier) { described_class.new }
|
8
|
+
|
9
|
+
describe '.new' do
|
10
|
+
it { is_expected.not_to(be(nil)) }
|
11
|
+
it { is_expected.to(have_attributes(def_type: '')) }
|
12
|
+
it { is_expected.to(have_attributes(changes: [])) }
|
13
|
+
it { expect { linemodifier.user_defined_attribute }.to(raise_error(NoMethodError)) }
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '.from_config' do
|
17
|
+
subject(:linemodifier) do
|
18
|
+
described_class.from_config(
|
19
|
+
def_type: 'requirement'
|
20
|
+
)
|
21
|
+
end
|
22
|
+
|
23
|
+
it { is_expected.not_to(be(nil)) }
|
24
|
+
it { is_expected.to(have_attributes(def_type: 'requirement')) }
|
25
|
+
it { is_expected.to(have_attributes(document: nil)) }
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '#replace' do
|
29
|
+
subject(:linemodifier) do
|
30
|
+
described_class.from_config(
|
31
|
+
def_type: 'requirement'
|
32
|
+
)
|
33
|
+
end
|
34
|
+
|
35
|
+
let(:definition) { instance_double(DefMastership::Definition, 'definition') }
|
36
|
+
let(:document) { instance_double(DefMastership::Document, 'document') }
|
37
|
+
let(:definitions) { { 'REFERENCE' => definition } }
|
38
|
+
|
39
|
+
before do
|
40
|
+
linemodifier.document = document
|
41
|
+
allow(File).to(receive(:rename))
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'when definition has not the good type' do
|
45
|
+
it do
|
46
|
+
expect(linemodifier.replace('[define,req,REFERENCE]'))
|
47
|
+
.to(eq('[define,req,REFERENCE]'))
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'when definition has the good type' do
|
52
|
+
before do
|
53
|
+
allow(document).to(receive(:ref_to_def).with('REFERENCE').and_return(definition))
|
54
|
+
allow(definition).to(receive(:sha256).and_return('abcd1234'))
|
55
|
+
end
|
56
|
+
|
57
|
+
it do
|
58
|
+
expect(linemodifier.replace('[define,requirement,REFERENCE]'))
|
59
|
+
.to(eq('[define,requirement,REFERENCE(abcd1234)]'))
|
60
|
+
end
|
61
|
+
|
62
|
+
it do
|
63
|
+
expect(linemodifier.replace('[define,requirement,REFERENCE(bad)]'))
|
64
|
+
.to(eq('[define,requirement,REFERENCE(abcd1234)]'))
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# Copyright (c) 2020 Jerome Arbez-Gindre
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require('defmastership')
|
5
|
+
|
6
|
+
RSpec.describe(DefMastership::UpdateDefChecksumModifier) do
|
7
|
+
subject(:modifier) do
|
8
|
+
described_class.new(
|
9
|
+
'fake config'
|
10
|
+
)
|
11
|
+
end
|
12
|
+
|
13
|
+
let(:adoc_texts) do
|
14
|
+
{
|
15
|
+
'file1.adoc' => "file1 line1\nfile1 line2",
|
16
|
+
'file2.adoc' => "file2 line1\nfile2 line2"
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
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: [])) }
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '#do_modifications' do
|
27
|
+
let(:line_modifier) { instance_double(DefMastership::UpdateDefChecksumLineModifier, 'lineModifier') }
|
28
|
+
let(:document) { instance_double(DefMastership::Document, 'document') }
|
29
|
+
|
30
|
+
before do
|
31
|
+
allow(DefMastership::UpdateDefChecksumLineModifier).to(
|
32
|
+
receive(:from_config).with('fake config').and_return(line_modifier)
|
33
|
+
)
|
34
|
+
allow(DefMastership::Document).to(receive(:new).and_return(document))
|
35
|
+
allow(document).to(receive(:parse_file_with_preprocessor))
|
36
|
+
allow(line_modifier).to(receive(:'document=').with(document))
|
37
|
+
allow(line_modifier).to(receive(:replace).with("file1 line1\n").and_return("new file1 line1\n"))
|
38
|
+
allow(line_modifier).to(receive(:replace).with('file1 line2').and_return('new file1 line2'))
|
39
|
+
allow(line_modifier).to(receive(:replace).with("file2 line1\n").and_return("new file2 line1\n"))
|
40
|
+
allow(line_modifier).to(receive(:replace).with('file2 line2').and_return('new 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]]))
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'when detailed expectations' do
|
46
|
+
before { modifier.do_modifications(adoc_texts) }
|
47
|
+
|
48
|
+
it do
|
49
|
+
expect(DefMastership::UpdateDefChecksumLineModifier).to(
|
50
|
+
have_received(:from_config).with('fake config')
|
51
|
+
)
|
52
|
+
end
|
53
|
+
|
54
|
+
it { expect(document).to(have_received(:parse_file_with_preprocessor).with('file1.adoc')) }
|
55
|
+
it { expect(document).to(have_received(:parse_file_with_preprocessor).with('file2.adoc')) }
|
56
|
+
it { expect(line_modifier).to(have_received(:'document=').with(document)) }
|
57
|
+
it { expect(line_modifier).to(have_received(:replace).with("file1 line1\n")) }
|
58
|
+
it { expect(line_modifier).to(have_received(:replace).with('file1 line2')) }
|
59
|
+
it { expect(line_modifier).to(have_received(:replace).with("file2 line1\n")) }
|
60
|
+
it { expect(line_modifier).to(have_received(:replace).with('file2 line2')) }
|
61
|
+
it { expect(line_modifier).to(have_received(:config)) }
|
62
|
+
it { expect(line_modifier).to(have_received(:changes)) }
|
63
|
+
it { is_expected.to(have_attributes(config: 'new fake config')) }
|
64
|
+
it { is_expected.to(have_attributes(changes: [%w[from1 to1], %w[from2 to2]])) }
|
65
|
+
end
|
66
|
+
|
67
|
+
it do
|
68
|
+
expected_adoc = {
|
69
|
+
'file1.adoc' => "new file1 line1\nnew file1 line2",
|
70
|
+
'file2.adoc' => "new file2 line1\nnew file2 line2"
|
71
|
+
}
|
72
|
+
expect(modifier.do_modifications(adoc_texts)).to(eq(expected_adoc))
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: defmastership
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jérôme Arbez-Gindre
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-02-
|
11
|
+
date: 2021-02-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aruba
|
@@ -193,6 +193,7 @@ files:
|
|
193
193
|
- defmastership.gemspec
|
194
194
|
- defmastership.rdoc
|
195
195
|
- features/changeref.feature
|
196
|
+
- features/checksum.feature
|
196
197
|
- features/defmastership.feature
|
197
198
|
- features/export.feature
|
198
199
|
- features/modify.feature
|
@@ -216,6 +217,8 @@ files:
|
|
216
217
|
- lib/defmastership/modifier_base.rb
|
217
218
|
- lib/defmastership/rename_included_files_line_modifier.rb
|
218
219
|
- lib/defmastership/rename_included_files_modifier.rb
|
220
|
+
- lib/defmastership/update_def_checksum_line_modifier.rb
|
221
|
+
- lib/defmastership/update_def_checksum_modifier.rb
|
219
222
|
- lib/defmastership/version.rb
|
220
223
|
- spec/spec_helper.rb
|
221
224
|
- spec/unit/defmastership/batch_modifier_spec.rb
|
@@ -230,6 +233,8 @@ files:
|
|
230
233
|
- spec/unit/defmastership/document_spec.rb
|
231
234
|
- spec/unit/defmastership/rename_included_files_line_modifier_spec.rb
|
232
235
|
- spec/unit/defmastership/rename_included_files_modifier_spec.rb
|
236
|
+
- spec/unit/defmastership/update_def_checksum_line_modifier_spec.rb
|
237
|
+
- spec/unit/defmastership/update_def_checksum_modifier_spec.rb
|
233
238
|
- spec/unit/defmastership_spec.rb
|
234
239
|
homepage: https://gitlab.com/jjag/defmastership/
|
235
240
|
licenses:
|