licensed 0.11.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +13 -4
  3. data/.rubocop.yml +3 -0
  4. data/.ruby-version +1 -0
  5. data/CHANGELOG.md +13 -0
  6. data/CODE_OF_CONDUCT.md +14 -12
  7. data/CONTRIBUTING.md +51 -0
  8. data/Gemfile +2 -1
  9. data/{LICENSE.txt → LICENSE} +1 -1
  10. data/README.md +55 -76
  11. data/Rakefile +3 -2
  12. data/docs/configuration.md +131 -0
  13. data/docs/sources/bower.md +5 -0
  14. data/docs/sources/bundler.md +7 -0
  15. data/docs/sources/cabal.md +39 -0
  16. data/docs/sources/go.md +12 -0
  17. data/docs/sources/manifests.md +26 -0
  18. data/docs/sources/npm.md +3 -0
  19. data/docs/sources/stack.md +3 -0
  20. data/exe/licensed +1 -0
  21. data/lib/licensed.rb +9 -5
  22. data/lib/licensed/cli.rb +22 -14
  23. data/lib/licensed/command/cache.rb +46 -29
  24. data/lib/licensed/command/list.rb +17 -9
  25. data/lib/licensed/command/status.rb +78 -0
  26. data/lib/licensed/configuration.rb +127 -25
  27. data/lib/licensed/dependency.rb +8 -2
  28. data/lib/licensed/git.rb +39 -0
  29. data/lib/licensed/license.rb +1 -0
  30. data/lib/licensed/shell.rb +28 -0
  31. data/lib/licensed/source/bower.rb +4 -0
  32. data/lib/licensed/source/bundler.rb +4 -0
  33. data/lib/licensed/source/cabal.rb +72 -24
  34. data/lib/licensed/source/go.rb +23 -36
  35. data/lib/licensed/source/manifest.rb +26 -23
  36. data/lib/licensed/source/npm.rb +19 -8
  37. data/lib/licensed/ui/shell.rb +2 -1
  38. data/lib/licensed/version.rb +2 -1
  39. data/licensed.gemspec +9 -5
  40. data/{bin/setup → script/bootstrap} +13 -8
  41. data/script/cibuild +7 -0
  42. data/{bin → script}/console +1 -0
  43. metadata +53 -158
  44. data/.bowerrc +0 -3
  45. data/exe/licensor +0 -5
  46. data/lib/licensed/command/verify.rb +0 -73
  47. data/lib/licensed/source/stack.rb +0 -66
@@ -1,4 +1,5 @@
1
- require 'pathname/common_prefix'
1
+ # frozen_string_literal: true
2
+ require "pathname/common_prefix"
2
3
 
3
4
  module Licensed
4
5
  module Source
@@ -12,65 +13,67 @@ module Licensed
12
13
  end
13
14
 
14
15
  def type
15
- 'manifest'
16
+ "manifest"
16
17
  end
17
18
 
18
19
  def dependencies
19
20
  @dependencies ||= packages.map do |package_name, sources|
20
21
  Dependency.new(sources_license_path(sources), {
21
- 'type' => type,
22
- 'name' => package_name,
23
- 'version' => package_version(sources)
22
+ "type" => type,
23
+ "name" => package_name,
24
+ "version" => package_version(sources)
24
25
  })
25
26
  end
26
27
  end
27
28
 
29
+ # Returns the top-most directory that is common to all paths in `sources`
28
30
  def sources_license_path(sources)
29
31
  common_prefix = Pathname.common_prefix(*sources).to_path
30
32
 
31
33
  # don't allow the repo root to be used as common prefix
32
34
  # the project this is run for should be excluded from the manifest,
33
35
  # or ignored in the config. any license in the root should be ignored.
34
- return common_prefix if common_prefix != repository_root
36
+ return common_prefix if common_prefix != Licensed::Git.repository_root
35
37
 
36
38
  # use the first source file as the license path.
37
39
  sources.first
38
40
  end
39
41
 
42
+ # Returns the latest git SHA available from `sources`
40
43
  def package_version(sources)
41
44
  return if sources.nil? || sources.empty?
42
45
 
43
- # return the latest version from the sources
44
- sources.map { |s| source_version_command(s) }
45
- .max_by { |sha| commit_date_command(sha) }
46
- end
47
-
48
- def commit_date_command(sha)
49
- `git show -s -1 --format=%ct #{sha}`.strip
50
- end
51
-
52
- def source_version_command(source)
53
- `git rev-list -1 HEAD -- #{source}`.strip
46
+ sources.map { |s| Licensed::Git.version(s) }
47
+ .compact
48
+ .max_by { |sha| Licensed::Git.commit_date(sha) }
54
49
  end
55
50
 
51
+ # Returns a map of package names -> array of full source paths found
52
+ # in the app manifest
56
53
  def packages
57
54
  manifest.each_with_object({}) do |(src, package_name), hsh|
58
55
  next if src.nil? || src.empty?
59
56
  hsh[package_name] ||= []
60
- hsh[package_name] << File.join(repository_root, src)
57
+ hsh[package_name] << File.join(Licensed::Git.repository_root, src)
61
58
  end
62
59
  end
63
60
 
61
+ # Returns parsed manifest data for the app
64
62
  def manifest
65
- JSON.parse(File.read(manifest_path))
63
+ case manifest_path.extname.downcase.delete "."
64
+ when "json"
65
+ JSON.parse(File.read(manifest_path))
66
+ when "yml", "yaml"
67
+ YAML.load_file(manifest_path)
68
+ end
66
69
  end
67
70
 
71
+ # Returns the manifest location for the app
68
72
  def manifest_path
69
- @config.path.join('manifest.json')
70
- end
73
+ path = @config["manifest"]["path"] if @config["manifest"]
74
+ return Licensed::Git.repository_root.join(path) if path
71
75
 
72
- def repository_root
73
- @root ||= `git rev-parse --show-toplevel`.strip
76
+ @config.cache_path.join("manifest.json")
74
77
  end
75
78
  end
76
79
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "json"
2
3
 
3
4
  module Licensed
@@ -39,14 +40,8 @@ module Licensed
39
40
  end
40
41
  end
41
42
 
42
- def package_location_command
43
- `npm list --parseable --production --long 2>/dev/null`
44
- end
45
-
46
- def package_metadata_command
47
- `npm list --json --production --long 2>/dev/null`
48
- end
49
-
43
+ # Recursively parse dependency JSON data. Returns a hash mapping the
44
+ # package name to it's metadata
50
45
  def recursive_dependencies(dependencies, result = {})
51
46
  dependencies.each do |name, dependency|
52
47
  (result[name] ||= {}).update(dependency)
@@ -54,6 +49,22 @@ module Licensed
54
49
  end
55
50
  result
56
51
  end
52
+
53
+ # Returns the output from running `npm list` to get package paths
54
+ def package_location_command
55
+ npm_list_command("--parseable", "--production", "--long")
56
+ end
57
+
58
+ # Returns the output from running `npm list` to get package metadata
59
+ def package_metadata_command
60
+ npm_list_command("--json", "--production", "--long")
61
+ end
62
+
63
+ # Executes an `npm list` command with the provided args and returns the
64
+ # output from stdout
65
+ def npm_list_command(*args)
66
+ Licensed::Shell.execute("npm", "list", *args)
67
+ end
57
68
  end
58
69
  end
59
70
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "thor"
2
3
 
3
4
  module Licensed
@@ -7,7 +8,7 @@ module Licensed
7
8
 
8
9
  def initialize
9
10
  @shell = STDOUT.tty? ? Thor::Base.shell.new : Thor::Shell::Basic.new
10
- @level = ENV['DEBUG'] ? "debug" : "info"
11
+ @level = ENV["DEBUG"] ? "debug" : "info"
11
12
  end
12
13
 
13
14
  def debug(msg, newline = true)
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Licensed
2
- VERSION = "0.11.1"
3
+ VERSION = "1.0.0".freeze
3
4
  end
@@ -1,16 +1,18 @@
1
1
  # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
2
+ # frozen_string_literal: true
3
+ lib = File.expand_path("../lib", __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'licensed/version'
5
+ require "licensed/version"
5
6
 
6
7
  Gem::Specification.new do |spec|
7
8
  spec.name = "licensed"
8
9
  spec.version = Licensed::VERSION
9
10
  spec.authors = ["GitHub"]
10
- spec.email = ["opensource@github.com"]
11
+ spec.email = ["opensource+licensed@github.com"]
12
+
13
+ spec.summary = %q{Extract and validate the licenses of dependencies.}
14
+ spec.description = "Licensed automates extracting and validating the licenses of dependencies."
11
15
 
12
- spec.summary = %q{extract and validate the licenses of dependencies.}
13
- spec.description = File.read("README.md")
14
16
  spec.homepage = "https://github.com/github/licensed"
15
17
  spec.license = "MIT"
16
18
 
@@ -29,4 +31,6 @@ Gem::Specification.new do |spec|
29
31
  spec.add_development_dependency "minitest", "~> 5.8"
30
32
  spec.add_development_dependency "vcr", "~> 2.9"
31
33
  spec.add_development_dependency "webmock", "~> 1.21"
34
+ spec.add_development_dependency "rubocop", "~> 0.49"
35
+ spec.add_development_dependency "rubocop-github", "~> 0.6"
32
36
  end
@@ -3,24 +3,29 @@ set -euo pipefail
3
3
  IFS=$'\n\t'
4
4
 
5
5
  if [ -n "$(which bundle)" ]; then
6
- bundle install
6
+ bundle install --path vendor/gems
7
+ fi
8
+
9
+ cd test/fixtures
10
+
11
+ if [ -n "$(which bundle)" ]; then
12
+ pushd bundler
13
+ bundle install --path vendor/gems
14
+ popd
7
15
  fi
8
16
 
9
17
  # Install bower fixtures
10
18
  if [ -n "$(which bower)" ]; then
19
+ pushd bower
11
20
  bower install
21
+ popd
12
22
  fi
13
23
 
14
- cd test/fixtures
15
-
16
24
  # Install npm fixtures
17
25
  if [ -n "$(which npm)" ]; then
26
+ pushd npm
18
27
  npm install
19
- fi
20
-
21
- # Install stack fixtures
22
- if [ -n "$(which stack)" ]; then
23
- stack build
28
+ popd
24
29
  fi
25
30
 
26
31
  if [ -n "$(which go)" ]; then
@@ -0,0 +1,7 @@
1
+ #!/bin/sh
2
+
3
+ set -e
4
+
5
+ bundle exec rake test
6
+ bundle exec rubocop -S -D
7
+ gem build licensed.gemspec
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require "bundler/setup"
4
5
  require "licensed"
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: 0.11.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitHub
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-10-30 00:00:00.000000000 Z
11
+ date: 2018-03-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: licensee
@@ -136,189 +136,84 @@ dependencies:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
138
  version: '1.21'
139
- description: |
140
- # Licensed
141
-
142
- Licensed is a Ruby gem to cache and verify the licenses of dependencies.
143
-
144
- ## Installation
145
-
146
- Add this line to your application's Gemfile:
147
-
148
- ```ruby
149
- gem 'licensed', :group => 'development'
150
- ```
151
-
152
- And then execute:
153
-
154
- $ bundle
155
-
156
- ## Usage
157
-
158
- - `licensed cache`: Cache licenses and metadata in `vendor/licenses`
159
-
160
- - `licensed verify`: Check for issues with the licenses of dependencies. For example:
161
-
162
- ```
163
- $ bundle exec licensed verify
164
- Verifying licenses for 3 dependencies
165
-
166
- Warnings:
167
-
168
- vendor/licenses/rubygem/bundler.txt:
169
- - license needs reviewed: mit.
170
-
171
- vendor/licenses/rubygem/licensee.txt:
172
- - missing license data
173
-
174
- vendor/licenses/bower/jquery.txt:
175
- - license needs reviewed: mit.
176
- - cached license data out of date
177
-
178
- 3 dependencies checked, 3 warnings found.
179
- ```
180
-
181
- ### Configuration
182
-
183
- Configuration is managed by `vendor/licenses/config.yml`.
184
-
185
- ```yml
186
- # Dependencies with these licenses are approved by default.
187
- whitelist:
188
- - mit
189
- - apache-2.0
190
- - bsd-2-clause
191
- - bsd-3-clause
192
- - cc0-1.0
193
-
194
- # These dependencies are explicitly ignored.
195
- ignored:
196
- rubygem:
197
- - some-internal-gem
198
-
199
- bower:
200
- - some-internal-package
201
-
202
- # These dependencies have been reviewed.
203
- reviewed:
204
- rubygem:
205
- - bcrypt-ruby
206
-
207
- bower:
208
- - classlist # public domain
209
- - octicons
210
- ```
211
-
212
- ### Sources
213
-
214
- Dependencies will be automatically detected for
215
- 1. Bundler (rubygem)
216
- 2. NPM
217
- 3. Bower
218
- 4. HaskellStack
219
- 5. Cabal
220
- 6. Go
221
- 7. Manifest lists
222
-
223
- You can disable any of them in `vendor/licenses/config.yml`:
224
-
225
- ```yml
226
- sources:
227
- rubygem: false
228
- npm: false
229
- bower: false
230
- stack: false
231
- ```
232
-
233
- #### Special Considerations for Sources
234
- ##### rubygem
235
- The rubygem source will explicitly exclude gems in the `:development` and `:test` groups. Be aware that if you have a local
236
- bundler configuration (e.g. `.bundle`), that configuration will be respected as well. For example, if you have a local
237
- configuration set for `without: [':server']`, the rubygem source will exclude all gems in the `:server` group.
238
-
239
- ##### cabal
240
- Cabal sourced dependencies are found exclusively through `ghc-pkg`. `licensed` makes no assumptions on where `ghc` package dbs are found.
241
- As a result, it is up to the caller to set `GHC_PACKAGE_PATHS` to all package db directories prior to calling into `licensed`.
242
-
243
- ##### manifests
244
- Manifests are intended to be a stopgap if no package managers are available. The manifest is a JSON file that should be placed in
245
- the same directory as `config.yml` and should have the following format
246
- ```JSON
247
- {
248
- "file1": "package1",
249
- "path/to/file2": "package1",
250
- "other/file3": "package2"
251
- }
252
- ```
253
- Paths to files are expected to be relative to the git repository root. Package names will match 1:1 with metadata files at `<licenses directory>/manifest/*.txt`.
254
-
255
- It is the responsibility of the repository owner to maintain the manifest file.
256
-
257
- ## Development
258
-
259
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
260
-
261
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
262
-
263
- #### Adding sources
264
-
265
- When adding new dependency sources, ensure that `bin/setup` scripting and tests are only run if the required tooling is available on the development machine.
266
-
267
- * See `bin/setup` for examples of gating scripting based on whether tooling executables are found.
268
- * Use `tool_available?` when writing test files to gate running a test suite when tooling executables aren't available.
269
- ```ruby
270
- if tool_available?('bundle')
271
- describe Licensed::Source::Bundler do
272
- ...
273
- end
274
- end
275
- ```
276
-
277
- ## Contributing
278
-
279
- Bug reports and pull requests are welcome on GitHub at https://github.com/github/licensed. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org/) code of conduct.
280
-
281
- ## License
282
-
283
- The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
139
+ - !ruby/object:Gem::Dependency
140
+ name: rubocop
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '0.49'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '0.49'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rubocop-github
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '0.6'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '0.6'
167
+ description: Licensed automates extracting and validating the licenses of dependencies.
284
168
  email:
285
- - opensource@github.com
169
+ - opensource+licensed@github.com
286
170
  executables:
287
171
  - licensed
288
- - licensor
289
172
  extensions: []
290
173
  extra_rdoc_files: []
291
174
  files:
292
- - ".bowerrc"
293
175
  - ".gitignore"
176
+ - ".rubocop.yml"
177
+ - ".ruby-version"
294
178
  - ".travis.yml"
179
+ - CHANGELOG.md
295
180
  - CODE_OF_CONDUCT.md
181
+ - CONTRIBUTING.md
296
182
  - Gemfile
297
- - LICENSE.txt
183
+ - LICENSE
298
184
  - README.md
299
185
  - Rakefile
300
- - bin/console
301
- - bin/setup
186
+ - docs/configuration.md
187
+ - docs/sources/bower.md
188
+ - docs/sources/bundler.md
189
+ - docs/sources/cabal.md
190
+ - docs/sources/go.md
191
+ - docs/sources/manifests.md
192
+ - docs/sources/npm.md
193
+ - docs/sources/stack.md
302
194
  - exe/licensed
303
- - exe/licensor
304
195
  - lib/licensed.rb
305
196
  - lib/licensed/cli.rb
306
197
  - lib/licensed/command/cache.rb
307
198
  - lib/licensed/command/list.rb
308
- - lib/licensed/command/verify.rb
199
+ - lib/licensed/command/status.rb
309
200
  - lib/licensed/configuration.rb
310
201
  - lib/licensed/dependency.rb
202
+ - lib/licensed/git.rb
311
203
  - lib/licensed/license.rb
204
+ - lib/licensed/shell.rb
312
205
  - lib/licensed/source/bower.rb
313
206
  - lib/licensed/source/bundler.rb
314
207
  - lib/licensed/source/cabal.rb
315
208
  - lib/licensed/source/go.rb
316
209
  - lib/licensed/source/manifest.rb
317
210
  - lib/licensed/source/npm.rb
318
- - lib/licensed/source/stack.rb
319
211
  - lib/licensed/ui/shell.rb
320
212
  - lib/licensed/version.rb
321
213
  - licensed.gemspec
214
+ - script/bootstrap
215
+ - script/cibuild
216
+ - script/console
322
217
  homepage: https://github.com/github/licensed
323
218
  licenses:
324
219
  - MIT
@@ -339,8 +234,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
339
234
  version: '0'
340
235
  requirements: []
341
236
  rubyforge_project:
342
- rubygems_version: 2.6.11
237
+ rubygems_version: 2.6.8
343
238
  signing_key:
344
239
  specification_version: 4
345
- summary: extract and validate the licenses of dependencies.
240
+ summary: Extract and validate the licenses of dependencies.
346
241
  test_files: []