Class: Dependabot::Docker::Tag
- Inherits:
-
Object
- Object
- Dependabot::Docker::Tag
- Extended by:
- T::Sig
- Defined in:
- lib/dependabot/docker/tag.rb
Constant Summary collapse
- WORDS_WITH_BUILD =
/(?:(?:-[a-z]+)+-[0-9]+)+/- VERSION_REGEX =
/v?(?<version>[0-9]+(?:[_.][0-9]+)*(?:\.[a-z0-9]+|#{WORDS_WITH_BUILD}|-(?:kb)?[0-9]+)*)/i- VERSION_WITH_SFX =
/^(?<operator>[~^<>=]*)#{VERSION_REGEX}(?<suffix>-[a-z][a-z0-9.\-]*)?$/i- VERSION_WITH_PFX =
/^(?<prefix>[a-z][a-z0-9.\-_]*-)?#{VERSION_REGEX}$/i- VERSION_WITH_PFX_AND_SFX =
/^(?<prefix>[a-z\-_]+-)?#{VERSION_REGEX}(?<suffix>-[a-z\-]+)?$/i- NAME_WITH_VERSION =
/ #{VERSION_WITH_PFX}| #{VERSION_WITH_SFX}| #{VERSION_WITH_PFX_AND_SFX} /x
Instance Attribute Summary collapse
-
#name ⇒ Object
readonly
Returns the value of attribute name.
Instance Method Summary collapse
- #canonical? ⇒ Boolean
- #comparable? ⇒ Boolean
- #comparable_formats(other_format, other_prefix, other_suffix) ⇒ Object
- #comparable_to?(other) ⇒ Boolean
- #digest? ⇒ Boolean
- #format ⇒ Object
-
#initialize(name) ⇒ Tag
constructor
A new instance of Tag.
- #looks_like_prerelease? ⇒ Boolean
- #numeric_version ⇒ Object
- #precision ⇒ Object
- #prefix ⇒ Object
- #same_but_less_precise?(other) ⇒ Boolean
- #same_precision?(other) ⇒ Boolean
- #segments ⇒ Object
- #suffix ⇒ Object
- #to_s ⇒ Object
- #version ⇒ Object
Constructor Details
#initialize(name) ⇒ Tag
Returns a new instance of Tag.
27 28 29 |
# File 'lib/dependabot/docker/tag.rb', line 27 def initialize(name) @name = name end |
Instance Attribute Details
#name ⇒ Object (readonly)
Returns the value of attribute name.
24 25 26 |
# File 'lib/dependabot/docker/tag.rb', line 24 def name @name end |
Instance Method Details
#canonical? ⇒ Boolean
95 96 97 98 99 100 101 102 103 |
# File 'lib/dependabot/docker/tag.rb', line 95 def canonical? return false unless numeric_version return true if name == numeric_version # .NET tags are suffixed with -sdk return true if numeric_version && name == numeric_version.to_s + "-sdk" numeric_version && name == "jdk-" + T.must(numeric_version) end |
#comparable? ⇒ Boolean
78 79 80 |
# File 'lib/dependabot/docker/tag.rb', line 78 def comparable? name.match?(NAME_WITH_VERSION) end |
#comparable_formats(other_format, other_prefix, other_suffix) ⇒ Object
53 54 55 56 57 58 |
# File 'lib/dependabot/docker/tag.rb', line 53 def comparable_formats(other_format, other_prefix, other_suffix) return false unless prefix.nil? && suffix.nil? && other_prefix.nil? && other_suffix.nil? formats = i(year_month year_month_day) (format == :build_num && formats.include?(other_format)) || (formats.include?(format) && other_format == :build_num) # rubocop:disable Layout/LineLength end |
#comparable_to?(other) ⇒ Boolean
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
# File 'lib/dependabot/docker/tag.rb', line 61 def comparable_to?(other) return false unless comparable? other_prefix = other.prefix other_suffix = other.suffix other_format = other.format equal_prefix = prefix == other_prefix equal_format = format == other_format comparable_format = comparable_formats(other.format, other.prefix, other.suffix) return equal_prefix && equal_format if other_format == :sha_suffixed equal_suffix = suffix == other_suffix (equal_prefix && equal_format && equal_suffix) || comparable_format end |
#digest? ⇒ Boolean
37 38 39 |
# File 'lib/dependabot/docker/tag.rb', line 37 def digest? name.match?(FileParser::DIGEST) end |
#format ⇒ Object
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
# File 'lib/dependabot/docker/tag.rb', line 121 def format return :sha_suffixed if name.match?(/(^|\-g?)[0-9a-f]{7,}$/) return :year_month if version&.match?(/^[12]\d{3}(?:[.\-]|$)/) return :year_month_day if version&.match?(/^[12](?:\d{5}|\d{7})(?:[.\-]|$)/) return :build_num if version&.match?(/^\d+$/) # As an example, "21-ea-32", "22-ea-7", and "22-ea-jdk-nanoserver-1809" # are mapped to "<version>-ea-<build_num>", "<version>-ea-<build_num>", # and "<version>-ea-jdk-nanoserver-<build_num>" respectively. # # That means only "22-ea-7" will be considered as a viable update # candidate for "21-ea-32", since it's the only one that respects that # format. if version&.match?(WORDS_WITH_BUILD) return :"<version>#{T.must(version).match(WORDS_WITH_BUILD).to_s.gsub(/-[0-9]+/, '-<build_num>')}" end :normal end |
#looks_like_prerelease? ⇒ Boolean
42 43 44 |
# File 'lib/dependabot/docker/tag.rb', line 42 def looks_like_prerelease? numeric_version&.match?(/[a-zA-Z]/) end |
#numeric_version ⇒ Object
142 143 144 145 146 |
# File 'lib/dependabot/docker/tag.rb', line 142 def numeric_version return unless comparable? version&.gsub(/kb/i, "")&.gsub(/-[a-z]+/, "")&.downcase end |
#precision ⇒ Object
149 150 151 |
# File 'lib/dependabot/docker/tag.rb', line 149 def precision segments.length end |
#prefix ⇒ Object
106 107 108 |
# File 'lib/dependabot/docker/tag.rb', line 106 def prefix name.match(NAME_WITH_VERSION)&.named_captures&.fetch("prefix") end |
#same_but_less_precise?(other) ⇒ Boolean
88 89 90 91 92 |
# File 'lib/dependabot/docker/tag.rb', line 88 def same_but_less_precise?(other) other.segments.zip(segments).all? do |segment, other_segment| segment == other_segment || other_segment.nil? end end |
#same_precision?(other) ⇒ Boolean
83 84 85 |
# File 'lib/dependabot/docker/tag.rb', line 83 def same_precision?(other) other.precision == precision end |
#segments ⇒ Object
154 155 156 |
# File 'lib/dependabot/docker/tag.rb', line 154 def segments T.must(numeric_version).split(/[.-]/) end |
#suffix ⇒ Object
111 112 113 |
# File 'lib/dependabot/docker/tag.rb', line 111 def suffix name.match(NAME_WITH_VERSION)&.named_captures&.fetch("suffix") end |
#to_s ⇒ Object
32 33 34 |
# File 'lib/dependabot/docker/tag.rb', line 32 def to_s name end |
#version ⇒ Object
116 117 118 |
# File 'lib/dependabot/docker/tag.rb', line 116 def version name.match(NAME_WITH_VERSION)&.named_captures&.fetch("version") end |