1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
# frozen_string_literal: true
$LOAD_PATH.unshift('/home/jprokop/bin')
require 'rb_parallel'
require 'httparty'
require 'json'
class ValidateJob < RubyJobQueue
def initialize(jobs, verbosity, max_parallel = (Etc.nprocessors / 2))
super jobs, verbosity, max_parallel
end
def execute(slice)
work(slice[0], slice[1], slice[2])
end
private
def work(gem_name, gem_ver, fedspec_license)
license = gem_license(gem_name, gem_ver)
[gem_name, gem_ver, fedspec_license, license&.first]
end
def wait_finish
@threads.each(&:join)
end
def gem_info(gem_name)
JSON.load(HTTParty.get("https://rubygems.org/api/v1/versions/#{gem_name}.json").response.body.to_s)
end
def gem_for_ver(gem_name, gem_ver)
info = gem_info(gem_name)
info.find do |h|
h["number"] == gem_ver
end || info.sort() { |a, b| Gem::Version.new(a['number']) <=> Gem::Version.new(b['number']) }.first
# ^ Some gems haven't had a proper release in a long time so they are using "Version" with a githash, making it even more confusing.
end
def gem_license(gem_name, gem_ver)
remote_gem = gem_for_ver(gem_name, gem_ver)
require 'irb'; binding.irb unless remote_gem
remote_gem["licenses"]
end
end
jobs = []
Dir['rubygem-*.spec'].each do |file|
name, spec_license = nil, nil
file = File.read(file)
# puts file.each_line.to_a[0]
# puts file.each_line.to_a[1]
name = file.scan(/%(?:global|define)[[:space:]]+gem_name[[:space:]]+([A-Za-z0-9\-_.]+)/).flatten.first
spec_license = file.scan(/License:[[:space:]]*(.*)/).flatten.first
version = nil
begin
version = Gem::Version.new(file.scan(/Version:[[:space:]]*(.*)/).flatten.first)
rescue ArgumentError
# Why do maintainers do this ?!
possible_variations = %w[majorver mainver version gemver coffee_script_version].join('|')
version = Gem::Version.new(file.scan(/%(?:global|define)[[:space:]]*(?:#{possible_variations})[[:space:]]*(.+)/).flatten.first) if version.nil? || version =~ /(#{possible_variations})/
end
raise "spec license empty" if spec_license.empty?
raise "name empty #{name} #{spec_license}" if name.empty?
raise "version empty for #{name}" if version.to_s.empty?
jobs << [name, version.to_s, spec_license].flatten
end
gem_info = ValidateJob.new(jobs, Logger::DEBUG).collect
puts 'name;version;Fedora License;Gem License'
gem_licenses = gem_info.map() { |arr| arr.join(";") }.join("\n")
File.write("licences.csv", gem_licenses)
|