Class: Version Private

Inherits:
Object show all
Includes:
Comparable
Defined in:
version.rb,
version/parser.rb

This class is part of a private API. This class may only be used in the Homebrew/brew repository. Third parties should avoid using this class if possible, as it may be removed or changed without warning.

Direct Known Subclasses

MacOSVersion

Defined Under Namespace

Classes: AlphaToken, BetaToken, CompositeToken, NumericToken, Parser, PatchToken, PostToken, PreToken, RCToken, RegexParser, StemParser, StringToken, Token, UrlParser

Constant Summary collapse

NULL_TOKEN =

This constant is part of a private API. This constant may only be used in the Homebrew/brew repository. Third parties should avoid using this constant if possible, as it may be removed or changed without warning.

Represents the absence of a token.

T.let(NullToken.new.freeze, NullToken)

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(val, detected_from_url: false) ⇒ void

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

  • val (String, Version)
  • detected_from_url (Boolean) (defaults to: false)

Raises:

  • (ArgumentError)


495
496
497
498
499
500
501
# File 'version.rb', line 495

def initialize(val, detected_from_url: false)
  version = val.to_str
  raise ArgumentError, "Version must not be empty" if version.blank?

  @version = T.let(version, String)
  @detected_from_url = detected_from_url
end

Class Method Details

.detect(url, **specs) ⇒ Version

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:



343
344
345
# File 'version.rb', line 343

def self.detect(url, **specs)
  parse(specs.fetch(:tag, url), detected_from_url: true)
end

.formula_optionally_versioned_regex(name, full: true) ⇒ Regexp

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:

  • (Regexp)


11
12
13
# File 'version.rb', line 11

def self.formula_optionally_versioned_regex(name, full: true)
  /#{"^" if full}#{Regexp.escape(name)}(@\d[\d.]*)?#{"$" if full}/
end

.parse(spec, detected_from_url: false) ⇒ Version

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

  • spec (String, Pathname)
  • detected_from_url (Boolean) (defaults to: false)

Returns:



348
349
350
351
352
353
354
355
356
357
358
359
# File 'version.rb', line 348

def self.parse(spec, detected_from_url: false)
  spec = CGI.unescape(spec.to_s) if detected_from_url

  spec = Pathname(spec)

  VERSION_PARSERS.each do |parser|
    version = parser.parse(spec)
    return new(version, detected_from_url:) if version.present?
  end

  NULL
end

Instance Method Details

#commitString?

Return the commit for a HEAD version.

Returns:



523
524
525
# File 'version.rb', line 523

def commit
  version&.match(HEAD_VERSION_REGEX)&.[](:commit)
end

#compare(comparator, other) ⇒ Boolean

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:

  • (Boolean)


545
546
547
548
549
550
551
552
553
554
555
# File 'version.rb', line 545

def compare(comparator, other)
  case comparator
  when ">=" then self >= other
  when ">" then self > other
  when "<" then self < other
  when "<=" then self <= other
  when "==" then self == other
  when "!=" then self != other
  else raise ArgumentError, "Unknown comparator: #{comparator}"
  end
end

#detected_from_url?Boolean

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:

  • (Boolean)


504
505
506
# File 'version.rb', line 504

def detected_from_url?
  @detected_from_url
end

#freezeT.self_type

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:

  • (T.self_type)


753
754
755
756
# File 'version.rb', line 753

def freeze
  tokens # Determine and store tokens before freezing
  super
end

#head?Boolean

Check if this is a HEAD version.

Returns:

  • (Boolean)


515
516
517
# File 'version.rb', line 515

def head?
  version&.match?(HEAD_VERSION_REGEX) || false
end

#majorToken?

The major version.

Returns:



650
651
652
653
654
# File 'version.rb', line 650

def major
  return NULL_TOKEN if null?

  tokens.first
end

#major_minorT.self_type

The major and minor version.

Returns:

  • (T.self_type)


680
681
682
683
684
685
# File 'version.rb', line 680

def major_minor
  return self if null?

  major_minor = T.must(tokens[0..1])
  major_minor.empty? ? NULL : self.class.new(major_minor.join("."))
end

#major_minor_patchT.self_type

The major, minor and patch version.

Returns:

  • (T.self_type)


691
692
693
694
695
696
# File 'version.rb', line 691

def major_minor_patch
  return self if null?

  major_minor_patch = T.must(tokens[0..2])
  major_minor_patch.empty? ? NULL : self.class.new(major_minor_patch.join("."))
end

#minorToken?

The minor version.

Returns:



660
661
662
663
664
# File 'version.rb', line 660

def minor
  return NULL_TOKEN if null?

  tokens.second
end

#null?Boolean

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:

  • (Boolean)


540
541
542
# File 'version.rb', line 540

def null?
  version.nil?
end

#patchToken?

The patch version.

Returns:



670
671
672
673
674
# File 'version.rb', line 670

def patch
  return NULL_TOKEN if null?

  tokens.third
end

#respond_to?(method, include_all = T.unsafe(nil)) ⇒ Boolean

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

  • method (Symbol, String)
  • include_all (Boolean) (defaults to: T.unsafe(nil))

Returns:

  • (Boolean)


739
740
741
742
743
# File 'version.rb', line 739

def respond_to?(method, include_all = T.unsafe(nil))
  return !null? if ["to_str", :to_str].include?(method)

  super
end

#to_fFloat

Convert the version to a floating-point number.

Returns:

  • (Float)


707
708
709
710
711
# File 'version.rb', line 707

def to_f
  return Float::NAN if null?

  version.to_f
end

#to_iInteger

Convert the version to an integer.

Returns:

  • (Integer)


717
718
719
# File 'version.rb', line 717

def to_i
  version.to_i
end

#to_json(*options) ⇒ String

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

  • options (T.untyped)

Returns:



734
735
736
# File 'version.rb', line 734

def to_json(*options)
  T.unsafe(version).to_json(*options)
end

#to_strString

Returns:

Raises:

  • (NoMethodError)


723
724
725
726
727
# File 'version.rb', line 723

def to_str
  raise NoMethodError, "undefined method `to_str' for #{self.class}:NULL" if null?

  T.must(version).to_str
end

#update_commit(commit) ⇒ void

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

This method returns an undefined value.

Update the commit for a HEAD version.

Parameters:

Raises:

  • (ArgumentError)


529
530
531
532
533
534
535
536
537
# File 'version.rb', line 529

def update_commit(commit)
  raise ArgumentError, "Cannot update commit for non-HEAD version." unless head?

  @version = if commit
    "HEAD-#{commit}"
  else
    "HEAD"
  end
end