module VersionTranslator

A prepropcessor – convert different version strings to something that can be digested by the version parser

Public Class Methods

add_missing_operator(version_string) click to toggle source
# File lib/semver_dialects/semantic_version/version_translator.rb, line 46
def self.add_missing_operator(version_string)
  starts_with_operator?(version_string) ? version_string : "=#{version_string}"
end
comma_to_space(version_string) click to toggle source
# File lib/semver_dialects/semantic_version/version_translator.rb, line 58
def self.comma_to_space(version_string)
  version_string.strip.gsub(/,/, ' ')
end
lexing_maven_version_string(version_string) click to toggle source
# File lib/semver_dialects/semantic_version/version_translator.rb, line 62
def self.lexing_maven_version_string(version_string)
  open = false
  substring = ''
  ret = []
  version_string.each_char do |c|
    case c
    when '(', '['
      if open
        puts "malformed maven version string #{version_string}"
        exit(-1)
      else
        unless substring.empty?
          ret << substring
          substring = ''
        end
        open = true
        substring += c
      end
    when ')', ']'
      if !open
        puts "malformed maven version string #{version_string}"
        exit(-1)
      else
        open = false
        substring += c
        ret << substring
        substring = ''
      end
    when ','
      substring += c if open
    when ' '
      # nothing to do
      substring += ''
    else
      substring += c
    end
  end
  if open
    puts "malformed maven version string #{version_string}"
    exit(-1)
  end
  ret << substring unless substring.empty?
  ret
end
parenthesized?(version_item) click to toggle source
# File lib/semver_dialects/semantic_version/version_translator.rb, line 107
def self.parenthesized?(version_item)
  version_item.match(/^[\(\[]/) && version_item.match(/[\]\)]$/) ? true : false
end
single_space_after_operator(version_string) click to toggle source
# File lib/semver_dialects/semantic_version/version_translator.rb, line 50
def self.single_space_after_operator(version_string)
  version_string.gsub(/([>=<]+) +/, '\1').gsub(/\s+/, ' ')
end
starts_with_operator?(version_item) click to toggle source
# File lib/semver_dialects/semantic_version/version_translator.rb, line 54
def self.starts_with_operator?(version_item)
  version_item.match(/^[=><]/) ? true : false
end
translate_conan(version_string) click to toggle source
# File lib/semver_dialects/semantic_version/version_translator.rb, line 14
def self.translate_conan(version_string)
  translate_npm(version_string)
end
translate_gem(version_string) click to toggle source
# File lib/semver_dialects/semantic_version/version_translator.rb, line 22
def self.translate_gem(version_string)
  version_string.split('||').map do |item|
    add_missing_operator(single_space_after_operator(item.strip.gsub(/\s+/, ' ')))
  end
end
translate_go(version_string) click to toggle source
# File lib/semver_dialects/semantic_version/version_translator.rb, line 18
def self.translate_go(version_string)
  translate_gem(version_string)
end
translate_maven(version_string) click to toggle source
# File lib/semver_dialects/semantic_version/version_translator.rb, line 42
def self.translate_maven(version_string)
  lexing_maven_version_string(version_string).map { |item| translate_mvn_version_item(item) }
end
translate_mvn_version_item(version_item) click to toggle source
# File lib/semver_dialects/semantic_version/version_translator.rb, line 111
def self.translate_mvn_version_item(version_item)
  content = ''
  parens_pattern = ''
  if parenthesized?(version_item)
    content = version_item[1, version_item.size - 2]
    parens_pattern = version_item[0] + version_item[version_item.size - 1]
    # special case -- unversal version range
    return '=*' if content.strip == ','
  else
    # according to the doc, if there is a plain version string in maven, it means 'starting from version x'
    # https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN8903
    content = "#{version_item},"
    parens_pattern = '[)'
  end

  args = content.split(',')
  first_non_empty_arg = args.find(&:present?)

  if content.start_with?(',')
    # {,y}
    case parens_pattern
    when '[]'
      "<=#{first_non_empty_arg}"
    when '()'
      "<#{first_non_empty_arg}"
    when '[)'
      "<#{first_non_empty_arg}"
    else
      # par_pattern == "(]"
      "<=#{first_non_empty_arg}"
    end
  elsif content.end_with?(',')
    # {x,}
    case parens_pattern
    when '[]'
      ">=#{first_non_empty_arg}"
    when '()'
      ">#{first_non_empty_arg}"
    when '[)'
      ">=#{first_non_empty_arg}"
    else
      # par_pattern == "(]"
      ">#{first_non_empty_arg}"
    end
  elsif content[','].nil?
    # [x,x]
    "=#{content}"
  else
    case parens_pattern
    when '[]'
      ">=#{args[0]} <=#{args[1]}"
    when '()'
      ">#{args[0]} <#{args[1]}"
    when '[)'
      ">=#{args[0]} <#{args[1]}"
    else
      # par_pattern == "(]"
      ">#{args[0]} <=#{args[1]}"
    end
  end
end
translate_npm(version_string) click to toggle source
# File lib/semver_dialects/semantic_version/version_translator.rb, line 8
def self.translate_npm(version_string)
  version_string.split('||').map do |item|
    add_missing_operator(single_space_after_operator(item.strip.gsub(/&&/, ' ')))
  end
end
translate_nuget(version_string) click to toggle source
# File lib/semver_dialects/semantic_version/version_translator.rb, line 38
def self.translate_nuget(version_string)
  translate_maven(version_string)
end
translate_packagist(version_string) click to toggle source
# File lib/semver_dialects/semantic_version/version_translator.rb, line 28
def self.translate_packagist(version_string)
  translate_pypi(version_string)
end
translate_pypi(version_string) click to toggle source
# File lib/semver_dialects/semantic_version/version_translator.rb, line 32
def self.translate_pypi(version_string)
  version_string.split('||').map do |item|
    add_missing_operator(single_space_after_operator(comma_to_space(item)))
  end
end