defmastership-core 1.0.0
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 +7 -0
- data/.gitignore +9 -0
- data/.gitlab-ci.yml +68 -0
- data/Gemfile +88 -0
- data/Guardfile +44 -0
- data/LICENSE +22 -0
- data/README.adoc +8 -0
- data/Rakefile +20 -0
- data/config/mutant.yml +30 -0
- data/config/reek.yml +130 -0
- data/config/rspec +4 -0
- data/config/rubocop.yml +89 -0
- data/defmastership-core.gemspec +33 -0
- data/lib/defmastership/core/constants.rb +124 -0
- data/lib/defmastership/core/parsing_state.rb +33 -0
- data/lib/defmastership/core/version.rb +11 -0
- data/lib/defmastership.rb +9 -0
- data/spec/spec_helper.rb +29 -0
- data/spec/unit/def_mastership/core/parsing_state_spec.rb +62 -0
- data/spec/unit/def_mastership/core_spec.rb +8 -0
- data/tasks/code_quality.rake +74 -0
- data/tasks/console.rake +8 -0
- data/tasks/documentation.rake +19 -0
- data/tasks/package.rake +4 -0
- data/tasks/test.rake +19 -0
- metadata +68 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: a2409414409c0de765bc37b9b666c32e31ec11fc6c5b5a03c44bc88c1d575d31
|
4
|
+
data.tar.gz: e2db2622f4b8eece83f5b1c80f918890619dc0d7a88c4b32cd35b90a6560afa3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 75804159eff5802621ef51db560c7fac277b025d2eeb28462af0915c467aa2b927eb745c9aa20029056974e1d4c8bc7cb61deffe53c064b6f3da32e26128b769
|
7
|
+
data.tar.gz: f79713179f65c5c7e57eac2cbcf623b0a151a91a58de39d6953ef1803369c081429039c1eb200a52f312265fffc03a5999ed3de4b227f4797c84a73005367138
|
data/.gitignore
ADDED
data/.gitlab-ci.yml
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
default:
|
2
|
+
image: ruby:3.3
|
3
|
+
before_script:
|
4
|
+
- apt-get update
|
5
|
+
- ruby -v
|
6
|
+
- which ruby
|
7
|
+
- gem install bundler --no-document
|
8
|
+
- bundle install --jobs $(nproc) "${FLAGS[@]}"
|
9
|
+
- git config --global user.email "you@example.com"
|
10
|
+
- git config --global user.name "Your Name"
|
11
|
+
|
12
|
+
unit tests:
|
13
|
+
script:
|
14
|
+
- bundle exec rake test:spec
|
15
|
+
artifacts:
|
16
|
+
paths:
|
17
|
+
- rspec_results.html
|
18
|
+
- coverage/*
|
19
|
+
|
20
|
+
code_quality:
|
21
|
+
script:
|
22
|
+
- bundle exec rake quality:all
|
23
|
+
|
24
|
+
yard documentation:
|
25
|
+
script:
|
26
|
+
- bundle exec rake yard
|
27
|
+
artifacts:
|
28
|
+
paths:
|
29
|
+
- doc
|
30
|
+
|
31
|
+
unit tests ruby2.7:
|
32
|
+
image: ruby:2.7
|
33
|
+
before_script:
|
34
|
+
- apt-get update
|
35
|
+
- ruby -v
|
36
|
+
- which ruby
|
37
|
+
- gem install bundler -v 2.4.22 --no-document
|
38
|
+
- bundle install --jobs $(nproc) "${FLAGS[@]}"
|
39
|
+
script:
|
40
|
+
- bundle exec rake test:spec
|
41
|
+
|
42
|
+
unit tests ruby3.0:
|
43
|
+
image: ruby:3.0
|
44
|
+
script:
|
45
|
+
- bundle exec rake test:spec
|
46
|
+
|
47
|
+
unit tests ruby3.1:
|
48
|
+
image: ruby:3.1
|
49
|
+
script:
|
50
|
+
- bundle exec rake test:spec
|
51
|
+
|
52
|
+
unit tests ruby3.2:
|
53
|
+
image: ruby:3.2
|
54
|
+
script:
|
55
|
+
- bundle exec rake test:spec
|
56
|
+
|
57
|
+
pages:
|
58
|
+
stage: deploy
|
59
|
+
script:
|
60
|
+
- mkdir public
|
61
|
+
- cp -r doc/* public
|
62
|
+
- cp "rspec_results.html" public
|
63
|
+
- cp -r "coverage" public
|
64
|
+
artifacts:
|
65
|
+
paths:
|
66
|
+
- public
|
67
|
+
only:
|
68
|
+
- master
|
data/Gemfile
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
# Copyright (c) 2020 Jerome Arbez-Gindre
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
source 'https://rubygems.org'
|
5
|
+
|
6
|
+
gemspec
|
7
|
+
|
8
|
+
ruby RUBY_VERSION
|
9
|
+
|
10
|
+
# rubocop:disable Metrics/BlockLength
|
11
|
+
group :development do
|
12
|
+
# needed by yard to render documentation
|
13
|
+
gem 'asciidoctor', '~> 2'
|
14
|
+
# cucumber steps for command line tests
|
15
|
+
gem 'aruba', '~> 2'
|
16
|
+
# bdd
|
17
|
+
gem 'cucumber', '~> 9'
|
18
|
+
|
19
|
+
# code duplication
|
20
|
+
gem 'flay', '~> 2'
|
21
|
+
|
22
|
+
# automatic test run
|
23
|
+
gem 'guard', '~> 2'
|
24
|
+
# automatic update invocation
|
25
|
+
gem 'guard-bundler', '~> 3'
|
26
|
+
if RUBY_VERSION >= '3.0'
|
27
|
+
# automatic style check
|
28
|
+
gem 'guard-reek', '~> 1.2'
|
29
|
+
end
|
30
|
+
# automatic tdd
|
31
|
+
gem 'guard-rspec', '~> 4'
|
32
|
+
# automatic style check
|
33
|
+
gem 'guard-rubocop', '~> 1'
|
34
|
+
|
35
|
+
# if RUBY_VERSION >= '3.0'
|
36
|
+
# # mutation testing
|
37
|
+
# plan = 'oss'
|
38
|
+
# key = '7oac4dMz95cTUuFPtGDfTDSQep6ZhdGW'
|
39
|
+
# source "https://#{plan}:#{key}@gem.mutant.dev" do
|
40
|
+
# # license needed
|
41
|
+
# gem 'mutant-license', '~> 0'
|
42
|
+
# end
|
43
|
+
# # mutation testing
|
44
|
+
# gem 'mutant-rspec', '~> 0'
|
45
|
+
# end
|
46
|
+
# to parse and execute Rakefile
|
47
|
+
gem 'rake', '~> 13'
|
48
|
+
|
49
|
+
if RUBY_VERSION >= '3.0'
|
50
|
+
# needed by yard to render documentation
|
51
|
+
gem 'rdoc', '~> 6'
|
52
|
+
end
|
53
|
+
# tdd
|
54
|
+
gem 'rspec', '~> 3'
|
55
|
+
# # to test performances
|
56
|
+
# gem 'rspec-benchmark', '~> 0'
|
57
|
+
# code needs to be clean
|
58
|
+
gem 'rubocop', '1.68'
|
59
|
+
# code needs to be clean
|
60
|
+
gem 'rubocop-performance', '~> 1'
|
61
|
+
# test code needs to be clean
|
62
|
+
gem 'rubocop-rspec', '~> 3'
|
63
|
+
# Rakefiles need to be clean
|
64
|
+
gem 'rubocop-rake', '~> 0'
|
65
|
+
|
66
|
+
if RUBY_VERSION >= '3.0'
|
67
|
+
# detect selling code
|
68
|
+
gem 'reek', '~> 6'
|
69
|
+
# my code needs to be critiqued
|
70
|
+
gem 'rubycritic', '~> 4'
|
71
|
+
# Doc need to be clean
|
72
|
+
gem 'rubocop-yard', '~> 0'
|
73
|
+
end
|
74
|
+
|
75
|
+
# What is tdd without code coverage ?
|
76
|
+
gem 'simplecov', '~> 0'
|
77
|
+
|
78
|
+
if RUBY_VERSION >= '3.0'
|
79
|
+
# to document code
|
80
|
+
gem 'yard', '~> 0'
|
81
|
+
end
|
82
|
+
end
|
83
|
+
# rubocop:enable Metrics/BlockLength
|
84
|
+
|
85
|
+
group :debugging do
|
86
|
+
# Sometimes, we need to debug
|
87
|
+
gem 'pry', '~> 0'
|
88
|
+
end
|
data/Guardfile
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# Copyright (c) 2024 Jerome Arbez-Gindre
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
# notifications :emacs
|
5
|
+
|
6
|
+
guard :bundler do
|
7
|
+
require 'guard/bundler'
|
8
|
+
require 'guard/bundler/verify'
|
9
|
+
helper = Guard::Bundler::Verify.new
|
10
|
+
|
11
|
+
files = ['Gemfile']
|
12
|
+
files += Dir['*.gemspec'] if files.any? { |f| helper.uses_gemspec?(f) }
|
13
|
+
|
14
|
+
# Assume files are symlinked from somewhere
|
15
|
+
files.each { |file| watch(helper.real_path(file)) }
|
16
|
+
end
|
17
|
+
|
18
|
+
guard :rspec, cmd: 'bundle exec rspec --options config/rspec' do
|
19
|
+
require 'guard/rspec/dsl'
|
20
|
+
dsl = Guard::RSpec::Dsl.new(self)
|
21
|
+
|
22
|
+
# RSpec files
|
23
|
+
rspec = dsl.rspec
|
24
|
+
watch(rspec.spec_helper) { rspec.spec_dir }
|
25
|
+
watch(rspec.spec_support) { rspec.spec_dir }
|
26
|
+
watch(rspec.spec_files)
|
27
|
+
|
28
|
+
# Ruby files
|
29
|
+
ruby = dsl.ruby
|
30
|
+
dsl.watch_spec_files_for(ruby.lib_files)
|
31
|
+
end
|
32
|
+
|
33
|
+
guard :rubocop,
|
34
|
+
all_on_start: true,
|
35
|
+
cli: ['--display-cop-names', '--config=config/rubocop.yml'] do
|
36
|
+
watch(/.+\.rb$/)
|
37
|
+
watch(%r{(?:.+/)?\.rubocop(?:_todo)?\.yml$}) { |m| File.dirname(m.first) }
|
38
|
+
end
|
39
|
+
|
40
|
+
guard :reek,
|
41
|
+
cli: ['--config config/reek.yml', '--single-line'] do
|
42
|
+
watch(/.+\.rb$/)
|
43
|
+
watch('config/reek.yml')
|
44
|
+
end
|
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2020 Jérôme Arbez-Gindre, and the individual contributors
|
4
|
+
to DefMastership.
|
5
|
+
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
+
of this software and associated documentation files (the "Software"), to deal
|
8
|
+
in the Software without restriction, including without limitation the rights
|
9
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
+
copies of the Software, and to permit persons to whom the Software is
|
11
|
+
furnished to do so, subject to the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be included in
|
14
|
+
all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
|
+
THE SOFTWARE.
|
data/README.adoc
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# Copyright (c) 2023 Jerome Arbez-Gindre
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require('rake/clean')
|
5
|
+
|
6
|
+
Dir['tasks/**/*.rake'].each { |t| load t }
|
7
|
+
|
8
|
+
desc 'Continous integration tasks'
|
9
|
+
task :ci do
|
10
|
+
[
|
11
|
+
'test:spec',
|
12
|
+
:rubocop
|
13
|
+
].each do |name|
|
14
|
+
puts "\n=== Running #{name}...\n"
|
15
|
+
Rake::Task[name].invoke
|
16
|
+
puts "\n=== Running #{name} -> Done\n"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
task default: :ci
|
data/config/mutant.yml
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
---
|
2
|
+
usage: opensource
|
3
|
+
includes:
|
4
|
+
- lib
|
5
|
+
integration:
|
6
|
+
name: rspec
|
7
|
+
arguments:
|
8
|
+
- --options=config/rspec
|
9
|
+
- spec
|
10
|
+
requires:
|
11
|
+
- defmastership
|
12
|
+
matcher:
|
13
|
+
subjects:
|
14
|
+
- 'DefMastership*'
|
15
|
+
# ignore:
|
16
|
+
# - 'DefMastership::BatchModifier*'
|
17
|
+
# - 'DefMastership::Export::CSV::Formatter*'
|
18
|
+
# - 'DefMastership::Export::CSV::BodyFormatter*'
|
19
|
+
# - 'DefMastership::Export::CSV::HeaderFormatter*'
|
20
|
+
# - 'DefMastership::Modifier::ChangeRef*'
|
21
|
+
# - 'DefMastership::Definition*'
|
22
|
+
# - 'DefMastership::Document*'
|
23
|
+
# - 'DefMastership::Modifier::ModifierCommon*'
|
24
|
+
# - 'DefMastership::Modifier::Factory*'
|
25
|
+
# - 'DefMastership::ParsingState*'
|
26
|
+
# - 'DefMastership::Modifier::RenameIncludedFiles*'
|
27
|
+
# - 'DefMastership::Modifier::UpdateDefChecksum*'
|
28
|
+
# - 'DefMastership::Modifier::UpdateDef*'
|
29
|
+
# - 'DefMastership::Modifier::UpdateDefVersion*'
|
30
|
+
# fail_fast: true
|
data/config/reek.yml
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
---
|
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
data/config/rubocop.yml
ADDED
@@ -0,0 +1,89 @@
|
|
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
|
16
|
+
- rubocop-yard
|
17
|
+
|
18
|
+
AllCops:
|
19
|
+
TargetRubyVersion: 2.7
|
20
|
+
EnabledByDefault: true
|
21
|
+
DisplayCopNames: true
|
22
|
+
|
23
|
+
Style/Copyright:
|
24
|
+
Enabled: true
|
25
|
+
Notice: 'Copyright (\(c\) )?202[0-9] Jerome Arbez-Gindre'
|
26
|
+
AutocorrectNotice: '# Copyright (c) 2023 Jerome Arbez-Gindre'
|
27
|
+
|
28
|
+
Lint/ConstantResolution: # Not available ins rubocop 0.81
|
29
|
+
Enabled: false
|
30
|
+
|
31
|
+
Style/DocumentationMethod:
|
32
|
+
Enabled: false
|
33
|
+
|
34
|
+
Style/StringHashKeys :
|
35
|
+
Enabled: true
|
36
|
+
Exclude:
|
37
|
+
- '*.gemspec'
|
38
|
+
- 'spec/unit/def_mastership/batch_modifier_spec.rb'
|
39
|
+
- 'spec/unit/def_mastership/modifier/update_def_checksum_spec.rb'
|
40
|
+
- 'spec/unit/def_mastership/modifier/update_def_spec.rb'
|
41
|
+
- 'spec/unit/def_mastership/modifier/update_def_version_spec.rb'
|
42
|
+
|
43
|
+
Style/MissingElse:
|
44
|
+
EnforcedStyle: case
|
45
|
+
|
46
|
+
Metrics/ModuleLength :
|
47
|
+
Exclude:
|
48
|
+
- 'spec/**/*'
|
49
|
+
|
50
|
+
Metrics/BlockLength :
|
51
|
+
Exclude:
|
52
|
+
- 'spec/**/*'
|
53
|
+
- '*.gemspec'
|
54
|
+
|
55
|
+
Security/Eval :
|
56
|
+
Exclude:
|
57
|
+
- 'Rakefile'
|
58
|
+
|
59
|
+
Style/ConstantVisibility :
|
60
|
+
Exclude:
|
61
|
+
# there is one unique explicit constant visibility for all
|
62
|
+
# constants
|
63
|
+
- 'lib/defmastership/constants.rb'
|
64
|
+
|
65
|
+
# rubocop-rspec options
|
66
|
+
RSpec/MessageExpectation :
|
67
|
+
Enabled: true
|
68
|
+
|
69
|
+
RSpec/SpecFilePathFormat :
|
70
|
+
Enabled: true
|
71
|
+
|
72
|
+
RSpec/SpecFilePathSuffix :
|
73
|
+
Enabled: true
|
74
|
+
|
75
|
+
RSpec/NestedGroups:
|
76
|
+
Max: 4
|
77
|
+
|
78
|
+
Layout/RedundantLineBreak:
|
79
|
+
Enabled: false
|
80
|
+
|
81
|
+
Style/DisableCopsWithinSourceCodeDirective:
|
82
|
+
Enabled: true
|
83
|
+
Exclude:
|
84
|
+
- 'Gemfile'
|
85
|
+
- 'tasks/code_quality.rake'
|
86
|
+
|
87
|
+
Layout/EndOfLine:
|
88
|
+
EnforcedStyle: lf
|
89
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# Copyright (c) 2020 Jerome Arbez-Gindre
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
# Ensure we require the local version and not one we might have
|
5
|
+
# installed already
|
6
|
+
require(
|
7
|
+
File.join(
|
8
|
+
[
|
9
|
+
File.dirname(__FILE__),
|
10
|
+
'lib',
|
11
|
+
'defmastership',
|
12
|
+
'core',
|
13
|
+
'version.rb'
|
14
|
+
]
|
15
|
+
)
|
16
|
+
)
|
17
|
+
|
18
|
+
Gem::Specification.new do |spec|
|
19
|
+
spec.metadata = {
|
20
|
+
'rubygems_mfa_required' => 'true'
|
21
|
+
}
|
22
|
+
spec.required_ruby_version = '>= 2.7'
|
23
|
+
spec.name = 'defmastership-core'
|
24
|
+
spec.version = DefMastership::Core::VERSION
|
25
|
+
spec.author = 'Jérôme Arbez-Gindre'
|
26
|
+
spec.email = 'jeromearbezgindre@gmail.com'
|
27
|
+
spec.licenses = ['MIT']
|
28
|
+
spec.homepage = 'https://gitlab.com/defmastership/defmastership-core/'
|
29
|
+
spec.platform = Gem::Platform::RUBY
|
30
|
+
spec.summary = 'Handling of references and definitions with asciidoctor - common code'
|
31
|
+
spec.files = `git ls-files`.split("\n")
|
32
|
+
spec.require_paths << 'lib'
|
33
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
# Copyright (c) 2020 Jerome Arbez-Gindre
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module DefMastership
|
5
|
+
# Common code for DefMastership and Asciidoctor::DefMastership
|
6
|
+
module Core
|
7
|
+
# set of regexp of added asciidoctor constructions
|
8
|
+
# This module smells of :reek:TooManyConstants
|
9
|
+
module DMRegexp
|
10
|
+
# [Regexp] to match a single line comment
|
11
|
+
SINGLE_LINE_COMMENT = %r{^//[^/]}.freeze
|
12
|
+
public_constant :SINGLE_LINE_COMMENT
|
13
|
+
|
14
|
+
# [Regexp] match all text before the definition's reference
|
15
|
+
DEF_BEFORE_REF = <<~'BEF'
|
16
|
+
^\s*
|
17
|
+
\[\s*define\s*,
|
18
|
+
\s*(?<type>[\w:_-]+)\s*,
|
19
|
+
\s*
|
20
|
+
BEF
|
21
|
+
public_constant :DEF_BEFORE_REF
|
22
|
+
|
23
|
+
# [Regexp] match all text after the definition's reference
|
24
|
+
DEF_AFTER_REF = <<~'AFT'
|
25
|
+
\s*
|
26
|
+
(,\s*\[\s*(?<labels>.*?)\s*\])?\s*\]
|
27
|
+
AFT
|
28
|
+
public_constant :DEF_AFTER_REF
|
29
|
+
|
30
|
+
# [Regexp] match optional explicit version and explicit checksum
|
31
|
+
DEF_VERSION_AND_CHECKSUM = '(?<version_and_checksum>' \
|
32
|
+
'\((?<explicit_version>[^~]+)?(?<explicit_checksum>~[[:alnum:]]+)?\)' \
|
33
|
+
')?'
|
34
|
+
public_constant :DEF_VERSION_AND_CHECKSUM
|
35
|
+
|
36
|
+
# [Regexp] match reference
|
37
|
+
REFERENCE = '(?<reference>[\\w:_-]+)'
|
38
|
+
public_constant :REFERENCE
|
39
|
+
|
40
|
+
# [Regexp] match a definition line
|
41
|
+
DEFINITION = Regexp.new(
|
42
|
+
"#{DEF_BEFORE_REF}#{REFERENCE}#{DEF_VERSION_AND_CHECKSUM}#{DEF_AFTER_REF}",
|
43
|
+
Regexp::EXTENDED
|
44
|
+
)
|
45
|
+
public_constant :DEFINITION
|
46
|
+
|
47
|
+
# [Regexp] match a asciidcotor attribute definition
|
48
|
+
VARIABLE_DEF = /^\s*:(?<varname>[\w:_-]+):\s+
|
49
|
+
(?<value>\S.*\S)\s*$/x.freeze
|
50
|
+
public_constant :VARIABLE_DEF
|
51
|
+
|
52
|
+
# [Regexp] match a asciidcotor attribute use
|
53
|
+
VARIABLE_USE = /{(?<varname>[\w:_-]+)}/x.freeze
|
54
|
+
public_constant :VARIABLE_USE
|
55
|
+
|
56
|
+
# [Regexp] match an external cross reference type configuration
|
57
|
+
EREF_CONFIG = /^\s*:eref-(?<reference>[\w:_-]+)-(?<symb>prefix|url):\s*
|
58
|
+
\s*(?<value>\S.*\S)\s*/x.freeze
|
59
|
+
public_constant :EREF_CONFIG
|
60
|
+
# [Regexp] match an external cross reference use
|
61
|
+
EREF_DEF = /^\s*
|
62
|
+
defs:eref\[
|
63
|
+
\s*(?<reference>[\w:_-]+)\s*,
|
64
|
+
\s*\[\s*(?<extrefs>[^\]]+?)\s*\]\s*\]/x.freeze
|
65
|
+
public_constant :EREF_DEF
|
66
|
+
|
67
|
+
# [Regexp] match an asciidoc block delimiter
|
68
|
+
BLOCK = /^--\s*$/.freeze
|
69
|
+
public_constant :BLOCK
|
70
|
+
|
71
|
+
# [Regexp] match the begining of an internal cross reference
|
72
|
+
IREF_DEF_BEF = 'defs:iref\[\s*'
|
73
|
+
public_constant :IREF_DEF_BEF
|
74
|
+
# [Regexp] match the end of an internal cross reference
|
75
|
+
IREF_DEF_AFT = '\s*\]'
|
76
|
+
public_constant :IREF_DEF_AFT
|
77
|
+
# [Regexp] match an internal cross reference
|
78
|
+
IREF_DEF = Regexp.new(
|
79
|
+
"#{IREF_DEF_BEF}(?<intref>[\\w:_-]+)#{IREF_DEF_AFT}",
|
80
|
+
Regexp::EXTENDED
|
81
|
+
)
|
82
|
+
public_constant :IREF_DEF
|
83
|
+
|
84
|
+
# [Regexp] match an attribute configuration
|
85
|
+
ATTR_CONFIG = /\s*:attr-(?<attr>[\w:_-]+)-prefix:
|
86
|
+
\s+(?<prefix>.+?)\s*$/x.freeze
|
87
|
+
public_constant :ATTR_CONFIG
|
88
|
+
# [Regexp] match an attribute use
|
89
|
+
ATTR_SET = /\s*
|
90
|
+
defs:attribute\[
|
91
|
+
\s*(?<attr>[\w:_-]+)\s*,
|
92
|
+
\s*(?<value>.+?)\s*\]/x.freeze
|
93
|
+
public_constant :ATTR_SET
|
94
|
+
|
95
|
+
# [Regexp] match an empty line
|
96
|
+
EMPTY_LINE = /^\s*$/.freeze
|
97
|
+
public_constant :EMPTY_LINE
|
98
|
+
|
99
|
+
# [Regexp] match everything
|
100
|
+
WHATEVER = //.freeze
|
101
|
+
public_constant :WHATEVER
|
102
|
+
|
103
|
+
# [Regexp] match asciidoc include statement keyword
|
104
|
+
INCLUDE_KEYWORD = '\binclude::'
|
105
|
+
public_constant :INCLUDE_KEYWORD
|
106
|
+
# [Regexp] match asciidoc include statement path
|
107
|
+
INCLUDE_PATH = '(?<path>.*/)?'
|
108
|
+
public_constant :INCLUDE_PATH
|
109
|
+
# [Regexp] match asciidoc include statement filename
|
110
|
+
INCLUDE_FILENAME = '(?<filename>[^\\/]+)'
|
111
|
+
public_constant :INCLUDE_FILENAME
|
112
|
+
# [Regexp] match asciidoc include statement options
|
113
|
+
INCLUDE_OPTIONS = '\[(?<options>[^\]]*)\]'
|
114
|
+
public_constant :INCLUDE_OPTIONS
|
115
|
+
|
116
|
+
# [Regexp] match asciidoc include statement
|
117
|
+
INCLUDE = Regexp.new(
|
118
|
+
INCLUDE_KEYWORD + INCLUDE_PATH + INCLUDE_FILENAME + INCLUDE_OPTIONS,
|
119
|
+
Regexp::EXTENDED
|
120
|
+
)
|
121
|
+
public_constant :INCLUDE
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# Copyright (c) 2020 Jerome Arbez-Gindre
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module DefMastership
|
5
|
+
module Core
|
6
|
+
# Allow to know if we need to parse the line or simply ignore it
|
7
|
+
class ParsingState
|
8
|
+
# mutant:disable (for mutant, aatribute initialization is useless)
|
9
|
+
def initialize
|
10
|
+
@last_disabling_line = nil
|
11
|
+
end
|
12
|
+
|
13
|
+
def enabled?(line)
|
14
|
+
return false if line.match?(DMRegexp::SINGLE_LINE_COMMENT)
|
15
|
+
|
16
|
+
line = line.chomp
|
17
|
+
possibly_invert_last_disabling_line(line) if ['....', '----', '////'].include?(line)
|
18
|
+
|
19
|
+
!@last_disabling_line
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def possibly_invert_last_disabling_line(line)
|
25
|
+
if @last_disabling_line == line
|
26
|
+
@last_disabling_line = nil
|
27
|
+
elsif !@last_disabling_line
|
28
|
+
@last_disabling_line = line
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# Copyright (c) 2020 Jerome Arbez-Gindre
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require('defmastership/core/version')
|
5
|
+
|
6
|
+
# Add requires for other files you add to your project here, so
|
7
|
+
# you just need to require this one file in your bin file
|
8
|
+
require('defmastership/core/constants')
|
9
|
+
require('defmastership/core/parsing_state')
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# Copyright (c) 2020 Jerome Arbez-Gindre
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require('simplecov')
|
5
|
+
|
6
|
+
SimpleCov.start do
|
7
|
+
command_name 'spec:unit'
|
8
|
+
|
9
|
+
add_group 'Libraries', 'lib'
|
10
|
+
add_group 'Unit test', 'spec/unit'
|
11
|
+
|
12
|
+
add_filter 'config'
|
13
|
+
add_filter 'vendor'
|
14
|
+
add_filter 'set_join_hack'
|
15
|
+
|
16
|
+
minimum_coverage 100
|
17
|
+
|
18
|
+
enable_coverage :branch
|
19
|
+
end
|
20
|
+
|
21
|
+
RSpec::Matchers.define(:matchdata_including) do |h|
|
22
|
+
match do |matchdata|
|
23
|
+
h.all? do |key, _|
|
24
|
+
matchdata[key] == h[key]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
require('defmastership')
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# Copyright (c) 2020 Jerome Arbez-Gindre
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require('defmastership/core/parsing_state')
|
5
|
+
|
6
|
+
RSpec.describe(DefMastership::Core::ParsingState) do
|
7
|
+
subject(:parsing_state) do
|
8
|
+
described_class.new
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '.new' do
|
12
|
+
it { is_expected.not_to(be_nil) }
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '#enabled_with?' do
|
16
|
+
context 'when single line commment' do
|
17
|
+
it { expect(parsing_state.enabled?("//whatever\n")).to(be(false)) }
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'when starting' do
|
21
|
+
it { expect(parsing_state.enabled?("whatever\n")).to(be(true)) }
|
22
|
+
it { expect(parsing_state.enabled?("----\n")).to(be(false)) }
|
23
|
+
it { expect(parsing_state.enabled?("....\n")).to(be(false)) }
|
24
|
+
it { expect(parsing_state.enabled?("////\n")).to(be(false)) }
|
25
|
+
it { expect(parsing_state.enabled?('....')).to(be(false)) }
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'when disabled' do
|
29
|
+
before { parsing_state.enabled?("----\n") }
|
30
|
+
|
31
|
+
it { expect(parsing_state.enabled?("whatever\n")).to(be(false)) }
|
32
|
+
it { expect(parsing_state.enabled?("----\n")).to(be(true)) }
|
33
|
+
it { expect(parsing_state.enabled?("....\n")).to(be(false)) }
|
34
|
+
it { expect(parsing_state.enabled?("////\n")).to(be(false)) }
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'with intricated disables starting with "...."' do
|
38
|
+
before do
|
39
|
+
["....\n", "----\n", "whatever\n"].each { |line| parsing_state.enabled?(line) }
|
40
|
+
end
|
41
|
+
|
42
|
+
it { expect(parsing_state.enabled?("----\n")).to(be(false)) }
|
43
|
+
it { expect(parsing_state.enabled?("....\n")).to(be(true)) }
|
44
|
+
end
|
45
|
+
|
46
|
+
context 'with intricated disables starting with "----"' do
|
47
|
+
before do
|
48
|
+
["....\n", "----\n", "whatever\n"].each { |line| parsing_state.enabled?(line) }
|
49
|
+
end
|
50
|
+
|
51
|
+
it { expect(parsing_state.enabled?("....\n")).to(be(true)) }
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'with intricated disables starting with "////"' do
|
55
|
+
before do
|
56
|
+
["////\n", "----\n", "whatever\n"].each { |line| parsing_state.enabled?(line) }
|
57
|
+
end
|
58
|
+
|
59
|
+
it { expect(parsing_state.enabled?("////\n")).to(be(true)) }
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# Copyright (c) 2023 Jerome Arbez-Gindre
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
# rubocop:disable Metrics/BlockLength
|
5
|
+
namespace 'quality' do
|
6
|
+
begin
|
7
|
+
require('rubocop/rake_task')
|
8
|
+
|
9
|
+
RuboCop::RakeTask.new do |task|
|
10
|
+
task.options << '--display-cop-names'
|
11
|
+
task.options << '--config=config/rubocop.yml'
|
12
|
+
end
|
13
|
+
rescue LoadError
|
14
|
+
task(:rubocop) do
|
15
|
+
puts('Install rubocop to run its rake tasks')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
begin
|
20
|
+
require('reek/rake/task')
|
21
|
+
|
22
|
+
Reek::Rake::Task.new do |task|
|
23
|
+
task.fail_on_error = true
|
24
|
+
task.source_files = '{lib,spec}/**/*.rb'
|
25
|
+
task.reek_opts = '--config config/reek.yml --single-line'
|
26
|
+
end
|
27
|
+
rescue LoadError
|
28
|
+
task(:reek) do
|
29
|
+
puts('Install reek to run its rake tasks')
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
begin
|
34
|
+
require('flay_task')
|
35
|
+
|
36
|
+
FlayTask.new(:flay, 200, %w[bin lib]) do |task|
|
37
|
+
task.verbose = true
|
38
|
+
end
|
39
|
+
rescue LoadError
|
40
|
+
task(:flay) do
|
41
|
+
puts('Install flay to run its rake tasks')
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
begin
|
46
|
+
require('rubycritic/rake_task')
|
47
|
+
|
48
|
+
RubyCritic::RakeTask.new do |task|
|
49
|
+
task.verbose = true
|
50
|
+
task.options = '--no-browser'
|
51
|
+
end
|
52
|
+
rescue LoadError
|
53
|
+
task(:rubycritic) do
|
54
|
+
puts('Install rubycritic to run its rake tasks')
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
desc 'Runs all quality code check'
|
59
|
+
task(
|
60
|
+
all: [
|
61
|
+
'quality:rubocop',
|
62
|
+
'quality:reek',
|
63
|
+
'quality:flay',
|
64
|
+
'quality:rubycritic'
|
65
|
+
]
|
66
|
+
)
|
67
|
+
end
|
68
|
+
# rubocop:enable Metrics/BlockLength
|
69
|
+
|
70
|
+
desc 'Synonym for quality:rubocop'
|
71
|
+
task(rubocop: 'quality:rubocop')
|
72
|
+
|
73
|
+
desc 'Synonym for quality:reek'
|
74
|
+
task(reek: 'quality:reek')
|
data/tasks/console.rake
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# Copyright (c) 2024 Jerome Arbez-Gindre
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
namespace 'documentation' do
|
5
|
+
require('yard')
|
6
|
+
|
7
|
+
YARD::Rake::YardocTask.new do |task|
|
8
|
+
task.files = ['lib/**/*.rb']
|
9
|
+
task.options = ['--fail-on-warning', '--verbose']
|
10
|
+
task.stats_options = ['--list-undoc']
|
11
|
+
end
|
12
|
+
rescue LoadError
|
13
|
+
task(:yard) do
|
14
|
+
puts('Install Yard to run its rake tasks')
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
desc 'Synonym for documentation:yard'
|
19
|
+
task(yard: 'documentation:yard')
|
data/tasks/package.rake
ADDED
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'
|
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
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: defmastership-core
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jérôme Arbez-Gindre
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2024-11-14 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description:
|
14
|
+
email: jeromearbezgindre@gmail.com
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- ".gitignore"
|
20
|
+
- ".gitlab-ci.yml"
|
21
|
+
- Gemfile
|
22
|
+
- Guardfile
|
23
|
+
- LICENSE
|
24
|
+
- README.adoc
|
25
|
+
- Rakefile
|
26
|
+
- config/mutant.yml
|
27
|
+
- config/reek.yml
|
28
|
+
- config/rspec
|
29
|
+
- config/rubocop.yml
|
30
|
+
- defmastership-core.gemspec
|
31
|
+
- lib/defmastership.rb
|
32
|
+
- lib/defmastership/core/constants.rb
|
33
|
+
- lib/defmastership/core/parsing_state.rb
|
34
|
+
- lib/defmastership/core/version.rb
|
35
|
+
- spec/spec_helper.rb
|
36
|
+
- spec/unit/def_mastership/core/parsing_state_spec.rb
|
37
|
+
- spec/unit/def_mastership/core_spec.rb
|
38
|
+
- tasks/code_quality.rake
|
39
|
+
- tasks/console.rake
|
40
|
+
- tasks/documentation.rake
|
41
|
+
- tasks/package.rake
|
42
|
+
- tasks/test.rake
|
43
|
+
homepage: https://gitlab.com/defmastership/defmastership-core/
|
44
|
+
licenses:
|
45
|
+
- MIT
|
46
|
+
metadata:
|
47
|
+
rubygems_mfa_required: 'true'
|
48
|
+
post_install_message:
|
49
|
+
rdoc_options: []
|
50
|
+
require_paths:
|
51
|
+
- lib
|
52
|
+
- lib
|
53
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '2.7'
|
58
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
requirements: []
|
64
|
+
rubygems_version: 3.5.23
|
65
|
+
signing_key:
|
66
|
+
specification_version: 4
|
67
|
+
summary: Handling of references and definitions with asciidoctor - common code
|
68
|
+
test_files: []
|