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 =
/^#{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.



26
27
28
# File 'lib/dependabot/docker/tag.rb', line 26

def initialize(name)
  @name = name
end

Instance Attribute Details

#nameObject (readonly)

Returns the value of attribute name.



23
24
25
# File 'lib/dependabot/docker/tag.rb', line 23

def name
  @name
end

Instance Method Details

#canonical?Boolean

Returns:

  • (Boolean)


79
80
81
82
83
84
85
86
87
# File 'lib/dependabot/docker/tag.rb', line 79

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)


62
63
64
# File 'lib/dependabot/docker/tag.rb', line 62

def comparable?
  name.match?(NAME_WITH_VERSION)
end

#comparable_to?(other) ⇒ Boolean

Returns:

  • (Boolean)


46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/dependabot/docker/tag.rb', line 46

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
  return equal_prefix && equal_format if other_format == :sha_suffixed

  equal_suffix = suffix == other_suffix
  equal_prefix && equal_format && equal_suffix
end

#digest?Boolean

Returns:

  • (Boolean)


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

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

#formatObject



105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/dependabot/docker/tag.rb', line 105

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)


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

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

#numeric_versionObject



126
127
128
129
130
# File 'lib/dependabot/docker/tag.rb', line 126

def numeric_version
  return unless comparable?

  version&.gsub(/kb/i, "")&.gsub(/-[a-z]+/, "")&.downcase
end

#precisionObject



133
134
135
# File 'lib/dependabot/docker/tag.rb', line 133

def precision
  segments.length
end

#prefixObject



90
91
92
# File 'lib/dependabot/docker/tag.rb', line 90

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

#same_but_less_precise?(other) ⇒ Boolean

Returns:

  • (Boolean)


72
73
74
75
76
# File 'lib/dependabot/docker/tag.rb', line 72

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)


67
68
69
# File 'lib/dependabot/docker/tag.rb', line 67

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

#segmentsObject



138
139
140
# File 'lib/dependabot/docker/tag.rb', line 138

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

#suffixObject



95
96
97
# File 'lib/dependabot/docker/tag.rb', line 95

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

#to_sObject



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

def to_s
  name
end

#versionObject



100
101
102
# File 'lib/dependabot/docker/tag.rb', line 100

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