defmastership 1.0.16 → 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 (68) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.gitlab-ci.yml +50 -7
  4. data/.rubocop.yml +14 -6
  5. data/Gemfile +51 -1
  6. data/Rakefile +16 -47
  7. data/bin/defmastership +12 -9
  8. data/config/mutant.yml +23 -3
  9. data/defmastership.gemspec +22 -27
  10. data/features/definition_checksum.feature +31 -1
  11. data/features/export.feature +43 -1
  12. data/features/rename_included_files.feature +28 -0
  13. data/lib/defmastership/batch_modifier.rb +17 -12
  14. data/lib/defmastership/change_ref_modifier.rb +89 -5
  15. data/lib/defmastership/comment_filter.rb +1 -1
  16. data/lib/defmastership/constants.rb +5 -4
  17. data/lib/defmastership/csv_formatter.rb +20 -16
  18. data/lib/defmastership/csv_formatter_body.rb +18 -15
  19. data/lib/defmastership/csv_formatter_header.rb +1 -1
  20. data/lib/defmastership/definition.rb +58 -19
  21. data/lib/defmastership/document.rb +109 -74
  22. data/lib/defmastership/matching_line.rb +17 -0
  23. data/lib/defmastership/modifier.rb +42 -0
  24. data/lib/defmastership/modifier_factory.rb +12 -0
  25. data/lib/defmastership/parsing_state.rb +15 -9
  26. data/lib/defmastership/rename_included_files_modifier.rb +172 -5
  27. data/lib/defmastership/set_join_hack.rb +11 -0
  28. data/lib/defmastership/update_def_checksum_modifier.rb +8 -13
  29. data/lib/defmastership/update_def_modifier.rb +49 -0
  30. data/lib/defmastership/update_def_version_modifier.rb +56 -15
  31. data/lib/defmastership/version.rb +1 -1
  32. data/lib/defmastership.rb +7 -17
  33. data/spec/spec_helper.rb +4 -2
  34. data/spec/unit/{defmastership → def_mastership}/batch_modifier_spec.rb +42 -39
  35. data/spec/unit/{defmastership/change_ref_line_modifier_spec.rb → def_mastership/change_ref_modifier_spec.rb} +44 -66
  36. data/spec/unit/{defmastership → def_mastership}/csv_formatter_body_spec.rb +61 -32
  37. data/spec/unit/{defmastership → def_mastership}/csv_formatter_header_spec.rb +2 -2
  38. data/spec/unit/{defmastership → def_mastership}/csv_formatter_spec.rb +81 -86
  39. data/spec/unit/{defmastership → def_mastership}/definition_parser_spec.rb +2 -2
  40. data/spec/unit/{defmastership → def_mastership}/definition_spec.rb +17 -7
  41. data/spec/unit/{defmastership → def_mastership}/document_spec.rb +108 -53
  42. data/spec/unit/def_mastership/matching_line_spec.rb +37 -0
  43. data/spec/unit/def_mastership/modifier_factory_spec.rb +37 -0
  44. data/spec/unit/def_mastership/modifier_spec.rb +83 -0
  45. data/spec/unit/{defmastership → def_mastership}/parsing_state_spec.rb +16 -16
  46. data/spec/unit/{defmastership/rename_included_files_line_modifier_spec.rb → def_mastership/rename_included_files_modifier_spec.rb} +72 -36
  47. data/spec/unit/{defmastership/comment_filter_spec.rb → def_mastership/string_spec.rb} +1 -1
  48. data/spec/unit/def_mastership/update_def_checksum_modifier_spec.rb +107 -0
  49. data/spec/unit/def_mastership/update_def_modifier_spec.rb +119 -0
  50. data/spec/unit/def_mastership/update_def_version_modifier_spec.rb +159 -0
  51. data/spec/unit/{defmastership_spec.rb → def_mastership_spec.rb} +1 -1
  52. data/tasks/console.rake +8 -0
  53. data/tasks/package.task +9 -0
  54. data/tasks/smelling_code.rake +38 -0
  55. data/tasks/test.rake +45 -0
  56. metadata +37 -145
  57. data/lib/defmastership/change_ref_line_modifier.rb +0 -82
  58. data/lib/defmastership/line_modifier_base.rb +0 -29
  59. data/lib/defmastership/modifier_base.rb +0 -29
  60. data/lib/defmastership/rename_included_files_line_modifier.rb +0 -126
  61. data/lib/defmastership/update_def_checksum_line_modifier.rb +0 -38
  62. data/lib/defmastership/update_def_version_line_modifier.rb +0 -58
  63. data/spec/unit/defmastership/change_ref_modifier_spec.rb +0 -76
  64. data/spec/unit/defmastership/rename_included_files_modifier_spec.rb +0 -67
  65. data/spec/unit/defmastership/update_def_checksum_line_modifier_spec.rb +0 -78
  66. data/spec/unit/defmastership/update_def_checksum_modifier_spec.rb +0 -75
  67. data/spec/unit/defmastership/update_def_version_line_modifier_spec.rb +0 -127
  68. data/spec/unit/defmastership/update_def_version_modifier_spec.rb +0 -80
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 01a97f896ec1b0b88f80686290f5a0bf639ae7caeb4e4c48035e13221d3f21e2
4
- data.tar.gz: 75d68f34285d4babe217a678204681399ef7aa11679810eb00a5eb95eb9771d8
3
+ metadata.gz: 995e93909012fff3a4dcbeb55605d6e8754e24c3868f63d3000ed1c6674809c7
4
+ data.tar.gz: 94ae5225d555eb837017ebe243a69bfec21feb0882d14a3329b48f2b016c1ba2
5
5
  SHA512:
6
- metadata.gz: 2926efd086db703c7a4e03b516c833a237ffa4d484492af6e70f3ae54bd4de30e50abe7cd15bdc8330b62ed46b6ddc04e474790a9e33b6260bc58ecde2113bc7
7
- data.tar.gz: 5849049e21fc4882f957d09b0068769a26140327700caf88698595e2688f37b1467cc5b962d279d39c945ce6d187447d9ef6d90d1c26828bd7e841dfc08a30e2
6
+ metadata.gz: 48169bb5cfc6bea00209d60619cace40a45471e2ff6c2b2543cd8846ca001daac2e6a865c18cf20b95ed5e6102b36328302d91b577a69952acf7e3bc0d79c209
7
+ data.tar.gz: 00265e2ed2fc50f527ffba937dd2dae5d3d9f2189c2ada4b451f2504dbfdb96efffa73e1b8e18981055ea43c45458bc9df93479630ec014f2e9ec7b8bafd5cc5
data/.gitignore CHANGED
@@ -4,3 +4,4 @@
4
4
  defmastership-0.0.1.gem
5
5
  /Gemfile.lock
6
6
  /pkg/
7
+ /.ruby-version
data/.gitlab-ci.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  default:
2
- image: ruby:2.5
2
+ image: ruby:3.2
3
3
  before_script:
4
4
  - apt-get update
5
5
  - ruby -v
@@ -7,14 +7,57 @@ default:
7
7
  - gem install bundler --no-document
8
8
  - bundle install --jobs $(nproc) "${FLAGS[@]}"
9
9
 
10
- cucumber:
10
+ bdd:
11
11
  script:
12
- - bundle exec rake features
12
+ - bundle exec rake test:features
13
13
 
14
- rspec:
14
+ unit tests:
15
15
  script:
16
- - bundle exec rake spec
16
+ - bundle exec rake test:spec
17
17
 
18
- rubocop:
18
+ code_quality:
19
19
  script:
20
- - bundle exec rake rubocop
20
+ - bundle exec rake quality:all
21
+
22
+ bdd ruby2.7:
23
+ image: ruby:2.7
24
+ before_script:
25
+ - apt-get update
26
+ - ruby -v
27
+ - which ruby
28
+ - gem install bundler -v 2.4.22 --no-document
29
+ - bundle install --jobs $(nproc) "${FLAGS[@]}"
30
+ script:
31
+ - bundle exec rake test:features
32
+
33
+ bdd ruby3.0:
34
+ image: ruby:3.0
35
+ script:
36
+ - bundle exec rake test:features
37
+
38
+ bdd ruby3.1:
39
+ image: ruby:3.1
40
+ script:
41
+ - bundle exec rake test:features
42
+
43
+ unit tests ruby2.7:
44
+ image: ruby:2.7
45
+ before_script:
46
+ - apt-get update
47
+ - ruby -v
48
+ - which ruby
49
+ - gem install bundler -v 2.4.22 --no-document
50
+ - bundle install --jobs $(nproc) "${FLAGS[@]}"
51
+ script:
52
+ - bundle exec rake test:spec
53
+
54
+ unit tests ruby3.0:
55
+ image: ruby:3.0
56
+ script:
57
+ - bundle exec rake test:spec
58
+
59
+ unit tests ruby3.1:
60
+ image: ruby:3.1
61
+ script:
62
+ - bundle exec rake test:spec
63
+
data/.rubocop.yml CHANGED
@@ -10,17 +10,19 @@
10
10
  # See https://github.com/rubocop-hq/rubocop/blob/master/manual/configuration.md
11
11
 
12
12
  require:
13
+ - rubocop-performance
13
14
  - rubocop-rspec
15
+ - rubocop-rake
14
16
 
15
17
  AllCops:
16
- TargetRubyVersion: 2.5
18
+ TargetRubyVersion: 2.7
17
19
  EnabledByDefault: true
18
20
  DisplayCopNames: true
19
21
 
20
22
  Style/Copyright:
21
23
  Enabled: true
22
24
  Notice: 'Copyright (\(c\) )?202[0-9] Jerome Arbez-Gindre'
23
- AutocorrectNotice: '# Copyright (c) 2020 Jerome Arbez-Gindre'
25
+ AutocorrectNotice: '# Copyright (c) 2023 Jerome Arbez-Gindre'
24
26
 
25
27
  Lint/ConstantResolution: # Not available ins rubocop 0.81
26
28
  Enabled: false
@@ -29,7 +31,10 @@ Style/DocumentationMethod:
29
31
  Enabled: false
30
32
 
31
33
  Style/StringHashKeys :
32
- Enabled: false
34
+ Enabled: true
35
+ Exclude:
36
+ - '*.gemspec'
37
+ - 'spec/**/*'
33
38
 
34
39
  Style/MissingElse:
35
40
  EnforcedStyle: case
@@ -55,14 +60,17 @@ Style/ConstantVisibility :
55
60
 
56
61
  # rubocop-rspec options
57
62
  RSpec/MessageExpectation :
58
- Enabled: false
63
+ Enabled: true
59
64
 
60
65
  RSpec/FilePath :
61
- Enabled: false
66
+ Enabled: true
62
67
 
63
68
  RSpec/NestedGroups:
64
69
  Max: 4
65
70
 
66
71
  Layout/RedundantLineBreak:
67
72
  Enabled: false
68
-
73
+
74
+ Layout/EndOfLine:
75
+ EnforcedStyle: lf
76
+
data/Gemfile CHANGED
@@ -1,5 +1,55 @@
1
1
  # Copyright (c) 2020 Jerome Arbez-Gindre
2
2
  # frozen_string_literal: true
3
3
 
4
- source('https://rubygems.org')
4
+ source 'https://rubygems.org'
5
+
5
6
  gemspec
7
+
8
+ ruby RUBY_VERSION
9
+
10
+ group :development do
11
+ # cucumber steps for command line tests
12
+ gem 'aruba', '~> 2.2'
13
+ # bdd
14
+ gem 'cucumber', '~> 9.1'
15
+
16
+ if RUBY_VERSION >= '3.0'
17
+ # mutation testing
18
+ plan = 'oss'
19
+ key = '7oac4dMz95cTUuFPtGDfTDSQep6ZhdGW'
20
+ source "https://#{plan}:#{key}@gem.mutant.dev" do
21
+ # license needed
22
+ gem 'mutant-license', '~> 0.1.1'
23
+ end
24
+ # mutation testing
25
+ gem 'mutant-rspec', '~> 0.11'
26
+ end
27
+
28
+ # to parse and execute Rakefile
29
+ gem 'rake', '~> 13.1'
30
+ # tdd
31
+ gem 'rspec', '~> 3.13'
32
+ # # to test performances
33
+ # gem 'rspec-benchmark', '~> 0.6.0'
34
+ # code needs to be clean
35
+ gem 'rubocop', '~> 1.62.0'
36
+ # code needs to be clean
37
+ gem 'rubocop-performance', '~> 1.20.0'
38
+ # test code needs to be clean
39
+ gem 'rubocop-rspec', '~> 2.27.0'
40
+ # Rakefiels need to be clean
41
+ gem 'rubocop-rake', '~> 0.6'
42
+ if RUBY_VERSION >= '3.0'
43
+ # detect selling code
44
+ gem 'reek', '~> 6.3'
45
+ end
46
+ # What is tdd without code coverage ?
47
+ gem 'simplecov', '~> 0.22', '< 0.23'
48
+ # # to document code
49
+ # gem 'yard', '~> 0.9.5'
50
+ end
51
+
52
+ group :debugging do
53
+ # Sometimes, we need to debug
54
+ gem 'pry', '~> 0.14.0'
55
+ end
data/Rakefile CHANGED
@@ -1,53 +1,22 @@
1
- # Copyright (c) 2020 Jerome Arbez-Gindre
1
+ # Copyright (c) 2023 Jerome Arbez-Gindre
2
2
  # frozen_string_literal: true
3
3
 
4
+ require('bundler/gem_tasks')
4
5
  require('rake/clean')
5
- require('rubygems')
6
- require('rubygems/package_task')
7
- require('rdoc/task')
8
- require('cucumber')
9
- require('cucumber/rake/task')
10
-
11
- Rake::RDocTask.new do |rd|
12
- rd.main = 'README.rdoc'
13
- rd.rdoc_files.include('README.rdoc', 'lib/**/*.rb', 'bin/**/*')
14
- rd.title = 'Your application title'
15
- end
16
-
17
- spec = eval(::File.read('defmastership.gemspec'))
18
-
19
- Gem::PackageTask.new(spec)
20
- CUKE_RESULTS = 'features_results.html'
21
- CLEAN << CUKE_RESULTS
22
-
23
- desc('Run features')
24
- ::Cucumber::Rake::Task.new(:features) do |t|
25
- opts = "features --format html -o #{CUKE_RESULTS} --format progress -x"
26
- opts += " --tags #{ENV['TAGS']}" if ENV['TAGS']
27
- t.cucumber_opts = opts
28
- t.fork = false
29
- end
30
6
 
31
- desc('Run features tagged as work-in-progress (@wip)')
32
- ::Cucumber::Rake::Task.new('features:wip') do |t|
33
- tag_opts = ' --tags ~@pending' \
34
- ' --tags @wip'
35
- t.cucumber_opts = "features --format html -o #{CUKE_RESULTS} "\
36
- "--format pretty -x -s#{tag_opts}"
37
- t.fork = false
7
+ Dir['tasks/**/*.rake'].each { |t| load t }
8
+
9
+ desc 'Continous integration tasks'
10
+ task :ci do
11
+ [
12
+ 'test:spec',
13
+ 'test:features',
14
+ :rubocop
15
+ ].each do |name|
16
+ puts "\n=== Running #{name}...\n"
17
+ Rake::Task[name].invoke
18
+ puts "\n=== Running #{name} -> Done\n"
19
+ end
38
20
  end
39
21
 
40
- task(cucumber: :features)
41
- task(wip: 'features:wip')
42
-
43
- require('bundler/gem_tasks')
44
-
45
- require('rspec/core/rake_task')
46
-
47
- ::RSpec::Core::RakeTask.new(:spec)
48
-
49
- require('rubocop/rake_task')
50
-
51
- ::RuboCop::RakeTask.new
52
-
53
- task(default: %i[spec features rubocop])
22
+ task default: :ci
data/bin/defmastership CHANGED
@@ -55,9 +55,9 @@ module DefMastership
55
55
 
56
56
  c.action do |_global_options, options, args|
57
57
  my_doc = DefMastership::Document.new
58
- my_doc.parse_file_with_preprocessor(args[0])
58
+ my_doc.parse_file_with_preprocessor(args.first)
59
59
 
60
- output_file = args[0].sub(/\.adoc$/, '.csv')
60
+ output_file = args.first.sub(/\.adoc$/, '.csv')
61
61
 
62
62
  DefMastership::CSVFormatter.new(my_doc, options['separator']).export_to(output_file)
63
63
 
@@ -65,9 +65,12 @@ module DefMastership
65
65
  my_doc.definitions.each do |definition|
66
66
  next if definition.wrong_explicit_checksum.nil?
67
67
 
68
- warn("warning: #{definition.reference} has a wrong explicit checksum (should be #{definition.sha256})")
68
+ warn(
69
+ "warning: #{definition.reference} has a wrong explicit " \
70
+ "checksum (should be #{definition.sha256_short})"
71
+ )
69
72
  end
70
- exit 1 unless options[:"no-fail"]
73
+ exit 1 unless options[:'no-fail']
71
74
  end
72
75
  end
73
76
  end
@@ -87,16 +90,16 @@ module DefMastership
87
90
  c.action do |_global_options, options, args|
88
91
  changer = BatchModifier.new(
89
92
  YAML.load_file(options[:'modifications-file']),
90
- args.map { |afile| [afile, File.open(afile).read] }.to_h
93
+ args.to_h { |afile| [afile, File.read(afile)] }
91
94
  )
92
95
 
93
- changer.apply(options[:modifications])
96
+ changer.apply(options[:modifications].split(/\s*,\s*/).map(&:to_sym))
94
97
 
95
- changer.adoc_texts.each do |adoc_file, adoc_text|
96
- File.open(adoc_file, 'w') { |f| f.write(adoc_text) }
98
+ changer.adoc_sources.each do |adoc_filename, adoc_text|
99
+ File.write(adoc_filename, adoc_text)
97
100
  end
98
101
 
99
- File.open(options[:'modifications-file'], 'w') { |f| f.write(changer.config.to_yaml) }
102
+ File.write(options[:'modifications-file'], changer.config.to_yaml)
100
103
 
101
104
  unless options['changes-summary'].nil?
102
105
  CSV.open(options['changes-summary'], 'wb') do |csv|
data/config/mutant.yml CHANGED
@@ -1,6 +1,26 @@
1
1
  ---
2
2
  includes:
3
- - lib
4
- integration: rspec
3
+ - lib
4
+ integration:
5
+ name: rspec
5
6
  requires:
6
- - devtools
7
+ - defmastership
8
+ matcher:
9
+ subjects:
10
+ - 'DefMastership*'
11
+ # ignore:
12
+ # - 'DefMastership::BatchModifier*'
13
+ # - 'DefMastership::CSVFormatter*'
14
+ # - 'DefMastership::CSVFormatterBody*'
15
+ # - 'DefMastership::CSVFormatterHeader*'
16
+ # - 'DefMastership::ChangeRefModifier*'
17
+ # - 'DefMastership::Definition*'
18
+ # - 'DefMastership::Document*'
19
+ # - 'DefMastership::Modifier*'
20
+ # - 'DefMastership::ModifierFactory*'
21
+ # - 'DefMastership::ParsingState*'
22
+ # - 'DefMastership::RenameIncludedFilesModifier*'
23
+ # - 'DefMastership::UpdateDefChecksumModifier*'
24
+ # - 'DefMastership::UpdateDefModifier*'
25
+ # - 'DefMastership::UpdateDefVersionModifier*'
26
+ # fail_fast: true
@@ -14,31 +14,26 @@ require(
14
14
  )
15
15
  )
16
16
 
17
- Gem::Specification.new do |s|
18
- s.required_ruby_version = '>= 2.5'
19
- s.name = 'defmastership'
20
- s.version = DefMastership::VERSION
21
- s.author = 'Jérôme Arbez-Gindre'
22
- s.email = 'jeromearbezgindre@gmail.com'
23
- s.licenses = ['MIT']
24
- s.homepage = 'https://gitlab.com/jjag/defmastership/'
25
- s.platform = Gem::Platform::RUBY
26
- s.summary = 'Handling of references and definitions with asciidoctor'
27
- s.files = `git ls-files`.split("\n")
28
- s.require_paths << 'lib'
29
- s.extra_rdoc_files = ['README.rdoc', 'defmastership.rdoc']
30
- s.rdoc_options << '--title defmastership' << '--main README.rdoc' << '-ri'
31
- s.bindir = 'bin'
32
- s.executables << 'defmastership'
33
- s.add_development_dependency('aruba', '~> 1')
34
- s.add_development_dependency('rake', '~> 13')
35
- s.add_development_dependency('rdoc', '~> 6')
36
- s.add_development_dependency('rspec', '~> 3')
37
- s.add_development_dependency('rubocop', '1.13')
38
- s.add_development_dependency('rubocop-rake', '~> 0.5')
39
- s.add_development_dependency('rubocop-rspec', '~> 2.0')
40
- s.add_development_dependency('simplecov', '~> 0')
41
- s.add_runtime_dependency('aasm', '~> 5')
42
- s.add_runtime_dependency('asciidoctor', '~> 2')
43
- s.add_runtime_dependency('gli', '~> 2')
17
+ Gem::Specification.new do |spec|
18
+ spec.metadata = {
19
+ 'rubygems_mfa_required' => 'true'
20
+ }
21
+ spec.required_ruby_version = '>= 2.7'
22
+ spec.name = 'defmastership'
23
+ spec.version = DefMastership::VERSION
24
+ spec.author = 'Jérôme Arbez-Gindre'
25
+ spec.email = 'jeromearbezgindre@gmail.com'
26
+ spec.licenses = ['MIT']
27
+ spec.homepage = 'https://gitlab.com/jjag/defmastership/'
28
+ spec.platform = Gem::Platform::RUBY
29
+ spec.summary = 'Handling of references and definitions with asciidoctor'
30
+ spec.files = `git ls-files`.split("\n")
31
+ spec.require_paths << 'lib'
32
+ spec.extra_rdoc_files = ['README.rdoc', 'defmastership.rdoc']
33
+ spec.rdoc_options << '--title defmastership' << '--main README.rdoc' << '-ri'
34
+ spec.bindir = 'bin'
35
+ spec.executables << 'defmastership'
36
+ spec.add_runtime_dependency('aasm', '~> 5')
37
+ spec.add_runtime_dependency('asciidoctor', '~> 2')
38
+ spec.add_runtime_dependency('gli', '~> 2')
44
39
  end
@@ -213,7 +213,7 @@ Feature: definition checksum
213
213
  And the stdout should not contain anything
214
214
  And the stderr should not contain anything
215
215
 
216
- Scenario: Checksum take into account variables in ref modification
216
+ Scenario: Checksum takes into account variables in ref modification
217
217
  Given a file named "modifications.yml" with:
218
218
  """
219
219
  ---
@@ -243,6 +243,36 @@ Feature: definition checksum
243
243
  And the stdout should not contain anything
244
244
  And the stderr should not contain anything
245
245
 
246
+ Scenario: Checksum does not take into account bad variables definition
247
+ Given a file named "modifications.yml" with:
248
+ """
249
+ ---
250
+ :update_requirement_checksum:
251
+ :type: update_def_checksum
252
+ :config:
253
+ :def_type: requirement
254
+ """
255
+ And a file named "thedoc.adoc" with:
256
+ """
257
+ :variable:multiline
258
+ [define, requirement, TOTO-0001]
259
+ --
260
+ Exemple of {variable} requirement.
261
+ Second line.
262
+ --
263
+ """
264
+ When I successfully run `defmastership modify --modifications update_requirement_checksum thedoc.adoc`
265
+ Then the file "thedoc.adoc" should contain:
266
+ """
267
+ [define, requirement, TOTO-0001(~2e7dd73e)]
268
+ --
269
+ Exemple of {variable} requirement.
270
+ Second line.
271
+ --
272
+ """
273
+ And the stdout should not contain anything
274
+ And the stderr should not contain anything
275
+
246
276
  Scenario: Checksum keep explicit version in ref modification
247
277
  Given a file named "modifications.yml" with:
248
278
  """
@@ -201,7 +201,7 @@ Feature: The extract command
201
201
  And the stdout should not contain anything
202
202
  And the stderr should not contain anything
203
203
 
204
- Scenario: Extract one definition with external ref to CSV
204
+ Scenario: Extract one definition with external ref to CSV
205
205
  Given a file named "toto.adoc" with:
206
206
  """
207
207
  :eref-implements-prefix: Participate to:
@@ -224,6 +224,27 @@ Feature: The extract command
224
224
  And the stdout should not contain anything
225
225
  And the stderr should not contain anything
226
226
 
227
+ Scenario: Extract one definition with missing external ref to CSV
228
+ Given a file named "toto.adoc" with:
229
+ """
230
+ :eref-implements-prefix: Participate to:
231
+ :eref-implements-url: ./the_other_document.html
232
+ [define, requirement, TOTO-0001]
233
+ --
234
+ Exemple of multiline requirement.
235
+ Second line.
236
+ --
237
+ """
238
+ When I successfully run `defmastership export toto.adoc`
239
+ Then the file "toto.csv" should contain:
240
+ """
241
+ Type,Reference,Value,Checksum,Participate to:
242
+ requirement,TOTO-0001,"Exemple of multiline requirement.
243
+ Second line.",~b86dcbde,
244
+ """
245
+ And the stdout should not contain anything
246
+ And the stderr should not contain anything
247
+
227
248
  Scenario: Extract one definition with external ref without url to CSV
228
249
  Given a file named "toto.adoc" with:
229
250
  """
@@ -313,6 +334,27 @@ Feature: The extract command
313
334
  And the stdout should not contain anything
314
335
  And the stderr should not contain anything
315
336
 
337
+ Scenario: Extract one definition with missing attributes to CSV
338
+ Given a file named "toto.adoc" with:
339
+ """
340
+ :attr-verifiedby-prefix: Verified by:
341
+ :attr-criticity-prefix: Criticity:
342
+ [define, requirement, TOTO-0001]
343
+ One single line.
344
+
345
+ something else.
346
+ defs:attribute[verifiedby, Beautiful Test]
347
+ """
348
+ When I successfully run `defmastership export toto.adoc`
349
+ And the stdout should not contain anything
350
+ Then the file "toto.csv" should contain:
351
+ """
352
+ Type,Reference,Value,Checksum,Verified by:,Criticity:
353
+ requirement,TOTO-0001,One single line.,~554b0ff5,Beautiful Test,
354
+ """
355
+ And the stdout should not contain anything
356
+ And the stderr should not contain anything
357
+
316
358
  Scenario: Extract one definition with example in it
317
359
  Given a file named "toto.adoc" with:
318
360
  """
@@ -58,6 +58,34 @@ Feature: The rename_included_files command
58
58
  And the file "any_path/one_file.png" should not exist
59
59
  And the file "any_path/TOTO-WHATEVER-123_one_file.png" should exist
60
60
 
61
+ Scenario: change the filename with options in include macro
62
+ Given a file named "modifications.yml" with:
63
+ """
64
+ ---
65
+ :rename_included_png:
66
+ :type: rename_included_files
67
+ :config:
68
+ :from_regexp: (?<origin>.*\.png)
69
+ :to_template: "%<reference>s_%<origin>s"
70
+ """
71
+ And a file named "thedoc.adoc" with:
72
+ """
73
+ [define, requirement, TOTO-WHATEVER-123]
74
+ include::any_path/one_file.png[leveloffset=offset,lines=ranges]
75
+ """
76
+ And a directory named "any_path"
77
+ And an empty file named "any_path/one_file.png"
78
+ When I successfully run `defmastership modify --modifications rename_included_png thedoc.adoc`
79
+ Then the stdout should not contain anything
80
+ And the stderr should not contain anything
81
+ And the file "thedoc.adoc" should contain:
82
+ """
83
+ [define, requirement, TOTO-WHATEVER-123]
84
+ include::any_path/TOTO-WHATEVER-123_one_file.png[leveloffset=offset,lines=ranges]
85
+ """
86
+ And the file "any_path/one_file.png" should not exist
87
+ And the file "any_path/TOTO-WHATEVER-123_one_file.png" should exist
88
+
61
89
  Scenario: change the filename with variable in path
62
90
  Given a file named "modifications.yml" with:
63
91
  """
@@ -4,32 +4,37 @@
4
4
  module DefMastership
5
5
  # Change references from temporary to definitive with multiple RefChangers
6
6
  class BatchModifier
7
- attr_reader :config, :adoc_texts, :changes
7
+ attr_reader :config, :adoc_sources, :changes
8
8
 
9
- def initialize(config, adoc_texts)
9
+ def initialize(config, adoc_sources)
10
10
  @config = config
11
- @adoc_texts = adoc_texts
11
+ @adoc_sources = adoc_sources
12
12
  @changes = []
13
13
  end
14
14
 
15
15
  def apply(modifs)
16
- modifs.split(/\s*,\s*/).each do |modif|
16
+ modifs.each do |modif|
17
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
18
+ @adoc_sources = modifier.do_modifications(adoc_sources)
19
+ config.fetch(modif)[:config] = modifier.config
20
+
21
+ collect_changes(modifier, modif)
23
22
  end
24
23
  end
25
24
 
26
25
  private
27
26
 
28
27
  def modifier_from(modif)
29
- raise(ArgumentError, "#{modif} is not a known modification") if @config[modif.to_sym].nil?
28
+ config_modif_sym = config[modif]
29
+ raise(ArgumentError, "#{modif} is not a known modification") unless config_modif_sym
30
+
31
+ ModifierFactory.from_config(config_modif_sym)
32
+ end
30
33
 
31
- class_name = "#{@config[modif.to_sym][:type].split('_').map(&:capitalize).join}Modifier"
32
- DefMastership.const_get(class_name).new(@config[modif.to_sym][:config])
34
+ def collect_changes(modifier, modif)
35
+ modifier.changes.reduce(changes) do |acc, change|
36
+ acc << ([modif.to_s] + change)
37
+ end
33
38
  end
34
39
  end
35
40
  end