cookstyle 5.4.13 → 5.5.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/config/cookstyle.yml +231 -129
- data/lib/cookstyle.rb +1 -0
- data/lib/cookstyle/version.rb +1 -1
- data/lib/rubocop/chef/cookbook_helpers.rb +67 -0
- data/lib/rubocop/cop/chef/correctness/block_guard_clause_string_only.rb +34 -31
- data/lib/rubocop/cop/chef/correctness/cb_depends_on_self.rb +16 -14
- data/lib/rubocop/cop/chef/correctness/default_maintainer_metadata.rb +22 -20
- data/lib/rubocop/cop/chef/correctness/insecure_cookbook_url.rb +32 -30
- data/lib/rubocop/cop/chef/correctness/invalid_license_string.rb +454 -453
- data/lib/rubocop/cop/chef/correctness/invalid_platform_metadata.rb +57 -57
- data/lib/rubocop/cop/chef/correctness/metadata_missing_name.rb +18 -16
- data/lib/rubocop/cop/chef/correctness/name_property_and_required.rb +61 -59
- data/lib/rubocop/cop/chef/correctness/node_normal.rb +29 -27
- data/lib/rubocop/cop/chef/correctness/node_normal_unless.rb +29 -27
- data/lib/rubocop/cop/chef/correctness/node_save.rb +46 -0
- data/lib/rubocop/cop/chef/correctness/ohai_default_recipe.rb +47 -0
- data/lib/rubocop/cop/chef/correctness/property_with_default_and_required.rb +35 -33
- data/lib/rubocop/cop/chef/correctness/property_with_name_attribute.rb +29 -27
- data/lib/rubocop/cop/chef/correctness/resource_sets_internal_properties.rb +52 -0
- data/lib/rubocop/cop/chef/correctness/resource_sets_name_property.rb +51 -0
- data/lib/rubocop/cop/chef/correctness/resource_with_none_action.rb +52 -0
- data/lib/rubocop/cop/chef/correctness/service_resource.rb +26 -24
- data/lib/rubocop/cop/chef/correctness/tmp_path.rb +30 -28
- data/lib/rubocop/cop/chef/deprecation/attribute_metadata.rb +22 -21
- data/lib/rubocop/cop/chef/deprecation/chef_rest.rb +56 -0
- data/lib/rubocop/cop/chef/deprecation/chocolatey_package_uninstall_action.rb +58 -0
- data/lib/rubocop/cop/chef/deprecation/conflicts_metadata.rb +18 -16
- data/lib/rubocop/cop/chef/deprecation/depends_compat_resource.rb +21 -19
- data/lib/rubocop/cop/chef/deprecation/depends_partial_search.rb +17 -15
- data/lib/rubocop/cop/chef/deprecation/depends_poise.rb +17 -15
- data/lib/rubocop/cop/chef/deprecation/deprecated_mixins.rb +39 -37
- data/lib/rubocop/cop/chef/deprecation/easy_install.rb +15 -13
- data/lib/rubocop/cop/chef/deprecation/epic_fail.rb +24 -22
- data/lib/rubocop/cop/chef/deprecation/erl_call.rb +15 -13
- data/lib/rubocop/cop/chef/deprecation/launchd_deprecated_hash_property.rb +55 -0
- data/lib/rubocop/cop/chef/deprecation/legacy_yum_cookbook_recipes.rb +24 -22
- data/lib/rubocop/cop/chef/deprecation/locale_lc_all_property.rb +45 -0
- data/lib/rubocop/cop/chef/deprecation/long_description_metadata.rb +21 -19
- data/lib/rubocop/cop/chef/deprecation/node_methods_not_attributes.rb +55 -53
- data/lib/rubocop/cop/chef/deprecation/node_set.rb +27 -25
- data/lib/rubocop/cop/chef/deprecation/node_set_unless.rb +27 -25
- data/lib/rubocop/cop/chef/deprecation/provides_metadata.rb +18 -16
- data/lib/rubocop/cop/chef/deprecation/replaces_metadata.rb +18 -16
- data/lib/rubocop/cop/chef/deprecation/require_recipe.rb +23 -21
- data/lib/rubocop/cop/chef/deprecation/suggests_metadata.rb +18 -16
- data/lib/rubocop/cop/chef/deprecation/use_inline_resources.rb +56 -0
- data/lib/rubocop/cop/chef/deprecation/user_supports_property.rb +53 -0
- data/lib/rubocop/cop/chef/deprecation/xml_ruby_recipe.rb +51 -0
- data/lib/rubocop/cop/chef/deprecation/yum_dnf_compat_recipe.rb +51 -0
- data/lib/rubocop/cop/chef/effortless/data_bags.rb +13 -11
- data/lib/rubocop/cop/chef/effortless/search_used.rb +13 -11
- data/lib/rubocop/cop/chef/modernize/apt_default_recipe.rb +22 -20
- data/lib/rubocop/cop/chef/modernize/berksfile_source.rb +31 -29
- data/lib/rubocop/cop/chef/modernize/build_essential.rb +25 -23
- data/lib/rubocop/cop/chef/modernize/chef_14_resources.rb +27 -25
- data/lib/rubocop/cop/chef/modernize/defines_chefspec_matchers.rb +25 -23
- data/lib/rubocop/cop/chef/modernize/execute_apt_update.rb +19 -17
- data/lib/rubocop/cop/chef/modernize/includes_mixin_shellout.rb +27 -25
- data/lib/rubocop/cop/chef/modernize/libarchive_file.rb +41 -0
- data/lib/rubocop/cop/chef/modernize/minitest_handler_usage.rb +21 -19
- data/lib/rubocop/cop/chef/modernize/powershell_expand_archive.rb +48 -0
- data/lib/rubocop/cop/chef/modernize/powershell_install_package.rb +51 -0
- data/lib/rubocop/cop/chef/modernize/powershell_install_windowsfeature.rb +54 -0
- data/lib/rubocop/cop/chef/modernize/resource_set_or_return.rb +25 -23
- data/lib/rubocop/cop/chef/modernize/resource_with_allowed_actions.rb +77 -0
- data/lib/rubocop/cop/chef/modernize/resource_with_attributes.rb +37 -35
- data/lib/rubocop/cop/chef/modernize/respond_to_metadata.rb +54 -0
- data/lib/rubocop/cop/chef/modernize/respond_to_provides.rb +25 -23
- data/lib/rubocop/cop/chef/modernize/respond_to_resource_name.rb +26 -24
- data/lib/rubocop/cop/chef/{effortless/node_save.rb → modernize/seven_zip_archive.rb} +16 -16
- data/lib/rubocop/cop/chef/modernize/shellouts_to_chocolatey.rb +59 -0
- data/lib/rubocop/cop/chef/modernize/whyrun_supported_true.rb +20 -18
- data/lib/rubocop/cop/chef/modernize/windows_default_recipe.rb +23 -21
- data/lib/rubocop/cop/chef/modernize/windows_version_helper.rb +20 -18
- data/lib/rubocop/cop/chef/modernize/windows_zipfile.rb +15 -13
- data/lib/rubocop/cop/chef/style/attribute_keys.rb +59 -57
- data/lib/rubocop/cop/chef/style/comment_sentence_spacing.rb +14 -12
- data/lib/rubocop/cop/chef/style/comments_copyright_format.rb +65 -63
- data/lib/rubocop/cop/chef/style/comments_format.rb +48 -45
- data/lib/rubocop/cop/chef/style/file_mode.rb +32 -30
- metadata +24 -9
- data/lib/rubocop/cop/chef/deprecation/respond_to_metadata.rb +0 -53
- data/lib/rubocop/cop/chef/modernize/ohai_default_recipe.rb +0 -45
- data/lib/rubocop/cop/chef/modernize/resource_with_allowed_action.rb +0 -75
- data/lib/rubocop/cop/chef/modernize/use_inline_resources.rb +0 -54
- data/lib/rubocop/cop/chef/modernize/xml_ruby_recipe.rb +0 -49
- data/lib/rubocop/cop/chef/modernize/yum_dnf_compat_recipe.rb +0 -49
data/lib/cookstyle.rb
CHANGED
data/lib/cookstyle/version.rb
CHANGED
@@ -0,0 +1,67 @@
|
|
1
|
+
module RuboCop
|
2
|
+
module Chef
|
3
|
+
# Common node helpers used for matching against Chef Infra Cookbooks
|
4
|
+
module CookbookHelpers
|
5
|
+
# Match particular properties within a resource
|
6
|
+
#
|
7
|
+
# @param [String] resource_name The name of the resource to match
|
8
|
+
# @param [String] property_name The name of the property to match (or action)
|
9
|
+
# @param [<Type>] node The rubocop ast node to search
|
10
|
+
#
|
11
|
+
# @yield
|
12
|
+
#
|
13
|
+
def match_property_in_resource?(resource_name, property_name, node)
|
14
|
+
return unless node.block_type? # resources are blocks if they have properties
|
15
|
+
return unless node.children.first.receiver.nil? # resource blocks don't have a receiver
|
16
|
+
return if node.send_node.arguments.first.is_a?(RuboCop::AST::SymbolNode) # resources have a string name. resource actions have symbols
|
17
|
+
|
18
|
+
# bail if the block doesn't have a name a resource *generally* has a name.
|
19
|
+
# This isn't 100% true with things like apt_update and build_essential, but we'll live
|
20
|
+
# with that for now to avoid the false positives of getting stuck in generic blocks in resources
|
21
|
+
return if node.children.first.arguments.empty?
|
22
|
+
|
23
|
+
# bail out if we're not in the resource we care about or nil was passed (all resources)
|
24
|
+
return unless resource_name.nil? || node.children.first.method?(resource_name.to_sym) # see if we're in the right resource
|
25
|
+
|
26
|
+
resource_block = node.children[2] # the 3rd child is the actual block in the resource
|
27
|
+
return unless resource_block # nil would be an empty block
|
28
|
+
if resource_block.begin_type? # if begin_type we need to iterate over the children
|
29
|
+
resource_block.children.each do |resource_blk_child|
|
30
|
+
extract_send_types(resource_blk_child) do |p|
|
31
|
+
yield(p) if p.method_name == property_name.to_sym
|
32
|
+
end
|
33
|
+
end
|
34
|
+
else # there's only a single property to check
|
35
|
+
extract_send_types(resource_block) do |p|
|
36
|
+
yield(p) if p.method_name == property_name.to_sym
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def method_arg_ast_to_string(ast)
|
42
|
+
# a property without a value. This is totally bogus, but they exist
|
43
|
+
return if ast.children[2].nil?
|
44
|
+
# https://rubular.com/r/6uzOMd6WCHewOu
|
45
|
+
m = ast.children[2].source.match(/^("|')(.*)("|')$/)
|
46
|
+
return m[2] unless m.nil?
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def extract_send_types(node)
|
52
|
+
return if node.nil? # there are cases we can be passed an empty node
|
53
|
+
case node.type
|
54
|
+
when :send
|
55
|
+
yield(node) if node.receiver.nil? # if it's not nil then we're not in a property foo we're in bar.foo
|
56
|
+
when :while
|
57
|
+
extract_send_types(node.body) { |t| yield(t) }
|
58
|
+
when :if
|
59
|
+
node.branches.each { |n| extract_send_types(n) { |t| yield(t) } }
|
60
|
+
when :case
|
61
|
+
node.when_branches.each { |n| extract_send_types(n.body) { |t| yield(t) } } # unless node.when_branches.nil?
|
62
|
+
extract_send_types(node.else_branch) { |t| yield(t) } if node.else_branch
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -17,41 +17,44 @@
|
|
17
17
|
module RuboCop
|
18
18
|
module Cop
|
19
19
|
module Chef
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
20
|
+
module ChefCorrectness
|
21
|
+
# A resource guard (not_if/only_if) that is a string should not be wrapped in {}.
|
22
|
+
# Wrapping a guard string in {} causes it be executed as Ruby code which will always returns true instead of a shell command that will actually run.
|
23
|
+
#
|
24
|
+
# @example
|
25
|
+
#
|
26
|
+
# # bad
|
27
|
+
# template '/etc/foo' do
|
28
|
+
# mode '0644'
|
29
|
+
# source 'foo.erb'
|
30
|
+
# only_if { 'test -f /etc/foo' }
|
31
|
+
# end
|
32
|
+
#
|
33
|
+
# # good
|
34
|
+
# template '/etc/foo' do
|
35
|
+
# mode '0644'
|
36
|
+
# source 'foo.erb'
|
37
|
+
# only_if 'test -f /etc/foo'
|
38
|
+
# end
|
39
|
+
#
|
40
|
+
class BlockGuardWithOnlyString < Cop
|
41
|
+
MSG = 'A resource guard (not_if/only_if) that is a string should not be wrapped in {}. Wrapping a guard string in {} causes it be executed as Ruby code which will always returns true instead of a shell command that will actually run.'.freeze
|
40
42
|
|
41
|
-
|
42
|
-
|
43
|
-
|
43
|
+
def_node_matcher :block_guard_with_only_string?, <<-PATTERN
|
44
|
+
(block (send nil? ${:not_if :only_if}) (args) (str $_) )
|
45
|
+
PATTERN
|
44
46
|
|
45
|
-
|
46
|
-
|
47
|
-
|
47
|
+
def on_block(node)
|
48
|
+
block_guard_with_only_string?(node) do
|
49
|
+
add_offense(node, location: :expression, message: MSG, severity: :refactor)
|
50
|
+
end
|
48
51
|
end
|
49
|
-
end
|
50
52
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
53
|
+
def autocorrect(node)
|
54
|
+
lambda do |corrector|
|
55
|
+
new_val = "#{node.method_name} #{node.body.source}"
|
56
|
+
corrector.replace(node.loc.expression, new_val)
|
57
|
+
end
|
55
58
|
end
|
56
59
|
end
|
57
60
|
end
|
@@ -29,26 +29,28 @@ module RuboCop
|
|
29
29
|
# # good
|
30
30
|
# name 'foo'
|
31
31
|
#
|
32
|
-
|
33
|
-
|
32
|
+
module ChefCorrectness
|
33
|
+
class CookbooksDependsOnSelf < Cop
|
34
|
+
MSG = 'A cookbook cannot depend on itself. This will fail on Chef Infra Client 13+'.freeze
|
34
35
|
|
35
|
-
|
36
|
-
|
36
|
+
def_node_search :dependencies, '(send nil? :depends str ...)'
|
37
|
+
def_node_matcher :cb_name?, '(send nil? :name str ...)'
|
37
38
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
39
|
+
def on_send(node)
|
40
|
+
cb_name?(node) do
|
41
|
+
dependencies(processed_source.ast).each do |dep|
|
42
|
+
if dep.arguments == node.arguments
|
43
|
+
node = dep # set our dependency node as the node for autocorrecting later
|
44
|
+
add_offense(node, location: dep.source_range, message: MSG, severity: :refactor)
|
45
|
+
end
|
44
46
|
end
|
45
47
|
end
|
46
48
|
end
|
47
|
-
end
|
48
49
|
|
49
|
-
|
50
|
-
|
51
|
-
|
50
|
+
def autocorrect(node)
|
51
|
+
lambda do |corrector|
|
52
|
+
corrector.remove(node.source_range)
|
53
|
+
end
|
52
54
|
end
|
53
55
|
end
|
54
56
|
end
|
@@ -18,28 +18,30 @@
|
|
18
18
|
module RuboCop
|
19
19
|
module Cop
|
20
20
|
module Chef
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
21
|
+
module ChefCorrectness
|
22
|
+
# Metadata contains default maintainer information from the `chef generate cookbook`
|
23
|
+
# command. This should be updated to reflect that actual maintainer of the cookbook.
|
24
|
+
#
|
25
|
+
# @example
|
26
|
+
#
|
27
|
+
# # bad
|
28
|
+
# maintainer 'YOUR_COMPANY_NAME'
|
29
|
+
# maintainer_email 'YOUR_EMAIL'
|
30
|
+
# maintainer 'The Authors'
|
31
|
+
# maintainer_email 'you@example.com'
|
32
|
+
# # good
|
33
|
+
# maintainer 'Bob Bobberson'
|
34
|
+
# maintainer_email 'bob@bobberson.com'
|
35
|
+
#
|
36
|
+
class DefaultMetadataMaintainer < Cop
|
37
|
+
MSG = 'Metadata contains default maintainer information from the cookbook generator. Add actual cookbook maintainer information to the metadata.rb.'.freeze
|
34
38
|
|
35
|
-
|
36
|
-
MSG = 'Metadata contains default maintainer information from the cookbook generator. Add actual cookbook maintainer information to the metadata.rb.'.freeze
|
39
|
+
def_node_matcher :default_metadata?, '(send nil? {:maintainer :maintainer_email} (str {"YOUR_COMPANY_NAME" "The Authors" "YOUR_EMAIL" "you@example.com"}))'
|
37
40
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
add_offense(node, location: :expression, message: MSG, severity: :refactor)
|
41
|
+
def on_send(node)
|
42
|
+
default_metadata?(node) do
|
43
|
+
add_offense(node, location: :expression, message: MSG, severity: :refactor)
|
44
|
+
end
|
43
45
|
end
|
44
46
|
end
|
45
47
|
end
|
@@ -17,41 +17,43 @@
|
|
17
17
|
module RuboCop
|
18
18
|
module Cop
|
19
19
|
module Chef
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
20
|
+
module ChefCorrectness
|
21
|
+
# Use secure Github and Gitlab URLs for source_url and issues_url
|
22
|
+
#
|
23
|
+
# @example
|
24
|
+
#
|
25
|
+
# # bad
|
26
|
+
# source_url 'http://github.com/something/something'
|
27
|
+
# source_url 'http://www.github.com/something/something'
|
28
|
+
# source_url 'http://www.gitlab.com/something/something'
|
29
|
+
# source_url 'http://gitlab.com/something/something'
|
30
|
+
#
|
31
|
+
# # good
|
32
|
+
# source_url 'http://github.com/something/something'
|
33
|
+
# source_url 'http://gitlab.com/something/something'
|
34
|
+
#
|
35
|
+
class InsecureCookbookURL < Cop
|
36
|
+
MSG = 'Insecure http Github or Gitlab URLs for metadata source_url/issues_url fields'.freeze
|
36
37
|
|
37
|
-
|
38
|
-
|
39
|
-
|
38
|
+
def_node_matcher :insecure_cb_url?, <<-PATTERN
|
39
|
+
(send nil? {:source_url :issues_url} (str #insecure_url?))
|
40
|
+
PATTERN
|
40
41
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
42
|
+
def insecure_url?(url)
|
43
|
+
# https://rubular.com/r/dS6L6bQZvwWxWq
|
44
|
+
url.match?(%r{http://(www.)*git(hub|lab)})
|
45
|
+
end
|
45
46
|
|
46
|
-
|
47
|
-
|
48
|
-
|
47
|
+
def on_send(node)
|
48
|
+
insecure_cb_url?(node) do
|
49
|
+
add_offense(node, location: :expression, message: MSG, severity: :refactor)
|
50
|
+
end
|
49
51
|
end
|
50
|
-
end
|
51
52
|
|
52
|
-
|
53
|
-
|
54
|
-
|
53
|
+
def autocorrect(node)
|
54
|
+
lambda do |corrector|
|
55
|
+
corrector.replace(node.loc.expression, node.source.gsub(%r{http://(www.)*}, 'https://'))
|
56
|
+
end
|
55
57
|
end
|
56
58
|
end
|
57
59
|
end
|
@@ -18,471 +18,472 @@
|
|
18
18
|
module RuboCop
|
19
19
|
module Cop
|
20
20
|
module Chef
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
21
|
+
module ChefCorrectness
|
22
|
+
# metadata.rb license field should include a SPDX compliant string
|
23
|
+
# or "all right reserved" (not case sensitive)
|
24
|
+
#
|
25
|
+
# @example
|
26
|
+
#
|
27
|
+
# # bad
|
28
|
+
# license 'Apache 2.0'
|
29
|
+
#
|
30
|
+
# # good
|
31
|
+
# license 'Apache-2.0'
|
32
|
+
# license 'all rights reserved'
|
33
|
+
#
|
34
|
+
# list of valid SPDX.org license strings. To build an array run this:
|
35
|
+
# require 'json'
|
36
|
+
# require 'net/http'
|
37
|
+
# json_data = JSON.parse(Net::HTTP.get(URI('https://raw.githubusercontent.com/spdx/license-list-data/master/json/licenses.json')))
|
38
|
+
# licenses = json_data['licenses'].map {|l| l['licenseId'] }.sort
|
39
|
+
#
|
40
|
+
class InvalidLicenseString < Cop
|
41
|
+
VALID_LICENSE_STRING = %w(
|
42
|
+
0BSD
|
43
|
+
AAL
|
44
|
+
ADSL
|
45
|
+
AFL-1.1
|
46
|
+
AFL-1.2
|
47
|
+
AFL-2.0
|
48
|
+
AFL-2.1
|
49
|
+
AFL-3.0
|
50
|
+
AGPL-1.0
|
51
|
+
AGPL-1.0-only
|
52
|
+
AGPL-1.0-or-later
|
53
|
+
AGPL-3.0
|
54
|
+
AGPL-3.0-only
|
55
|
+
AGPL-3.0-or-later
|
56
|
+
AMDPLPA
|
57
|
+
AML
|
58
|
+
AMPAS
|
59
|
+
ANTLR-PD
|
60
|
+
APAFML
|
61
|
+
APL-1.0
|
62
|
+
APSL-1.0
|
63
|
+
APSL-1.1
|
64
|
+
APSL-1.2
|
65
|
+
APSL-2.0
|
66
|
+
Abstyles
|
67
|
+
Adobe-2006
|
68
|
+
Adobe-Glyph
|
69
|
+
Afmparse
|
70
|
+
Aladdin
|
71
|
+
Apache-1.0
|
72
|
+
Apache-1.1
|
73
|
+
Apache-2.0
|
74
|
+
Artistic-1.0
|
75
|
+
Artistic-1.0-Perl
|
76
|
+
Artistic-1.0-cl8
|
77
|
+
Artistic-2.0
|
78
|
+
BSD-1-Clause
|
79
|
+
BSD-2-Clause
|
80
|
+
BSD-2-Clause-FreeBSD
|
81
|
+
BSD-2-Clause-NetBSD
|
82
|
+
BSD-2-Clause-Patent
|
83
|
+
BSD-3-Clause
|
84
|
+
BSD-3-Clause-Attribution
|
85
|
+
BSD-3-Clause-Clear
|
86
|
+
BSD-3-Clause-LBNL
|
87
|
+
BSD-3-Clause-No-Nuclear-License
|
88
|
+
BSD-3-Clause-No-Nuclear-License-2014
|
89
|
+
BSD-3-Clause-No-Nuclear-Warranty
|
90
|
+
BSD-3-Clause-Open-MPI
|
91
|
+
BSD-4-Clause
|
92
|
+
BSD-4-Clause-UC
|
93
|
+
BSD-Protection
|
94
|
+
BSD-Source-Code
|
95
|
+
BSL-1.0
|
96
|
+
Bahyph
|
97
|
+
Barr
|
98
|
+
Beerware
|
99
|
+
BitTorrent-1.0
|
100
|
+
BitTorrent-1.1
|
101
|
+
BlueOak-1.0.0
|
102
|
+
Borceux
|
103
|
+
CATOSL-1.1
|
104
|
+
CC-BY-1.0
|
105
|
+
CC-BY-2.0
|
106
|
+
CC-BY-2.5
|
107
|
+
CC-BY-3.0
|
108
|
+
CC-BY-4.0
|
109
|
+
CC-BY-NC-1.0
|
110
|
+
CC-BY-NC-2.0
|
111
|
+
CC-BY-NC-2.5
|
112
|
+
CC-BY-NC-3.0
|
113
|
+
CC-BY-NC-4.0
|
114
|
+
CC-BY-NC-ND-1.0
|
115
|
+
CC-BY-NC-ND-2.0
|
116
|
+
CC-BY-NC-ND-2.5
|
117
|
+
CC-BY-NC-ND-3.0
|
118
|
+
CC-BY-NC-ND-4.0
|
119
|
+
CC-BY-NC-SA-1.0
|
120
|
+
CC-BY-NC-SA-2.0
|
121
|
+
CC-BY-NC-SA-2.5
|
122
|
+
CC-BY-NC-SA-3.0
|
123
|
+
CC-BY-NC-SA-4.0
|
124
|
+
CC-BY-ND-1.0
|
125
|
+
CC-BY-ND-2.0
|
126
|
+
CC-BY-ND-2.5
|
127
|
+
CC-BY-ND-3.0
|
128
|
+
CC-BY-ND-4.0
|
129
|
+
CC-BY-SA-1.0
|
130
|
+
CC-BY-SA-2.0
|
131
|
+
CC-BY-SA-2.5
|
132
|
+
CC-BY-SA-3.0
|
133
|
+
CC-BY-SA-4.0
|
134
|
+
CC-PDDC
|
135
|
+
CC0-1.0
|
136
|
+
CDDL-1.0
|
137
|
+
CDDL-1.1
|
138
|
+
CDLA-Permissive-1.0
|
139
|
+
CDLA-Sharing-1.0
|
140
|
+
CECILL-1.0
|
141
|
+
CECILL-1.1
|
142
|
+
CECILL-2.0
|
143
|
+
CECILL-2.1
|
144
|
+
CECILL-B
|
145
|
+
CECILL-C
|
146
|
+
CERN-OHL-1.1
|
147
|
+
CERN-OHL-1.2
|
148
|
+
CNRI-Jython
|
149
|
+
CNRI-Python
|
150
|
+
CNRI-Python-GPL-Compatible
|
151
|
+
CPAL-1.0
|
152
|
+
CPL-1.0
|
153
|
+
CPOL-1.02
|
154
|
+
CUA-OPL-1.0
|
155
|
+
Caldera
|
156
|
+
ClArtistic
|
157
|
+
Condor-1.1
|
158
|
+
Crossword
|
159
|
+
CrystalStacker
|
160
|
+
Cube
|
161
|
+
D-FSL-1.0
|
162
|
+
DOC
|
163
|
+
DSDP
|
164
|
+
Dotseqn
|
165
|
+
ECL-1.0
|
166
|
+
ECL-2.0
|
167
|
+
EFL-1.0
|
168
|
+
EFL-2.0
|
169
|
+
EPL-1.0
|
170
|
+
EPL-2.0
|
171
|
+
EUDatagrid
|
172
|
+
EUPL-1.0
|
173
|
+
EUPL-1.1
|
174
|
+
EUPL-1.2
|
175
|
+
Entessa
|
176
|
+
ErlPL-1.1
|
177
|
+
Eurosym
|
178
|
+
FSFAP
|
179
|
+
FSFUL
|
180
|
+
FSFULLR
|
181
|
+
FTL
|
182
|
+
Fair
|
183
|
+
Frameworx-1.0
|
184
|
+
FreeImage
|
185
|
+
GFDL-1.1
|
186
|
+
GFDL-1.1-only
|
187
|
+
GFDL-1.1-or-later
|
188
|
+
GFDL-1.2
|
189
|
+
GFDL-1.2-only
|
190
|
+
GFDL-1.2-or-later
|
191
|
+
GFDL-1.3
|
192
|
+
GFDL-1.3-only
|
193
|
+
GFDL-1.3-or-later
|
194
|
+
GL2PS
|
195
|
+
GPL-1.0
|
196
|
+
GPL-1.0+
|
197
|
+
GPL-1.0-only
|
198
|
+
GPL-1.0-or-later
|
199
|
+
GPL-2.0
|
200
|
+
GPL-2.0+
|
201
|
+
GPL-2.0-only
|
202
|
+
GPL-2.0-or-later
|
203
|
+
GPL-2.0-with-GCC-exception
|
204
|
+
GPL-2.0-with-autoconf-exception
|
205
|
+
GPL-2.0-with-bison-exception
|
206
|
+
GPL-2.0-with-classpath-exception
|
207
|
+
GPL-2.0-with-font-exception
|
208
|
+
GPL-3.0
|
209
|
+
GPL-3.0+
|
210
|
+
GPL-3.0-only
|
211
|
+
GPL-3.0-or-later
|
212
|
+
GPL-3.0-with-GCC-exception
|
213
|
+
GPL-3.0-with-autoconf-exception
|
214
|
+
Giftware
|
215
|
+
Glide
|
216
|
+
Glulxe
|
217
|
+
HPND
|
218
|
+
HPND-sell-variant
|
219
|
+
HaskellReport
|
220
|
+
IBM-pibs
|
221
|
+
ICU
|
222
|
+
IJG
|
223
|
+
IPA
|
224
|
+
IPL-1.0
|
225
|
+
ISC
|
226
|
+
ImageMagick
|
227
|
+
Imlib2
|
228
|
+
Info-ZIP
|
229
|
+
Intel
|
230
|
+
Intel-ACPI
|
231
|
+
Interbase-1.0
|
232
|
+
JPNIC
|
233
|
+
JSON
|
234
|
+
JasPer-2.0
|
235
|
+
LAL-1.2
|
236
|
+
LAL-1.3
|
237
|
+
LGPL-2.0
|
238
|
+
LGPL-2.0+
|
239
|
+
LGPL-2.0-only
|
240
|
+
LGPL-2.0-or-later
|
241
|
+
LGPL-2.1
|
242
|
+
LGPL-2.1+
|
243
|
+
LGPL-2.1-only
|
244
|
+
LGPL-2.1-or-later
|
245
|
+
LGPL-3.0
|
246
|
+
LGPL-3.0+
|
247
|
+
LGPL-3.0-only
|
248
|
+
LGPL-3.0-or-later
|
249
|
+
LGPLLR
|
250
|
+
LPL-1.0
|
251
|
+
LPL-1.02
|
252
|
+
LPPL-1.0
|
253
|
+
LPPL-1.1
|
254
|
+
LPPL-1.2
|
255
|
+
LPPL-1.3a
|
256
|
+
LPPL-1.3c
|
257
|
+
Latex2e
|
258
|
+
Leptonica
|
259
|
+
LiLiQ-P-1.1
|
260
|
+
LiLiQ-R-1.1
|
261
|
+
LiLiQ-Rplus-1.1
|
262
|
+
Libpng
|
263
|
+
Linux-OpenIB
|
264
|
+
MIT
|
265
|
+
MIT-0
|
266
|
+
MIT-CMU
|
267
|
+
MIT-advertising
|
268
|
+
MIT-enna
|
269
|
+
MIT-feh
|
270
|
+
MITNFA
|
271
|
+
MPL-1.0
|
272
|
+
MPL-1.1
|
273
|
+
MPL-2.0
|
274
|
+
MPL-2.0-no-copyleft-exception
|
275
|
+
MS-PL
|
276
|
+
MS-RL
|
277
|
+
MTLL
|
278
|
+
MakeIndex
|
279
|
+
MirOS
|
280
|
+
Motosoto
|
281
|
+
Multics
|
282
|
+
Mup
|
283
|
+
NASA-1.3
|
284
|
+
NBPL-1.0
|
285
|
+
NCSA
|
286
|
+
NGPL
|
287
|
+
NLOD-1.0
|
288
|
+
NLPL
|
289
|
+
NOSL
|
290
|
+
NPL-1.0
|
291
|
+
NPL-1.1
|
292
|
+
NPOSL-3.0
|
293
|
+
NRL
|
294
|
+
NTP
|
295
|
+
Naumen
|
296
|
+
Net-SNMP
|
297
|
+
NetCDF
|
298
|
+
Newsletr
|
299
|
+
Nokia
|
300
|
+
Noweb
|
301
|
+
Nunit
|
302
|
+
OCCT-PL
|
303
|
+
OCLC-2.0
|
304
|
+
ODC-By-1.0
|
305
|
+
ODbL-1.0
|
306
|
+
OFL-1.0
|
307
|
+
OFL-1.1
|
308
|
+
OGL-UK-1.0
|
309
|
+
OGL-UK-2.0
|
310
|
+
OGL-UK-3.0
|
311
|
+
OGTSL
|
312
|
+
OLDAP-1.1
|
313
|
+
OLDAP-1.2
|
314
|
+
OLDAP-1.3
|
315
|
+
OLDAP-1.4
|
316
|
+
OLDAP-2.0
|
317
|
+
OLDAP-2.0.1
|
318
|
+
OLDAP-2.1
|
319
|
+
OLDAP-2.2
|
320
|
+
OLDAP-2.2.1
|
321
|
+
OLDAP-2.2.2
|
322
|
+
OLDAP-2.3
|
323
|
+
OLDAP-2.4
|
324
|
+
OLDAP-2.5
|
325
|
+
OLDAP-2.6
|
326
|
+
OLDAP-2.7
|
327
|
+
OLDAP-2.8
|
328
|
+
OML
|
329
|
+
OPL-1.0
|
330
|
+
OSET-PL-2.1
|
331
|
+
OSL-1.0
|
332
|
+
OSL-1.1
|
333
|
+
OSL-2.0
|
334
|
+
OSL-2.1
|
335
|
+
OSL-3.0
|
336
|
+
OpenSSL
|
337
|
+
PDDL-1.0
|
338
|
+
PHP-3.0
|
339
|
+
PHP-3.01
|
340
|
+
Parity-6.0.0
|
341
|
+
Plexus
|
342
|
+
PostgreSQL
|
343
|
+
Python-2.0
|
344
|
+
QPL-1.0
|
345
|
+
Qhull
|
346
|
+
RHeCos-1.1
|
347
|
+
RPL-1.1
|
348
|
+
RPL-1.5
|
349
|
+
RPSL-1.0
|
350
|
+
RSA-MD
|
351
|
+
RSCPL
|
352
|
+
Rdisc
|
353
|
+
Ruby
|
354
|
+
SAX-PD
|
355
|
+
SCEA
|
356
|
+
SGI-B-1.0
|
357
|
+
SGI-B-1.1
|
358
|
+
SGI-B-2.0
|
359
|
+
SHL-0.5
|
360
|
+
SHL-0.51
|
361
|
+
SISSL
|
362
|
+
SISSL-1.2
|
363
|
+
SMLNJ
|
364
|
+
SMPPL
|
365
|
+
SNIA
|
366
|
+
SPL-1.0
|
367
|
+
SSPL-1.0
|
368
|
+
SWL
|
369
|
+
Saxpath
|
370
|
+
Sendmail
|
371
|
+
Sendmail-8.23
|
372
|
+
SimPL-2.0
|
373
|
+
Sleepycat
|
374
|
+
Spencer-86
|
375
|
+
Spencer-94
|
376
|
+
Spencer-99
|
377
|
+
StandardML-NJ
|
378
|
+
SugarCRM-1.1.3
|
379
|
+
TAPR-OHL-1.0
|
380
|
+
TCL
|
381
|
+
TCP-wrappers
|
382
|
+
TMate
|
383
|
+
TORQUE-1.1
|
384
|
+
TOSL
|
385
|
+
TU-Berlin-1.0
|
386
|
+
TU-Berlin-2.0
|
387
|
+
UPL-1.0
|
388
|
+
Unicode-DFS-2015
|
389
|
+
Unicode-DFS-2016
|
390
|
+
Unicode-TOU
|
391
|
+
Unlicense
|
392
|
+
VOSTROM
|
393
|
+
VSL-1.0
|
394
|
+
Vim
|
395
|
+
W3C
|
396
|
+
W3C-19980720
|
397
|
+
W3C-20150513
|
398
|
+
WTFPL
|
399
|
+
Watcom-1.0
|
400
|
+
Wsuipa
|
401
|
+
X11
|
402
|
+
XFree86-1.1
|
403
|
+
XSkat
|
404
|
+
Xerox
|
405
|
+
Xnet
|
406
|
+
YPL-1.0
|
407
|
+
YPL-1.1
|
408
|
+
ZPL-1.1
|
409
|
+
ZPL-2.0
|
410
|
+
ZPL-2.1
|
411
|
+
Zed
|
412
|
+
Zend-2.0
|
413
|
+
Zimbra-1.3
|
414
|
+
Zimbra-1.4
|
415
|
+
Zlib
|
416
|
+
blessing
|
417
|
+
bzip2-1.0.5
|
418
|
+
bzip2-1.0.6
|
419
|
+
copyleft-next-0.3.0
|
420
|
+
copyleft-next-0.3.1
|
421
|
+
curl
|
422
|
+
diffmark
|
423
|
+
dvipdfm
|
424
|
+
eCos-2.0
|
425
|
+
eGenix
|
426
|
+
gSOAP-1.3b
|
427
|
+
gnuplot
|
428
|
+
iMatix
|
429
|
+
libpng-2.0
|
430
|
+
libtiff
|
431
|
+
mpich2
|
432
|
+
psfrag
|
433
|
+
psutils
|
434
|
+
wxWindows
|
435
|
+
xinetd
|
436
|
+
xpp
|
437
|
+
zlib-acknowledgement
|
438
|
+
).freeze
|
39
439
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
AGPL-3.0-or-later
|
56
|
-
AMDPLPA
|
57
|
-
AML
|
58
|
-
AMPAS
|
59
|
-
ANTLR-PD
|
60
|
-
APAFML
|
61
|
-
APL-1.0
|
62
|
-
APSL-1.0
|
63
|
-
APSL-1.1
|
64
|
-
APSL-1.2
|
65
|
-
APSL-2.0
|
66
|
-
Abstyles
|
67
|
-
Adobe-2006
|
68
|
-
Adobe-Glyph
|
69
|
-
Afmparse
|
70
|
-
Aladdin
|
71
|
-
Apache-1.0
|
72
|
-
Apache-1.1
|
73
|
-
Apache-2.0
|
74
|
-
Artistic-1.0
|
75
|
-
Artistic-1.0-Perl
|
76
|
-
Artistic-1.0-cl8
|
77
|
-
Artistic-2.0
|
78
|
-
BSD-1-Clause
|
79
|
-
BSD-2-Clause
|
80
|
-
BSD-2-Clause-FreeBSD
|
81
|
-
BSD-2-Clause-NetBSD
|
82
|
-
BSD-2-Clause-Patent
|
83
|
-
BSD-3-Clause
|
84
|
-
BSD-3-Clause-Attribution
|
85
|
-
BSD-3-Clause-Clear
|
86
|
-
BSD-3-Clause-LBNL
|
87
|
-
BSD-3-Clause-No-Nuclear-License
|
88
|
-
BSD-3-Clause-No-Nuclear-License-2014
|
89
|
-
BSD-3-Clause-No-Nuclear-Warranty
|
90
|
-
BSD-3-Clause-Open-MPI
|
91
|
-
BSD-4-Clause
|
92
|
-
BSD-4-Clause-UC
|
93
|
-
BSD-Protection
|
94
|
-
BSD-Source-Code
|
95
|
-
BSL-1.0
|
96
|
-
Bahyph
|
97
|
-
Barr
|
98
|
-
Beerware
|
99
|
-
BitTorrent-1.0
|
100
|
-
BitTorrent-1.1
|
101
|
-
BlueOak-1.0.0
|
102
|
-
Borceux
|
103
|
-
CATOSL-1.1
|
104
|
-
CC-BY-1.0
|
105
|
-
CC-BY-2.0
|
106
|
-
CC-BY-2.5
|
107
|
-
CC-BY-3.0
|
108
|
-
CC-BY-4.0
|
109
|
-
CC-BY-NC-1.0
|
110
|
-
CC-BY-NC-2.0
|
111
|
-
CC-BY-NC-2.5
|
112
|
-
CC-BY-NC-3.0
|
113
|
-
CC-BY-NC-4.0
|
114
|
-
CC-BY-NC-ND-1.0
|
115
|
-
CC-BY-NC-ND-2.0
|
116
|
-
CC-BY-NC-ND-2.5
|
117
|
-
CC-BY-NC-ND-3.0
|
118
|
-
CC-BY-NC-ND-4.0
|
119
|
-
CC-BY-NC-SA-1.0
|
120
|
-
CC-BY-NC-SA-2.0
|
121
|
-
CC-BY-NC-SA-2.5
|
122
|
-
CC-BY-NC-SA-3.0
|
123
|
-
CC-BY-NC-SA-4.0
|
124
|
-
CC-BY-ND-1.0
|
125
|
-
CC-BY-ND-2.0
|
126
|
-
CC-BY-ND-2.5
|
127
|
-
CC-BY-ND-3.0
|
128
|
-
CC-BY-ND-4.0
|
129
|
-
CC-BY-SA-1.0
|
130
|
-
CC-BY-SA-2.0
|
131
|
-
CC-BY-SA-2.5
|
132
|
-
CC-BY-SA-3.0
|
133
|
-
CC-BY-SA-4.0
|
134
|
-
CC-PDDC
|
135
|
-
CC0-1.0
|
136
|
-
CDDL-1.0
|
137
|
-
CDDL-1.1
|
138
|
-
CDLA-Permissive-1.0
|
139
|
-
CDLA-Sharing-1.0
|
140
|
-
CECILL-1.0
|
141
|
-
CECILL-1.1
|
142
|
-
CECILL-2.0
|
143
|
-
CECILL-2.1
|
144
|
-
CECILL-B
|
145
|
-
CECILL-C
|
146
|
-
CERN-OHL-1.1
|
147
|
-
CERN-OHL-1.2
|
148
|
-
CNRI-Jython
|
149
|
-
CNRI-Python
|
150
|
-
CNRI-Python-GPL-Compatible
|
151
|
-
CPAL-1.0
|
152
|
-
CPL-1.0
|
153
|
-
CPOL-1.02
|
154
|
-
CUA-OPL-1.0
|
155
|
-
Caldera
|
156
|
-
ClArtistic
|
157
|
-
Condor-1.1
|
158
|
-
Crossword
|
159
|
-
CrystalStacker
|
160
|
-
Cube
|
161
|
-
D-FSL-1.0
|
162
|
-
DOC
|
163
|
-
DSDP
|
164
|
-
Dotseqn
|
165
|
-
ECL-1.0
|
166
|
-
ECL-2.0
|
167
|
-
EFL-1.0
|
168
|
-
EFL-2.0
|
169
|
-
EPL-1.0
|
170
|
-
EPL-2.0
|
171
|
-
EUDatagrid
|
172
|
-
EUPL-1.0
|
173
|
-
EUPL-1.1
|
174
|
-
EUPL-1.2
|
175
|
-
Entessa
|
176
|
-
ErlPL-1.1
|
177
|
-
Eurosym
|
178
|
-
FSFAP
|
179
|
-
FSFUL
|
180
|
-
FSFULLR
|
181
|
-
FTL
|
182
|
-
Fair
|
183
|
-
Frameworx-1.0
|
184
|
-
FreeImage
|
185
|
-
GFDL-1.1
|
186
|
-
GFDL-1.1-only
|
187
|
-
GFDL-1.1-or-later
|
188
|
-
GFDL-1.2
|
189
|
-
GFDL-1.2-only
|
190
|
-
GFDL-1.2-or-later
|
191
|
-
GFDL-1.3
|
192
|
-
GFDL-1.3-only
|
193
|
-
GFDL-1.3-or-later
|
194
|
-
GL2PS
|
195
|
-
GPL-1.0
|
196
|
-
GPL-1.0+
|
197
|
-
GPL-1.0-only
|
198
|
-
GPL-1.0-or-later
|
199
|
-
GPL-2.0
|
200
|
-
GPL-2.0+
|
201
|
-
GPL-2.0-only
|
202
|
-
GPL-2.0-or-later
|
203
|
-
GPL-2.0-with-GCC-exception
|
204
|
-
GPL-2.0-with-autoconf-exception
|
205
|
-
GPL-2.0-with-bison-exception
|
206
|
-
GPL-2.0-with-classpath-exception
|
207
|
-
GPL-2.0-with-font-exception
|
208
|
-
GPL-3.0
|
209
|
-
GPL-3.0+
|
210
|
-
GPL-3.0-only
|
211
|
-
GPL-3.0-or-later
|
212
|
-
GPL-3.0-with-GCC-exception
|
213
|
-
GPL-3.0-with-autoconf-exception
|
214
|
-
Giftware
|
215
|
-
Glide
|
216
|
-
Glulxe
|
217
|
-
HPND
|
218
|
-
HPND-sell-variant
|
219
|
-
HaskellReport
|
220
|
-
IBM-pibs
|
221
|
-
ICU
|
222
|
-
IJG
|
223
|
-
IPA
|
224
|
-
IPL-1.0
|
225
|
-
ISC
|
226
|
-
ImageMagick
|
227
|
-
Imlib2
|
228
|
-
Info-ZIP
|
229
|
-
Intel
|
230
|
-
Intel-ACPI
|
231
|
-
Interbase-1.0
|
232
|
-
JPNIC
|
233
|
-
JSON
|
234
|
-
JasPer-2.0
|
235
|
-
LAL-1.2
|
236
|
-
LAL-1.3
|
237
|
-
LGPL-2.0
|
238
|
-
LGPL-2.0+
|
239
|
-
LGPL-2.0-only
|
240
|
-
LGPL-2.0-or-later
|
241
|
-
LGPL-2.1
|
242
|
-
LGPL-2.1+
|
243
|
-
LGPL-2.1-only
|
244
|
-
LGPL-2.1-or-later
|
245
|
-
LGPL-3.0
|
246
|
-
LGPL-3.0+
|
247
|
-
LGPL-3.0-only
|
248
|
-
LGPL-3.0-or-later
|
249
|
-
LGPLLR
|
250
|
-
LPL-1.0
|
251
|
-
LPL-1.02
|
252
|
-
LPPL-1.0
|
253
|
-
LPPL-1.1
|
254
|
-
LPPL-1.2
|
255
|
-
LPPL-1.3a
|
256
|
-
LPPL-1.3c
|
257
|
-
Latex2e
|
258
|
-
Leptonica
|
259
|
-
LiLiQ-P-1.1
|
260
|
-
LiLiQ-R-1.1
|
261
|
-
LiLiQ-Rplus-1.1
|
262
|
-
Libpng
|
263
|
-
Linux-OpenIB
|
264
|
-
MIT
|
265
|
-
MIT-0
|
266
|
-
MIT-CMU
|
267
|
-
MIT-advertising
|
268
|
-
MIT-enna
|
269
|
-
MIT-feh
|
270
|
-
MITNFA
|
271
|
-
MPL-1.0
|
272
|
-
MPL-1.1
|
273
|
-
MPL-2.0
|
274
|
-
MPL-2.0-no-copyleft-exception
|
275
|
-
MS-PL
|
276
|
-
MS-RL
|
277
|
-
MTLL
|
278
|
-
MakeIndex
|
279
|
-
MirOS
|
280
|
-
Motosoto
|
281
|
-
Multics
|
282
|
-
Mup
|
283
|
-
NASA-1.3
|
284
|
-
NBPL-1.0
|
285
|
-
NCSA
|
286
|
-
NGPL
|
287
|
-
NLOD-1.0
|
288
|
-
NLPL
|
289
|
-
NOSL
|
290
|
-
NPL-1.0
|
291
|
-
NPL-1.1
|
292
|
-
NPOSL-3.0
|
293
|
-
NRL
|
294
|
-
NTP
|
295
|
-
Naumen
|
296
|
-
Net-SNMP
|
297
|
-
NetCDF
|
298
|
-
Newsletr
|
299
|
-
Nokia
|
300
|
-
Noweb
|
301
|
-
Nunit
|
302
|
-
OCCT-PL
|
303
|
-
OCLC-2.0
|
304
|
-
ODC-By-1.0
|
305
|
-
ODbL-1.0
|
306
|
-
OFL-1.0
|
307
|
-
OFL-1.1
|
308
|
-
OGL-UK-1.0
|
309
|
-
OGL-UK-2.0
|
310
|
-
OGL-UK-3.0
|
311
|
-
OGTSL
|
312
|
-
OLDAP-1.1
|
313
|
-
OLDAP-1.2
|
314
|
-
OLDAP-1.3
|
315
|
-
OLDAP-1.4
|
316
|
-
OLDAP-2.0
|
317
|
-
OLDAP-2.0.1
|
318
|
-
OLDAP-2.1
|
319
|
-
OLDAP-2.2
|
320
|
-
OLDAP-2.2.1
|
321
|
-
OLDAP-2.2.2
|
322
|
-
OLDAP-2.3
|
323
|
-
OLDAP-2.4
|
324
|
-
OLDAP-2.5
|
325
|
-
OLDAP-2.6
|
326
|
-
OLDAP-2.7
|
327
|
-
OLDAP-2.8
|
328
|
-
OML
|
329
|
-
OPL-1.0
|
330
|
-
OSET-PL-2.1
|
331
|
-
OSL-1.0
|
332
|
-
OSL-1.1
|
333
|
-
OSL-2.0
|
334
|
-
OSL-2.1
|
335
|
-
OSL-3.0
|
336
|
-
OpenSSL
|
337
|
-
PDDL-1.0
|
338
|
-
PHP-3.0
|
339
|
-
PHP-3.01
|
340
|
-
Parity-6.0.0
|
341
|
-
Plexus
|
342
|
-
PostgreSQL
|
343
|
-
Python-2.0
|
344
|
-
QPL-1.0
|
345
|
-
Qhull
|
346
|
-
RHeCos-1.1
|
347
|
-
RPL-1.1
|
348
|
-
RPL-1.5
|
349
|
-
RPSL-1.0
|
350
|
-
RSA-MD
|
351
|
-
RSCPL
|
352
|
-
Rdisc
|
353
|
-
Ruby
|
354
|
-
SAX-PD
|
355
|
-
SCEA
|
356
|
-
SGI-B-1.0
|
357
|
-
SGI-B-1.1
|
358
|
-
SGI-B-2.0
|
359
|
-
SHL-0.5
|
360
|
-
SHL-0.51
|
361
|
-
SISSL
|
362
|
-
SISSL-1.2
|
363
|
-
SMLNJ
|
364
|
-
SMPPL
|
365
|
-
SNIA
|
366
|
-
SPL-1.0
|
367
|
-
SSPL-1.0
|
368
|
-
SWL
|
369
|
-
Saxpath
|
370
|
-
Sendmail
|
371
|
-
Sendmail-8.23
|
372
|
-
SimPL-2.0
|
373
|
-
Sleepycat
|
374
|
-
Spencer-86
|
375
|
-
Spencer-94
|
376
|
-
Spencer-99
|
377
|
-
StandardML-NJ
|
378
|
-
SugarCRM-1.1.3
|
379
|
-
TAPR-OHL-1.0
|
380
|
-
TCL
|
381
|
-
TCP-wrappers
|
382
|
-
TMate
|
383
|
-
TORQUE-1.1
|
384
|
-
TOSL
|
385
|
-
TU-Berlin-1.0
|
386
|
-
TU-Berlin-2.0
|
387
|
-
UPL-1.0
|
388
|
-
Unicode-DFS-2015
|
389
|
-
Unicode-DFS-2016
|
390
|
-
Unicode-TOU
|
391
|
-
Unlicense
|
392
|
-
VOSTROM
|
393
|
-
VSL-1.0
|
394
|
-
Vim
|
395
|
-
W3C
|
396
|
-
W3C-19980720
|
397
|
-
W3C-20150513
|
398
|
-
WTFPL
|
399
|
-
Watcom-1.0
|
400
|
-
Wsuipa
|
401
|
-
X11
|
402
|
-
XFree86-1.1
|
403
|
-
XSkat
|
404
|
-
Xerox
|
405
|
-
Xnet
|
406
|
-
YPL-1.0
|
407
|
-
YPL-1.1
|
408
|
-
ZPL-1.1
|
409
|
-
ZPL-2.0
|
410
|
-
ZPL-2.1
|
411
|
-
Zed
|
412
|
-
Zend-2.0
|
413
|
-
Zimbra-1.3
|
414
|
-
Zimbra-1.4
|
415
|
-
Zlib
|
416
|
-
blessing
|
417
|
-
bzip2-1.0.5
|
418
|
-
bzip2-1.0.6
|
419
|
-
copyleft-next-0.3.0
|
420
|
-
copyleft-next-0.3.1
|
421
|
-
curl
|
422
|
-
diffmark
|
423
|
-
dvipdfm
|
424
|
-
eCos-2.0
|
425
|
-
eGenix
|
426
|
-
gSOAP-1.3b
|
427
|
-
gnuplot
|
428
|
-
iMatix
|
429
|
-
libpng-2.0
|
430
|
-
libtiff
|
431
|
-
mpich2
|
432
|
-
psfrag
|
433
|
-
psutils
|
434
|
-
wxWindows
|
435
|
-
xinetd
|
436
|
-
xpp
|
437
|
-
zlib-acknowledgement
|
438
|
-
).freeze
|
440
|
+
COMMON_TYPOS = {
|
441
|
+
"all_rights": 'all rights reserved',
|
442
|
+
"apache 2.0": 'Apache-2.0',
|
443
|
+
"apache v2.0": 'Apache-2.0',
|
444
|
+
"apache license version 2.0": 'Apache-2.0',
|
445
|
+
"apache2": 'Apache-2.0',
|
446
|
+
"mit": 'MIT',
|
447
|
+
'3-clause bsd': 'BSD-3-Clause',
|
448
|
+
'gnu public license 3.0': 'GPL-3.0',
|
449
|
+
'gpl v2': 'GPL-2.0',
|
450
|
+
'gpl v3': 'GPL-3.0',
|
451
|
+
'gplv2': 'GPL-2.0',
|
452
|
+
'gplv3': 'GPL-3.0',
|
453
|
+
'mit license': 'MIT',
|
454
|
+
}.freeze
|
439
455
|
|
440
|
-
|
441
|
-
"all_rights": 'all rights reserved',
|
442
|
-
"apache 2.0": 'Apache-2.0',
|
443
|
-
"apache v2.0": 'Apache-2.0',
|
444
|
-
"apache license version 2.0": 'Apache-2.0',
|
445
|
-
"apache2": 'Apache-2.0',
|
446
|
-
"mit": 'MIT',
|
447
|
-
'3-clause bsd': 'BSD-3-Clause',
|
448
|
-
'gnu public license 3.0': 'GPL-3.0',
|
449
|
-
'gpl v2': 'GPL-2.0',
|
450
|
-
'gpl v3': 'GPL-3.0',
|
451
|
-
'gplv2': 'GPL-2.0',
|
452
|
-
'gplv3': 'GPL-3.0',
|
453
|
-
'mit license': 'MIT',
|
454
|
-
}.freeze
|
456
|
+
MSG = 'Cookbook metadata.rb does not use a SPDX compliant license string or "all rights reserved". See https://spdx.org/licenses/ for a complete list of license identifiers.'.freeze
|
455
457
|
|
456
|
-
|
458
|
+
def_node_matcher :license?, '(send nil? :license $str ...)'
|
457
459
|
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
add_offense(license, location: :expression, message: MSG, severity: :refactor)
|
460
|
+
def on_send(node)
|
461
|
+
license?(node) do |license|
|
462
|
+
unless valid_license?(license.str_content)
|
463
|
+
add_offense(license, location: :expression, message: MSG, severity: :refactor)
|
464
|
+
end
|
464
465
|
end
|
465
466
|
end
|
466
|
-
end
|
467
467
|
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
468
|
+
def autocorrect(node)
|
469
|
+
correct_string = autocorrect_license_string(node.str_content)
|
470
|
+
if correct_string
|
471
|
+
lambda do |corrector|
|
472
|
+
corrector.replace(node.loc.expression, "'#{correct_string}'")
|
473
|
+
end
|
473
474
|
end
|
474
475
|
end
|
475
|
-
end
|
476
476
|
|
477
|
-
|
477
|
+
# private
|
478
478
|
|
479
|
-
|
480
|
-
|
481
|
-
|
479
|
+
def autocorrect_license_string(bad_string)
|
480
|
+
COMMON_TYPOS[bad_string.delete(',').downcase.to_sym]
|
481
|
+
end
|
482
482
|
|
483
|
-
|
484
|
-
|
485
|
-
|
483
|
+
def valid_license?(license)
|
484
|
+
VALID_LICENSE_STRING.include?(license) ||
|
485
|
+
license.downcase == 'all rights reserved'
|
486
|
+
end
|
486
487
|
end
|
487
488
|
end
|
488
489
|
end
|