class Bundler::PubGrub::VersionUnion

Attributes

ranges[R]

Public Class Methods

new(ranges) click to toggle source
# File bundler/vendor/pub_grub/lib/pub_grub/version_union.rb, line 42
def initialize(ranges)
  raise ArgumentError unless ranges.all? { |r| r.instance_of?(VersionRange) }
  @ranges = ranges
end
normalize_ranges(ranges) click to toggle source
# File bundler/vendor/pub_grub/lib/pub_grub/version_union.rb, line 7
def self.normalize_ranges(ranges)
  ranges = ranges.flat_map do |range|
    range.ranges
  end

  ranges.reject!(&:empty?)

  return [] if ranges.empty?

  mins, ranges = ranges.partition { |r| !r.min }
  original_ranges = mins + ranges.sort_by { |r| [r.min, r.include_min ? 0 : 1] }
  ranges = [original_ranges.shift]
  original_ranges.each do |range|
    if ranges.last.contiguous_to?(range)
      ranges << ranges.pop.span(range)
    else
      ranges << range
    end
  end

  ranges
end
union(ranges, normalize: true) click to toggle source
# File bundler/vendor/pub_grub/lib/pub_grub/version_union.rb, line 30
def self.union(ranges, normalize: true)
  ranges = normalize_ranges(ranges) if normalize

  if ranges.size == 0
    VersionRange.empty
  elsif ranges.size == 1
    ranges[0]
  else
    new(ranges)
  end
end

Public Instance Methods

==(other) click to toggle source
# File bundler/vendor/pub_grub/lib/pub_grub/version_union.rb, line 173
def ==(other)
  self.class == other.class &&
    self.ranges == other.ranges
end
allows_all?(other) click to toggle source
# File bundler/vendor/pub_grub/lib/pub_grub/version_union.rb, line 89
def allows_all?(other)
  my_ranges = ranges.dup

  my_range = my_ranges.shift

  other.ranges.all? do |other_range|
    while my_range
      break if my_range.allows_all?(other_range)
      my_range = my_ranges.shift
    end

    !!my_range
  end
end
allows_any?(other)
Alias for: intersects?
any?() click to toggle source
# File bundler/vendor/pub_grub/lib/pub_grub/version_union.rb, line 108
def any?
  false
end
empty?() click to toggle source
# File bundler/vendor/pub_grub/lib/pub_grub/version_union.rb, line 104
def empty?
  false
end
eql?(other) click to toggle source
# File bundler/vendor/pub_grub/lib/pub_grub/version_union.rb, line 51
def eql?(other)
  ranges.eql?(other.ranges)
end
hash() click to toggle source
# File bundler/vendor/pub_grub/lib/pub_grub/version_union.rb, line 47
def hash
  ranges.hash
end
include?(version) click to toggle source
# File bundler/vendor/pub_grub/lib/pub_grub/version_union.rb, line 55
def include?(version)
  !!ranges.bsearch {|r| r.compare_version(version) }
end
inspect() click to toggle source
# File bundler/vendor/pub_grub/lib/pub_grub/version_union.rb, line 169
def inspect
  "#<#{self.class} #{to_s}>"
end
intersect(other) click to toggle source
# File bundler/vendor/pub_grub/lib/pub_grub/version_union.rb, line 112
def intersect(other)
  my_ranges = ranges.dup
  other_ranges = other.ranges.dup
  new_ranges = []

  my_range = my_ranges.shift
  other_range = other_ranges.shift
  while my_range && other_range
    new_ranges << my_range.intersect(other_range)

    if !my_range.max || other_range.empty? || (other_range.max && other_range.max < my_range.max)
      other_range = other_ranges.shift
    else
      my_range = my_ranges.shift
    end
  end
  new_ranges.reject!(&:empty?)
  VersionUnion.union(new_ranges, normalize: false)
end
intersects?(other) click to toggle source
# File bundler/vendor/pub_grub/lib/pub_grub/version_union.rb, line 69
def intersects?(other)
  my_ranges = ranges.dup
  other_ranges = other.ranges.dup

  my_range = my_ranges.shift
  other_range = other_ranges.shift
  while my_range && other_range
    if my_range.intersects?(other_range)
      return true
    end

    if !my_range.max || other_range.empty? || (other_range.max && other_range.max < my_range.max)
      other_range = other_ranges.shift
    else
      my_range = my_ranges.shift
    end
  end
end
Also aliased as: allows_any?
invert() click to toggle source
# File bundler/vendor/pub_grub/lib/pub_grub/version_union.rb, line 136
def invert
  ranges.map(&:invert).inject(:intersect)
end
select_versions(all_versions) click to toggle source
# File bundler/vendor/pub_grub/lib/pub_grub/version_union.rb, line 59
def select_versions(all_versions)
  versions = []
  ranges.inject(all_versions) do |acc, range|
    _, matching, higher = range.partition_versions(acc)
    versions.concat matching
    higher
  end
  versions
end
to_s() click to toggle source
# File bundler/vendor/pub_grub/lib/pub_grub/version_union.rb, line 144
def to_s
  output = []

  ranges = self.ranges.dup
  while !ranges.empty?
    ne = []
    range = ranges.shift
    while !ranges.empty? && ranges[0].min == range.max
      ne << range.max
      range = range.span(ranges.shift)
    end

    ne.map! {|x| "!= #{x}" }
    if ne.empty?
      output << range.to_s
    elsif range.any?
      output << ne.join(', ')
    else
      output << "#{range}, #{ne.join(', ')}"
    end
  end

  output.join(" OR ")
end
union(other) click to toggle source
# File bundler/vendor/pub_grub/lib/pub_grub/version_union.rb, line 140
def union(other)
  VersionUnion.union([self, other])
end
upper_invert() click to toggle source
# File bundler/vendor/pub_grub/lib/pub_grub/version_union.rb, line 132
def upper_invert
  ranges.last.upper_invert
end