Class: Dependabot::Docker::Tag

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

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

#nameObject (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

Returns:

  • (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

Returns:

  • (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

Returns:

  • (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

Returns:

  • (Boolean)


37
38
39
# File 'lib/dependabot/docker/tag.rb', line 37

def digest?
  name.match?(FileParser::DIGEST)
end

#formatObject



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

Returns:

  • (Boolean)


42
43
44
# File 'lib/dependabot/docker/tag.rb', line 42

def looks_like_prerelease?
  numeric_version&.match?(/[a-zA-Z]/)
end

#numeric_versionObject



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

#precisionObject



149
150
151
# File 'lib/dependabot/docker/tag.rb', line 149

def precision
  segments.length
end

#prefixObject



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

Returns:

  • (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

Returns:

  • (Boolean)


83
84
85
# File 'lib/dependabot/docker/tag.rb', line 83

def same_precision?(other)
  other.precision == precision
end

#segmentsObject



154
155
156
# File 'lib/dependabot/docker/tag.rb', line 154

def segments
  T.must(numeric_version).split(/[.-]/)
end

#suffixObject



111
112
113
# File 'lib/dependabot/docker/tag.rb', line 111

def suffix
  name.match(NAME_WITH_VERSION)&.named_captures&.fetch("suffix")
end

#to_sObject



32
33
34
# File 'lib/dependabot/docker/tag.rb', line 32

def to_s
  name
end

#versionObject



116
117
118
# File 'lib/dependabot/docker/tag.rb', line 116

def version
  name.match(NAME_WITH_VERSION)&.named_captures&.fetch("version")
end