defmastership 1.0.1 → 1.0.6
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/.gitignore +2 -0
- data/.gitlab-ci.yml +20 -0
- data/.rubocop.yml +5 -4
- data/Gemfile +1 -0
- data/LICENSE +22 -0
- data/Rakefile +2 -2
- data/bin/defmastership +25 -17
- data/cucumber.yml +2 -0
- data/defmastership.gemspec +18 -11
- data/features/changeref.feature +82 -129
- data/features/export.feature +102 -31
- data/features/modify.feature +143 -0
- data/features/rename_included_files.feature +121 -0
- data/features/step_definitions/defmastership_steps.rb +1 -0
- data/features/support/env.rb +1 -0
- data/lib/defmastership.rb +12 -3
- data/lib/defmastership/batch_modifier.rb +33 -0
- data/lib/defmastership/{ref_changer.rb → change_ref_line_modifier.rb} +19 -35
- data/lib/defmastership/change_ref_modifier.rb +15 -0
- data/lib/defmastership/comment_filter.rb +1 -0
- data/lib/defmastership/constants.rb +15 -1
- data/lib/defmastership/csv_formatter.rb +19 -18
- data/lib/defmastership/csv_formatter_body.rb +12 -6
- data/lib/defmastership/csv_formatter_header.rb +12 -10
- data/lib/defmastership/definition.rb +12 -0
- data/lib/defmastership/definition_parser.rb +46 -0
- data/lib/defmastership/document.rb +44 -75
- data/lib/defmastership/filters.rb +30 -0
- data/lib/defmastership/line_modifier_base.rb +29 -0
- data/lib/defmastership/modifier_base.rb +29 -0
- data/lib/defmastership/rename_included_files_line_modifier.rb +126 -0
- data/lib/defmastership/rename_included_files_modifier.rb +30 -0
- data/lib/defmastership/version.rb +2 -1
- data/spec/spec_helper.rb +2 -0
- data/spec/unit/defmastership/batch_modifier_spec.rb +115 -0
- data/spec/unit/defmastership/{ref_changer_spec.rb → change_ref_line_modifier_spec.rb} +49 -26
- data/spec/unit/defmastership/change_ref_modifier_spec.rb +76 -0
- data/spec/unit/defmastership/comment_filter_spec.rb +9 -4
- data/spec/unit/defmastership/csv_formatter_body_spec.rb +62 -37
- data/spec/unit/defmastership/csv_formatter_header_spec.rb +47 -22
- data/spec/unit/defmastership/csv_formatter_spec.rb +67 -105
- data/spec/unit/defmastership/definition_parser_spec.rb +63 -0
- data/spec/unit/defmastership/definition_spec.rb +31 -4
- data/spec/unit/defmastership/document_spec.rb +113 -35
- data/spec/unit/defmastership/rename_included_files_line_modifier_spec.rb +203 -0
- data/spec/unit/defmastership/rename_included_files_modifier_spec.rb +67 -0
- data/spec/unit/defmastership_spec.rb +1 -0
- metadata +44 -17
- data/Gemfile.lock +0 -140
- data/lib/defmastership/batch_changer.rb +0 -40
- data/lib/defmastership/project_ref_changer.rb +0 -27
- data/spec/unit/defmastership/batch_changer_spec.rb +0 -108
- data/spec/unit/defmastership/project_ref_changer_spec.rb +0 -79
data/features/support/env.rb
CHANGED
data/lib/defmastership.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# Copyright (c) 2020 Jerome Arbez-Gindre
|
1
2
|
# frozen_string_literal: true
|
2
3
|
|
3
4
|
require('defmastership/version')
|
@@ -6,10 +7,18 @@ require('defmastership/version')
|
|
6
7
|
# you just need to require this one file in your bin file
|
7
8
|
require('defmastership/constants')
|
8
9
|
require('defmastership/definition')
|
10
|
+
require('defmastership/definition_parser')
|
11
|
+
require('defmastership/filters')
|
9
12
|
require('defmastership/document')
|
10
13
|
require('defmastership/comment_filter')
|
11
14
|
require('defmastership/csv_formatter')
|
12
15
|
|
13
|
-
require('defmastership/
|
14
|
-
require('defmastership/
|
15
|
-
require('defmastership/
|
16
|
+
require('defmastership/modifier_base')
|
17
|
+
require('defmastership/line_modifier_base')
|
18
|
+
require('defmastership/batch_modifier')
|
19
|
+
|
20
|
+
require('defmastership/change_ref_modifier')
|
21
|
+
require('defmastership/change_ref_line_modifier')
|
22
|
+
|
23
|
+
require('defmastership/rename_included_files_modifier')
|
24
|
+
require('defmastership/rename_included_files_line_modifier')
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# Copyright (c) 2020 Jerome Arbez-Gindre
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module DefMastership
|
5
|
+
# Change references from temporary to definitive with multiple RefChangers
|
6
|
+
class BatchModifier
|
7
|
+
attr_reader :config, :adoc_texts, :changes
|
8
|
+
|
9
|
+
def initialize(config, adoc_texts)
|
10
|
+
@config = config
|
11
|
+
@adoc_texts = adoc_texts
|
12
|
+
@changes = []
|
13
|
+
end
|
14
|
+
|
15
|
+
def apply(modifs)
|
16
|
+
modifs.split(/\s*,\s*/).each do |modif|
|
17
|
+
modifier = modifier_from(modif)
|
18
|
+
@adoc_texts = modifier.do_modifications(@adoc_texts)
|
19
|
+
@config[modif.to_sym][:config] = modifier.config
|
20
|
+
modifier.changes.each do |change|
|
21
|
+
@changes << [modif] + change
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def modifier_from(modif)
|
29
|
+
class_name = "#{@config[modif.to_sym][:type].split('_').map(&:capitalize).join}Modifier"
|
30
|
+
DefMastership.const_get(class_name).new(@config[modif.to_sym][:config])
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -1,12 +1,11 @@
|
|
1
|
+
# Copyright (c) 2020 Jerome Arbez-Gindre
|
1
2
|
# frozen_string_literal: true
|
2
3
|
|
3
4
|
module DefMastership
|
4
|
-
# Change references from temporary to definitive
|
5
|
-
class
|
6
|
-
|
7
|
-
|
8
|
-
def self.from_h(hash)
|
9
|
-
new.from_h(hash)
|
5
|
+
# Change references from temporary to definitive with multiple RefChangers
|
6
|
+
class ChangeRefLineModifier < LineModifierBase
|
7
|
+
def self.from_config(hash)
|
8
|
+
new.from_config(hash)
|
10
9
|
end
|
11
10
|
|
12
11
|
REGEXP_FROM = {
|
@@ -23,32 +22,17 @@ module DefMastership
|
|
23
22
|
private_constant :REGEXP_FROM
|
24
23
|
|
25
24
|
def initialize
|
26
|
-
|
25
|
+
super
|
26
|
+
@config = {
|
27
27
|
from_regexp: '',
|
28
28
|
to_template: '',
|
29
29
|
next_ref: 0
|
30
30
|
}
|
31
|
-
@changes = []
|
32
31
|
@in_literal = false
|
33
32
|
end
|
34
33
|
|
35
|
-
def
|
36
|
-
|
37
|
-
|
38
|
-
super
|
39
|
-
end
|
40
|
-
|
41
|
-
def respond_to_missing?(method_name, *args)
|
42
|
-
@h[method_name] || super
|
43
|
-
end
|
44
|
-
|
45
|
-
def from_h(hash)
|
46
|
-
@h.merge!(hash)
|
47
|
-
self
|
48
|
-
end
|
49
|
-
|
50
|
-
def to_h
|
51
|
-
@h
|
34
|
+
def replace(method, line)
|
35
|
+
public_send("replace_#{method}".to_sym, line)
|
52
36
|
end
|
53
37
|
|
54
38
|
def replace_refdef(line)
|
@@ -69,6 +53,15 @@ module DefMastership
|
|
69
53
|
|
70
54
|
private
|
71
55
|
|
56
|
+
def do_replace_refdef(line)
|
57
|
+
line.gsub(regexp_from(:definition, from_regexp)) do
|
58
|
+
replacement = to_template % hmerge(Regexp.last_match)
|
59
|
+
changes << [Regexp.last_match[:from], replacement]
|
60
|
+
@config[:next_ref] += 1
|
61
|
+
text_with(Regexp.last_match, replacement)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
72
65
|
def regexp_from(const, from)
|
73
66
|
regexp_str =
|
74
67
|
"(?<before>#{REGEXP_FROM[const][:before]})" \
|
@@ -82,21 +75,12 @@ module DefMastership
|
|
82
75
|
end
|
83
76
|
|
84
77
|
def hmerge(match)
|
85
|
-
@
|
78
|
+
@config.merge(match.names.map(&:to_sym).zip(match.captures).to_h)
|
86
79
|
end
|
87
80
|
|
88
81
|
def in_literal(line)
|
89
82
|
@in_literal ^= true if line.chomp == '....'
|
90
83
|
@in_literal
|
91
84
|
end
|
92
|
-
|
93
|
-
def do_replace_refdef(line)
|
94
|
-
line.gsub(regexp_from(:definition, from_regexp)) do
|
95
|
-
replacement = to_template % hmerge(Regexp.last_match)
|
96
|
-
changes << [Regexp.last_match[:from], replacement]
|
97
|
-
@h[:next_ref] += 1
|
98
|
-
text_with(Regexp.last_match, replacement)
|
99
|
-
end
|
100
|
-
end
|
101
85
|
end
|
102
86
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# Copyright (c) 2020 Jerome Arbez-Gindre
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module DefMastership
|
5
|
+
# Change all refs of a given project
|
6
|
+
class ChangeRefModifier < ModifierBase
|
7
|
+
def replacements
|
8
|
+
%i[replace_refdef replace_irefs]
|
9
|
+
end
|
10
|
+
|
11
|
+
def line_modifier_class
|
12
|
+
ChangeRefLineModifier
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# Copyright (c) 2020 Jerome Arbez-Gindre
|
1
2
|
# frozen_string_literal: true
|
2
3
|
|
3
4
|
module DefMastership
|
@@ -18,8 +19,11 @@ module DefMastership
|
|
18
19
|
\s*
|
19
20
|
(,\s*\[\s*(?<labels>.*?)\s*\])?\s*\]
|
20
21
|
AFT
|
22
|
+
|
23
|
+
DEF_CHECKSUM = '(\((?<explicit_checksum>[[:alnum:]]+)\))?'
|
24
|
+
|
21
25
|
DEFINITION = Regexp.new(
|
22
|
-
"#{DEF_BEFORE_REF}(?<reference>[\\w:_-]+)#{DEF_AFTER_REF}",
|
26
|
+
"#{DEF_BEFORE_REF}(?<reference>[\\w:_-]+)#{DEF_CHECKSUM}#{DEF_AFTER_REF}",
|
23
27
|
Regexp::EXTENDED
|
24
28
|
)
|
25
29
|
|
@@ -55,6 +59,16 @@ module DefMastership
|
|
55
59
|
|
56
60
|
WHATEVER = //.freeze
|
57
61
|
|
62
|
+
INCLUDE_KEYWORD = '\binclude::'
|
63
|
+
INCLUDE_PATH = '(?<path>.*/)?'
|
64
|
+
INCLUDE_FILENAME = '(?<filename>[^\\/]+)'
|
65
|
+
INCLUDE_OPTIONS = '\[(?<options>[\]]*)\]'
|
66
|
+
|
67
|
+
INCLUDE = Regexp.new(
|
68
|
+
INCLUDE_KEYWORD + INCLUDE_PATH + INCLUDE_FILENAME + INCLUDE_OPTIONS,
|
69
|
+
Regexp::EXTENDED
|
70
|
+
)
|
71
|
+
|
58
72
|
public_constant :SINGLE_LINE_COMMENT,
|
59
73
|
:MULTI_LINE_COMMENT_DELIM,
|
60
74
|
:DEF_BEFORE_REF,
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# Copyright (c) 2020 Jerome Arbez-Gindre
|
1
2
|
# frozen_string_literal: true
|
2
3
|
|
3
4
|
require('csv')
|
@@ -7,35 +8,35 @@ require('defmastership/csv_formatter_body')
|
|
7
8
|
module DefMastership
|
8
9
|
# to export a CSV file
|
9
10
|
class CSVFormatter
|
10
|
-
|
11
|
-
|
11
|
+
COLUMN_LIST1 = %i[fixed wrong_explicit_checksum labels eref iref attributes].freeze
|
12
|
+
COLUMN_LIST2 = %i[fixed labels eref iref attributes].freeze
|
13
|
+
private_constant :COLUMN_LIST1
|
14
|
+
private_constant :COLUMN_LIST2
|
12
15
|
|
13
|
-
def initialize(doc)
|
16
|
+
def initialize(doc, sep = ',')
|
14
17
|
@doc = doc
|
15
|
-
@
|
16
|
-
@body_formatter = CSVFormatterBody.new(@doc)
|
18
|
+
@sep = sep
|
17
19
|
end
|
18
20
|
|
19
21
|
def export_to(output_file)
|
20
|
-
|
21
|
-
|
22
|
-
|
22
|
+
column_list = @doc.wrong_explicit_checksum? ? COLUMN_LIST1 : COLUMN_LIST2
|
23
|
+
CSV.open(output_file, 'w:ISO-8859-1', { col_sep: @sep }) do |csv|
|
24
|
+
csv << header(column_list)
|
25
|
+
@doc.definitions.each { |definition| csv << body(definition, column_list) }
|
23
26
|
end
|
24
27
|
end
|
25
28
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
29
|
+
private
|
30
|
+
|
31
|
+
def header(column_list)
|
32
|
+
header_formatter = CSVFormatterHeader.new(@doc)
|
33
|
+
header_line = column_list.map { |part| header_formatter.public_send(part) }
|
31
34
|
header_line.reduce(:+)
|
32
35
|
end
|
33
36
|
|
34
|
-
def body(definition)
|
35
|
-
|
36
|
-
|
37
|
-
@body_formatter.public_send("#{part}_body".to_sym, definition)
|
38
|
-
end
|
37
|
+
def body(definition, column_list)
|
38
|
+
body_formatter = CSVFormatterBody.new(@doc)
|
39
|
+
body_line = column_list.map { |part| body_formatter.public_send(part, definition) }
|
39
40
|
body_line.reduce(:+)
|
40
41
|
end
|
41
42
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# Copyright (c) 2020 Jerome Arbez-Gindre
|
1
2
|
# frozen_string_literal: true
|
2
3
|
|
3
4
|
require('csv')
|
@@ -9,23 +10,28 @@ module DefMastership
|
|
9
10
|
@doc = doc
|
10
11
|
end
|
11
12
|
|
12
|
-
def
|
13
|
-
[definition.type, definition.reference, definition.value]
|
13
|
+
def fixed(definition)
|
14
|
+
[definition.type, definition.reference, definition.value, definition.sha256]
|
14
15
|
end
|
15
16
|
|
16
|
-
def
|
17
|
+
def wrong_explicit_checksum(definition)
|
18
|
+
wrong_explicit_checksum = definition.wrong_explicit_checksum
|
19
|
+
wrong_explicit_checksum ? [wrong_explicit_checksum] : ['']
|
20
|
+
end
|
21
|
+
|
22
|
+
def labels(definition)
|
17
23
|
@doc.labels.empty? ? [] : [definition.labels.to_a.join("\n")]
|
18
24
|
end
|
19
25
|
|
20
|
-
def
|
26
|
+
def eref(definition)
|
21
27
|
@doc.eref.map { |key, _| definition.eref[key].join("\n") }
|
22
28
|
end
|
23
29
|
|
24
|
-
def
|
30
|
+
def iref(definition)
|
25
31
|
@doc.iref ? [definition.iref.join("\n")] : []
|
26
32
|
end
|
27
33
|
|
28
|
-
def
|
34
|
+
def attributes(definition)
|
29
35
|
@doc.attributes.map do |key, _|
|
30
36
|
definition.attributes[key]
|
31
37
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# Copyright (c) 2020 Jerome Arbez-Gindre
|
1
2
|
# frozen_string_literal: true
|
2
3
|
|
3
4
|
require('csv')
|
@@ -9,26 +10,27 @@ module DefMastership
|
|
9
10
|
@doc = doc
|
10
11
|
end
|
11
12
|
|
12
|
-
def
|
13
|
-
%w[Type Reference Value]
|
13
|
+
def fixed
|
14
|
+
%w[Type Reference Value sha256]
|
14
15
|
end
|
15
16
|
|
16
|
-
def
|
17
|
+
def wrong_explicit_checksum
|
18
|
+
@doc.wrong_explicit_checksum? ? ['Wrong explicit checksum'] : []
|
19
|
+
end
|
20
|
+
|
21
|
+
def labels
|
17
22
|
@doc.labels.empty? ? [] : %w[Labels]
|
18
23
|
end
|
19
24
|
|
20
|
-
def
|
21
|
-
@doc.eref.map
|
22
|
-
ref[:prefix] +
|
23
|
-
(ref[:url].nil? || ref[:url] == 'none' ? '' : " #{ref[:url]}")
|
24
|
-
end
|
25
|
+
def eref
|
26
|
+
@doc.eref.map { |_, ref| ref[:prefix] }
|
25
27
|
end
|
26
28
|
|
27
|
-
def
|
29
|
+
def iref
|
28
30
|
@doc.iref ? ['Internal links'] : []
|
29
31
|
end
|
30
32
|
|
31
|
-
def
|
33
|
+
def attributes
|
32
34
|
@doc.attributes.map { |_, value| value }
|
33
35
|
end
|
34
36
|
end
|
@@ -1,5 +1,8 @@
|
|
1
|
+
# Copyright (c) 2020 Jerome Arbez-Gindre
|
1
2
|
# frozen_string_literal: true
|
2
3
|
|
4
|
+
require 'digest'
|
5
|
+
|
3
6
|
module DefMastership
|
4
7
|
# DefMastership definition: contains all data of a definition
|
5
8
|
class Definition
|
@@ -15,6 +18,7 @@ module DefMastership
|
|
15
18
|
@eref = Hash.new([])
|
16
19
|
@iref = []
|
17
20
|
@attributes = {}
|
21
|
+
@explicit_checksum = match[:explicit_checksum]
|
18
22
|
end
|
19
23
|
|
20
24
|
def <<(new_line)
|
@@ -26,6 +30,14 @@ module DefMastership
|
|
26
30
|
@lines.join("\n")
|
27
31
|
end
|
28
32
|
|
33
|
+
def sha256
|
34
|
+
Digest::SHA2.new(256).hexdigest(value).split(//).last(8).join
|
35
|
+
end
|
36
|
+
|
37
|
+
def wrong_explicit_checksum
|
38
|
+
@explicit_checksum if @explicit_checksum != sha256
|
39
|
+
end
|
40
|
+
|
29
41
|
def add_eref(refname, extrefs)
|
30
42
|
@eref[refname] = extrefs.strip.split(/\s*,\s*/)
|
31
43
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# Copyright (c) 2020 Jerome Arbez-Gindre
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require('aasm')
|
5
|
+
|
6
|
+
module DefMastership
|
7
|
+
# DefMastership definition: contains all data of a definition
|
8
|
+
class DefinitionParser
|
9
|
+
include AASM
|
10
|
+
|
11
|
+
def initialize(document)
|
12
|
+
@document = document
|
13
|
+
end
|
14
|
+
|
15
|
+
aasm do
|
16
|
+
state :idle, initial: true
|
17
|
+
state :wait_content
|
18
|
+
state :in_block
|
19
|
+
state :single_para
|
20
|
+
|
21
|
+
event :new_definition do
|
22
|
+
transitions from: :idle, to: :wait_content, after: ->(*args) { @document.add_new_definition(*args) }
|
23
|
+
end
|
24
|
+
|
25
|
+
event :block_delimiter do
|
26
|
+
transitions from: :wait_content, to: :in_block
|
27
|
+
transitions from: %i[in_block idle single_para], to: :idle
|
28
|
+
end
|
29
|
+
|
30
|
+
event :new_line do
|
31
|
+
transitions from: %i[wait_content single_para],
|
32
|
+
to: :single_para,
|
33
|
+
after: ->(*args) { @document.add_line(*args) }
|
34
|
+
transitions from: :in_block,
|
35
|
+
to: :in_block,
|
36
|
+
after: ->(*args) { @document.add_line(*args) }
|
37
|
+
transitions from: :idle, to: :idle
|
38
|
+
end
|
39
|
+
|
40
|
+
event :empty_line do
|
41
|
+
transitions from: %i[wait_content single_para idle], to: :idle
|
42
|
+
transitions from: :in_block, to: :in_block
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|