licensed 4.3.1 → 4.5.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/CHANGELOG.md +7 -1
- data/Gemfile.lock +27 -15
- data/README.md +1 -1
- data/docs/commands/status.md +15 -0
- data/docs/configuration/customizing_licensee.md +2 -2
- data/docs/configuration.md +9 -0
- data/docs/migrations/v3.md +7 -7
- data/docs/sources/cocoapods.md +1 -1
- data/lib/licensed/commands/cache.rb +1 -0
- data/lib/licensed/commands/command.rb +4 -4
- data/lib/licensed/commands/status.rb +62 -1
- data/lib/licensed/configuration.rb +5 -0
- data/lib/licensed/reporters/status_reporter.rb +5 -0
- data/lib/licensed/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d7d2ea0e055fe77e271036b11cc0494a3258e4a7f912bea4b135da327f7c6b16
|
|
4
|
+
data.tar.gz: eba319d54b8bc1865e25c325113b85fe3e151f5dfe52fe17059400bfbff4d6ea
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: cb1676bd29d609faf6bab6b32a8c54599ab7a3b508e0ade9c59ca6f6538923420540b78ac2074af343bc3dc8eceb611a74f4f3dc921ea0fef95eefc596f77395
|
|
7
|
+
data.tar.gz: 26ca34201fe2c44c1dfe2bf2168720b885b051aca5e143225348febfc34d24d5e3b17845224fb543e5187aea370bcbf2c446f5e37e3d5c8028054f3cc3e061c3
|
data/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,12 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## 4.4.0
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Licensed status command will alert on stale cached dependency records (https://github.com/github/licensed/pull/657)
|
|
14
|
+
|
|
9
15
|
## 4.3.1
|
|
10
16
|
|
|
11
17
|
### Changed
|
|
@@ -735,4 +741,4 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|
|
735
741
|
|
|
736
742
|
Initial release :tada:
|
|
737
743
|
|
|
738
|
-
[Unreleased]: https://github.com/github/licensed/compare/4.
|
|
744
|
+
[Unreleased]: https://github.com/github/licensed/compare/4.4.0...HEAD
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
licensed (4.
|
|
4
|
+
licensed (4.5.0)
|
|
5
5
|
json (~> 2.6)
|
|
6
6
|
licensee (~> 9.16)
|
|
7
7
|
parallel (~> 1.22)
|
|
@@ -14,24 +14,33 @@ PATH
|
|
|
14
14
|
GEM
|
|
15
15
|
remote: https://rubygems.org/
|
|
16
16
|
specs:
|
|
17
|
-
activesupport (7.
|
|
17
|
+
activesupport (7.1.3.2)
|
|
18
|
+
base64
|
|
19
|
+
bigdecimal
|
|
18
20
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
|
21
|
+
connection_pool (>= 2.2.5)
|
|
22
|
+
drb
|
|
19
23
|
i18n (>= 1.6, < 2)
|
|
20
24
|
minitest (>= 5.1)
|
|
25
|
+
mutex_m
|
|
21
26
|
tzinfo (~> 2.0)
|
|
22
27
|
addressable (2.8.1)
|
|
23
28
|
public_suffix (>= 2.0.2, < 6.0)
|
|
24
29
|
ast (2.4.2)
|
|
30
|
+
base64 (0.2.0)
|
|
31
|
+
bigdecimal (3.1.7)
|
|
25
32
|
byebug (11.1.3)
|
|
26
|
-
concurrent-ruby (1.2.
|
|
33
|
+
concurrent-ruby (1.2.3)
|
|
34
|
+
connection_pool (2.4.1)
|
|
27
35
|
dotenv (2.8.1)
|
|
36
|
+
drb (2.2.1)
|
|
28
37
|
faraday (2.7.4)
|
|
29
38
|
faraday-net_http (>= 2.0, < 3.1)
|
|
30
39
|
ruby2_keywords (>= 0.0.4)
|
|
31
40
|
faraday-net_http (3.0.2)
|
|
32
|
-
i18n (1.
|
|
41
|
+
i18n (1.14.4)
|
|
33
42
|
concurrent-ruby (~> 1.0)
|
|
34
|
-
json (2.
|
|
43
|
+
json (2.7.2)
|
|
35
44
|
licensee (9.16.0)
|
|
36
45
|
dotenv (~> 2.0)
|
|
37
46
|
octokit (>= 4.20, < 7.0)
|
|
@@ -39,30 +48,32 @@ GEM
|
|
|
39
48
|
rugged (>= 0.24, < 2.0)
|
|
40
49
|
thor (>= 0.19, < 2.0)
|
|
41
50
|
mini_portile2 (2.8.1)
|
|
42
|
-
minitest (5.
|
|
43
|
-
minitest-hooks (1.5.
|
|
51
|
+
minitest (5.24.1)
|
|
52
|
+
minitest-hooks (1.5.1)
|
|
44
53
|
minitest (> 5.3)
|
|
45
|
-
mocha (2.
|
|
54
|
+
mocha (2.4.5)
|
|
46
55
|
ruby2_keywords (>= 0.0.5)
|
|
47
|
-
|
|
56
|
+
mutex_m (0.2.0)
|
|
57
|
+
nokogiri (1.15.6)
|
|
48
58
|
mini_portile2 (~> 2.8.0)
|
|
49
59
|
racc (~> 1.4)
|
|
50
60
|
octokit (6.1.0)
|
|
51
61
|
faraday (>= 1, < 3)
|
|
52
62
|
sawyer (~> 0.9)
|
|
53
|
-
parallel (1.
|
|
63
|
+
parallel (1.25.1)
|
|
54
64
|
parser (3.2.0.0)
|
|
55
65
|
ast (~> 2.4.1)
|
|
56
|
-
pathname-common_prefix (0.0.
|
|
66
|
+
pathname-common_prefix (0.0.2)
|
|
57
67
|
public_suffix (5.0.1)
|
|
58
68
|
racc (1.6.2)
|
|
59
|
-
rack (3.0.
|
|
69
|
+
rack (3.0.9.1)
|
|
60
70
|
rainbow (3.1.1)
|
|
61
|
-
rake (13.
|
|
71
|
+
rake (13.2.1)
|
|
62
72
|
regexp_parser (2.6.2)
|
|
63
73
|
reverse_markdown (2.1.1)
|
|
64
74
|
nokogiri
|
|
65
|
-
rexml (3.
|
|
75
|
+
rexml (3.3.3)
|
|
76
|
+
strscan
|
|
66
77
|
rubocop (1.45.1)
|
|
67
78
|
json (~> 2.3)
|
|
68
79
|
parallel (~> 1.10)
|
|
@@ -93,7 +104,8 @@ GEM
|
|
|
93
104
|
sawyer (0.9.2)
|
|
94
105
|
addressable (>= 2.3.5)
|
|
95
106
|
faraday (>= 0.17.3, < 3)
|
|
96
|
-
|
|
107
|
+
strscan (3.1.0)
|
|
108
|
+
thor (1.3.1)
|
|
97
109
|
tomlrb (2.0.3)
|
|
98
110
|
tzinfo (2.0.6)
|
|
99
111
|
concurrent-ruby (~> 1.0)
|
data/README.md
CHANGED
|
@@ -8,7 +8,7 @@ Licensed is **not** a complete open source license compliance solution. Please u
|
|
|
8
8
|
|
|
9
9
|

|
|
10
10
|
|
|
11
|
-
Licensed is in
|
|
11
|
+
Licensed is currently in **low maintenance mode**. At this point, we're only looking to maintain this repository for security fixes.
|
|
12
12
|
|
|
13
13
|
## Licensed v4 - **Removed support for non-Ruby environments**
|
|
14
14
|
|
data/docs/commands/status.md
CHANGED
|
@@ -31,6 +31,21 @@ A dependency will fail the status checks if:
|
|
|
31
31
|
- If `license: other` is specified and all of the `licenses` entries match an `allowed` license a failure will not be logged
|
|
32
32
|
- A `reviewed` entry must reference a specific version of the depdency, e.g. `<name>@<version>`. The version identifier must specify a specific dependency version, ranges are not allowed.
|
|
33
33
|
|
|
34
|
+
## Detect and alert on stale cached metadata files
|
|
35
|
+
|
|
36
|
+
Licensed can alert on any metadata files that don't correlate to a currently used dependency when `licensed status` is run. To configure this behavior, set a root-level `stale_records_action` value in your [licensed configuration file](./../configuration.md).
|
|
37
|
+
|
|
38
|
+
Available values are:
|
|
39
|
+
|
|
40
|
+
1. `'error'`: Treat stale cached records as errors. Licensed will output errors for any stale metadata files and will cause `licensed status` to fail.
|
|
41
|
+
1. `'warn'`, `''`, or unset (default): Treat stale cached records as warnings. Licensed will output warnings for any stale metadata files but will not cause `licensed status` to fail.
|
|
42
|
+
1. `'ignore'`, any other value: Ignore stale cached records. Licensed will not output any notifications about stale metadata files.
|
|
43
|
+
|
|
44
|
+
```yaml
|
|
45
|
+
# in the licensed configuration file
|
|
46
|
+
stale_records_action: 'warn'
|
|
47
|
+
```
|
|
48
|
+
|
|
34
49
|
## Options
|
|
35
50
|
|
|
36
51
|
- `--config`/`-c`: the path to the licensed configuration file
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Customize Licensee's behavior
|
|
2
2
|
|
|
3
|
-
Licensed uses [Licensee](https://github.com/licensee/licensee) to detect and evaluate OSS licenses for project dependencies found during source enumeration.
|
|
3
|
+
Licensed uses [Licensee](https://github.com/licensee/licensee) to detect and evaluate OSS licenses for project dependencies found during source enumeration. Licensed can optionally [customize Licensee's behavior](https://github.com/licensee/licensee/blob/main/docs/customizing.md#customizing-licensees-behavior) based on options set in the configuration file.
|
|
4
4
|
|
|
5
5
|
**NOTE** Matching licenses based on package manager metadata and README references is always enabled and cannot currently be configured.
|
|
6
6
|
|
|
@@ -8,6 +8,6 @@ Licensed uses [Licensee](https://github.com/licensee/licensee) to detect and eva
|
|
|
8
8
|
licensee:
|
|
9
9
|
# the confidence threshold is an integer between 1 and 100. the value represents
|
|
10
10
|
# the minimum percentage confidence that Licensee must have to report a matched license
|
|
11
|
-
# https://github.com/licensee/licensee/blob/
|
|
11
|
+
# https://github.com/licensee/licensee/blob/main/docs/customizing.md#adjusting-the-confidence-threshold
|
|
12
12
|
confidence_threshold: 90 # default value: 98
|
|
13
13
|
```
|
data/docs/configuration.md
CHANGED
|
@@ -26,6 +26,15 @@ cache_path: 'relative/path/to/cache'
|
|
|
26
26
|
# Defaults to current directory when running `licensed`
|
|
27
27
|
source_path: 'relative/path/to/source'
|
|
28
28
|
|
|
29
|
+
# Whether to take any action when records are detected in the cache paths that don't map to evaluated
|
|
30
|
+
# dependencies.
|
|
31
|
+
# Available values are:
|
|
32
|
+
# - 'error': treat stale cached records as errors. Notify the user and fail status checks
|
|
33
|
+
# - 'warn', '', unset: treat stale cached records as warnings. Notify the user but do not fail status checks
|
|
34
|
+
# - 'ignore': Ignore stale cached records. Do not notify the user and do not fail status checks
|
|
35
|
+
# Optional, when not set this defaults to 'warn' behavior
|
|
36
|
+
stale_records_action: 'warn'
|
|
37
|
+
|
|
29
38
|
# Sources of metadata
|
|
30
39
|
sources:
|
|
31
40
|
bower: true
|
data/docs/migrations/v3.md
CHANGED
|
@@ -14,11 +14,11 @@ When using licensed v3 with bundler dependencies, licensed must be installed fro
|
|
|
14
14
|
|
|
15
15
|
Using licensed to enumerate bundler dependencies in a GitHub Actions workflow will require ruby to be available in the actions VM environment. Ruby can be setup in an actions workflow using [ruby/setup-ruby](https://github.com/ruby/setup-ruby)(preferred) or [actions/setup-ruby](https://github.com/actions/setup-ruby)(deprecated).
|
|
16
16
|
|
|
17
|
-
If you are using licensed in a GitHub Actions workflow, [
|
|
17
|
+
If you are using licensed in a GitHub Actions workflow, [github/setup-licensed](https://github.com/github/setup-licensed) has been updated according to this breaking change. `setup-licensed` will install the licensed gem when ruby is available, or the licensed executable when ruby is not available. Alternatively, you can `gem install` licensed directly as an actions step.
|
|
18
18
|
|
|
19
|
-
This is an example workflow definition that runs [
|
|
19
|
+
This is an example workflow definition that runs [github/licensed-ci](https://github.com/github/licensed-ci)'s opinionated license compliance workflow in CI. It includes jobs that demonstrate installing licensed using
|
|
20
20
|
- `gem install`
|
|
21
|
-
- [
|
|
21
|
+
- [github/setup-licensed](https://github.com/github/setup-licensed)
|
|
22
22
|
- installing when included in a bundler gem file
|
|
23
23
|
|
|
24
24
|
```yml
|
|
@@ -50,7 +50,7 @@ jobs:
|
|
|
50
50
|
ruby-version: "3.0"
|
|
51
51
|
|
|
52
52
|
# install licensed gem using setup-licensed
|
|
53
|
-
- uses:
|
|
53
|
+
- uses: github/setup-licensed@v1
|
|
54
54
|
with:
|
|
55
55
|
version: '3.x'
|
|
56
56
|
|
|
@@ -58,7 +58,7 @@ jobs:
|
|
|
58
58
|
- run: bundle install
|
|
59
59
|
|
|
60
60
|
# run licensed-ci to cache any metadata changes and verify compliance
|
|
61
|
-
- uses:
|
|
61
|
+
- uses: github/licensed-ci@v1
|
|
62
62
|
|
|
63
63
|
# OR
|
|
64
64
|
|
|
@@ -82,7 +82,7 @@ jobs:
|
|
|
82
82
|
- run: bundle install
|
|
83
83
|
|
|
84
84
|
# run licensed-ci to cache any metadata changes and verify compliance
|
|
85
|
-
- uses:
|
|
85
|
+
- uses: github/licensed-ci@v1
|
|
86
86
|
|
|
87
87
|
# OR
|
|
88
88
|
|
|
@@ -103,7 +103,7 @@ jobs:
|
|
|
103
103
|
- run: bundle install
|
|
104
104
|
|
|
105
105
|
# run licensed-ci to cache any metadata changes and verify compliance
|
|
106
|
-
- uses:
|
|
106
|
+
- uses: github/licensed-ci@v1
|
|
107
107
|
with:
|
|
108
108
|
command: 'bundle exec licensed' # run licensed within the bundler context
|
|
109
109
|
```
|
data/docs/sources/cocoapods.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
The cocoapods source will detect dependencies when `Podfile` and `Podfile.lock` are found at an app's `source_path`. The cocoapods source uses the [cocoapods-dependencies-list](https://github.com/jonabc/cocoapods-dependencies-list) plugin to enumerate dependencies and gather metadata on each package.
|
|
4
4
|
|
|
5
|
-
**NOTE: Licensed does not install the [cocoapods-dependencies-list](https://github.com/
|
|
5
|
+
**NOTE: Licensed does not install the [cocoapods-dependencies-list](https://github.com/jonabc/cocoapods-dependencies-list) plugin. Users must install the gem alongside the cocoapods gem to enumerate cocoapods dependencies.**
|
|
6
6
|
|
|
7
7
|
## Evaluating dependencies from a specific target
|
|
8
8
|
|
|
@@ -69,7 +69,7 @@ module Licensed
|
|
|
69
69
|
|
|
70
70
|
result = results.all?
|
|
71
71
|
|
|
72
|
-
yield(result) if block_given?
|
|
72
|
+
result = yield(result) if block_given?
|
|
73
73
|
|
|
74
74
|
result
|
|
75
75
|
ensure
|
|
@@ -103,7 +103,7 @@ module Licensed
|
|
|
103
103
|
|
|
104
104
|
result = results.all?
|
|
105
105
|
|
|
106
|
-
yield(result) if block_given?
|
|
106
|
+
result = yield(result) if block_given?
|
|
107
107
|
|
|
108
108
|
result
|
|
109
109
|
end
|
|
@@ -142,7 +142,7 @@ module Licensed
|
|
|
142
142
|
|
|
143
143
|
result = results.all?
|
|
144
144
|
|
|
145
|
-
yield(result) if block_given?
|
|
145
|
+
result = yield(result) if block_given?
|
|
146
146
|
|
|
147
147
|
result
|
|
148
148
|
rescue Licensed::Shell::Error => err
|
|
@@ -175,7 +175,7 @@ module Licensed
|
|
|
175
175
|
|
|
176
176
|
result = evaluate_dependency(app, source, dependency, report)
|
|
177
177
|
|
|
178
|
-
yield(result) if block_given?
|
|
178
|
+
result = yield(result) if block_given?
|
|
179
179
|
|
|
180
180
|
result
|
|
181
181
|
rescue Licensed::DependencyRecord::Error, Licensed::Shell::Error => err
|
|
@@ -23,10 +23,48 @@ module Licensed
|
|
|
23
23
|
# Returns whether the command succeeded based on the call to super
|
|
24
24
|
def run_command(report)
|
|
25
25
|
super do |result|
|
|
26
|
-
|
|
26
|
+
stale_records = stale_cached_records
|
|
27
|
+
if stale_records.any?
|
|
28
|
+
messages = stale_records.map { |f| "Stale dependency record found: #{f}" }
|
|
29
|
+
messages << "Please run the licensed cache command to clean up stale records"
|
|
30
|
+
|
|
31
|
+
case config["stale_records_action"].to_s
|
|
32
|
+
when "error"
|
|
33
|
+
report.errors.concat messages
|
|
34
|
+
result = false
|
|
35
|
+
when "warn", ""
|
|
36
|
+
report.warnings.concat messages
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
next result if result
|
|
27
41
|
|
|
28
42
|
report.errors << "Licensed found errors during source enumeration. Please see https://github.com/github/licensed/tree/master/docs/commands/status.md#status-errors-and-resolutions for possible resolutions."
|
|
43
|
+
|
|
44
|
+
result
|
|
29
45
|
end
|
|
46
|
+
ensure
|
|
47
|
+
cache_paths.clear
|
|
48
|
+
files.clear
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Run the command for all enumerated dependencies found in a dependency source,
|
|
52
|
+
# recording results in a report.
|
|
53
|
+
# Enumerating dependencies in the source is skipped if a :sources option
|
|
54
|
+
# is provided and the evaluated `source.class.type` is not in the :sources values
|
|
55
|
+
#
|
|
56
|
+
# app - The application configuration for the source
|
|
57
|
+
# source - A dependency source enumerator
|
|
58
|
+
#
|
|
59
|
+
# Returns whether the command succeeded for the dependency source enumerator
|
|
60
|
+
def run_source(app, source, report)
|
|
61
|
+
result = super
|
|
62
|
+
|
|
63
|
+
# add the full cache path to the list of cache paths
|
|
64
|
+
# that should be checked for extra files after the command run
|
|
65
|
+
cache_paths << app.cache_path.join(source.class.type) unless result == :skipped
|
|
66
|
+
|
|
67
|
+
result
|
|
30
68
|
end
|
|
31
69
|
|
|
32
70
|
# Evaluates a dependency for any compliance errors.
|
|
@@ -49,6 +87,9 @@ module Licensed
|
|
|
49
87
|
filename = app.cache_path.join(source.class.type, "#{dependency.name}.#{DependencyRecord::EXTENSION}")
|
|
50
88
|
report["filename"] = filename
|
|
51
89
|
record = cached_record(filename)
|
|
90
|
+
|
|
91
|
+
# add the absolute dependency file path to the list of files seen during this licensed run
|
|
92
|
+
files << filename.to_s
|
|
52
93
|
end
|
|
53
94
|
|
|
54
95
|
if record.nil?
|
|
@@ -133,6 +174,26 @@ module Licensed
|
|
|
133
174
|
|
|
134
175
|
licenses.sort_by { |license| license != "other" ? 0 : 1 }.first
|
|
135
176
|
end
|
|
177
|
+
|
|
178
|
+
# Check for cached files that don't match current dependencies
|
|
179
|
+
#
|
|
180
|
+
# Returns an array of any cached records that do not match a currently used dependency
|
|
181
|
+
def stale_cached_records
|
|
182
|
+
cache_paths.flat_map do |cache_path|
|
|
183
|
+
record_search_glob_pattern = cache_path.join("**/*.#{DependencyRecord::EXTENSION}")
|
|
184
|
+
Dir.glob(record_search_glob_pattern).select { |file| !files.include?(file) }
|
|
185
|
+
end.uniq
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
# Set of unique cache paths that are evaluted during the run
|
|
189
|
+
def cache_paths
|
|
190
|
+
@cache_paths ||= Set.new
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
# Set of unique absolute file paths of cached records evaluted during the run
|
|
194
|
+
def files
|
|
195
|
+
@files ||= Set.new
|
|
196
|
+
end
|
|
136
197
|
end
|
|
137
198
|
end
|
|
138
199
|
end
|
|
@@ -274,6 +274,7 @@ module Licensed
|
|
|
274
274
|
end
|
|
275
275
|
|
|
276
276
|
def initialize(options = {})
|
|
277
|
+
@options = options
|
|
277
278
|
apps = options.delete("apps") || []
|
|
278
279
|
apps << default_options.merge(options) if apps.empty?
|
|
279
280
|
|
|
@@ -285,6 +286,10 @@ module Licensed
|
|
|
285
286
|
@apps = apps.map { |app| AppConfiguration.new(app, options) }
|
|
286
287
|
end
|
|
287
288
|
|
|
289
|
+
def [](key)
|
|
290
|
+
@options&.fetch(key, nil)
|
|
291
|
+
end
|
|
292
|
+
|
|
288
293
|
private
|
|
289
294
|
|
|
290
295
|
def self.expand_app_source_path(app_config)
|
|
@@ -8,6 +8,11 @@ module Licensed
|
|
|
8
8
|
# command - The command being run
|
|
9
9
|
# report - A report object containing information about the command run
|
|
10
10
|
def end_report_command(command, report)
|
|
11
|
+
if report.warnings.any?
|
|
12
|
+
shell.newline
|
|
13
|
+
report.warnings.each { |e| shell.warn e }
|
|
14
|
+
end
|
|
15
|
+
|
|
11
16
|
if report.errors.any?
|
|
12
17
|
shell.newline
|
|
13
18
|
report.errors.each { |e| shell.error e }
|
data/lib/licensed/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: licensed
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 4.
|
|
4
|
+
version: 4.5.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- GitHub
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2024-08-06 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: licensee
|
|
@@ -342,7 +342,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
342
342
|
- !ruby/object:Gem::Version
|
|
343
343
|
version: '0'
|
|
344
344
|
requirements: []
|
|
345
|
-
rubygems_version: 3.
|
|
345
|
+
rubygems_version: 3.4.19
|
|
346
346
|
signing_key:
|
|
347
347
|
specification_version: 4
|
|
348
348
|
summary: Extract and validate the licenses of dependencies.
|