asciidoctor-defmastership 1.0.7 → 1.0.8

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 32c34eada26d2c22399f1418c4eef3753832cff1363ff0d82ab1f2308af83ca4
4
- data.tar.gz: 95e344b6e198af8ce03fa005a9545a8d256183966547cd5dacd3f2a4fef802ba
3
+ metadata.gz: d012bdd9c28ef271bbb1f65b6df7b46b1c4b423fb4445e8e55c4bdb73f7a43de
4
+ data.tar.gz: 58ce5fc184f48878c8b7cd904e049a9a87bbb76d5a977beba4b0fad7a661cbfd
5
5
  SHA512:
6
- metadata.gz: f860c3c2c9dcc1743495c8f806a9085a5be1ab836bd87f4282902423420157b96e3d0f2b5e61e3d70a95055a955c00e7ff619e1b95462d293f412d4701002d95
7
- data.tar.gz: 9918bb1738b73827e6c5071effd3f44b91cc3ddaa607ad06ca2cdea3b25e42f9cd75d4300018f3e9dd1bf28362e3aacbd3251666cfe2a3d9b723f82b83c0e83b
6
+ metadata.gz: 76fe2d67b3827039dd4d974c7bf329a417d7edfc57bf5d42542092055fd9e8c54d0169e5b36213b6777acefc267cbce4e2aedae877ba7bc5ff6316a9c428a888
7
+ data.tar.gz: cd455d7722292309de19cf3788d9735a18fd6bd85bc7cab48f5165d9d3eaa61682fbdae70839884c649795f5155b0907b64f222affc1456d5fe9ab6f3023aead
data/.gitignore CHANGED
@@ -14,3 +14,4 @@
14
14
  *.gem
15
15
  /Gemfile.lock
16
16
  /.ruby-version
17
+ /rspec_results.html
data/.gitlab-ci.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  default:
2
- image: ruby:3.2
2
+ image: ruby:3.3
3
3
  before_script:
4
4
  - apt-get update
5
5
  - ruby -v
@@ -9,23 +9,34 @@ default:
9
9
 
10
10
  unit tests:
11
11
  script:
12
- - bundle exec rake spec
12
+ - bundle exec rake test:spec
13
13
 
14
14
  rubocop:
15
15
  script:
16
- - bundle exec rake rubocop
16
+ - bundle exec rake quality:rubocop
17
17
 
18
18
  unit tests ruby2.7:
19
19
  image: ruby:2.7
20
+ before_script:
21
+ - apt-get update
22
+ - ruby -v
23
+ - which ruby
24
+ - gem install bundler -v 2.4.22 --no-document
25
+ - bundle install --jobs $(nproc) "${FLAGS[@]}"
20
26
  script:
21
- - bundle exec rake spec
27
+ - bundle exec rake test:spec
22
28
 
23
29
  unit tests ruby3.0:
24
30
  image: ruby:3.0
25
31
  script:
26
- - bundle exec rake spec
32
+ - bundle exec rake test:spec
27
33
 
28
34
  unit tests ruby3.1:
29
35
  image: ruby:3.1
30
36
  script:
31
- - bundle exec rake spec
37
+ - bundle exec rake test:spec
38
+
39
+ unit tests ruby3.2:
40
+ image: ruby:3.2
41
+ script:
42
+ - bundle exec rake test:spec
data/Gemfile CHANGED
@@ -2,19 +2,44 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  source('https://rubygems.org')
5
+
5
6
  gemspec
6
7
 
7
- # to parse provided Rakefile
8
- gem 'rake', '~> 13'
9
- # tdd
10
- gem 'rspec', '~> 3'
11
- # code need to be clean
12
- gem 'rubocop', '1.54'
13
- # code need to be clean
14
- gem 'rubocop-performance', '~> 1.18'
15
- # Rakile needs to be clean
16
- gem 'rubocop-rake', '~> 0.6'
17
- # unit tests need to be clean
18
- gem 'rubocop-rspec', '~> 2.22'
19
- # What is tdd without code coverage ?
20
- gem 'simplecov', '~> 0'
8
+ ruby RUBY_VERSION
9
+
10
+ group :development do
11
+ if RUBY_VERSION >= '3.0'
12
+ # mutation testing
13
+ plan = 'oss'
14
+ key = '7oac4dMz95cTUuFPtGDfTDSQep6ZhdGW'
15
+ source "https://#{plan}:#{key}@gem.mutant.dev" do
16
+ # license needed
17
+ gem 'mutant-license', '~> 0'
18
+ end
19
+ # mutation testing
20
+ gem 'mutant-rspec', '~> 0'
21
+ end
22
+ # to parse provided Rakefile
23
+ gem 'rake', '~> 13'
24
+ # tdd
25
+ gem 'rspec', '3.12'
26
+ # code need to be clean
27
+ gem 'rubocop', '1.65'
28
+ # code need to be clean
29
+ gem 'rubocop-performance', '~> 1'
30
+ # Rakile needs to be clean
31
+ gem 'rubocop-rake', '~> 0'
32
+ # unit tests need to be clean
33
+ gem 'rubocop-rspec', '~> 2'
34
+ if RUBY_VERSION >= '3.0'
35
+ # detect selling code
36
+ gem 'reek', '~> 6'
37
+ end
38
+ # What is tdd without code coverage ?
39
+ gem 'simplecov', '~> 0'
40
+ end
41
+
42
+ group :debugging do
43
+ # Sometimes, we need to debug
44
+ gem 'pry', '~> 0'
45
+ end
data/Rakefile CHANGED
@@ -4,13 +4,18 @@
4
4
  require('bundler/gem_tasks')
5
5
  require('rspec/core/rake_task')
6
6
 
7
- RSpec::Core::RakeTask.new(:spec)
8
- require('rubocop/rake_task')
7
+ Dir['tasks/**/*.rake'].each { |t| load t }
9
8
 
10
- RuboCop::RakeTask.new do |task|
11
- task.requires << 'rubocop-performance'
12
- task.requires << 'rubocop-rspec'
13
- task.requires << 'rubocop-rake'
9
+ desc 'Continous integration tasks'
10
+ task :ci do
11
+ [
12
+ 'test:spec',
13
+ :rubocop
14
+ ].each do |name|
15
+ puts "\n=== Running #{name}...\n"
16
+ Rake::Task[name].invoke
17
+ puts "\n=== Running #{name} -> Done\n"
18
+ end
14
19
  end
15
20
 
16
- task(default: %i[rubocop spec])
21
+ task default: :ci
@@ -37,6 +37,6 @@ Gem::Specification.new do |spec|
37
37
  end
38
38
  spec.require_paths = ['lib']
39
39
 
40
- spec.add_dependency('asciidoctor', '~> 2.0')
41
- spec.add_dependency('defmastership', '>= 1.0.16', '< 2.0')
40
+ spec.add_dependency('asciidoctor', '~> 2')
41
+ spec.add_dependency('defmastership', '>= 1.0.19')
42
42
  end
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
data/config/reek.yml CHANGED
@@ -1,106 +1,130 @@
1
1
  ---
2
- detectors:
3
- Attribute:
4
- enabled: false
5
- exclude: []
6
- BooleanParameter:
7
- enabled: true
8
- exclude: []
9
- ClassVariable:
10
- enabled: true
11
- exclude: []
12
- ControlParameter:
13
- enabled: true
14
- exclude: []
15
- DataClump:
16
- enabled: true
17
- exclude: []
18
- max_copies: 0
19
- min_clump_size: 2
20
- DuplicateMethodCall:
21
- enabled: true
22
- exclude: []
23
- max_calls: 1
24
- allow_calls: []
25
- FeatureEnvy:
26
- enabled: true
27
- exclude: []
28
- IrresponsibleModule:
29
- enabled: true
30
- exclude: []
31
- LongParameterList:
32
- enabled: true
33
- exclude:
34
- - Devtools::Config#self.attribute
35
- max_params: 2
36
- overrides: {}
37
- LongYieldList:
38
- enabled: true
39
- exclude: []
40
- max_params: 0
41
- NestedIterators:
42
- enabled: true
43
- exclude: []
44
- max_allowed_nesting: 1
45
- ignore_iterators: []
46
- NilCheck:
47
- enabled: true
48
- exclude: []
49
- RepeatedConditional:
50
- enabled: true
51
- exclude: []
52
- max_ifs: 1
53
- TooManyConstants:
54
- enabled: true
55
- exclude:
56
- - Devtools
57
- TooManyInstanceVariables:
58
- enabled: true
59
- exclude: []
60
- max_instance_variables: 2
61
- TooManyMethods:
62
- enabled: true
63
- exclude: []
64
- max_methods: 15
65
- TooManyStatements:
66
- enabled: true
67
- exclude: []
68
- max_statements: 5
69
- UncommunicativeMethodName:
70
- enabled: true
71
- exclude: []
72
- reject:
73
- - '/^[a-z]$/'
74
- - '/[0-9]$/'
75
- - '/[A-Z]/'
76
- accept: []
77
- UncommunicativeModuleName:
78
- enabled: true
79
- exclude: []
80
- reject:
81
- - '/^.$/'
82
- - '/[0-9]$/'
83
- accept: []
84
- UncommunicativeParameterName:
85
- enabled: true
86
- exclude: []
87
- reject:
88
- - '/^.$/'
89
- - '/[0-9]$/'
90
- - '/[A-Z]/'
91
- accept: []
92
- UncommunicativeVariableName:
93
- enabled: true
94
- exclude: []
95
- reject:
96
- - '/^.$/'
97
- - '/[0-9]$/'
98
- - '/[A-Z]/'
99
- accept: []
100
- UnusedParameters:
101
- enabled: true
102
- exclude: []
103
- UtilityFunction:
104
- enabled: true
105
- exclude:
106
- - Devtools::Project::Initializer::Rspec#require_files # intentional for deduplication
2
+ # detectors:
3
+ # Attribute:
4
+ # enabled: true
5
+ # exclude: []
6
+ # BooleanParameter:
7
+ # enabled: true
8
+ # exclude: []
9
+ # ClassVariable:
10
+ # enabled: true
11
+ # exclude: []
12
+ # ControlParameter:
13
+ # enabled: true
14
+ # exclude: []
15
+ # DataClump:
16
+ # enabled: true
17
+ # exclude: []
18
+ # max_copies: 2
19
+ # min_clump_size: 2
20
+ # DuplicateMethodCall:
21
+ # enabled: true
22
+ # exclude: []
23
+ # max_calls: 1
24
+ # allow_calls: []
25
+ # FeatureEnvy:
26
+ # enabled: true
27
+ # exclude: []
28
+ # InstanceVariableAssumption:
29
+ # enabled: true
30
+ # exclude: []
31
+ # IrresponsibleModule:
32
+ # enabled: true
33
+ # exclude: []
34
+ # LongParameterList:
35
+ # enabled: true
36
+ # exclude: []
37
+ # max_params: 3
38
+ # overrides:
39
+ # initialize:
40
+ # max_params: 5
41
+ # LongYieldList:
42
+ # enabled: true
43
+ # exclude: []
44
+ # max_params: 3
45
+ # ManualDispatch:
46
+ # enabled: true
47
+ # exclude: []
48
+ # MissingSafeMethod:
49
+ # enabled: true
50
+ # exclude: []
51
+ # ModuleInitialize:
52
+ # enabled: true
53
+ # exclude: []
54
+ # NestedIterators:
55
+ # enabled: true
56
+ # exclude: []
57
+ # max_allowed_nesting: 1
58
+ # ignore_iterators:
59
+ # - tap
60
+ # - Tempfile.create
61
+ # NilCheck:
62
+ # enabled: true
63
+ # exclude: []
64
+ # RepeatedConditional:
65
+ # enabled: true
66
+ # exclude: []
67
+ # max_ifs: 2
68
+ # SubclassedFromCoreClass:
69
+ # enabled: true
70
+ # exclude: []
71
+ # TooManyConstants:
72
+ # enabled: true
73
+ # exclude: []
74
+ # max_constants: 5
75
+ # TooManyInstanceVariables:
76
+ # enabled: true
77
+ # exclude: []
78
+ # max_instance_variables: 4
79
+ # TooManyMethods:
80
+ # enabled: true
81
+ # exclude: []
82
+ # max_methods: 15
83
+ # TooManyStatements:
84
+ # enabled: true
85
+ # exclude:
86
+ # - initialize
87
+ # max_statements: 5
88
+ # UncommunicativeMethodName:
89
+ # enabled: true
90
+ # exclude: []
91
+ # reject:
92
+ # - "/^[a-z]$/"
93
+ # - "/[0-9]$/"
94
+ # - "/[A-Z]/"
95
+ # accept: []
96
+ # UncommunicativeModuleName:
97
+ # enabled: true
98
+ # exclude: []
99
+ # reject:
100
+ # - "/^.$/"
101
+ # - "/[0-9]$/"
102
+ # accept: []
103
+ # UncommunicativeParameterName:
104
+ # enabled: true
105
+ # exclude: []
106
+ # reject:
107
+ # - "/^.$/"
108
+ # - "/[0-9]$/"
109
+ # - "/[A-Z]/"
110
+ # - "/^_/"
111
+ # accept: []
112
+ # UncommunicativeVariableName:
113
+ # enabled: true
114
+ # exclude: []
115
+ # reject:
116
+ # - "/^.$/"
117
+ # - "/[0-9]$/"
118
+ # - "/[A-Z]/"
119
+ # accept:
120
+ # - "/^_$/"
121
+ # UnusedParameters:
122
+ # enabled: true
123
+ # exclude: []
124
+ # UnusedPrivateMethod:
125
+ # enabled: false
126
+ # exclude: []
127
+ # UtilityFunction:
128
+ # enabled: true
129
+ # exclude: []
130
+ # public_methods_only: false
data/config/rspec ADDED
@@ -0,0 +1,4 @@
1
+ --format documentation
2
+ --format html --out rspec_results.html
3
+ --color
4
+ --require spec_helper
data/config/rubocop.yml CHANGED
@@ -1,151 +1,79 @@
1
- inherit_from: ../.rubocop.yml
1
+ # The behavior of RuboCop can be controlled via the .rubocop.yml
2
+ # configuration file. It makes it possible to enable/disable
3
+ # certain cops (checks) and to alter their behavior if they accept
4
+ # any parameters. The file can be placed either in your home
5
+ # directory or in some project directory.
6
+ #
7
+ # RuboCop will start looking for the configuration file in the directory
8
+ # where the inspected file is and continue its way up to the root directory.
9
+ #
10
+ # See https://github.com/rubocop-hq/rubocop/blob/master/manual/configuration.md
11
+
12
+ require:
13
+ - rubocop-performance
14
+ - rubocop-rspec
15
+ - rubocop-rake
2
16
 
3
17
  AllCops:
4
- TargetRubyVersion: 2.5.0
18
+ TargetRubyVersion: 2.7
19
+ EnabledByDefault: true
20
+ DisplayCopNames: true
5
21
 
6
- Metrics/BlockLength:
7
- Exclude:
8
- # Ignore RSpec DSL
9
- - spec/**/*
10
- # Ignore gemspec DSL
11
- - '*.gemspec'
12
-
13
- Naming/FileName:
14
- Exclude:
15
- - Rakefile
16
-
17
- # Avoid parameter lists longer than five parameters.
18
- ParameterLists:
19
- Max: 3
20
- CountKeywordArgs: true
21
-
22
- # Avoid more than `Max` levels of nesting.
23
- BlockNesting:
24
- Max: 3
25
-
26
- # Align with the style guide.
27
- CollectionMethods:
28
- PreferredMethods:
29
- collect: 'map'
30
- inject: 'reduce'
31
- find: 'detect'
32
- find_all: 'select'
33
-
34
- # Do not force public/protected/private keyword to be indented at the same
35
- # level as the def keyword. My personal preference is to outdent these keywords
36
- # because I think when scanning code it makes it easier to identify the
37
- # sections of code and visually separate them. When the keyword is at the same
38
- # level I think it sort of blends in with the def keywords and makes it harder
39
- # to scan the code and see where the sections are.
40
- AccessModifierIndentation:
41
- Enabled: false
42
-
43
- # Limit line length
44
- LineLength:
45
- Max: 80
46
-
47
- # Disable documentation checking until a class needs to be documented once
48
- Documentation:
49
- Enabled: false
50
-
51
- # Do not always use &&/|| instead of and/or.
52
- AndOr:
53
- Enabled: false
22
+ Style/Copyright:
23
+ Enabled: true
24
+ Notice: 'Copyright (\(c\) )?202[0-9] Jerome Arbez-Gindre'
25
+ AutocorrectNotice: '# Copyright (c) 2023 Jerome Arbez-Gindre'
54
26
 
55
- # Do not favor modifier if/unless usage when you have a single-line body
56
- IfUnlessModifier:
27
+ Lint/ConstantResolution: # Not available ins rubocop 0.81
57
28
  Enabled: false
58
29
 
59
- # Allow case equality operator (in limited use within the specs)
60
- CaseEquality:
30
+ Style/DocumentationMethod:
61
31
  Enabled: false
62
32
 
63
- # Constants do not always have to use SCREAMING_SNAKE_CASE
64
- ConstantName:
65
- Enabled: false
66
-
67
- # Not all trivial readers/writers can be defined with attr_* methods
68
- TrivialAccessors:
69
- Enabled: false
70
-
71
- # Allow empty lines around class body
72
- EmptyLinesAroundClassBody:
73
- Enabled: false
74
-
75
- # Allow empty lines around module body
76
- EmptyLinesAroundModuleBody:
77
- Enabled: false
78
-
79
- # Allow empty lines around block body
80
- EmptyLinesAroundBlockBody:
81
- Enabled: false
82
-
83
- # Allow multiple line operations to not require indentation
84
- MultilineOperationIndentation:
85
- Enabled: false
86
-
87
- # Prefer String#% over Kernel#sprintf
88
- FormatString:
89
- Enabled: false
90
-
91
- # Use square brackets for literal Array objects
92
- PercentLiteralDelimiters:
93
- PreferredDelimiters:
94
- '%': '{}'
95
- '%i': '[]'
96
- '%q': ()
97
- '%Q': ()
98
- '%r': '{}'
99
- '%s': ()
100
- '%w': '[]'
101
- '%W': '[]'
102
- '%x': ()
103
-
104
- # Align if/else blocks with the variable assignment
105
- EndAlignment:
106
- EnforcedStyleAlignWith: variable
107
-
108
- # Do not always align parameters when it is easier to read
109
- AlignParameters:
33
+ Style/StringHashKeys :
34
+ Enabled: true
110
35
  Exclude:
111
- - spec/**/*_spec.rb
112
-
113
- # Prefer #kind_of? over #is_a?
114
- ClassCheck:
115
- EnforcedStyle: kind_of?
36
+ - '*.gemspec'
116
37
 
117
- # Do not prefer double quotes to be used when %q or %Q is more appropriate
118
- UnneededPercentQ:
119
- Enabled: false
38
+ Style/MissingElse:
39
+ EnforcedStyle: case
120
40
 
121
- # Allow a maximum ABC score
122
- Metrics/AbcSize:
123
- Max: 20.1
41
+ Metrics/ModuleLength :
42
+ Exclude:
43
+ - 'spec/**/*'
124
44
 
125
- # Do not prefer lambda.call(...) over lambda.(...)
126
- LambdaCall:
127
- Enabled: false
45
+ Metrics/BlockLength :
46
+ Exclude:
47
+ - 'spec/**/*'
48
+ - '*.gemspec'
128
49
 
129
- # Allow additional spaces
130
- ExtraSpacing:
131
- Enabled: false
50
+ Security/Eval :
51
+ Exclude:
52
+ - 'Rakefile'
132
53
 
133
- # All objects can still be mutated if their eigenclass is patched
134
- RedundantFreeze:
135
- Enabled: false
54
+ Style/ConstantVisibility :
55
+ Exclude:
56
+ # there is one unique explicit constant visibility for all
57
+ # constants
58
+ - 'lib/asciidoctor/defmastership/extension.rb'
136
59
 
137
- # Prefer using `fail` when raising and `raise` when reraising
138
- SignalException:
139
- EnforcedStyle: semantic
60
+ # rubocop-rspec options
61
+ RSpec/MessageExpectation :
62
+ Enabled: true
140
63
 
141
- Style/FrozenStringLiteralComment:
142
- Enabled: false
64
+ RSpec/FilePath :
65
+ Enabled: true
143
66
 
144
- Style/CommentedKeyword:
145
- Enabled: false
67
+ RSpec/NestedGroups:
68
+ Max: 4
146
69
 
147
- Style/MixinGrouping:
70
+ Layout/RedundantLineBreak:
148
71
  Enabled: false
72
+
73
+ Style/DisableCopsWithinSourceCodeDirective:
74
+ Enabled: true
75
+ AllowedCops: ['Lint/InterpolationCheck']
149
76
 
150
- Layout/MultilineMethodCallIndentation:
151
- EnforcedStyle: indented
77
+ Layout/EndOfLine:
78
+ EnforcedStyle: lf
79
+
@@ -0,0 +1,185 @@
1
+ # Copyright (c) 2020 Jerome Arbez-Gindre
2
+ # frozen_string_literal: true
3
+
4
+ # :nocov:
5
+ require('asciidoctor/extensions') unless RUBY_ENGINE == 'opal'
6
+ # :nocov:
7
+
8
+ # An extension that allow to define applicable definitions
9
+ #
10
+ # Usage
11
+ # :tag-mylabel-color: yellow
12
+ # :tag-otherlabel-color: red
13
+ #
14
+ #
15
+ # [define, requirement, TOTO-0001, [mylabel, otherlabel]]
16
+ # --
17
+ # The system shall allow to do lots of things.
18
+ # --
19
+ #
20
+ # or
21
+ #
22
+ # [define, requirement, TOTO-0001]
23
+ # This shall be nice.
24
+ #
25
+ require('asciidoctor/defmastership/regexp_dispatcher')
26
+ require('defmastership/constants')
27
+ require('defmastership/parsing_state')
28
+
29
+ module Asciidoctor
30
+ # Module to host DefMastership preprocessor
31
+ module DefMastership
32
+ # Preprocessor to replace adoc statements
33
+ # This class smells of :reek:InstanceVariableAssumption.
34
+ # Not an issue because process is the only method used by Asciidoctor
35
+ class Preprocessor < Asciidoctor::Extensions::Preprocessor
36
+ REGEXPS = {
37
+ eref_config: ::DefMastership::DMRegexp::EREF_CONFIG,
38
+ definition: ::DefMastership::DMRegexp::DEFINITION,
39
+ eref_def: ::DefMastership::DMRegexp::EREF_DEF,
40
+ iref_def: ::DefMastership::DMRegexp::IREF_DEF,
41
+ attr_set: ::DefMastership::DMRegexp::ATTR_SET,
42
+ variable_def: ::DefMastership::DMRegexp::VARIABLE_DEF
43
+ }.freeze
44
+
45
+ private_constant :REGEXPS
46
+
47
+ def process(_document, reader)
48
+ @has_url = Set.new
49
+ @variables = {}
50
+ @parsing_state = ::DefMastership::ParsingState.new
51
+
52
+ return reader if reader.eof?
53
+
54
+ reader.unshift_lines(parse_and_replace(reader.read_lines))
55
+ end
56
+
57
+ def build_definition(_line, matches)
58
+ Helper::DefinitionStringBuilder.new(matches, show_explicit_checksum(matches)).str
59
+ end
60
+
61
+ def variable_set(line, matches)
62
+ @variables.merge!(Helper.variable_hash(matches))
63
+ [line]
64
+ end
65
+
66
+ def set_eref_url_if_any(line, matches)
67
+ @has_url.add(matches[:reference]) if Helper.valid_eref_url?(matches)
68
+ [line]
69
+ end
70
+
71
+ def build_external_ref(_line, matches)
72
+ return [] unless show_ext_ref(matches)
73
+
74
+ extrefs = matches[:extrefs].split(/\s*,\s*/)
75
+ extref_line = extrefs.map { |ref| build_link(ref, matches) }
76
+ ["[.external_reference]\#{eref-#{matches[:reference]}-prefix} #{extref_line.join(', ')}.#"]
77
+ end
78
+
79
+ # This method smells of :reek:UtilityFunction
80
+ def build_internal_ref(line, _matches)
81
+ [
82
+ line.gsub(REGEXPS.fetch(:iref_def)) do
83
+ intref = Regexp.last_match[:intref]
84
+ "<<#{intref},#{intref}>>"
85
+ end
86
+ ]
87
+ end
88
+
89
+ # This method smells of :reek:UtilityFunction
90
+ def attribute_setting(_line, matches)
91
+ [
92
+ '[.attribute]',
93
+ "{attr-#{matches[:attr]}-prefix} #{matches[:value]}."
94
+ ]
95
+ end
96
+
97
+ private
98
+
99
+ def build_subs
100
+ subs = RegexpDispatcher.new(self)
101
+ subs
102
+ .add_rule(REGEXPS.fetch(:eref_config), :set_eref_url_if_any)
103
+ .add_rule(REGEXPS.fetch(:definition), :build_definition)
104
+ .add_rule(REGEXPS.fetch(:eref_def), :build_external_ref)
105
+ .add_rule(REGEXPS.fetch(:iref_def), :build_internal_ref)
106
+ .add_rule(REGEXPS.fetch(:attr_set), :attribute_setting)
107
+ .add_rule(REGEXPS.fetch(:variable_def), :variable_set)
108
+ end
109
+
110
+ def parse_and_replace(lines)
111
+ subs = build_subs
112
+ lines.reduce([]) do |new_lines, line|
113
+ next new_lines + [line] unless @parsing_state.enabled?(line)
114
+
115
+ next new_lines + subs.replace(line)
116
+ end
117
+ end
118
+
119
+ def show_explicit_checksum(matches)
120
+ matches[:explicit_checksum] &&
121
+ !@variables['show-explicit-checksum'].eql?('disable') &&
122
+ !@variables["show-#{matches[:type]}-explicit-checksum"].eql?('disable')
123
+ end
124
+
125
+ def build_link(ref, matches)
126
+ refname = matches[:reference]
127
+ return ref unless @has_url.include?(refname)
128
+
129
+ "link:{eref-#{refname}-url}##{ref}[#{ref}]"
130
+ end
131
+
132
+ def show_ext_ref(matches)
133
+ !@variables['show-ext-ref'].eql?('disable') &&
134
+ !@variables["show-#{matches[:reference]}-ext-ref"].eql?('disable')
135
+ end
136
+ end
137
+
138
+ # Proepocessors class Helpers
139
+ class Preprocessor
140
+ # Helpers for Preprocessor class
141
+ module Helper
142
+ # Isolate the definition macro
143
+ class DefinitionStringBuilder
144
+ def initialize(matches, show_explicit_checksum)
145
+ @matches = matches
146
+ @show_explicit_checksum = show_explicit_checksum
147
+ end
148
+
149
+ def str
150
+ explicit_checksum_str = " [.checksum]#(#{@matches[:explicit_checksum]})#" if @show_explicit_checksum
151
+ explicit_version_str = Helper.build_explicit_version_str(@matches[:explicit_version])
152
+ labels_str = Helper.build_labels_str(@matches[:labels])
153
+ reference = @matches[:reference]
154
+ [
155
+ ".#{reference}#{explicit_version_str}#{explicit_checksum_str}#{labels_str}",
156
+ "[##{reference}.define.#{@matches[:type]}]"
157
+ ]
158
+ end
159
+ end
160
+
161
+ def self.valid_eref_url?(match)
162
+ match[:symb] == 'url' && !match[:value].eql?('none')
163
+ end
164
+
165
+ def self.build_labels_str(labels)
166
+ return unless labels
167
+
168
+ labels_strings =
169
+ labels.split(/\s*,\s*/).reduce([]) do |acc, label|
170
+ acc << "[.tag.{tag-#{label}-color}]##{label}#"
171
+ end
172
+ " #{labels_strings.join(' ')}"
173
+ end
174
+
175
+ def self.build_explicit_version_str(explicit_version)
176
+ " [.version]#(#{explicit_version})#" if explicit_version
177
+ end
178
+
179
+ def self.variable_hash(match)
180
+ { match[:varname] => match[:value] }
181
+ end
182
+ end
183
+ end
184
+ end
185
+ end
@@ -1,13 +1,17 @@
1
1
  # Copyright (c) 2023 Jerome Arbez-Gindre
2
2
  # frozen_string_literal: true
3
3
 
4
+ # :nocov:
4
5
  require('asciidoctor/extensions') unless RUBY_ENGINE == 'opal'
6
+ # :nocov:
7
+
5
8
  require('ostruct')
6
9
 
7
10
  module Asciidoctor
8
11
  module DefMastership
9
12
  # Hosts several Text replacement rules
10
13
  class RegexpDispatcher
14
+ # Class to link a regexp with a method
11
15
  Rule = Struct.new(:regexp, :method_symbol)
12
16
  private_constant :Rule
13
17
 
@@ -24,7 +28,7 @@ module Asciidoctor
24
28
  def replace(line)
25
29
  @rules.each do |rule|
26
30
  matches = rule.regexp.match(line)
27
- return @effective_subs.__send__(rule.method_symbol, line, matches) if matches
31
+ return @effective_subs.public_send(rule.method_symbol, line, matches) if matches
28
32
  end
29
33
  [line]
30
34
  end
@@ -2,8 +2,9 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Asciidoctor
5
+ # main application module
5
6
  module DefMastership
6
- VERSION = '1.0.7'
7
+ VERSION = '1.0.8'
7
8
  public_constant :VERSION
8
9
  end
9
10
  end
@@ -2,9 +2,9 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  if RUBY_ENGINE == 'opal'
5
- require('asciidoctor/defmastership/extension')
5
+ require('asciidoctor/defmastership/preprocessor')
6
6
  else
7
- require_relative('defmastership/extension')
7
+ require_relative('defmastership/preprocessor')
8
8
  end
9
9
 
10
10
  Asciidoctor::Extensions.register do
@@ -0,0 +1,8 @@
1
+ # Copyright (c) 2023 Jerome Arbez-Gindre
2
+ # frozen_string_literal: true
3
+
4
+ desc 'Starts the interactive console'
5
+ task :console do
6
+ require 'pry'
7
+ Pry.start
8
+ end
@@ -0,0 +1,9 @@
1
+ # Copyright (c) 2023 Jerome Arbez-Gindre
2
+ # frozen_string_literal: true
3
+
4
+ require('rubygems')
5
+ require('rubygems/package_task')
6
+
7
+ spec = eval(File.read('asciidoctor-defmastership.gemspec'))
8
+
9
+ Gem::PackageTask.new(spec)
@@ -0,0 +1,41 @@
1
+ # Copyright (c) 2023 Jerome Arbez-Gindre
2
+ # frozen_string_literal: true
3
+
4
+ namespace 'quality' do
5
+ begin
6
+ require('rubocop/rake_task')
7
+
8
+ RuboCop::RakeTask.new do |task|
9
+ task.options << '--display-cop-names'
10
+ task.options << '--config=config/rubocop.yml'
11
+ end
12
+ rescue LoadError
13
+ task(:rubocop) do
14
+ puts('Install rubocop to run its rake tasks')
15
+ end
16
+ end
17
+
18
+ begin
19
+ require('reek/rake/task')
20
+
21
+ Reek::Rake::Task.new do |t|
22
+ t.fail_on_error = true
23
+ t.verbose = false
24
+
25
+ t.reek_opts = '--config config/reek.yml'
26
+ end
27
+ rescue LoadError
28
+ task(:reek) do
29
+ puts('Install reek to run its rake tasks')
30
+ end
31
+ end
32
+
33
+ desc 'Runs all quality code check'
34
+ task(all: ['quality:rubocop', 'quality:reek'])
35
+ end
36
+
37
+ desc 'Synonym for quality:rubocop'
38
+ task(rubocop: 'quality:rubocop')
39
+
40
+ desc 'Synonym for quality:reek'
41
+ task(reek: 'quality:reek')
data/tasks/test.rake ADDED
@@ -0,0 +1,19 @@
1
+ # Copyright (c) 2023 Jerome Arbez-Gindre
2
+ # frozen_string_literal: true
3
+
4
+ require('rspec/core/rake_task')
5
+
6
+ namespace 'test' do
7
+ RSpec::Core::RakeTask.new(:spec) do |t|
8
+ t.rspec_opts = ['--options config/rspec']
9
+ end
10
+
11
+ desc 'Runs all unit tests and acceptance tests'
12
+ task(all: ['test:spec'])
13
+ end
14
+
15
+ desc 'Synonym for test:spec'
16
+ task(spec: 'test:spec')
17
+
18
+ desc 'Synonym for test:all'
19
+ task(test: 'test:all')
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: asciidoctor-defmastership
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.7
4
+ version: 1.0.8
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: 2023-07-03 00:00:00.000000000 Z
11
+ date: 2024-07-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: asciidoctor
@@ -16,34 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '2.0'
19
+ version: '2'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '2.0'
26
+ version: '2'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: defmastership
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 1.0.16
34
- - - "<"
35
- - !ruby/object:Gem::Version
36
- version: '2.0'
33
+ version: 1.0.19
37
34
  type: :runtime
38
35
  prerelease: false
39
36
  version_requirements: !ruby/object:Gem::Requirement
40
37
  requirements:
41
38
  - - ">="
42
39
  - !ruby/object:Gem::Version
43
- version: 1.0.16
44
- - - "<"
45
- - !ruby/object:Gem::Version
46
- version: '2.0'
40
+ version: 1.0.19
47
41
  description: |-
48
42
  asciidoctor-defmastership allows to define
49
43
  applicable definitions references, link to other references
@@ -66,21 +60,22 @@ files:
66
60
  - asciidoctor-defmastership.gemspec
67
61
  - bin/console
68
62
  - bin/setup
69
- - config/devtools.yml
70
- - config/flay.yml
71
- - config/flog.yml
72
63
  - config/mutant.yml
73
64
  - config/reek.yml
65
+ - config/rspec
74
66
  - config/rubocop.yml
75
- - config/yardstick.yml
76
67
  - example/.config.adoc
77
68
  - example/.gitignore
78
69
  - example/example.adoc
79
70
  - example/howto.sh
80
71
  - lib/asciidoctor/defmastership.rb
81
- - lib/asciidoctor/defmastership/extension.rb
72
+ - lib/asciidoctor/defmastership/preprocessor.rb
82
73
  - lib/asciidoctor/defmastership/regexp_dispatcher.rb
83
74
  - lib/asciidoctor/defmastership/version.rb
75
+ - tasks/console.rake
76
+ - tasks/package.task
77
+ - tasks/smelling_code.rake
78
+ - tasks/test.rake
84
79
  homepage: https://gitlab.com/jjag/asciidoctor-defmastership/
85
80
  licenses:
86
81
  - MIT
@@ -101,7 +96,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
101
96
  - !ruby/object:Gem::Version
102
97
  version: '0'
103
98
  requirements: []
104
- rubygems_version: 3.4.1
99
+ rubygems_version: 3.4.10
105
100
  signing_key:
106
101
  specification_version: 4
107
102
  summary: asciidoctor extension to handle applicable definition references
data/config/devtools.yml DELETED
@@ -1,2 +0,0 @@
1
- ---
2
- unit_test_timeout: 0.2
data/config/flay.yml DELETED
@@ -1,3 +0,0 @@
1
- ---
2
- threshold: 8
3
- total_score: 119
data/config/flog.yml DELETED
@@ -1,2 +0,0 @@
1
- ---
2
- threshold: 13.5
data/config/yardstick.yml DELETED
@@ -1,2 +0,0 @@
1
- ---
2
- threshold: 100
@@ -1,149 +0,0 @@
1
- # Copyright (c) 2020 Jerome Arbez-Gindre
2
- # frozen_string_literal: true
3
-
4
- require('asciidoctor/extensions') unless RUBY_ENGINE == 'opal'
5
-
6
- # An extension that allow to define applicable definitions
7
- #
8
- # Usage
9
- # :tag-mylabel-color: yellow
10
- # :tag-otherlabel-color: red
11
- #
12
- #
13
- # [define, requirement, TOTO-0001, [mylabel, otherlabel]]
14
- # --
15
- # The system shall allow to do lots of things.
16
- # --
17
- #
18
- # or
19
- #
20
- # [define, requirement, TOTO-0001]
21
- # This shall be nice.
22
- #
23
- require('asciidoctor/defmastership/regexp_dispatcher')
24
- require('defmastership/constants')
25
- require('defmastership/parsing_state')
26
-
27
- module Asciidoctor
28
- module DefMastership
29
- # Preprocessor to replace adoc statements
30
- class Preprocessor < Asciidoctor::Extensions::Preprocessor
31
- EREF_CONFIG_REGEXP = ::DefMastership::DMRegexp::EREF_CONFIG
32
- DEFINITION_REGEXP = ::DefMastership::DMRegexp::DEFINITION
33
- EREF_DEF_REGEXP = ::DefMastership::DMRegexp::EREF_DEF
34
- IREF_DEF_REGEXP = ::DefMastership::DMRegexp::IREF_DEF
35
- ATTR_SET_REGEXP = ::DefMastership::DMRegexp::ATTR_SET
36
- VARIABLE_DEF_REGEXP = ::DefMastership::DMRegexp::VARIABLE_DEF
37
-
38
- def initialize(config = {})
39
- super(config)
40
-
41
- @has_url = {}
42
- @variables = {}
43
- @parsing_state = ::DefMastership::ParsingState.new
44
- end
45
-
46
- # process the document
47
- def process(_document, reader)
48
- return reader if reader.eof?
49
-
50
- reader.unshift_lines(parse_and_replace(reader.read_lines))
51
- reader
52
- end
53
-
54
- private
55
-
56
- def build_subs
57
- subs = RegexpDispatcher.new(self)
58
- subs
59
- .add_rule(EREF_CONFIG_REGEXP, :set_eref_url_if_any)
60
- .add_rule(DEFINITION_REGEXP, :build_definition)
61
- .add_rule(EREF_DEF_REGEXP, :build_external_ref)
62
- .add_rule(IREF_DEF_REGEXP, :build_internal_ref)
63
- .add_rule(ATTR_SET_REGEXP, :attribute_setting)
64
- .add_rule(VARIABLE_DEF_REGEXP, :variable_set)
65
- end
66
-
67
- def parse_and_replace(lines)
68
- subs = build_subs
69
- lines.reduce([]) do |new_lines, line|
70
- next new_lines + [line] unless @parsing_state.enabled?(line)
71
-
72
- next new_lines + subs.replace(line)
73
- end
74
- end
75
-
76
- def set_eref_url_if_any(line, matches)
77
- @has_url[matches[:refname]] = true if matches[:symb] == 'url' && matches[:value] != 'none'
78
- [line]
79
- end
80
-
81
- def show_explicit_checksum(matches)
82
- matches[:explicit_checksum] &&
83
- @variables['show-explicit-checksum'] != 'disable' &&
84
- @variables["show-#{matches[:type]}-explicit-checksum"] != 'disable'
85
- end
86
-
87
- def build_definition(_line, matches)
88
- definition_lines = []
89
- explicit_checksum_str = " [.checksum]#(#{matches[:explicit_checksum]})#" if show_explicit_checksum(matches)
90
- explicit_version_str = " [.version]#(#{matches[:explicit_version]})#" if matches[:explicit_version]
91
- labels_str = " #{labels_strings(matches[:labels]).join(' ')}" if matches[:labels]
92
- definition_lines << ".#{matches[:reference]}#{explicit_version_str}#{explicit_checksum_str}#{labels_str}"
93
- definition_lines <<
94
- "[##{matches[:reference]}.define.#{matches[:type]}]"
95
- end
96
-
97
- def labels_strings(labels)
98
- labels_strs = []
99
- labels.split(/\s*,\s*/).reject(&:empty?).each do |label|
100
- labels_strs << "[.tag.{tag-#{label}-color}]##{label}#"
101
- end
102
- labels_strs
103
- end
104
-
105
- def build_link(ref, matches)
106
- if @has_url[matches[:refname]]
107
- "link:{eref-#{matches[:refname]}-url}##{ref}[#{ref}]"
108
- else
109
- ref
110
- end
111
- end
112
-
113
- def show_ext_ref(matches)
114
- @variables['show-ext-ref'] != 'disable' &&
115
- @variables["show-#{matches[:refname]}-ext-ref"] != 'disable'
116
- end
117
-
118
- def build_external_ref(_line, matches)
119
- return [] unless show_ext_ref(matches)
120
-
121
- extrefs = matches[:extrefs].split(/\s*,\s*/)
122
- new_line = "[.external_reference]\#{eref-#{matches[:refname]}-prefix} "
123
- extref_line = extrefs.map { |ref| build_link(ref, matches) }
124
- @has_url[matches[:refname]]
125
- ["#{new_line}#{extref_line.join(', ')}.#"]
126
- end
127
-
128
- def build_internal_ref(line, _matches)
129
- [
130
- line.gsub(IREF_DEF_REGEXP) do
131
- "<<#{Regexp.last_match[:intref]},#{Regexp.last_match[:intref]}>>"
132
- end
133
- ]
134
- end
135
-
136
- def attribute_setting(_line, matches)
137
- [
138
- '[.attribute]',
139
- "{attr-#{matches[:attr]}-prefix} #{matches[:value]}."
140
- ]
141
- end
142
-
143
- def variable_set(line, matches)
144
- @variables[matches[:varname]] = matches[:value]
145
- [line]
146
- end
147
- end
148
- end
149
- end