mirror of
https://github.com/github/choosealicense.com
synced 2024-11-05 19:28:50 +01:00
84a7bbbf96
Ideally the FSF would be maintaining the API (or any API), but until someone can talk them into that I think we can save work by collaborating on the mock API. Using a JSON API also allows us to drop the Nokogiri dependency. The parens feel excessive, and I'm not familiar with Ruby, so they might be. However, removing the parens from the libre check resulted in: $ ./script/check-approval ISC ./script/check-approval:8:in `require_relative': /.../choosealicense.com/spec/spec_helper.rb:108: syntax error, unexpected tSTRING_BEG, expecting keyword_then or ';' or '\n' (SyntaxError) ...gs') && meta['tags'].include? 'libre' ... ^ /.../choosealicense.com/spec/spec_helper.rb:116: syntax error, unexpected keyword_end, expecting end-of-input from ./script/check-approval:8:in `<main>'
144 lines
3.1 KiB
Ruby
144 lines
3.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'jekyll'
|
|
require 'json'
|
|
require 'licensee'
|
|
require 'open-uri'
|
|
|
|
module SpecHelper
|
|
class << self
|
|
attr_accessor :config, :licenses, :site, :spdx
|
|
attr_accessor :osi_approved_licenses, :fsf_approved_licenses, :od_approved_licenses
|
|
end
|
|
end
|
|
|
|
def config_file
|
|
File.expand_path './_config.yml', source
|
|
end
|
|
|
|
def source
|
|
File.expand_path('../', File.dirname(__FILE__))
|
|
end
|
|
|
|
def licenses_path
|
|
File.expand_path '_licenses', source
|
|
end
|
|
|
|
def config
|
|
SpecHelper.config ||= begin
|
|
config = Jekyll::Configuration.new.read_config_file config_file
|
|
config = Jekyll::Utils.deep_merge_hashes(config, source: source)
|
|
Jekyll::Utils.deep_merge_hashes(Jekyll::Configuration::DEFAULTS, config)
|
|
end
|
|
end
|
|
|
|
def licenses
|
|
SpecHelper.licenses ||= begin
|
|
site.collections['licenses'].docs.map do |license|
|
|
spdx_lcase = File.basename(license.basename, '.txt')
|
|
license.to_liquid.merge('spdx-lcase' => spdx_lcase)
|
|
end
|
|
end
|
|
end
|
|
|
|
def shown_licenses
|
|
licenses.reject { |l| l['hidden'] }
|
|
end
|
|
|
|
def site
|
|
SpecHelper.site ||= begin
|
|
site = Jekyll::Site.new(config)
|
|
site.reset
|
|
site.read
|
|
site
|
|
end
|
|
end
|
|
|
|
def rules
|
|
site.data['rules']
|
|
end
|
|
|
|
def fields
|
|
site.data['fields']
|
|
end
|
|
|
|
def meta
|
|
site.data['meta']
|
|
end
|
|
|
|
def rule?(tag, group)
|
|
rules[group].any? { |r| r['tag'] == tag }
|
|
end
|
|
|
|
def spdx_list
|
|
SpecHelper.spdx ||= begin
|
|
url = 'https://spdx.org/licenses/licenses.json'
|
|
list = JSON.parse(open(url).read)['licenses']
|
|
list.each_with_object({}) do |values, memo|
|
|
memo[values['licenseId']] = values
|
|
end
|
|
end
|
|
end
|
|
|
|
def spdx_ids
|
|
spdx_list.map { |name, _properties| name }
|
|
end
|
|
|
|
def find_spdx(license)
|
|
spdx_list.find { |name, _properties| name.casecmp(license).zero? }
|
|
end
|
|
|
|
def osi_approved_licenses
|
|
SpecHelper.osi_approved_licenses ||= begin
|
|
licenses = {}
|
|
list = spdx_list.select { |_id, meta| meta['isOsiApproved'] }
|
|
list.each do |id, meta|
|
|
licenses[id.downcase] = meta['name']
|
|
end
|
|
licenses
|
|
end
|
|
end
|
|
|
|
def fsf_approved_licenses
|
|
SpecHelper.fsf_approved_licenses ||= begin
|
|
url = 'https://wking.github.io/fsf-api/licenses-full.json'
|
|
object = JSON.parse(open(url).read)
|
|
licenses = {}
|
|
object.each_value do |meta|
|
|
next unless (meta.include? 'identifiers') && (meta['identifiers'].include? 'spdx') && (meta.include? 'tags') && (meta['tags'].include? 'libre')
|
|
meta['identifiers']['spdx'].each do |identifier|
|
|
licenses[identifier.downcase] = meta['name']
|
|
end
|
|
end
|
|
licenses
|
|
end
|
|
end
|
|
|
|
def od_approved_licenses
|
|
SpecHelper.od_approved_licenses ||= begin
|
|
url = 'http://licenses.opendefinition.org/licenses/groups/od.json'
|
|
data = open(url).read
|
|
data = JSON.parse(data)
|
|
licenses = {}
|
|
data.each do |id, meta|
|
|
licenses[id.downcase] = meta['title']
|
|
end
|
|
licenses
|
|
end
|
|
end
|
|
|
|
def approved_licenses
|
|
(osi_approved_licenses.keys + fsf_approved_licenses.keys + od_approved_licenses.keys).flatten.uniq.sort
|
|
end
|
|
|
|
module Licensee
|
|
class License
|
|
class << self
|
|
def license_dir
|
|
dir = ::File.dirname(__FILE__)
|
|
::File.expand_path '../_licenses', dir
|
|
end
|
|
end
|
|
end
|
|
end
|