class VersionRange

VersionRange is a utility class that helps managing consecutive version ranges automatically given that they are added in-order Note that join_if_possible should be only activated in case the ranges are added in consecutive order!!

Attributes

join_if_possible[R]
version_intervals[R]

Public Class Methods

new(join_if_possible = true) click to toggle source
# File lib/semver_dialects/semantic_version/version_range.rb, line 12
def initialize(join_if_possible = true)
  @version_intervals = []
  @version_interval_set = Set.new
  @join_if_possible = join_if_possible
end

Public Instance Methods

<<(item) click to toggle source
# File lib/semver_dialects/semantic_version/version_range.rb, line 47
def <<(item)
  add(item)
end
add(version_interval) click to toggle source
# File lib/semver_dialects/semantic_version/version_range.rb, line 22
def add(version_interval)
  return if @version_interval_set.include?(version_interval)

  if @join_if_possible
    if @version_intervals.empty?
      @version_intervals << version_interval
      @version_interval_set.add(version_interval)
    else
      last = @version_intervals.last
      # nothing to do
      return if last.end_cut == version_interval.start_cut && last.end_cut.value == version_interval.start_cut.value

      if last.joinable?(version_interval)
        @version_intervals[@version_intervals.size - 1] = last.join(version_interval)
      else
        @version_intervals << version_interval
        @version_interval_set.add(version_interval)
      end
    end
  else
    @version_intervals << version_interval
    @version_interval_set.add(version_interval)
  end
end
add_all(version_range) click to toggle source
# File lib/semver_dialects/semantic_version/version_range.rb, line 18
def add_all(version_range)
  version_range.version_intervals.each { |interval| add(interval) }
end
any?() click to toggle source
# File lib/semver_dialects/semantic_version/version_range.rb, line 154
def any?
  @version_intervals.any?
end
collapse() click to toggle source
# File lib/semver_dialects/semantic_version/version_range.rb, line 130
def collapse
  version_intervals = collapse_intervals(@version_intervals)
  version_intervals_to_range(version_intervals)
end
empty?() click to toggle source
# File lib/semver_dialects/semantic_version/version_range.rb, line 150
def empty?
  @version_intervals.empty?
end
first() click to toggle source
# File lib/semver_dialects/semantic_version/version_range.rb, line 146
def first
  @version_intervals.first
end
includes?(version_interval) click to toggle source
# File lib/semver_dialects/semantic_version/version_range.rb, line 135
def includes?(version_interval)
  @version_interval_set.include?(version_interval)
end
invert() click to toggle source

inverts the given version interval – note that this function amy return two version intervals e.g., (2,10], (12, 13], [15, +inf) 1) invert: (-inf, 2], (10, +inf), (-inf, 12], (13, +inf), (15) 2) collapse (-inf, 2], (10, 12], (13, 15)

the collapsed inverted ranges can potentially contain fixed versions

# File lib/semver_dialects/semantic_version/version_range.rb, line 124
def invert
  inverted = @version_intervals.map(&:invert).flatten
  version_intervals = collapse_intervals(inverted)
  version_intervals_to_range(version_intervals)
end
overlaps_with?(version_interval) click to toggle source
# File lib/semver_dialects/semantic_version/version_range.rb, line 139
def overlaps_with?(version_interval)
  @version_interval_set.each do |interval|
    return true unless interval.intersect(version_interval).instance_of? EmptyInterval
  end
  false
end
size() click to toggle source
# File lib/semver_dialects/semantic_version/version_range.rb, line 51
def size
  @version_intervals.size
end
to_conan_s() click to toggle source
# File lib/semver_dialects/semantic_version/version_range.rb, line 67
def to_conan_s
  to_npm_s
end
to_description_s() click to toggle source
# File lib/semver_dialects/semantic_version/version_range.rb, line 59
def to_description_s
  @version_intervals.map(&:to_description_s).join(', ').capitalize
end
to_gem_s() click to toggle source
# File lib/semver_dialects/semantic_version/version_range.rb, line 79
def to_gem_s
  @version_intervals.map(&:to_gem_s).join('||')
end
to_go_s() click to toggle source
# File lib/semver_dialects/semantic_version/version_range.rb, line 87
def to_go_s
  @version_intervals.map(&:to_go_s).join('||')
end
to_maven_s() click to toggle source
# File lib/semver_dialects/semantic_version/version_range.rb, line 75
def to_maven_s
  @version_intervals.map(&:to_maven_s).join(',')
end
to_npm_s() click to toggle source
# File lib/semver_dialects/semantic_version/version_range.rb, line 63
def to_npm_s
  @version_intervals.map(&:to_npm_s).join('||')
end
to_nuget_s() click to toggle source
# File lib/semver_dialects/semantic_version/version_range.rb, line 71
def to_nuget_s
  to_maven_s
end
to_packagist_s() click to toggle source
# File lib/semver_dialects/semantic_version/version_range.rb, line 91
def to_packagist_s
  @version_intervals.map(&:to_packagist_s).join('||')
end
to_pypi_s() click to toggle source
# File lib/semver_dialects/semantic_version/version_range.rb, line 83
def to_pypi_s
  @version_intervals.map(&:to_pypi_s).join('||')
end
to_s() click to toggle source
# File lib/semver_dialects/semantic_version/version_range.rb, line 55
def to_s
  @version_intervals.map(&:to_s).join(',')
end
to_version_s(package_type) click to toggle source
# File lib/semver_dialects/semantic_version/version_range.rb, line 95
def to_version_s(package_type)
  case package_type
  when 'npm'
    to_npm_s
  when 'nuget'
    to_nuget_s
  when 'maven'
    to_maven_s
  when 'gem'
    to_gem_s
  when 'pypi'
    to_pypi_s
  when 'packagist'
    to_packagist_s
  when 'go'
    to_go_s
  when 'conan'
    to_conan_s
  else
    ''
  end
end
universal?() click to toggle source
# File lib/semver_dialects/semantic_version/version_range.rb, line 158
def universal?
  @version_intervals.each do |version_interval|
    return true if version_interval.universal?
  end
  false
end

Private Instance Methods

collapse_intervals(version_intervals) click to toggle source
# File lib/semver_dialects/semantic_version/version_range.rb, line 175
def collapse_intervals(version_intervals)
  interval_cp = []
  interval_cp += version_intervals
  ret = [interval_cp.shift]

  interval_cp.each do |item|
    last = ret.last
    if last.intersect(item).instance_of?(EmptyInterval)
      ret << item
    else
      ret.pop
      ret << last.collapse(item)
    end
  end
  ret
end
version_intervals_to_range(version_intervals) click to toggle source
# File lib/semver_dialects/semantic_version/version_range.rb, line 167
def version_intervals_to_range(version_intervals)
  ret = VersionRange.new(false)
  version_intervals.each do |version_interval|
    ret << version_interval
  end
  ret
end