metadata-json-lint 3.0.3 → 4.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 +4 -4
- data/.github/workflows/release.yml +2 -2
- data/.github/workflows/test.yml +26 -5
- data/.rubocop.yml +3 -33
- data/.rubocop_todo.yml +59 -3
- data/CHANGELOG.md +27 -2
- data/Gemfile +4 -3
- data/Rakefile +14 -14
- data/lib/metadata-json-lint/rake_task.rb +1 -3
- data/lib/metadata-json-lint/schema.rb +3 -4
- data/lib/metadata-json-lint/version_requirement.rb +4 -1
- data/lib/metadata_json_lint.rb +24 -28
- data/metadata-json-lint.gemspec +7 -8
- data/spec/metadata_json_lint_spec.rb +6 -4
- data/spec/schema_spec.rb +22 -4
- data/spec/spec_helper.rb +2 -2
- data/tests/broken/expected +1 -1
- data/tests/rake_chaining/Rakefile +1 -1
- metadata +26 -107
- data/lib/metadata-json-lint/semantic_puppet_loader.rb +0 -47
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1327a043726b715003e697e9024bda80b0134896e7fb2b97f9de14ee8b28e8b7
|
4
|
+
data.tar.gz: ff6e85957f67e2d1b2a37f2a9383640867bf7bf4f04cc1ed5bc10ed7b9c738fb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 841c877388db1e132ba061ef657f21f63b5f10b68255b96a673b1a79a5d4052327a54cc696a99c850addb4f8c830dab139c9891ae35ecf7444e83d53e8d86cc2
|
7
|
+
data.tar.gz: caf5db87f9dd3fa2a33fb75b36992f6447ec80c335c0757246d6c9be7d22019581464ee6bc65f26549f162f6cc3ac9efb6ee9f3cbe546af5465f414882179e1c
|
@@ -10,7 +10,7 @@ jobs:
|
|
10
10
|
runs-on: ubuntu-latest
|
11
11
|
if: github.repository_owner == 'voxpupuli'
|
12
12
|
steps:
|
13
|
-
- uses: actions/checkout@
|
13
|
+
- uses: actions/checkout@v4
|
14
14
|
- name: Install Ruby 3.0
|
15
15
|
uses: ruby/setup-ruby@v1
|
16
16
|
with:
|
@@ -18,7 +18,7 @@ jobs:
|
|
18
18
|
env:
|
19
19
|
BUNDLE_WITHOUT: release
|
20
20
|
- name: Build gem
|
21
|
-
run: gem build *.gemspec
|
21
|
+
run: gem build --strict --verbose *.gemspec
|
22
22
|
- name: Publish gem to rubygems.org
|
23
23
|
run: gem push *.gem
|
24
24
|
env:
|
data/.github/workflows/test.yml
CHANGED
@@ -10,22 +10,34 @@ env:
|
|
10
10
|
BUNDLE_WITHOUT: release
|
11
11
|
|
12
12
|
jobs:
|
13
|
+
rubocop:
|
14
|
+
runs-on: ubuntu-latest
|
15
|
+
steps:
|
16
|
+
- uses: actions/checkout@v4
|
17
|
+
- name: Install Ruby ${{ matrix.ruby }}
|
18
|
+
uses: ruby/setup-ruby@v1
|
19
|
+
with:
|
20
|
+
ruby-version: "3.0"
|
21
|
+
bundler-cache: true
|
22
|
+
- name: Run Rubocop
|
23
|
+
run: bundle exec rake rubocop
|
13
24
|
rspec:
|
14
25
|
runs-on: ubuntu-latest
|
15
26
|
strategy:
|
16
27
|
matrix:
|
17
28
|
include:
|
18
|
-
- ruby: "2.4"
|
19
|
-
- ruby: "2.5"
|
20
|
-
- ruby: "2.6"
|
21
29
|
- ruby: "2.7"
|
22
30
|
- ruby: "3.0"
|
31
|
+
- ruby: "3.1"
|
23
32
|
coverage: "yes"
|
33
|
+
- ruby: "3.2"
|
24
34
|
env:
|
25
35
|
COVERAGE: ${{ matrix.coverage }}
|
36
|
+
# https://github.com/rubygems/rubygems/issues/5234#issuecomment-1003773622
|
37
|
+
RUBYOPT: '--disable-did_you_mean'
|
26
38
|
name: RSpec - Ruby ${{ matrix.ruby }}
|
27
39
|
steps:
|
28
|
-
- uses: actions/checkout@
|
40
|
+
- uses: actions/checkout@v4
|
29
41
|
- name: Install Ruby ${{ matrix.ruby }}
|
30
42
|
uses: ruby/setup-ruby@v1
|
31
43
|
with:
|
@@ -34,4 +46,13 @@ jobs:
|
|
34
46
|
- name: spec tests
|
35
47
|
run: bundle exec rake test
|
36
48
|
- name: Verify gem builds
|
37
|
-
run: gem build *.gemspec
|
49
|
+
run: gem build --strict --verbose *.gemspec
|
50
|
+
|
51
|
+
tests:
|
52
|
+
needs:
|
53
|
+
- rubocop
|
54
|
+
- rspec
|
55
|
+
runs-on: ubuntu-latest
|
56
|
+
name: Test suite
|
57
|
+
steps:
|
58
|
+
- run: echo Test suite completed
|
data/.rubocop.yml
CHANGED
@@ -1,35 +1,5 @@
|
|
1
|
+
---
|
1
2
|
inherit_from: .rubocop_todo.yml
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
Enabled: false
|
6
|
-
|
7
|
-
#Metric cops are rarely useful
|
8
|
-
Metrics/AbcSize:
|
9
|
-
Enabled: false
|
10
|
-
|
11
|
-
Metrics/CyclomaticComplexity:
|
12
|
-
Enabled: false
|
13
|
-
|
14
|
-
Metrics/LineLength:
|
15
|
-
Enabled: false
|
16
|
-
|
17
|
-
Metrics/MethodLength:
|
18
|
-
Enabled: false
|
19
|
-
|
20
|
-
Metrics/BlockLength:
|
21
|
-
Exclude:
|
22
|
-
- spec/**/*_spec.rb
|
23
|
-
- ./*.gemspec
|
24
|
-
|
25
|
-
Metrics/PerceivedComplexity:
|
26
|
-
Enabled: false
|
27
|
-
|
28
|
-
Metrics/ModuleLength:
|
29
|
-
Max: 185
|
30
|
-
|
31
|
-
Style/TrailingCommaInHashLiteral:
|
32
|
-
EnforcedStyleForMultiline: consistent_comma
|
33
|
-
|
34
|
-
Style/AccessModifierDeclarations:
|
35
|
-
Enabled: false
|
4
|
+
inherit_gem:
|
5
|
+
voxpupuli-rubocop: rubocop.yml
|
data/.rubocop_todo.yml
CHANGED
@@ -1,18 +1,74 @@
|
|
1
1
|
# This configuration was generated by
|
2
2
|
# `rubocop --auto-gen-config`
|
3
|
-
# on
|
3
|
+
# on 2023-09-15 14:22:01 UTC using RuboCop version 1.54.2.
|
4
4
|
# The point is for the user to remove these configuration records
|
5
5
|
# one by one as the offenses are removed from the code base.
|
6
6
|
# Note that changes in the inspected code, or installation of new
|
7
7
|
# versions of RuboCop, may require this file to be generated again.
|
8
8
|
|
9
|
-
# Offense count:
|
9
|
+
# Offense count: 2
|
10
10
|
Lint/RescueException:
|
11
11
|
Exclude:
|
12
12
|
- 'lib/metadata_json_lint.rb'
|
13
13
|
|
14
14
|
# Offense count: 1
|
15
|
-
# Configuration parameters:
|
15
|
+
# Configuration parameters: Prefixes, AllowedPatterns.
|
16
|
+
# Prefixes: when, with, without
|
17
|
+
RSpec/ContextWording:
|
18
|
+
Exclude:
|
19
|
+
- 'spec/metadata_json_lint_spec.rb'
|
20
|
+
|
21
|
+
# Offense count: 2
|
22
|
+
# This cop supports unsafe autocorrection (--autocorrect-all).
|
23
|
+
# Configuration parameters: SkipBlocks, EnforcedStyle.
|
24
|
+
# SupportedStyles: described_class, explicit
|
25
|
+
RSpec/DescribedClass:
|
26
|
+
Exclude:
|
27
|
+
- 'spec/version_requirement_spec.rb'
|
28
|
+
|
29
|
+
# Offense count: 2
|
30
|
+
# Configuration parameters: Include, CustomTransform, IgnoreMethods, SpecSuffixOnly.
|
31
|
+
# Include: **/*_spec*rb*, **/spec/**/*
|
32
|
+
RSpec/FilePath:
|
33
|
+
Exclude:
|
34
|
+
- 'spec/schema_spec.rb'
|
35
|
+
- 'spec/version_requirement_spec.rb'
|
36
|
+
|
37
|
+
# Offense count: 2
|
38
|
+
# Configuration parameters: .
|
39
|
+
# SupportedStyles: have_received, receive
|
40
|
+
RSpec/MessageSpies:
|
41
|
+
EnforcedStyle: receive
|
42
|
+
|
43
|
+
# Offense count: 2
|
44
|
+
RSpec/MultipleExpectations:
|
45
|
+
Max: 2
|
46
|
+
|
47
|
+
# Offense count: 7
|
48
|
+
# Configuration parameters: EnforcedStyle, IgnoreSharedExamples.
|
49
|
+
# SupportedStyles: always, named_only
|
50
|
+
RSpec/NamedSubject:
|
51
|
+
Exclude:
|
52
|
+
- 'spec/schema_spec.rb'
|
53
|
+
|
54
|
+
# Offense count: 1
|
55
|
+
# Configuration parameters: AllowedConstants.
|
16
56
|
Style/Documentation:
|
17
57
|
Exclude:
|
58
|
+
- 'spec/**/*'
|
59
|
+
- 'test/**/*'
|
18
60
|
- 'lib/metadata_json_lint.rb'
|
61
|
+
|
62
|
+
# Offense count: 36
|
63
|
+
# This cop supports unsafe autocorrection (--autocorrect-all).
|
64
|
+
# Configuration parameters: EnforcedStyle.
|
65
|
+
# SupportedStyles: always, always_true, never
|
66
|
+
Style/FrozenStringLiteralComment:
|
67
|
+
Enabled: false
|
68
|
+
|
69
|
+
# Offense count: 6
|
70
|
+
# This cop supports safe autocorrection (--autocorrect).
|
71
|
+
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns.
|
72
|
+
# URISchemes: http, https
|
73
|
+
Layout/LineLength:
|
74
|
+
Max: 153
|
data/CHANGELOG.md
CHANGED
@@ -1,13 +1,38 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## [4.0.0](https://github.com/voxpupuli/metadata-json-lint/tree/4.0.0) (2023-09-15)
|
4
|
+
|
5
|
+
[Full Changelog](https://github.com/voxpupuli/metadata-json-lint/compare/3.0.3...4.0.0)
|
6
|
+
|
7
|
+
**Breaking changes:**
|
8
|
+
|
9
|
+
- Drop Ruby 2.5/2.6 & switch to voxpupuli-rubocop [\#137](https://github.com/voxpupuli/metadata-json-lint/pull/137) ([bastelfreak](https://github.com/bastelfreak))
|
10
|
+
- Drop Ruby =\< 2.4 support [\#125](https://github.com/voxpupuli/metadata-json-lint/pull/125) ([bastelfreak](https://github.com/bastelfreak))
|
11
|
+
|
12
|
+
**Implemented enhancements:**
|
13
|
+
|
14
|
+
- CI: Build gems with strictness and verbosity & Add upper version limits to gemspec [\#135](https://github.com/voxpupuli/metadata-json-lint/pull/135) ([bastelfreak](https://github.com/bastelfreak))
|
15
|
+
- Add Ruby 3.1/3.2 support [\#133](https://github.com/voxpupuli/metadata-json-lint/pull/133) ([bastelfreak](https://github.com/bastelfreak))
|
16
|
+
|
17
|
+
**Merged pull requests:**
|
18
|
+
|
19
|
+
- Update voxpupuli-rubocop requirement from ~\> 1.2 to ~\> 2.0 [\#139](https://github.com/voxpupuli/metadata-json-lint/pull/139) ([dependabot[bot]](https://github.com/apps/dependabot))
|
20
|
+
- Make semantic\_puppet a hard dependency [\#136](https://github.com/voxpupuli/metadata-json-lint/pull/136) ([bastelfreak](https://github.com/bastelfreak))
|
21
|
+
- Drop pry development dependency [\#134](https://github.com/voxpupuli/metadata-json-lint/pull/134) ([bastelfreak](https://github.com/bastelfreak))
|
22
|
+
- GCG: Add faraday-retry dep [\#132](https://github.com/voxpupuli/metadata-json-lint/pull/132) ([bastelfreak](https://github.com/bastelfreak))
|
23
|
+
- Add dummy CI job we can depend on [\#131](https://github.com/voxpupuli/metadata-json-lint/pull/131) ([bastelfreak](https://github.com/bastelfreak))
|
24
|
+
|
3
25
|
## [3.0.3](https://github.com/voxpupuli/metadata-json-lint/tree/3.0.3) (2023-04-24)
|
4
26
|
|
5
27
|
[Full Changelog](https://github.com/voxpupuli/metadata-json-lint/compare/3.0.2...3.0.3)
|
6
28
|
|
29
|
+
**Fixed bugs:**
|
30
|
+
|
31
|
+
- gemspec: drop deprecated `date` attribute [\#129](https://github.com/voxpupuli/metadata-json-lint/pull/129) ([bastelfreak](https://github.com/bastelfreak))
|
32
|
+
|
7
33
|
**Merged pull requests:**
|
8
34
|
|
9
|
-
- Allow json-schema 4.x [\#
|
10
|
-
- gemspec: drop deprecated date attribute [\#129](https://github.com/voxpupuli/metadata-json-lint/pull/129)
|
35
|
+
- Allow json-schema 4.x [\#128](https://github.com/voxpupuli/metadata-json-lint/pull/128) ([chelnak](https://github.com/chelnak))
|
11
36
|
|
12
37
|
## [3.0.2](https://github.com/voxpupuli/metadata-json-lint/tree/3.0.2) (2022-05-03)
|
13
38
|
|
data/Gemfile
CHANGED
@@ -3,10 +3,11 @@ source 'https://rubygems.org'
|
|
3
3
|
gemspec
|
4
4
|
|
5
5
|
group :release do
|
6
|
-
gem '
|
6
|
+
gem 'faraday-retry', require: false
|
7
|
+
gem 'github_changelog_generator', require: false
|
7
8
|
end
|
8
9
|
|
9
10
|
group :coverage, optional: ENV['COVERAGE'] != 'yes' do
|
10
|
-
gem 'codecov', :
|
11
|
-
gem 'simplecov-console', :
|
11
|
+
gem 'codecov', require: false
|
12
|
+
gem 'simplecov-console', require: false
|
12
13
|
end
|
data/Rakefile
CHANGED
@@ -1,17 +1,16 @@
|
|
1
1
|
desc 'Run all tests'
|
2
|
-
task :
|
2
|
+
task test: %i[spec test:acceptance]
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end
|
4
|
+
begin
|
5
|
+
require 'rubocop/rake_task'
|
6
|
+
rescue LoadError
|
7
|
+
# RuboCop is an optional group
|
8
|
+
else
|
9
|
+
RuboCop::RakeTask.new(:rubocop) do |task|
|
10
|
+
# These make the rubocop experience maybe slightly less terrible
|
11
|
+
task.options = ['--display-cop-names', '--display-style-guide', '--extra-details']
|
12
|
+
# Use Rubocop's Github Actions formatter if possible
|
13
|
+
task.formatters << 'github' if ENV['GITHUB_ACTIONS'] == 'true'
|
15
14
|
end
|
16
15
|
end
|
17
16
|
|
@@ -28,10 +27,11 @@ RSpec::Core::RakeTask.new(:spec)
|
|
28
27
|
begin
|
29
28
|
require 'rubygems'
|
30
29
|
require 'github_changelog_generator/task'
|
31
|
-
rescue LoadError
|
30
|
+
rescue LoadError
|
31
|
+
# github_changelog_generator is in the optional `release` group
|
32
32
|
else
|
33
33
|
GitHubChangelogGenerator::RakeTask.new :changelog do |config|
|
34
|
-
config.exclude_labels = %w[duplicate question invalid wontfix wont-fix skip-changelog]
|
34
|
+
config.exclude_labels = %w[duplicate question invalid wontfix wont-fix skip-changelog github_actions]
|
35
35
|
config.user = 'voxpupuli'
|
36
36
|
config.project = 'metadata-json-lint'
|
37
37
|
gem_version = Gem::Specification.load("#{config.project}.gemspec").version
|
@@ -4,8 +4,7 @@ module MetadataJsonLint
|
|
4
4
|
# Provides validation of metadata.json against a JSON schema document
|
5
5
|
# maintained in this class. Provides a good first pass over the metadata with
|
6
6
|
# type checking and basic format/length validations.
|
7
|
-
|
8
|
-
# rubocop:disable Metrics/ClassLength # schema data structure is quite large
|
7
|
+
## schema data structure is quite large
|
9
8
|
class Schema
|
10
9
|
# Based on https://docs.puppet.com/puppet/latest/modules_metadata.html
|
11
10
|
#
|
@@ -159,9 +158,9 @@ module MetadataJsonLint
|
|
159
158
|
raise JSON::Schema::CustomFormatError, "must be a valid semantic version: #{e.message}"
|
160
159
|
end
|
161
160
|
elsif value.match(semver_full_regex).nil?
|
162
|
-
raise JSON::Schema::CustomFormatError,
|
161
|
+
raise JSON::Schema::CustomFormatError,
|
162
|
+
"must be a valid semantic version: Unable to parse '#{value}' as a semantic version identifier"
|
163
163
|
end
|
164
164
|
end
|
165
165
|
end
|
166
166
|
end
|
167
|
-
# rubocop:enable Metrics/ClassLength
|
@@ -7,7 +7,10 @@ module MetadataJsonLint
|
|
7
7
|
|
8
8
|
if defined?(SemanticPuppet::VersionRange)
|
9
9
|
@range = SemanticPuppet::VersionRange.parse(requirement)
|
10
|
-
|
10
|
+
if @range == SemanticPuppet::VersionRange::EMPTY_RANGE
|
11
|
+
raise ArgumentError,
|
12
|
+
"Range matches no versions: \"#{requirement}\""
|
13
|
+
end
|
11
14
|
elsif requirement.match(/\A[a-z0-9*.\-^~><=|\t ]*\Z/i).nil?
|
12
15
|
raise ArgumentError, "Unparsable version range: \"#{requirement}\""
|
13
16
|
end
|
data/lib/metadata_json_lint.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
1
|
require 'json'
|
2
2
|
require 'spdx-licenses'
|
3
3
|
require 'optparse'
|
4
|
-
|
5
|
-
require 'metadata-json-lint/semantic_puppet_loader'
|
6
|
-
MetadataJsonLint::SemanticPuppetLoader.try_load
|
4
|
+
require 'semantic_puppet'
|
7
5
|
|
8
6
|
require 'metadata-json-lint/schema'
|
9
7
|
require 'metadata-json-lint/version_requirement'
|
@@ -17,7 +15,7 @@ module MetadataJsonLint
|
|
17
15
|
:strict_license,
|
18
16
|
:strict_dependencies,
|
19
17
|
:strict_puppet_version,
|
20
|
-
:format
|
18
|
+
:format,
|
21
19
|
).new(
|
22
20
|
true, # fail_on_warnings
|
23
21
|
true, # strict_license
|
@@ -32,11 +30,13 @@ module MetadataJsonLint
|
|
32
30
|
OptionParser.new do |opts|
|
33
31
|
opts.banner = 'Usage: metadata-json-lint [options] [metadata.json]'
|
34
32
|
|
35
|
-
opts.on('--[no-]strict-dependencies',
|
33
|
+
opts.on('--[no-]strict-dependencies',
|
34
|
+
"Fail on open-ended module version dependencies. Defaults to '#{options[:strict_dependencies]}'.") do |v|
|
36
35
|
options[:strict_dependencies] = v
|
37
36
|
end
|
38
37
|
|
39
|
-
opts.on('--[no-]strict-license',
|
38
|
+
opts.on('--[no-]strict-license',
|
39
|
+
"Don't fail on strict license check. Defaults to '#{options[:strict_license]}'.") do |v|
|
40
40
|
options[:strict_license] = v
|
41
41
|
end
|
42
42
|
|
@@ -44,11 +44,13 @@ module MetadataJsonLint
|
|
44
44
|
options[:fail_on_warnings] = v
|
45
45
|
end
|
46
46
|
|
47
|
-
opts.on('--[no-]strict-puppet-version',
|
47
|
+
opts.on('--[no-]strict-puppet-version',
|
48
|
+
"Fail on strict Puppet Version check based on current supported Puppet versions. Defaults to '#{options[:strict_puppet_version]}'.") do |v|
|
48
49
|
options[:strict_puppet_version] = v
|
49
50
|
end
|
50
51
|
|
51
|
-
opts.on('-f', '--format FORMAT', %i[text json],
|
52
|
+
opts.on('-f', '--format FORMAT', %i[text json],
|
53
|
+
'The format in which results will be output (text, json)') do |format|
|
52
54
|
options[:format] = format
|
53
55
|
end
|
54
56
|
end.parse!
|
@@ -90,7 +92,7 @@ module MetadataJsonLint
|
|
90
92
|
# Validate basic structure against JSON schema
|
91
93
|
schema_errors = Schema.new.validate(parsed)
|
92
94
|
schema_errors.each do |err|
|
93
|
-
error (err[:field] == 'root' ? :required_fields : err[:field]), err[:message]
|
95
|
+
error ((err[:field] == 'root') ? :required_fields : err[:field]), err[:message]
|
94
96
|
end
|
95
97
|
|
96
98
|
validate_dependencies!(parsed['dependencies']) if parsed['dependencies']
|
@@ -99,9 +101,7 @@ module MetadataJsonLint
|
|
99
101
|
# From: https://docs.puppetlabs.com/puppet/latest/reference/modules_publishing.html#write-a-metadatajson-file
|
100
102
|
deprecated_fields = %w[types checksum]
|
101
103
|
deprecated_fields.each do |field|
|
102
|
-
unless parsed[field].nil?
|
103
|
-
error :deprecated_fields, "Deprecated field '#{field}' found in metadata.json."
|
104
|
-
end
|
104
|
+
error :deprecated_fields, "Deprecated field '#{field}' found in metadata.json." unless parsed[field].nil?
|
105
105
|
end
|
106
106
|
|
107
107
|
# The nested 'requirements' name of 'pe' is deprecated as well.
|
@@ -121,16 +121,14 @@ module MetadataJsonLint
|
|
121
121
|
|
122
122
|
case options[:format]
|
123
123
|
when :json
|
124
|
-
puts JSON.fast_generate(:
|
124
|
+
puts JSON.fast_generate(result: result, warnings: @warnings, errors: @errors)
|
125
125
|
else
|
126
126
|
@warnings.each { |warn| puts "(WARN) #{warn}" }
|
127
127
|
@errors.each { |err| puts "(ERROR) #{err}" }
|
128
128
|
puts result
|
129
129
|
end
|
130
130
|
|
131
|
-
if !@errors.empty? || (!@warnings.empty? && (options[:fail_on_warnings] == true))
|
132
|
-
return false
|
133
|
-
end
|
131
|
+
return false if !@errors.empty? || (!@warnings.empty? && (options[:fail_on_warnings] == true))
|
134
132
|
end
|
135
133
|
|
136
134
|
true
|
@@ -153,9 +151,7 @@ module MetadataJsonLint
|
|
153
151
|
return unless requirements.is_a?(Array)
|
154
152
|
|
155
153
|
requirements.each do |requirement|
|
156
|
-
if requirement['name'] == 'pe'
|
157
|
-
warn :requirements, "The 'pe' requirement is no longer supported by the Forge."
|
158
|
-
end
|
154
|
+
warn :requirements, "The 'pe' requirement is no longer supported by the Forge." if requirement['name'] == 'pe'
|
159
155
|
|
160
156
|
begin
|
161
157
|
puppet_req = VersionRequirement.new(requirement.fetch('version_requirement', ''))
|
@@ -164,7 +160,7 @@ module MetadataJsonLint
|
|
164
160
|
error :requirements, "Invalid 'version_requirement' field in metadata.json: #{e}"
|
165
161
|
end
|
166
162
|
|
167
|
-
validate_puppet_ver!(puppet_req) unless puppet_req.instance_variable_get(
|
163
|
+
validate_puppet_ver!(puppet_req) unless puppet_req.instance_variable_get(:@requirement).nil?
|
168
164
|
end
|
169
165
|
|
170
166
|
validate_requirements_unique(requirements)
|
@@ -181,17 +177,16 @@ module MetadataJsonLint
|
|
181
177
|
end
|
182
178
|
|
183
179
|
return unless requirement.mixed_syntax?
|
180
|
+
|
184
181
|
warn(:requirement, 'Mixing "x" or "*" version syntax with operators is not recommended in ' \
|
185
|
-
|
182
|
+
"metadata.json, use one style in the puppet version: #{requirement.instance_variable_get(:@requirement)}")
|
186
183
|
end
|
187
184
|
module_function :validate_puppet_ver!
|
188
185
|
|
189
186
|
def validate_dependencies!(deps)
|
190
187
|
dep_names = []
|
191
188
|
deps.each do |dep|
|
192
|
-
if dep_names.include?(dep['name'])
|
193
|
-
warn :dependencies, "Duplicate dependencies on #{dep['name']}"
|
194
|
-
end
|
189
|
+
warn :dependencies, "Duplicate dependencies on #{dep['name']}" if dep_names.include?(dep['name'])
|
195
190
|
dep_names << dep['name']
|
196
191
|
|
197
192
|
begin
|
@@ -208,7 +203,7 @@ module MetadataJsonLint
|
|
208
203
|
# See https://tickets.puppetlabs.com/browse/PUP-2781
|
209
204
|
if dep.key?('version_range')
|
210
205
|
warn :dependencies, "Dependency #{dep['name']} has a 'version_range' attribute " \
|
211
|
-
|
206
|
+
'which is no longer used by the forge.'
|
212
207
|
end
|
213
208
|
end
|
214
209
|
end
|
@@ -219,7 +214,7 @@ module MetadataJsonLint
|
|
219
214
|
# From: https://docs.puppet.com/puppet/latest/reference/modules_metadata.html#best-practice-set-an-upper-bound-for-dependencies
|
220
215
|
if options[:strict_dependencies] && requirement.open_ended?
|
221
216
|
msg = "Dependency #{dep['name']} has an open " \
|
222
|
-
|
217
|
+
"ended dependency version requirement #{dep['version_requirement']}"
|
223
218
|
warn(:dependencies, msg)
|
224
219
|
end
|
225
220
|
|
@@ -227,15 +222,16 @@ module MetadataJsonLint
|
|
227
222
|
# From: https://docs.puppet.com/puppet/latest/modules_metadata.html#version-specifiers
|
228
223
|
# Supported in Puppet 5 and higher, but the syntax is unclear and incompatible with older versions
|
229
224
|
return unless requirement.mixed_syntax?
|
225
|
+
|
230
226
|
warn(:dependencies, 'Mixing "x" or "*" version syntax with operators is not recommended in ' \
|
231
|
-
|
227
|
+
"metadata.json, use one style in the #{dep['name']} dependency: #{dep['version_requirement']}")
|
232
228
|
end
|
233
229
|
module_function :validate_version_requirement!
|
234
230
|
|
235
231
|
def format_error(check, msg)
|
236
232
|
case options[:format]
|
237
233
|
when :json
|
238
|
-
{ :
|
234
|
+
{ check: check, msg: msg }
|
239
235
|
else
|
240
236
|
"#{check}: #{msg}"
|
241
237
|
end
|
data/metadata-json-lint.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'metadata-json-lint'
|
3
|
-
s.version = '
|
3
|
+
s.version = '4.0.0'
|
4
4
|
s.summary = 'metadata-json-lint /path/to/metadata.json'
|
5
5
|
s.description = 'Utility to verify Puppet metadata.json files'
|
6
6
|
s.authors = ['Vox Pupuli']
|
@@ -8,17 +8,16 @@ Gem::Specification.new do |s|
|
|
8
8
|
|
9
9
|
s.files = `git ls-files -z`.split("\x0")
|
10
10
|
s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
11
|
-
s.test_files = s.files.grep(%r{^(tests|spec)/})
|
12
11
|
|
13
12
|
s.homepage = 'https://github.com/voxpupuli/metadata-json-lint'
|
14
13
|
s.license = 'Apache-2.0'
|
15
14
|
|
16
|
-
s.required_ruby_version = '>= 2.
|
15
|
+
s.required_ruby_version = '>= 2.7.0'
|
16
|
+
|
17
17
|
s.add_runtime_dependency 'json-schema', '>= 2.8', '< 5.0'
|
18
|
+
s.add_runtime_dependency 'semantic_puppet', '~> 1.0'
|
18
19
|
s.add_runtime_dependency 'spdx-licenses', '~> 1.0'
|
19
|
-
s.add_development_dependency '
|
20
|
-
s.add_development_dependency '
|
21
|
-
s.add_development_dependency '
|
22
|
-
s.add_development_dependency 'rubocop', '~> 0.57.2'
|
23
|
-
s.add_development_dependency 'semantic_puppet'
|
20
|
+
s.add_development_dependency 'rake', '~> 13.0', '>= 13.0.6'
|
21
|
+
s.add_development_dependency 'rspec', '~> 3.12'
|
22
|
+
s.add_development_dependency 'voxpupuli-rubocop', '~> 2.0'
|
24
23
|
end
|
@@ -11,12 +11,13 @@ describe MetadataJsonLint do
|
|
11
11
|
context 'with pe' do
|
12
12
|
let :requirements do
|
13
13
|
[
|
14
|
-
{ 'name' => 'pe' }
|
14
|
+
{ 'name' => 'pe' },
|
15
15
|
]
|
16
16
|
end
|
17
17
|
|
18
18
|
it do
|
19
|
-
expect(described_class).to receive('warn').with(:requirements,
|
19
|
+
expect(described_class).to receive('warn').with(:requirements,
|
20
|
+
"The 'pe' requirement is no longer supported by the Forge.")
|
20
21
|
expect { described_class.validate_requirements!(requirements) }.not_to raise_error
|
21
22
|
end
|
22
23
|
end
|
@@ -24,12 +25,13 @@ describe MetadataJsonLint do
|
|
24
25
|
context 'with invalid requirement' do
|
25
26
|
let :requirements do
|
26
27
|
[
|
27
|
-
{ 'name' => 'puppet', 'version_requirement' => 'a' }
|
28
|
+
{ 'name' => 'puppet', 'version_requirement' => 'a' },
|
28
29
|
]
|
29
30
|
end
|
30
31
|
|
31
32
|
it do
|
32
|
-
expect(described_class).to receive('error').with(:requirements,
|
33
|
+
expect(described_class).to receive('error').with(:requirements,
|
34
|
+
"Invalid 'version_requirement' field in metadata.json: Unparsable version range: \"a\"")
|
33
35
|
expect { described_class.validate_requirements!(requirements) }.not_to raise_error
|
34
36
|
end
|
35
37
|
end
|
data/spec/schema_spec.rb
CHANGED
@@ -4,10 +4,13 @@ describe MetadataJsonLint::Schema do
|
|
4
4
|
end
|
5
5
|
|
6
6
|
describe '#validate' do
|
7
|
-
let(:minimal)
|
7
|
+
let(:minimal) do
|
8
|
+
{ author: '', dependencies: [], license: 'A', name: 'a-a', source: '', summary: '', version: '1.0.0' }
|
9
|
+
end
|
8
10
|
|
9
11
|
context 'with empty hash' do
|
10
12
|
subject { described_class.new.validate({}) }
|
13
|
+
|
11
14
|
it { is_expected.to be_a(Array) }
|
12
15
|
it { expect(subject.size).to eq(7) }
|
13
16
|
it { is_expected.to include(field: 'root', message: "The file did not contain a required property of 'author'") }
|
@@ -15,24 +18,39 @@ describe MetadataJsonLint::Schema do
|
|
15
18
|
|
16
19
|
context 'with minimal entries' do
|
17
20
|
subject { described_class.new.validate(minimal) }
|
21
|
+
|
18
22
|
it { is_expected.to eq([]) }
|
19
23
|
end
|
20
24
|
|
21
25
|
context 'with validation error on entry' do
|
22
26
|
subject { described_class.new.validate(minimal.merge(summary: 'A' * 145)) }
|
23
|
-
|
27
|
+
|
28
|
+
it {
|
29
|
+
expect(subject).to eq([{ field: 'summary',
|
30
|
+
message: "The property 'summary' was not of a maximum string length of 144", }])
|
31
|
+
}
|
24
32
|
end
|
25
33
|
|
26
34
|
context 'with validation error on nested entry' do
|
27
35
|
subject { described_class.new.validate(minimal.merge(dependencies: [{ name: 'in###id' }])) }
|
36
|
+
|
28
37
|
it { expect(subject.size).to eq(1) }
|
29
|
-
|
38
|
+
|
39
|
+
it {
|
40
|
+
expect(subject).to include(field: 'dependencies',
|
41
|
+
message: a_string_matching(%r{The property 'dependencies/0/name' value "in###id" did not match the regex}))
|
42
|
+
}
|
30
43
|
end
|
31
44
|
|
32
45
|
context 'with semver validation failure' do
|
33
46
|
subject { described_class.new.validate(minimal.merge(version: 'a')) }
|
47
|
+
|
34
48
|
it { expect(subject.size).to eq(1) }
|
35
|
-
|
49
|
+
|
50
|
+
it {
|
51
|
+
expect(subject).to include(field: 'version',
|
52
|
+
message: a_string_matching(/The property 'version' must be a valid semantic version/))
|
53
|
+
}
|
36
54
|
end
|
37
55
|
end
|
38
56
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -2,7 +2,7 @@ begin
|
|
2
2
|
require 'simplecov'
|
3
3
|
require 'simplecov-console'
|
4
4
|
require 'codecov'
|
5
|
-
rescue LoadError
|
5
|
+
rescue LoadError
|
6
6
|
else
|
7
7
|
SimpleCov.start do
|
8
8
|
track_files 'lib/**/*.rb'
|
@@ -18,7 +18,7 @@ else
|
|
18
18
|
|
19
19
|
SimpleCov.formatters = [
|
20
20
|
SimpleCov::Formatter::Console,
|
21
|
-
SimpleCov::Formatter::Codecov
|
21
|
+
SimpleCov::Formatter::Codecov,
|
22
22
|
]
|
23
23
|
end
|
24
24
|
|
data/tests/broken/expected
CHANGED
@@ -1 +1 @@
|
|
1
|
-
Error: Unable to parse metadata.json
|
1
|
+
Error: Unable to parse metadata.json:.* unexpected token at
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: metadata-json-lint
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vox Pupuli
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-09-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json-schema
|
@@ -31,7 +31,7 @@ dependencies:
|
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '5.0'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
|
-
name:
|
34
|
+
name: semantic_puppet
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
36
36
|
requirements:
|
37
37
|
- - "~>"
|
@@ -45,75 +45,67 @@ dependencies:
|
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: '1.0'
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
48
|
+
name: spdx-licenses
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
50
50
|
requirements:
|
51
|
-
- - "
|
51
|
+
- - "~>"
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: '0'
|
54
|
-
type: :
|
53
|
+
version: '1.0'
|
54
|
+
type: :runtime
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
57
|
requirements:
|
58
|
-
- - "
|
58
|
+
- - "~>"
|
59
59
|
- !ruby/object:Gem::Version
|
60
|
-
version: '0'
|
60
|
+
version: '1.0'
|
61
61
|
- !ruby/object:Gem::Dependency
|
62
62
|
name: rake
|
63
63
|
requirement: !ruby/object:Gem::Requirement
|
64
64
|
requirements:
|
65
|
-
- - "
|
66
|
-
- !ruby/object:Gem::Version
|
67
|
-
version: '0'
|
68
|
-
type: :development
|
69
|
-
prerelease: false
|
70
|
-
version_requirements: !ruby/object:Gem::Requirement
|
71
|
-
requirements:
|
72
|
-
- - ">="
|
65
|
+
- - "~>"
|
73
66
|
- !ruby/object:Gem::Version
|
74
|
-
version: '0'
|
75
|
-
- !ruby/object:Gem::Dependency
|
76
|
-
name: rspec
|
77
|
-
requirement: !ruby/object:Gem::Requirement
|
78
|
-
requirements:
|
67
|
+
version: '13.0'
|
79
68
|
- - ">="
|
80
69
|
- !ruby/object:Gem::Version
|
81
|
-
version:
|
70
|
+
version: 13.0.6
|
82
71
|
type: :development
|
83
72
|
prerelease: false
|
84
73
|
version_requirements: !ruby/object:Gem::Requirement
|
85
74
|
requirements:
|
75
|
+
- - "~>"
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '13.0'
|
86
78
|
- - ">="
|
87
79
|
- !ruby/object:Gem::Version
|
88
|
-
version:
|
80
|
+
version: 13.0.6
|
89
81
|
- !ruby/object:Gem::Dependency
|
90
|
-
name:
|
82
|
+
name: rspec
|
91
83
|
requirement: !ruby/object:Gem::Requirement
|
92
84
|
requirements:
|
93
85
|
- - "~>"
|
94
86
|
- !ruby/object:Gem::Version
|
95
|
-
version:
|
87
|
+
version: '3.12'
|
96
88
|
type: :development
|
97
89
|
prerelease: false
|
98
90
|
version_requirements: !ruby/object:Gem::Requirement
|
99
91
|
requirements:
|
100
92
|
- - "~>"
|
101
93
|
- !ruby/object:Gem::Version
|
102
|
-
version:
|
94
|
+
version: '3.12'
|
103
95
|
- !ruby/object:Gem::Dependency
|
104
|
-
name:
|
96
|
+
name: voxpupuli-rubocop
|
105
97
|
requirement: !ruby/object:Gem::Requirement
|
106
98
|
requirements:
|
107
|
-
- - "
|
99
|
+
- - "~>"
|
108
100
|
- !ruby/object:Gem::Version
|
109
|
-
version: '0'
|
101
|
+
version: '2.0'
|
110
102
|
type: :development
|
111
103
|
prerelease: false
|
112
104
|
version_requirements: !ruby/object:Gem::Requirement
|
113
105
|
requirements:
|
114
|
-
- - "
|
106
|
+
- - "~>"
|
115
107
|
- !ruby/object:Gem::Version
|
116
|
-
version: '0'
|
108
|
+
version: '2.0'
|
117
109
|
description: Utility to verify Puppet metadata.json files
|
118
110
|
email: voxpupuli@groups.io
|
119
111
|
executables:
|
@@ -137,7 +129,6 @@ files:
|
|
137
129
|
- bin/metadata-json-lint
|
138
130
|
- lib/metadata-json-lint/rake_task.rb
|
139
131
|
- lib/metadata-json-lint/schema.rb
|
140
|
-
- lib/metadata-json-lint/semantic_puppet_loader.rb
|
141
132
|
- lib/metadata-json-lint/version_requirement.rb
|
142
133
|
- lib/metadata_json_lint.rb
|
143
134
|
- metadata-json-lint.gemspec
|
@@ -225,7 +216,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
225
216
|
requirements:
|
226
217
|
- - ">="
|
227
218
|
- !ruby/object:Gem::Version
|
228
|
-
version: 2.
|
219
|
+
version: 2.7.0
|
229
220
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
230
221
|
requirements:
|
231
222
|
- - ">="
|
@@ -236,76 +227,4 @@ rubygems_version: 3.2.33
|
|
236
227
|
signing_key:
|
237
228
|
specification_version: 4
|
238
229
|
summary: metadata-json-lint /path/to/metadata.json
|
239
|
-
test_files:
|
240
|
-
- spec/metadata_json_lint_spec.rb
|
241
|
-
- spec/schema_spec.rb
|
242
|
-
- spec/spec_helper.rb
|
243
|
-
- spec/version_requirement_spec.rb
|
244
|
-
- tests/bad_license/Rakefile
|
245
|
-
- tests/bad_license/expected
|
246
|
-
- tests/bad_license/metadata.json
|
247
|
-
- tests/broken/Rakefile
|
248
|
-
- tests/broken/expected
|
249
|
-
- tests/broken/metadata.json
|
250
|
-
- tests/duplicate-dep/Rakefile
|
251
|
-
- tests/duplicate-dep/expected
|
252
|
-
- tests/duplicate-dep/metadata.json
|
253
|
-
- tests/duplicate-requirement/Rakefile
|
254
|
-
- tests/duplicate-requirement/expected
|
255
|
-
- tests/duplicate-requirement/metadata.json
|
256
|
-
- tests/json_format/Rakefile
|
257
|
-
- tests/json_format/expected
|
258
|
-
- tests/json_format/metadata.json
|
259
|
-
- tests/long_summary/Rakefile
|
260
|
-
- tests/long_summary/expected
|
261
|
-
- tests/long_summary/metadata.json
|
262
|
-
- tests/missing_version_requirement/Rakefile
|
263
|
-
- tests/missing_version_requirement/expected
|
264
|
-
- tests/missing_version_requirement/metadata.json
|
265
|
-
- tests/mixed_version_syntax/Rakefile
|
266
|
-
- tests/mixed_version_syntax/expected
|
267
|
-
- tests/mixed_version_syntax/metadata.json
|
268
|
-
- tests/multiple_problems/Rakefile
|
269
|
-
- tests/multiple_problems/expected
|
270
|
-
- tests/multiple_problems/metadata.json
|
271
|
-
- tests/no_dependencies/Rakefile
|
272
|
-
- tests/no_dependencies/metadata.json
|
273
|
-
- tests/no_files/.gitkeep
|
274
|
-
- tests/no_files/expected
|
275
|
-
- tests/no_pe/Rakefile
|
276
|
-
- tests/no_pe/metadata.json
|
277
|
-
- tests/no_version_range/Rakefile
|
278
|
-
- tests/no_version_range/metadata.json
|
279
|
-
- tests/non_array_requirements/Rakefile
|
280
|
-
- tests/non_array_requirements/expected
|
281
|
-
- tests/non_array_requirements/metadata.json
|
282
|
-
- tests/noname/Rakefile
|
283
|
-
- tests/noname/expected
|
284
|
-
- tests/noname/metadata.json
|
285
|
-
- tests/open_ended_dependency/Rakefile
|
286
|
-
- tests/open_ended_dependency/expected
|
287
|
-
- tests/open_ended_dependency/metadata.json
|
288
|
-
- tests/perfect/Rakefile
|
289
|
-
- tests/perfect/metadata.json
|
290
|
-
- tests/proprietary/Rakefile
|
291
|
-
- tests/proprietary/metadata.json
|
292
|
-
- tests/rake_chaining/Rakefile
|
293
|
-
- tests/rake_chaining/metadata.json
|
294
|
-
- tests/rake_global_options/Rakefile
|
295
|
-
- tests/rake_global_options/expected
|
296
|
-
- tests/rake_global_options/metadata.json
|
297
|
-
- tests/rake_multiple_json_options/Rakefile
|
298
|
-
- tests/rake_multiple_json_options/metadata_license.json
|
299
|
-
- tests/rake_multiple_json_options/metadata_ok.json
|
300
|
-
- tests/requirements_eol_version/Rakefile
|
301
|
-
- tests/requirements_eol_version/expected
|
302
|
-
- tests/requirements_eol_version/metadata.json
|
303
|
-
- tests/tags_no_array/Rakefile
|
304
|
-
- tests/tags_no_array/expected
|
305
|
-
- tests/tags_no_array/metadata.json
|
306
|
-
- tests/tags_with_array/Rakefile
|
307
|
-
- tests/tags_with_array/metadata.json
|
308
|
-
- tests/test.sh
|
309
|
-
- tests/types/Rakefile
|
310
|
-
- tests/types/expected
|
311
|
-
- tests/types/metadata.json
|
230
|
+
test_files: []
|
@@ -1,47 +0,0 @@
|
|
1
|
-
module MetadataJsonLint
|
2
|
-
# Attempts the various methods of loading SemanticPuppet.
|
3
|
-
module SemanticPuppetLoader
|
4
|
-
def try_load
|
5
|
-
try_load_puppet
|
6
|
-
return if defined?(SemanticPuppet)
|
7
|
-
|
8
|
-
try_load_semantic
|
9
|
-
return if defined?(SemanticPuppet)
|
10
|
-
|
11
|
-
try_load_semantic_puppet
|
12
|
-
return if defined?(SemanticPuppet)
|
13
|
-
|
14
|
-
warn 'Could not find semantic_puppet gem, falling back to internal functionality. Version checks may be less robust.'
|
15
|
-
end
|
16
|
-
module_function :try_load
|
17
|
-
|
18
|
-
# Most modern Puppet versions have SemanticPuppet vendored in the proper
|
19
|
-
# namespace and automatically load it at require time.
|
20
|
-
def try_load_puppet
|
21
|
-
require 'puppet'
|
22
|
-
rescue LoadError
|
23
|
-
nil
|
24
|
-
end
|
25
|
-
module_function :try_load_puppet
|
26
|
-
|
27
|
-
# Older Puppet 4.x versions have SemanticPuppet vendored but under the
|
28
|
-
# Semantic namespace and require it on demand, so we need to load it
|
29
|
-
# ourselves and then alias it to SemanticPuppet for convenience.
|
30
|
-
def try_load_semantic
|
31
|
-
require 'semantic'
|
32
|
-
Kernel.const_set('SemanticPuppet', Semantic)
|
33
|
-
rescue LoadError
|
34
|
-
nil
|
35
|
-
end
|
36
|
-
module_function :try_load_semantic
|
37
|
-
|
38
|
-
# If Puppet is not available or is a version that does not have
|
39
|
-
# SemanticPuppet vendored, try to load the external gem.
|
40
|
-
def try_load_semantic_puppet
|
41
|
-
require 'semantic_puppet'
|
42
|
-
rescue LoadError
|
43
|
-
nil
|
44
|
-
end
|
45
|
-
module_function :try_load_semantic_puppet
|
46
|
-
end
|
47
|
-
end
|