utils/spdx: fix invalid SPDX syntax for symbols
Also use more common uppercase operators for backwards compatibility
This commit is contained in:
parent
0c3104a8f2
commit
82fbbcc88b
@ -175,20 +175,20 @@ RSpec.describe SPDX do
|
|||||||
end
|
end
|
||||||
|
|
||||||
it "returns multiple licenses with :any" do
|
it "returns multiple licenses with :any" do
|
||||||
expect(described_class.license_expression_to_string({ any_of: ["MIT", "0BSD"] })).to eq "MIT or 0BSD"
|
expect(described_class.license_expression_to_string({ any_of: ["MIT", "0BSD"] })).to eq "MIT OR 0BSD"
|
||||||
end
|
end
|
||||||
|
|
||||||
it "returns multiple licenses with :all" do
|
it "returns multiple licenses with :all" do
|
||||||
expect(described_class.license_expression_to_string({ all_of: ["MIT", "0BSD"] })).to eq "MIT and 0BSD"
|
expect(described_class.license_expression_to_string({ all_of: ["MIT", "0BSD"] })).to eq "MIT AND 0BSD"
|
||||||
end
|
end
|
||||||
|
|
||||||
it "returns multiple licenses with plus" do
|
it "returns multiple licenses with plus" do
|
||||||
expect(described_class.license_expression_to_string({ any_of: ["MIT", "EPL-1.0+"] })).to eq "MIT or EPL-1.0+"
|
expect(described_class.license_expression_to_string({ any_of: ["MIT", "EPL-1.0+"] })).to eq "MIT OR EPL-1.0+"
|
||||||
end
|
end
|
||||||
|
|
||||||
it "returns license and exception" do
|
it "returns license and exception" do
|
||||||
license_expression = { "MIT" => { with: "LLVM-exception" } }
|
license_expression = { "MIT" => { with: "LLVM-exception" } }
|
||||||
expect(described_class.license_expression_to_string(license_expression)).to eq "MIT with LLVM-exception"
|
expect(described_class.license_expression_to_string(license_expression)).to eq "MIT WITH LLVM-exception"
|
||||||
end
|
end
|
||||||
|
|
||||||
it "returns licenses and exceptions for complex license expressions" do
|
it "returns licenses and exceptions for complex license expressions" do
|
||||||
@ -198,16 +198,17 @@ RSpec.describe SPDX do
|
|||||||
all_of: ["0BSD", "Zlib"], # rubocop:disable Style/HashAsLastArrayItem
|
all_of: ["0BSD", "Zlib"], # rubocop:disable Style/HashAsLastArrayItem
|
||||||
"curl" => { with: "LLVM-exception" },
|
"curl" => { with: "LLVM-exception" },
|
||||||
] }
|
] }
|
||||||
result = "MIT or Public Domain or (0BSD and Zlib) or (curl with LLVM-exception)"
|
result = "MIT OR LicenseRef-Homebrew-public-domain OR (0BSD AND Zlib) OR (curl WITH LLVM-exception)"
|
||||||
expect(described_class.license_expression_to_string(license_expression)).to eq result
|
expect(described_class.license_expression_to_string(license_expression)).to eq result
|
||||||
end
|
end
|
||||||
|
|
||||||
it "returns :public_domain" do
|
it "returns :public_domain" do
|
||||||
expect(described_class.license_expression_to_string(:public_domain)).to eq "Public Domain"
|
expect(described_class.license_expression_to_string(:public_domain)).to eq "LicenseRef-Homebrew-public-domain"
|
||||||
end
|
end
|
||||||
|
|
||||||
it "returns :cannot_represent" do
|
it "returns :cannot_represent" do
|
||||||
expect(described_class.license_expression_to_string(:cannot_represent)).to eq "Cannot Represent"
|
result = "LicenseRef-Homebrew-cannot-represent"
|
||||||
|
expect(described_class.license_expression_to_string(:cannot_represent)).to eq result
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -223,9 +224,20 @@ RSpec.describe SPDX do
|
|||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "returns the correct result for 'AND', 'OR' and 'WITH'" do
|
||||||
|
expr_string = "Apache-2.0 AND (Apache-2.0 WITH LLVM-exception) AND (MIT OR NCSA)"
|
||||||
|
expect(described_class.string_to_license_expression(expr_string)).to eq({
|
||||||
|
all_of: [
|
||||||
|
"Apache-2.0",
|
||||||
|
{ "Apache-2.0" => { with: "LLVM-exception" } },
|
||||||
|
{ any_of: ["MIT", "NCSA"] },
|
||||||
|
],
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
# rubocop:disable Style/HashAsLastArrayItem
|
# rubocop:disable Style/HashAsLastArrayItem
|
||||||
it "handles nested brackets" do
|
it "handles nested brackets" do
|
||||||
expect(described_class.string_to_license_expression("A and (B or (C and D))")).to eq({
|
expect(described_class.string_to_license_expression("A AND (B OR (C AND D))")).to eq({
|
||||||
all_of: [
|
all_of: [
|
||||||
"A",
|
"A",
|
||||||
any_of: [
|
any_of: [
|
||||||
@ -236,6 +248,15 @@ RSpec.describe SPDX do
|
|||||||
})
|
})
|
||||||
end
|
end
|
||||||
# rubocop:enable Style/HashAsLastArrayItem
|
# rubocop:enable Style/HashAsLastArrayItem
|
||||||
|
|
||||||
|
it "returns :public_domain" do
|
||||||
|
expect(described_class.string_to_license_expression("LicenseRef-Homebrew-public-domain")).to eq :public_domain
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns :cannot_represent" do
|
||||||
|
expr_string = "LicenseRef-Homebrew-cannot-represent"
|
||||||
|
expect(described_class.string_to_license_expression(expr_string)).to eq :cannot_represent
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe ".license_version_info" do
|
describe ".license_version_info" do
|
||||||
|
|||||||
@ -10,6 +10,7 @@ module SPDX
|
|||||||
|
|
||||||
DATA_PATH = (HOMEBREW_DATA_PATH/"spdx").freeze
|
DATA_PATH = (HOMEBREW_DATA_PATH/"spdx").freeze
|
||||||
API_URL = "https://api.github.com/repos/spdx/license-list-data/releases/latest"
|
API_URL = "https://api.github.com/repos/spdx/license-list-data/releases/latest"
|
||||||
|
LICENSEREF_PREFIX = "LicenseRef-Homebrew-"
|
||||||
ALLOWED_LICENSE_SYMBOLS = [
|
ALLOWED_LICENSE_SYMBOLS = [
|
||||||
:public_domain,
|
:public_domain,
|
||||||
:cannot_represent,
|
:cannot_represent,
|
||||||
@ -90,14 +91,14 @@ module SPDX
|
|||||||
when String
|
when String
|
||||||
license_expression
|
license_expression
|
||||||
when Symbol
|
when Symbol
|
||||||
license_expression.to_s.tr("_", " ").gsub(/\b(?<!\w['’`()])[a-z]/, &:capitalize)
|
LICENSEREF_PREFIX + license_expression.to_s.tr("_", "-")
|
||||||
when Hash
|
when Hash
|
||||||
expressions = []
|
expressions = []
|
||||||
|
|
||||||
if license_expression.keys.length == 1
|
if license_expression.keys.length == 1
|
||||||
hash_type = license_expression.keys.first
|
hash_type = license_expression.keys.first
|
||||||
if hash_type.is_a? String
|
if hash_type.is_a? String
|
||||||
expressions.push "#{hash_type} with #{license_expression[hash_type][:with]}"
|
expressions.push "#{hash_type} WITH #{license_expression[hash_type][:with]}"
|
||||||
else
|
else
|
||||||
expressions += license_expression[hash_type].map do |license|
|
expressions += license_expression[hash_type].map do |license|
|
||||||
license_expression_to_string license, bracket: true, hash_type:
|
license_expression_to_string license, bracket: true, hash_type:
|
||||||
@ -111,9 +112,9 @@ module SPDX
|
|||||||
end
|
end
|
||||||
|
|
||||||
operator = if hash_type == :any_of
|
operator = if hash_type == :any_of
|
||||||
" or "
|
" OR "
|
||||||
else
|
else
|
||||||
" and "
|
" AND "
|
||||||
end
|
end
|
||||||
|
|
||||||
if bracket
|
if bracket
|
||||||
@ -130,12 +131,12 @@ module SPDX
|
|||||||
result = string
|
result = string
|
||||||
result_type = nil
|
result_type = nil
|
||||||
|
|
||||||
and_parts = string.split(/ and (?![^(]*\))/)
|
and_parts = string.split(/ and (?![^(]*\))/i)
|
||||||
if and_parts.length > 1
|
if and_parts.length > 1
|
||||||
result = and_parts
|
result = and_parts
|
||||||
result_type = :all_of
|
result_type = :all_of
|
||||||
else
|
else
|
||||||
or_parts = string.split(/ or (?![^(]*\))/)
|
or_parts = string.split(/ or (?![^(]*\))/i)
|
||||||
if or_parts.length > 1
|
if or_parts.length > 1
|
||||||
result = or_parts
|
result = or_parts
|
||||||
result_type = :any_of
|
result_type = :any_of
|
||||||
@ -149,11 +150,12 @@ module SPDX
|
|||||||
end
|
end
|
||||||
{ result_type => result }
|
{ result_type => result }
|
||||||
else
|
else
|
||||||
with_parts = string.split(" with ", 2)
|
with_parts = string.split(/ with /i, 2)
|
||||||
if with_parts.length > 1
|
if with_parts.length > 1
|
||||||
{ with_parts.first => { with: with_parts.second } }
|
{ with_parts.first => { with: with_parts.second } }
|
||||||
else
|
else
|
||||||
result
|
license_sym = result[/^#{LICENSEREF_PREFIX}(.+)/o, 1]&.downcase&.tr("-", "_")&.to_sym
|
||||||
|
ALLOWED_LICENSE_SYMBOLS.include?(license_sym) ? license_sym : result
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user