defmastership 1.0.17 → 1.0.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/.gitlab-ci.yml +22 -10
  3. data/Gemfile +51 -1
  4. data/Rakefile +16 -61
  5. data/bin/defmastership +9 -6
  6. data/config/mutant.yml +23 -3
  7. data/defmastership.gemspec +0 -10
  8. data/features/definition_checksum.feature +31 -1
  9. data/features/export.feature +43 -1
  10. data/features/rename_included_files.feature +28 -0
  11. data/lib/defmastership/batch_modifier.rb +17 -12
  12. data/lib/defmastership/change_ref_modifier.rb +88 -6
  13. data/lib/defmastership/comment_filter.rb +1 -1
  14. data/lib/defmastership/constants.rb +5 -4
  15. data/lib/defmastership/csv_formatter.rb +16 -12
  16. data/lib/defmastership/csv_formatter_body.rb +18 -15
  17. data/lib/defmastership/csv_formatter_header.rb +1 -1
  18. data/lib/defmastership/definition.rb +58 -19
  19. data/lib/defmastership/document.rb +109 -74
  20. data/lib/defmastership/matching_line.rb +17 -0
  21. data/lib/defmastership/modifier.rb +42 -0
  22. data/lib/defmastership/modifier_factory.rb +12 -0
  23. data/lib/defmastership/parsing_state.rb +15 -9
  24. data/lib/defmastership/rename_included_files_modifier.rb +172 -5
  25. data/lib/defmastership/set_join_hack.rb +11 -0
  26. data/lib/defmastership/update_def_checksum_modifier.rb +8 -13
  27. data/lib/defmastership/update_def_modifier.rb +49 -0
  28. data/lib/defmastership/update_def_version_modifier.rb +56 -15
  29. data/lib/defmastership/version.rb +1 -1
  30. data/lib/defmastership.rb +1 -6
  31. data/spec/spec_helper.rb +3 -1
  32. data/spec/unit/def_mastership/batch_modifier_spec.rb +38 -36
  33. data/spec/unit/def_mastership/change_ref_modifier_spec.rb +196 -51
  34. data/spec/unit/def_mastership/csv_formatter_body_spec.rb +60 -31
  35. data/spec/unit/def_mastership/csv_formatter_header_spec.rb +1 -1
  36. data/spec/unit/def_mastership/csv_formatter_spec.rb +79 -87
  37. data/spec/unit/def_mastership/definition_parser_spec.rb +1 -1
  38. data/spec/unit/def_mastership/definition_spec.rb +16 -6
  39. data/spec/unit/def_mastership/document_spec.rb +81 -38
  40. data/spec/unit/def_mastership/matching_line_spec.rb +37 -0
  41. data/spec/unit/def_mastership/modifier_factory_spec.rb +37 -0
  42. data/spec/unit/def_mastership/modifier_spec.rb +83 -0
  43. data/spec/unit/def_mastership/parsing_state_spec.rb +1 -1
  44. data/spec/unit/def_mastership/rename_included_files_modifier_spec.rb +219 -47
  45. data/spec/unit/def_mastership/string_spec.rb +1 -1
  46. data/spec/unit/def_mastership/update_def_checksum_modifier_spec.rb +82 -50
  47. data/spec/unit/def_mastership/update_def_modifier_spec.rb +119 -0
  48. data/spec/unit/def_mastership/update_def_version_modifier_spec.rb +135 -56
  49. data/tasks/console.rake +8 -0
  50. data/tasks/package.task +9 -0
  51. data/tasks/smelling_code.rake +38 -0
  52. data/tasks/test.rake +45 -0
  53. metadata +16 -153
  54. data/lib/defmastership/change_ref_line_modifier.rb +0 -85
  55. data/lib/defmastership/line_modifier_base.rb +0 -29
  56. data/lib/defmastership/modifier_base.rb +0 -36
  57. data/lib/defmastership/rename_included_files_line_modifier.rb +0 -126
  58. data/lib/defmastership/update_def_checksum_line_modifier.rb +0 -38
  59. data/lib/defmastership/update_def_version_line_modifier.rb +0 -58
  60. data/spec/unit/def_mastership/change_ref_line_modifier_spec.rb +0 -250
  61. data/spec/unit/def_mastership/rename_included_files_line_modifier_spec.rb +0 -207
  62. data/spec/unit/def_mastership/update_def_checksum_line_modifier_spec.rb +0 -82
  63. data/spec/unit/def_mastership/update_def_version_line_modifier_spec.rb +0 -131
@@ -1,15 +1,182 @@
1
1
  # Copyright (c) 2020 Jerome Arbez-Gindre
2
2
  # frozen_string_literal: true
3
3
 
4
+ require 'defmastership/constants'
5
+ require('defmastership/matching_line')
6
+ require 'defmastership/modifier'
7
+
8
+ # defintion of the Rename Included Files Modifier
4
9
  module DefMastership
5
- # Change included filenames
6
- class RenameIncludedFilesModifier < ModifierBase
7
- def replacements
10
+ LOCAL_FILTERS = [
11
+ Filter.new(DMRegexp::VARIABLE_DEF, :new_variable_def),
12
+ Filter.new(DMRegexp::DEFINITION, :new_definition),
13
+ Filter.new(DMRegexp::BLOCK, :block_delimiter),
14
+ Filter.new(DMRegexp::EMPTY_LINE, :empty_line),
15
+ Filter.new(DMRegexp::WHATEVER, :new_line)
16
+ ].freeze
17
+ private_constant :LOCAL_FILTERS
18
+
19
+ # Change included filenames on one line at a time
20
+ class RenameIncludedFilesModifier
21
+ include Modifier
22
+
23
+ PARSER_ACTIONS = {
24
+ new_variable_def: lambda { |matching_line|
25
+ @variables.merge!(Helper.variable_def_hash(matching_line.match))
26
+ },
27
+ add_line: proc { |_| },
28
+ add_new_definition: lambda { |matching_line|
29
+ config[:reference] = matching_line.match[:reference]
30
+ }
31
+ }.freeze
32
+
33
+ private_constant :PARSER_ACTIONS
34
+
35
+ def self.replacement_methods
8
36
  %i[replace]
9
37
  end
10
38
 
11
- def new_line_modifier(config, _adoc_texts)
12
- RenameIncludedFilesLineModifier.from_config(config)
39
+ def self.default_config
40
+ {
41
+ from_regexp: '',
42
+ to_template: ''
43
+ }
44
+ end
45
+
46
+ def initialize(config)
47
+ @variables = {}
48
+ @definition_parser = DefinitionParser.new(self)
49
+
50
+ setup_modifier_module(config)
51
+ end
52
+
53
+ def method_missing(method_name, *args)
54
+ action = PARSER_ACTIONS[method_name]
55
+ return instance_exec(*args, &action) if action
56
+
57
+ super
58
+ end
59
+
60
+ def respond_to_missing?(method_name, *args)
61
+ PARSER_ACTIONS.key?(method_name) || super
62
+ end
63
+
64
+ def replace(line)
65
+ match = matched?(line)
66
+
67
+ return line unless match
68
+
69
+ new_line = build_new_include_line(match, line)
70
+
71
+ rename_file(line, new_line)
72
+
73
+ new_line
74
+ end
75
+
76
+ private
77
+
78
+ def build_new_include_line(match, line)
79
+ line.sub(Helper.complete_regexp_from(from_regexp)) do
80
+ Helper.text_with(match, to_template % Helper.hmerge(config, match))
81
+ end
82
+ end
83
+
84
+ def matched?(line)
85
+ return false unless concerned_line?(line)
86
+ return false unless line =~ Helper.complete_regexp_from(from_regexp)
87
+
88
+ match = Regexp.last_match
89
+
90
+ return false if config.key?(:cancel_if_match) && match[:filename].match?(cancel_if_match)
91
+
92
+ match
93
+ end
94
+
95
+ def concerned_line?(line)
96
+ return false if line.commented?
97
+
98
+ parse(line)
99
+
100
+ return false if @definition_parser.idle?
101
+
102
+ true
103
+ end
104
+
105
+ def parse(line)
106
+ Helper.apply_filters_until_consumed(line) do |event, match|
107
+ generate_event(event, MatchingLine.new(match))
108
+ end
109
+ end
110
+
111
+ def rename_file(from, to)
112
+ filename_from = Helper.extract_filename(from, @variables)
113
+ filename_to = Helper.extract_filename(to, @variables)
114
+ changes << [filename_from, filename_to]
115
+ File.rename(filename_from, filename_to)
116
+ end
117
+
118
+ def generate_event(event, matching_line)
119
+ if PARSER_ACTIONS.key?(event)
120
+ public_send(event, matching_line)
121
+ else
122
+ @definition_parser.public_send(event, matching_line)
123
+ end
124
+ end
125
+
126
+ # Helper functions
127
+ module Helper
128
+ def self.extract_filename(include_statement, variables)
129
+ filename = filename_from_include_statement(include_statement)
130
+
131
+ filename_replace_all_variables(filename, variables).chomp
132
+ end
133
+
134
+ def self.filename_from_include_statement(include_statement)
135
+ include_statement
136
+ .sub(Regexp.new(DMRegexp::INCLUDE_KEYWORD), '')
137
+ .sub(Regexp.new(DMRegexp::INCLUDE_OPTIONS), '')
138
+ end
139
+
140
+ def self.filename_replace_all_variables(filename, variables)
141
+ filename.scan(DMRegexp::VARIABLE_USE) do
142
+ varname = Regexp.last_match[:varname]
143
+ value = variables.fetch(varname.to_sym)
144
+ filename = filename_replace_one_variable(filename, varname, value)
145
+ end
146
+ filename
147
+ end
148
+
149
+ def self.filename_replace_one_variable(filename, varname, value)
150
+ filename.sub("{#{varname}}", value)
151
+ end
152
+
153
+ def self.complete_regexp_from(from)
154
+ Regexp.new(
155
+ DMRegexp::INCLUDE_KEYWORD + DMRegexp::INCLUDE_PATH +
156
+ "(?<filename>#{from})" + DMRegexp::INCLUDE_OPTIONS
157
+ )
158
+ end
159
+
160
+ def self.text_with(match, to)
161
+ "include::#{match[:path]}#{to}[#{match[:options]}]"
162
+ end
163
+
164
+ def self.hmerge(config, match)
165
+ config.merge(match.names.map(&:to_sym).zip(match.captures).to_h)
166
+ end
167
+
168
+ def self.variable_def_hash(match)
169
+ { match[:varname].to_sym => match[:value] }
170
+ end
171
+
172
+ def self.apply_filters_until_consumed(line)
173
+ LOCAL_FILTERS.each do |filter|
174
+ next unless line.match(filter.regexp)
175
+
176
+ yield(filter.event, Regexp.last_match)
177
+ break
178
+ end
179
+ end
13
180
  end
14
181
  end
15
182
  end
@@ -0,0 +1,11 @@
1
+ # Copyright (c) 2024 Jerome Arbez-Gindre
2
+ # frozen_string_literal: true
3
+
4
+ if RUBY_VERSION < '3.0'
5
+ # Ruby 2.7 do not implement join for Set
6
+ class Set
7
+ def join(*args)
8
+ to_a.join(*args)
9
+ end
10
+ end
11
+ end
@@ -1,21 +1,16 @@
1
1
  # Copyright (c) 2020 Jerome Arbez-Gindre
2
2
  # frozen_string_literal: true
3
3
 
4
+ require 'defmastership/constants'
5
+ require 'defmastership/update_def_modifier'
6
+
4
7
  module DefMastership
5
- # Update definition checksum with calculated one
6
- class UpdateDefChecksumModifier < ModifierBase
7
- def replacements
8
- %i[replace]
9
- end
8
+ # modify one line after another
9
+ class UpdateDefChecksumModifier < UpdateDefModifier
10
+ private
10
11
 
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
12
+ def reference_replacement(reference, match)
13
+ "#{reference}(#{match[:explicit_version]}#{document.ref_to_def(reference).sha256_short})"
19
14
  end
20
15
  end
21
16
  end
@@ -0,0 +1,49 @@
1
+ # Copyright (c) 2024 Jerome Arbez-Gindre
2
+ # frozen_string_literal: true
3
+
4
+ module DefMastership
5
+ # absttrac class for modififier that need o update defintion references
6
+ class UpdateDefModifier
7
+ include Modifier
8
+
9
+ attr_reader :document
10
+
11
+ def self.default_config
12
+ {
13
+ def_type: ''
14
+ }
15
+ end
16
+
17
+ def self.replacement_methods
18
+ %i[replace_reference]
19
+ end
20
+
21
+ def self.reference_regexp(reference)
22
+ Regexp.new("#{reference}#{DMRegexp::DEF_VERSION_AND_CHECKSUM}")
23
+ end
24
+
25
+ def initialize(config)
26
+ @document = Document.new
27
+
28
+ setup_modifier_module(config)
29
+ end
30
+
31
+ def do_modifications(adoc_sources)
32
+ adoc_sources.each_key do |adoc_file|
33
+ document.parse_file_with_preprocessor(adoc_file)
34
+ end
35
+
36
+ super(adoc_sources)
37
+ end
38
+
39
+ def replace_reference(line)
40
+ match = line.match(DMRegexp::DEFINITION)
41
+
42
+ return line unless match
43
+ return line unless match[:type] == def_type
44
+
45
+ reference = match[:reference]
46
+ line.sub(self.class.reference_regexp(reference), reference_replacement(reference, match))
47
+ end
48
+ end
49
+ end
@@ -1,25 +1,66 @@
1
1
  # Copyright (c) 2020 Jerome Arbez-Gindre
2
2
  # frozen_string_literal: true
3
3
 
4
+ require 'defmastership/constants'
5
+ require 'defmastership/update_def_modifier'
6
+
4
7
  module DefMastership
5
- # Update definition version if the definition has change since
6
- # reference document
7
- class UpdateDefVersionModifier < ModifierBase
8
- def replacements
9
- %i[replace]
8
+ # modify one line after another
9
+ class UpdateDefVersionModifier < UpdateDefModifier
10
+ def self.default_config
11
+ {
12
+ def_type: '',
13
+ ref_document: '',
14
+ first_version: ''
15
+ }
16
+ end
17
+
18
+ def initialize(config)
19
+ @ref_document = Document.new
20
+
21
+ super(config)
22
+ end
23
+
24
+ def do_modifications(adoc_sources)
25
+ @ref_document.parse_file_with_preprocessor(config.fetch(:ref_document))
26
+
27
+ super(adoc_sources)
28
+ end
29
+
30
+ private
31
+
32
+ def reference_replacement(reference, match)
33
+ "#{reference}#{version_and_checksum_str(match)}"
10
34
  end
11
35
 
12
- def new_line_modifier(config, adoc_texts)
13
- document = Document.new
14
- adoc_texts.each do |adoc_file, _|
15
- document.parse_file_with_preprocessor(adoc_file)
36
+ def version_and_checksum_str(match)
37
+ explicit_checksum = match[:explicit_checksum]
38
+ version = version_string(match)
39
+ return unless explicit_checksum || version
40
+
41
+ "(#{version}#{explicit_checksum})"
42
+ end
43
+
44
+ def version_string(match)
45
+ ref_definition = Helper.def_from_match(@ref_document, match)
46
+ definition = Helper.def_from_match(document, match)
47
+ return unless ref_definition
48
+
49
+ Helper.ref_version(ref_definition, definition, config.fetch(:first_version))
50
+ end
51
+
52
+ # Helper functions
53
+ module Helper
54
+ def self.def_from_match(doc, match)
55
+ doc.ref_to_def(match[:reference])
56
+ end
57
+
58
+ def self.ref_version(ref_definition, definition, first_version)
59
+ new_ref_version = ref_definition.explicit_version
60
+ return new_ref_version if definition.sha256_short == ref_definition.sha256_short
61
+
62
+ new_ref_version ? new_ref_version.next : first_version
16
63
  end
17
- ref_document = Document.new
18
- ref_document.parse_file_with_preprocessor(config[:ref_document])
19
- line_modifier = UpdateDefVersionLineModifier.from_config(config)
20
- line_modifier.document = document
21
- line_modifier.ref_document = ref_document
22
- line_modifier
23
64
  end
24
65
  end
25
66
  end
@@ -2,6 +2,6 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module DefMastership
5
- VERSION = '1.0.17'
5
+ VERSION = '1.0.18'
6
6
  public_constant :VERSION
7
7
  end
data/lib/defmastership.rb CHANGED
@@ -6,7 +6,6 @@ require('defmastership/version')
6
6
  # Add requires for other files you add to your project here, so
7
7
  # you just need to require this one file in your bin file
8
8
  require('defmastership/batch_modifier')
9
- require('defmastership/change_ref_line_modifier')
10
9
  require('defmastership/change_ref_modifier')
11
10
  require('defmastership/comment_filter')
12
11
  require('defmastership/constants')
@@ -15,12 +14,8 @@ require('defmastership/definition')
15
14
  require('defmastership/definition_parser')
16
15
  require('defmastership/document')
17
16
  require('defmastership/filters')
18
- require('defmastership/line_modifier_base')
19
- require('defmastership/modifier_base')
17
+ require('defmastership/modifier_factory')
20
18
  require('defmastership/parsing_state')
21
- require('defmastership/rename_included_files_line_modifier')
22
19
  require('defmastership/rename_included_files_modifier')
23
- require('defmastership/update_def_checksum_line_modifier')
24
20
  require('defmastership/update_def_checksum_modifier')
25
- require('defmastership/update_def_version_line_modifier')
26
21
  require('defmastership/update_def_version_modifier')
data/spec/spec_helper.rb CHANGED
@@ -3,7 +3,6 @@
3
3
 
4
4
  require('aasm/rspec')
5
5
  require('aruba/rspec')
6
- require('bundler/setup')
7
6
 
8
7
  # formatter = [SimpleCov::Formatter::HTMLFormatter]
9
8
  # SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new(formatter)
@@ -18,8 +17,11 @@ SimpleCov.start do
18
17
 
19
18
  add_filter 'config'
20
19
  add_filter 'vendor'
20
+ add_filter 'set_join_hack'
21
21
 
22
22
  minimum_coverage 100
23
+
24
+ enable_coverage :branch
23
25
  end
24
26
 
25
27
  RSpec.configure do |config|
@@ -1,29 +1,31 @@
1
1
  # Copyright (c) 2020 Jerome Arbez-Gindre
2
2
  # frozen_string_literal: true
3
3
 
4
- require('defmastership')
4
+ require('defmastership/batch_modifier')
5
5
 
6
6
  module DefMastership
7
- class TotoClassModifier < ModifierBase
7
+ class TotoModifier
8
+ include Modifier
8
9
  end
9
10
 
10
- class TutuClassModifier < ModifierBase
11
+ class TuTuModifier
12
+ include Modifier
11
13
  end
12
14
  end
13
15
 
14
16
  RSpec.describe(DefMastership::BatchModifier) do
15
17
  subject(:batchmodifier) do
16
- described_class.new(config, adoc_texts)
18
+ described_class.new(config, adoc_sources)
17
19
  end
18
20
 
19
21
  let(:config) do
20
22
  {
21
- modifier1: { type: 'toto_class', config: { p: 1 } },
22
- modifier2: { type: 'toto_class', config: { p: 'whatever1' } },
23
- modifier3: { type: 'tutu_class', config: { p1: 'whatever2', p2: 'whatever3' } }
23
+ modifier1: { type: 'toto', config: { p: 1 } },
24
+ modifier2: { type: 'toto', config: { p: 'whatever1' } },
25
+ modifier3: { type: 'tu_tu', config: { p1: 'whatever2', p2: 'whatever3' } }
24
26
  }
25
27
  end
26
- let(:adoc_texts) do
28
+ let(:adoc_sources) do
27
29
  {
28
30
  'file1.adoc' => 'some text',
29
31
  'file2.adoc' => 'another text'
@@ -35,14 +37,14 @@ RSpec.describe(DefMastership::BatchModifier) do
35
37
  it { is_expected.to(have_attributes(config: config)) }
36
38
 
37
39
  it do
38
- expect(batchmodifier).to(have_attributes(adoc_texts: adoc_texts))
40
+ expect(batchmodifier).to(have_attributes(adoc_sources: adoc_sources))
39
41
  end
40
42
  end
41
43
 
42
44
  describe '#apply' do
43
45
  context 'with only one modification' do
44
- let(:toto1) { instance_double(DefMastership::TotoClassModifier, 'toto1') }
45
- let(:adoc_texts_modified) do
46
+ let(:toto1) { instance_double(DefMastership::TotoModifier, 'toto1') }
47
+ let(:adoc_sources_modified) do
46
48
  {
47
49
  'file1.adoc' => 'some text modified',
48
50
  'file2.adoc' => 'another text'
@@ -51,26 +53,26 @@ RSpec.describe(DefMastership::BatchModifier) do
51
53
 
52
54
  let(:config_modified) do
53
55
  {
54
- modifier1: { type: 'toto_class', config: { p: 'modified_param' } },
55
- modifier2: { type: 'toto_class', config: { p: 'whatever1' } },
56
- modifier3: { type: 'tutu_class', config: { p1: 'whatever2', p2: 'whatever3' } }
56
+ modifier1: { type: 'toto', config: { p: 'modified_param' } },
57
+ modifier2: { type: 'toto', config: { p: 'whatever1' } },
58
+ modifier3: { type: 'tu_tu', config: { p1: 'whatever2', p2: 'whatever3' } }
57
59
  }
58
60
  end
59
61
 
60
62
  before do
61
- allow(DefMastership::TotoClassModifier).to(receive(:new).once.and_return(toto1))
62
- allow(toto1).to(receive(:do_modifications).once.and_return(adoc_texts_modified))
63
+ allow(DefMastership::TotoModifier).to(receive(:new).once.and_return(toto1))
64
+ allow(toto1).to(receive(:do_modifications).once.and_return(adoc_sources_modified))
63
65
  allow(toto1).to(receive(:config).once.and_return(p: 'modified_param'))
64
66
  allow(toto1).to(receive(:changes).once.and_return([%w[from1 to1], %w[from2 to2]]))
65
- batchmodifier.apply('modifier1')
67
+ batchmodifier.apply(%i[modifier1])
66
68
  end
67
69
 
68
70
  it do
69
- expect(DefMastership::TotoClassModifier).to(have_received(:new).with(p: 1))
71
+ expect(DefMastership::TotoModifier).to(have_received(:new).with(p: 1))
70
72
  end
71
73
 
72
- it { expect(toto1).to(have_received(:do_modifications).with(adoc_texts)) }
73
- it { is_expected.to(have_attributes(adoc_texts: adoc_texts_modified)) }
74
+ it { expect(toto1).to(have_received(:do_modifications).with(adoc_sources)) }
75
+ it { is_expected.to(have_attributes(adoc_sources: adoc_sources_modified)) }
74
76
  it { expect(toto1).to(have_received(:config).with(no_args)) }
75
77
 
76
78
  it { is_expected.to(have_attributes(config: config_modified)) }
@@ -78,43 +80,43 @@ RSpec.describe(DefMastership::BatchModifier) do
78
80
  end
79
81
 
80
82
  context 'with two modifications' do
81
- let(:toto2) { instance_double(DefMastership::TotoClassModifier, 'toto2') }
82
- let(:tutu3) { instance_double(DefMastership::TutuClassModifier, 'tutu3') }
83
+ let(:toto2) { instance_double(DefMastership::TotoModifier, 'toto2') }
84
+ let(:tutu3) { instance_double(DefMastership::TuTuModifier, 'tutu3') }
83
85
 
84
86
  let(:config_modified) do
85
87
  {
86
- modifier1: { type: 'toto_class', config: { p: 1 } },
87
- modifier2: { type: 'toto_class', config: :whatever },
88
- modifier3: { type: 'tutu_class', config: :pouet }
88
+ modifier1: { type: 'toto', config: { p: 1 } },
89
+ modifier2: { type: 'toto', config: :whatever },
90
+ modifier3: { type: 'tu_tu', config: :pouet }
89
91
  }
90
92
  end
91
93
 
92
94
  before do
93
- allow(DefMastership::TotoClassModifier).to(receive(:new).once.and_return(toto2))
94
- allow(toto2).to(receive(:do_modifications).once.and_return(:adoc_texts_modified_mod2))
95
+ allow(DefMastership::TotoModifier).to(receive(:new).once.and_return(toto2))
96
+ allow(toto2).to(receive(:do_modifications).once.and_return(:adoc_sources_modified_mod2))
95
97
  allow(toto2).to(receive(:config).once.and_return(:whatever))
96
- allow(DefMastership::TutuClassModifier).to(receive(:new).once.and_return(tutu3))
97
- allow(tutu3).to(receive(:do_modifications).once.and_return(:adoc_texts_modified_mod3))
98
+ allow(DefMastership::TuTuModifier).to(receive(:new).once.and_return(tutu3))
99
+ allow(tutu3).to(receive(:do_modifications).once.and_return(:adoc_sources_modified_mod3))
98
100
  allow(tutu3).to(receive(:config).once.and_return(:pouet))
99
101
  allow(toto2).to(receive(:changes).once.and_return([%w[from1 to1]]))
100
102
  allow(tutu3).to(receive(:changes).once.and_return([%w[from2 to2]]))
101
- batchmodifier.apply('modifier2, modifier3')
103
+ batchmodifier.apply(%i[modifier2 modifier3])
102
104
  end
103
105
 
104
- it { expect(DefMastership::TotoClassModifier).to(have_received(:new).with(p: 'whatever1')) }
105
- it { expect(DefMastership::TutuClassModifier).to(have_received(:new).with(p1: 'whatever2', p2: 'whatever3')) }
106
- it { expect(toto2).to(have_received(:do_modifications).with(adoc_texts)) }
106
+ it { expect(DefMastership::TotoModifier).to(have_received(:new).with(p: 'whatever1')) }
107
+ it { expect(DefMastership::TuTuModifier).to(have_received(:new).with(p1: 'whatever2', p2: 'whatever3')) }
108
+ it { expect(toto2).to(have_received(:do_modifications).with(adoc_sources)) }
107
109
  it { expect(toto2).to(have_received(:config).with(no_args)) }
108
- it { expect(tutu3).to(have_received(:do_modifications).with(:adoc_texts_modified_mod2)) }
110
+ it { expect(tutu3).to(have_received(:do_modifications).with(:adoc_sources_modified_mod2)) }
109
111
  it { expect(tutu3).to(have_received(:config).with(no_args)) }
110
- it { is_expected.to(have_attributes(adoc_texts: :adoc_texts_modified_mod3)) }
112
+ it { is_expected.to(have_attributes(adoc_sources: :adoc_sources_modified_mod3)) }
111
113
  it { is_expected.to(have_attributes(config: config_modified)) }
112
114
  it { is_expected.to(have_attributes(changes: [%w[modifier2 from1 to1], %w[modifier3 from2 to2]])) }
113
115
  end
114
116
 
115
117
  context 'with wrong modification' do
116
118
  it do
117
- expect { batchmodifier.apply('wrong-modification') }
119
+ expect { batchmodifier.apply(%i[wrong-modification]) }
118
120
  .to(
119
121
  raise_error(ArgumentError, 'wrong-modification is not a known modification')
120
122
  )