defmastership 1.0.6 → 1.0.7
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|