# frozen_string_literal: true require 'jekyll' require 'json' require 'licensee' require 'open-uri' module SpecHelper class << self attr_accessor :config, :licenses, :site, :spdx, :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:) Jekyll::Utils.deep_merge_hashes(Jekyll::Configuration::DEFAULTS, config) end end def licenses SpecHelper.licenses ||= site.collections['licenses'].docs.map do |license| spdx_lcase = File.basename(license.basename, '.txt') license.to_liquid.merge('spdx-lcase' => spdx_lcase) 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(OpenURI.open_uri(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(OpenURI.open_uri(url).read) licenses = {} object['licenses'].each_value do |meta| next unless meta.dig('identifiers', '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 = 'https://licenses.opendefinition.org/licenses/groups/od.json' data = OpenURI.open_uri(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 def spdx_dir ::File.expand_path '../license-list-XML/src', __dir__ end end end end