asciidoctor-defmastership 1.0.7 → 1.0.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 32c34eada26d2c22399f1418c4eef3753832cff1363ff0d82ab1f2308af83ca4
4
- data.tar.gz: 95e344b6e198af8ce03fa005a9545a8d256183966547cd5dacd3f2a4fef802ba
3
+ metadata.gz: 120879775fb430f58cc83b38f54a85a783e53c13a303f21aa1d53b140afe534c
4
+ data.tar.gz: 2dd09334b90b48c2d3fec43e8ba64a456ae00c13771113bae1655ac90d3451ef
5
5
  SHA512:
6
- metadata.gz: f860c3c2c9dcc1743495c8f806a9085a5be1ab836bd87f4282902423420157b96e3d0f2b5e61e3d70a95055a955c00e7ff619e1b95462d293f412d4701002d95
7
- data.tar.gz: 9918bb1738b73827e6c5071effd3f44b91cc3ddaa607ad06ca2cdea3b25e42f9cd75d4300018f3e9dd1bf28362e3aacbd3251666cfe2a3d9b723f82b83c0e83b
6
+ metadata.gz: ef6a6b74bc6486b24cad993dad606b6a4d7d1730344c074af2fd9792fa94492730f80933bd262149963b5501e9c53ab41ce6b2a06cb61aa3ec770c3f176b06a9
7
+ data.tar.gz: 71c5ca0517d3766e4cd880ceccbca363f723859636d11cf2618ddf2590f73d19658ef15cdb71fe4ae13b5e283fefc4ac12ce2f45607bb9788eb1e7c2fd366a1c
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,189 @@
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
+ ref_pattern =
130
+ @variables["eref-#{refname}-ref-pattern"] || '#%s'
131
+ ref_str = format(ref_pattern, ref)
132
+
133
+ "link:{eref-#{refname}-url}#{ref_str}[#{ref}]"
134
+ end
135
+
136
+ def show_ext_ref(matches)
137
+ !@variables['show-ext-ref'].eql?('disable') &&
138
+ !@variables["show-#{matches[:reference]}-ext-ref"].eql?('disable')
139
+ end
140
+ end
141
+
142
+ # Proepocessors class Helpers
143
+ class Preprocessor
144
+ # Helpers for Preprocessor class
145
+ module Helper
146
+ # Isolate the definition macro
147
+ class DefinitionStringBuilder
148
+ def initialize(matches, show_explicit_checksum)
149
+ @matches = matches
150
+ @show_explicit_checksum = show_explicit_checksum
151
+ end
152
+
153
+ def str
154
+ explicit_checksum_str = " [.checksum]#(#{@matches[:explicit_checksum]})#" if @show_explicit_checksum
155
+ explicit_version_str = Helper.build_explicit_version_str(@matches[:explicit_version])
156
+ labels_str = Helper.build_labels_str(@matches[:labels])
157
+ reference = @matches[:reference]
158
+ [
159
+ ".#{reference}#{explicit_version_str}#{explicit_checksum_str}#{labels_str}",
160
+ "[##{reference}.define.#{@matches[:type]}]"
161
+ ]
162
+ end
163
+ end
164
+
165
+ def self.valid_eref_url?(match)
166
+ match[:symb] == 'url' && !match[:value].eql?('none')
167
+ end
168
+
169
+ def self.build_labels_str(labels)
170
+ return unless labels
171
+
172
+ labels_strings =
173
+ labels.split(/\s*,\s*/).reduce([]) do |acc, label|
174
+ acc << "[.tag.{tag-#{label}-color}]##{label}#"
175
+ end
176
+ " #{labels_strings.join(' ')}"
177
+ end
178
+
179
+ def self.build_explicit_version_str(explicit_version)
180
+ " [.version]#(#{explicit_version})#" if explicit_version
181
+ end
182
+
183
+ def self.variable_hash(match)
184
+ { match[:varname] => match[:value] }
185
+ end
186
+ end
187
+ end
188
+ end
189
+ 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.9'
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.9
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.5.9
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