Sha256: 19a3e3c3772d3231078b771149065af243ce3864723b05416cb16e21982bf47e

Contents?: true

Size: 1.37 KB

Versions: 2

Compression:

Stored size: 1.37 KB

Contents

require 'yaml'

module RubyDep
  class Travis
    def version_constraint(filename = '.travis.yml')
      yaml = YAML.load(IO.read(filename))
      versions = supported_versions(yaml)

      selected = versions_for_latest_major(versions)
      lowest = lowest_supported(selected)

      ["~> #{lowest[0..1].join('.')}", ">= #{lowest.join('.')}"]
    end

    private

    def versions_for_latest_major(versions)
      by_major = versions.map do |x|
        Gem::Version.new(x).segments[0..2]
      end.group_by(&:first)

      last_supported_major = by_major.keys.sort.last
      by_major[last_supported_major]
    end

    def lowest_supported(versions)
      selected = versions.sort.reverse!
      grouped_by_minor = selected.group_by { |x| x[1] }

      lowest_minor = lowest_minor_without_skipping(grouped_by_minor)
      grouped_by_minor[lowest_minor].sort.first
    end

    def failable(yaml)
      matrix = yaml.fetch('matrix', {})
      allowed = matrix.fetch('allow_failures', [])
      allowed.map(&:values).flatten
    end

    def supported_versions(yaml)
      yaml['rvm'] - failable(yaml)
    end

    def lowest_minor_without_skipping(grouped_by_minor)
      minors = grouped_by_minor.keys.flatten
      lowest = minors.shift
      current = lowest
      while (lower = minors.shift)
        (current -= 1) == lower ? lowest = lower : break
      end
      lowest
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
ruby_dep-1.1.0 lib/ruby_dep/travis.rb
ruby_dep-1.0.0 lib/ruby_dep/travis.rb