licensed 0.11.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +13 -4
- data/.rubocop.yml +3 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +13 -0
- data/CODE_OF_CONDUCT.md +14 -12
- data/CONTRIBUTING.md +51 -0
- data/Gemfile +2 -1
- data/{LICENSE.txt → LICENSE} +1 -1
- data/README.md +55 -76
- data/Rakefile +3 -2
- data/docs/configuration.md +131 -0
- data/docs/sources/bower.md +5 -0
- data/docs/sources/bundler.md +7 -0
- data/docs/sources/cabal.md +39 -0
- data/docs/sources/go.md +12 -0
- data/docs/sources/manifests.md +26 -0
- data/docs/sources/npm.md +3 -0
- data/docs/sources/stack.md +3 -0
- data/exe/licensed +1 -0
- data/lib/licensed.rb +9 -5
- data/lib/licensed/cli.rb +22 -14
- data/lib/licensed/command/cache.rb +46 -29
- data/lib/licensed/command/list.rb +17 -9
- data/lib/licensed/command/status.rb +78 -0
- data/lib/licensed/configuration.rb +127 -25
- data/lib/licensed/dependency.rb +8 -2
- data/lib/licensed/git.rb +39 -0
- data/lib/licensed/license.rb +1 -0
- data/lib/licensed/shell.rb +28 -0
- data/lib/licensed/source/bower.rb +4 -0
- data/lib/licensed/source/bundler.rb +4 -0
- data/lib/licensed/source/cabal.rb +72 -24
- data/lib/licensed/source/go.rb +23 -36
- data/lib/licensed/source/manifest.rb +26 -23
- data/lib/licensed/source/npm.rb +19 -8
- data/lib/licensed/ui/shell.rb +2 -1
- data/lib/licensed/version.rb +2 -1
- data/licensed.gemspec +9 -5
- data/{bin/setup → script/bootstrap} +13 -8
- data/script/cibuild +7 -0
- data/{bin → script}/console +1 -0
- metadata +53 -158
- data/.bowerrc +0 -3
- data/exe/licensor +0 -5
- data/lib/licensed/command/verify.rb +0 -73
- data/lib/licensed/source/stack.rb +0 -66
data/.bowerrc
DELETED
data/exe/licensor
DELETED
@@ -1,73 +0,0 @@
|
|
1
|
-
require 'yaml'
|
2
|
-
|
3
|
-
module Licensed
|
4
|
-
module Command
|
5
|
-
class Verify
|
6
|
-
attr_reader :config
|
7
|
-
|
8
|
-
def initialize(config)
|
9
|
-
@config = config
|
10
|
-
end
|
11
|
-
|
12
|
-
def approved?(dependency)
|
13
|
-
@config.whitelisted?(dependency) || @config.reviewed?(dependency)
|
14
|
-
end
|
15
|
-
|
16
|
-
def dependencies
|
17
|
-
@dependencies ||= @config.sources
|
18
|
-
.map(&:dependencies)
|
19
|
-
.flatten
|
20
|
-
.select { |d| !@config.ignored?(d) }
|
21
|
-
end
|
22
|
-
|
23
|
-
def run
|
24
|
-
@config.ui.info "Verifying licenses for #{dependencies.size} dependencies"
|
25
|
-
|
26
|
-
@results = dependencies.map do |dependency|
|
27
|
-
filename = @config.path.join("#{dependency["type"]}/#{dependency["name"]}.txt")
|
28
|
-
|
29
|
-
warnings = []
|
30
|
-
|
31
|
-
if File.exists?(filename)
|
32
|
-
license = License.read(filename)
|
33
|
-
|
34
|
-
if license["version"] != dependency["version"]
|
35
|
-
warnings << "cached license data out of date"
|
36
|
-
end
|
37
|
-
warnings << "missing license text" if license.text.strip.empty?
|
38
|
-
unless approved?(license)
|
39
|
-
warnings << "license needs reviewed: #{license["license"]}."
|
40
|
-
end
|
41
|
-
else
|
42
|
-
warnings << "missing license data"
|
43
|
-
end
|
44
|
-
|
45
|
-
if warnings.size > 0
|
46
|
-
@config.ui.error("F", false)
|
47
|
-
[filename, warnings]
|
48
|
-
else
|
49
|
-
@config.ui.confirm(".", false)
|
50
|
-
nil
|
51
|
-
end
|
52
|
-
end.compact
|
53
|
-
|
54
|
-
unless success?
|
55
|
-
@config.ui.warn "\n\nWarnings:"
|
56
|
-
|
57
|
-
@results.each do |filename, warnings|
|
58
|
-
@config.ui.info "\n#{filename}:"
|
59
|
-
warnings.each do |warning|
|
60
|
-
@config.ui.error " - #{warning}"
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
puts "\n#{dependencies.size} dependencies checked, #{@results.size} warnings found."
|
66
|
-
end
|
67
|
-
|
68
|
-
def success?
|
69
|
-
@results.empty?
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
@@ -1,66 +0,0 @@
|
|
1
|
-
module Licensed
|
2
|
-
module Source
|
3
|
-
class Stack
|
4
|
-
def initialize(config)
|
5
|
-
@config = config
|
6
|
-
end
|
7
|
-
|
8
|
-
def type
|
9
|
-
"stack"
|
10
|
-
end
|
11
|
-
|
12
|
-
def enabled?
|
13
|
-
@config.enabled?(type) && File.exist?(@config.pwd.join("stack.yaml"))
|
14
|
-
end
|
15
|
-
|
16
|
-
def dependencies
|
17
|
-
@dependencies ||= packages.map do |(name, version)|
|
18
|
-
package_id = "#{name}-#{version}"
|
19
|
-
package = package_info package_id
|
20
|
-
|
21
|
-
if package.empty?
|
22
|
-
next if @config.ignored?('type' => type, 'name' => name)
|
23
|
-
raise "couldn't locate #{package_id} with ghc-pkg"
|
24
|
-
end
|
25
|
-
|
26
|
-
path = package["haddock-html"] || File.join(@config.pwd, "vendor", name)
|
27
|
-
Dependency.new(path, {
|
28
|
-
"type" => type,
|
29
|
-
"name" => package["name"] || name,
|
30
|
-
"version" => package["version"] || version,
|
31
|
-
"summary" => package["synopsis"],
|
32
|
-
"homepage" => safe_homepage(package["homepage"])
|
33
|
-
})
|
34
|
-
end.compact
|
35
|
-
end
|
36
|
-
|
37
|
-
def safe_homepage(homepage)
|
38
|
-
return unless homepage
|
39
|
-
# use https and remove url fragment
|
40
|
-
homepage.gsub(/http:/, "https:")
|
41
|
-
.gsub(/#[^?]*\z/, "")
|
42
|
-
end
|
43
|
-
|
44
|
-
def packages
|
45
|
-
list_packages_command.lines.map(&:split)
|
46
|
-
end
|
47
|
-
|
48
|
-
def list_packages_command
|
49
|
-
`stack list-dependencies --no-include-base`
|
50
|
-
end
|
51
|
-
|
52
|
-
def package_info(package_id)
|
53
|
-
package_info_command(package_id).lines.each_with_object({}) do |line, info|
|
54
|
-
key, value = line.split(':', 2).map(&:strip)
|
55
|
-
next unless key && value
|
56
|
-
|
57
|
-
info[key] = value
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def package_info_command(package_id)
|
62
|
-
`stack exec -- ghc-pkg field #{package_id} name,version,synopsis,homepage,haddock-html 2>/dev/null`
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|