1
0
mirror of https://github.com/github/choosealicense.com synced 2024-11-05 19:28:50 +01:00
choosealicense.com/spec/spec_helper.rb
W. Trevor King 84a7bbbf96 spec_helper: Extract FSF approval from wking.github.io/fsf-api
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>'
2018-01-03 11:53:36 -08:00

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