ruby/rubygems.req
Vít Ondruch f571c557e2 Conflict requirement needs to generate dependency.
If there is only conflict requirement, this still menas that there is
dependency on that package and appropriate requirement must be generated
(rhbz#1561487)
2018-04-10 09:53:37 +02:00

85 lines
2.6 KiB
Ruby

#!/usr/bin/ruby
require 'rubygems/package'
module RubyGemsReq
module Helpers
# Expands '~>' and '!=' gem requirements.
def self.expand_requirement(requirements)
requirements.inject([]) do |output, r|
output.concat case r.first
when '~>'
expand_pessimistic_requirement(r)
when '!='
# If there is only the conflict requirement, we still need to depend
# on the specified gem.
if requirements.size == 1
Gem::Requirement.default.requirements
else
[]
end
else
[r]
end
end.reject {|r| r.empty? }
end
# Expands the pessimistic version operator '~>' into equivalent '>=' and
# '<' pair.
def self.expand_pessimistic_requirement(requirement)
next_version = Gem::Version.create(requirement.last).bump
return ['>=', requirement.last], ['<', next_version]
end
# Converts Gem::Requirement into array of requirements strings compatible
# with RPM .spec file.
def self.requirement_versions_to_rpm(requirement)
self.expand_requirement(requirement.requirements).map do |op, version|
version == Gem::Version.new(0) ? "" : "#{op} #{version}"
end
end
end
# Report RubyGems dependency, versioned if required.
def self.rubygems_dependency(specification)
Helpers::requirement_versions_to_rpm(specification.required_rubygems_version).each do |requirement|
dependency_string = "ruby(rubygems)"
dependency_string += " #{specification.required_rubygems_version}" if requirement&.length > 0
puts dependency_string
end
end
# Report all gem dependencies including their version.
def self.gem_depenencies(specification)
specification.runtime_dependencies.each do |dependency|
dependency_strings = Helpers::requirement_versions_to_rpm(dependency.requirement).map do |requirement|
requirement_string = "rubygem(#{dependency.name})"
requirement_string += " #{requirement}" if requirement&.length > 0
requirement_string
end
dependency_string = dependency_strings.join(' with ')
dependency_string.prepend('(').concat(')') if dependency_strings.length > 1
puts dependency_string
end
end
# Reports all requirements specified by all provided .gemspec files.
def self.requires
while filename = gets
filename.strip!
begin
specification = Gem::Specification.load filename
rubygems_dependency(specification)
gem_depenencies(specification)
rescue => e
# Ignore all errors.
end
end
end
end
if __FILE__ == $0
RubyGemsReq::requires
end