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
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
it "returns license and exception" do
|
||||
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
|
||||
|
||||
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
|
||||
"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
|
||||
end
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
@ -223,9 +224,20 @@ RSpec.describe SPDX do
|
||||
})
|
||||
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
|
||||
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: [
|
||||
"A",
|
||||
any_of: [
|
||||
@ -236,6 +248,15 @@ RSpec.describe SPDX do
|
||||
})
|
||||
end
|
||||
# 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
|
||||
|
||||
describe ".license_version_info" do
|
||||
|
||||
@ -10,6 +10,7 @@ module SPDX
|
||||
|
||||
DATA_PATH = (HOMEBREW_DATA_PATH/"spdx").freeze
|
||||
API_URL = "https://api.github.com/repos/spdx/license-list-data/releases/latest"
|
||||
LICENSEREF_PREFIX = "LicenseRef-Homebrew-"
|
||||
ALLOWED_LICENSE_SYMBOLS = [
|
||||
:public_domain,
|
||||
:cannot_represent,
|
||||
@ -90,14 +91,14 @@ module SPDX
|
||||
when String
|
||||
license_expression
|
||||
when Symbol
|
||||
license_expression.to_s.tr("_", " ").gsub(/\b(?<!\w['’`()])[a-z]/, &:capitalize)
|
||||
LICENSEREF_PREFIX + license_expression.to_s.tr("_", "-")
|
||||
when Hash
|
||||
expressions = []
|
||||
|
||||
if license_expression.keys.length == 1
|
||||
hash_type = license_expression.keys.first
|
||||
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
|
||||
expressions += license_expression[hash_type].map do |license|
|
||||
license_expression_to_string license, bracket: true, hash_type:
|
||||
@ -111,9 +112,9 @@ module SPDX
|
||||
end
|
||||
|
||||
operator = if hash_type == :any_of
|
||||
" or "
|
||||
" OR "
|
||||
else
|
||||
" and "
|
||||
" AND "
|
||||
end
|
||||
|
||||
if bracket
|
||||
@ -130,12 +131,12 @@ module SPDX
|
||||
result = string
|
||||
result_type = nil
|
||||
|
||||
and_parts = string.split(/ and (?![^(]*\))/)
|
||||
and_parts = string.split(/ and (?![^(]*\))/i)
|
||||
if and_parts.length > 1
|
||||
result = and_parts
|
||||
result_type = :all_of
|
||||
else
|
||||
or_parts = string.split(/ or (?![^(]*\))/)
|
||||
or_parts = string.split(/ or (?![^(]*\))/i)
|
||||
if or_parts.length > 1
|
||||
result = or_parts
|
||||
result_type = :any_of
|
||||
@ -149,11 +150,12 @@ module SPDX
|
||||
end
|
||||
{ result_type => result }
|
||||
else
|
||||
with_parts = string.split(" with ", 2)
|
||||
with_parts = string.split(/ with /i, 2)
|
||||
if with_parts.length > 1
|
||||
{ with_parts.first => { with: with_parts.second } }
|
||||
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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user