summaryrefslogtreecommitdiffstats
path: root/validate_ruby_files.rb
blob: 0ebfe93d0f3677852b9efb1826441d6ce127eae1 (plain)
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)