class Bundler::PubGrub::VersionUnion - bundler: Ruby Standard Library Documentation

# 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.to_s == range.max.to_s
          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