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)


492
493
494
495
496
497
498
# File 'version.rb', line 492

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:



520
521
522
# File 'version.rb', line 520

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)


542
543
544
545
546
547
548
549
550
551
552
# File 'version.rb', line 542

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)


501
502
503
# File 'version.rb', line 501

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)


750
751
752
753
# File 'version.rb', line 750

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

#head?Boolean

Check if this is a HEAD version.

Returns:

  • (Boolean)


512
513
514
# File 'version.rb', line 512

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

#majorToken?

The major version.

Returns:



647
648
649
650
651
# File 'version.rb', line 647

def major
  return NULL_TOKEN if null?

  tokens.first
end

#major_minorT.self_type

The major and minor version.

Returns:

  • (T.self_type)


677
678
679
680
681
682
# File 'version.rb', line 677

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)


688
689
690
691
692
693
# File 'version.rb', line 688

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:



657
658
659
660
661
# File 'version.rb', line 657

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)


537
538
539
# File 'version.rb', line 537

def null?
  version.nil?
end

#patchToken?

The patch version.

Returns:



667
668
669
670
671
# File 'version.rb', line 667

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)


736
737
738
739
740
# File 'version.rb', line 736

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)


704
705
706
707
708
# File 'version.rb', line 704

def to_f
  return Float::NAN if null?

  version.to_f
end

#to_iInteger

Convert the version to an integer.

Returns:

  • (Integer)


714
715
716
# File 'version.rb', line 714

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:



731
732
733
# File 'version.rb', line 731

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

#to_strString

Returns:

Raises:

  • (NoMethodError)


720
721
722
723
724
# File 'version.rb', line 720

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)


526
527
528
529
530
531
532
533
534
# File 'version.rb', line 526

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

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