Class: Dependabot::Swift::UpdateChecker::LatestVersionResolver

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
Defined in:
lib/dependabot/swift/update_checker/latest_version_resolver.rb

Constant Summary collapse

DAY_IN_SECONDS =
T.let(24 * 60 * 60, Integer)

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(dependency:, credentials:, cooldown_options:, git_commit_checker:) ⇒ LatestVersionResolver

Returns a new instance of LatestVersionResolver.



27
28
29
30
31
32
33
34
35
# File 'lib/dependabot/swift/update_checker/latest_version_resolver.rb', line 27

def initialize(dependency:, credentials:, cooldown_options:, git_commit_checker:)
  @dependency = dependency
  @credentials = credentials
  @cooldown_options = cooldown_options
  @git_commit_checker = T.let(
    git_commit_checker,
    Dependabot::GitCommitChecker
  )
end

Instance Attribute Details

#cooldown_optionsObject (readonly)

Returns the value of attribute cooldown_options.



44
45
46
# File 'lib/dependabot/swift/update_checker/latest_version_resolver.rb', line 44

def cooldown_options
  @cooldown_options
end

#credentialsObject (readonly)

Returns the value of attribute credentials.



41
42
43
# File 'lib/dependabot/swift/update_checker/latest_version_resolver.rb', line 41

def credentials
  @credentials
end

#dependencyObject (readonly)

Returns the value of attribute dependency.



38
39
40
# File 'lib/dependabot/swift/update_checker/latest_version_resolver.rb', line 38

def dependency
  @dependency
end

#git_commit_checkerObject (readonly)

Returns the value of attribute git_commit_checker.



47
48
49
# File 'lib/dependabot/swift/update_checker/latest_version_resolver.rb', line 47

def git_commit_checker
  @git_commit_checker
end

Instance Method Details

#check_if_version_in_cooldown_period?(tag_with_detail) ⇒ Boolean

Returns:

  • (Boolean)


88
89
90
91
92
93
94
95
96
97
98
# File 'lib/dependabot/swift/update_checker/latest_version_resolver.rb', line 88

def check_if_version_in_cooldown_period?(tag_with_detail)
  return false unless tag_with_detail.release_date

  current_version = version_class.correct?(dependency.version) ? version_class.new(dependency.version) : nil
  days = cooldown_days_for(current_version, version_class.new(tag_with_detail.tag.delete("v")))

  # Calculate the number of seconds passed since the release
  passed_seconds = Time.now.to_i - release_date_to_seconds(tag_with_detail.release_date)
  # Check if the release is within the cooldown period
  passed_seconds < days * DAY_IN_SECONDS
end

#cooldown_days_for(current_version, new_version) ⇒ Object



106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/dependabot/swift/update_checker/latest_version_resolver.rb', line 106

def cooldown_days_for(current_version, new_version)
  return 0 unless cooldown_enabled?

  cooldown = T.must(cooldown_options)
  return 0 unless cooldown.included?(dependency.name)
  return cooldown.default_days if current_version.nil?

  current_version_semver = current_version.semver_parts
  new_version_semver = new_version.semver_parts

  # If semver_parts is nil for either, return default cooldown
  return cooldown.default_days if current_version_semver.nil? || new_version_semver.nil?

  # Ensure values are always integers
  current_major, current_minor, current_patch = current_version_semver
  new_major, new_minor, new_patch = new_version_semver

  # Determine cooldown based on version difference
  return cooldown.semver_major_days if new_major > current_major
  return cooldown.semver_minor_days if new_minor > current_minor
  return cooldown.semver_patch_days if new_patch > current_patch

  cooldown.default_days
end

#cooldown_enabled?Boolean

Returns:

  • (Boolean)


159
160
161
162
163
164
165
166
167
# File 'lib/dependabot/swift/update_checker/latest_version_resolver.rb', line 159

def cooldown_enabled?
  return false if cooldown_options.nil?

  cooldown = T.must(cooldown_options)
  cooldown.default_days.to_i.positive? ||
    cooldown.semver_major_days.to_i.positive? ||
    cooldown.semver_minor_days.to_i.positive? ||
    cooldown.semver_patch_days.to_i.positive?
end

#latest_version_tagObject



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/dependabot/swift/update_checker/latest_version_resolver.rb', line 54

def latest_version_tag
  # step one fetch allowed version tags and
  return git_commit_checker.local_tag_for_latest_version unless cooldown_enabled?

  allowed_version_tags = git_commit_checker.allowed_version_tags
  select_version_tags_in_cooldown_period&.each do |tag_name|
    # filter out if name is in cooldown period
    allowed_version_tags.reject! do |gitref_filtered|
      gitref_filtered.name == tag_name
    end
  end

  git_commit_checker.max_local_tag(allowed_version_tags)
rescue StandardError => e
  Dependabot.logger.error("Error fetching latest version tag: #{e.message}")
  git_commit_checker.local_tag_for_latest_version
end

#package_details_fetcherObject



147
148
149
150
151
152
153
154
155
156
# File 'lib/dependabot/swift/update_checker/latest_version_resolver.rb', line 147

def package_details_fetcher
  @package_details_fetcher ||= T.let(
    Package::PackageDetailsFetcher.new(
      dependency: dependency,
      credentials: credentials,
      git_commit_checker: git_commit_checker
    ),
    T.nilable(Package::PackageDetailsFetcher)
  )
end

#release_date_to_seconds(release_date) ⇒ Object



137
138
139
140
141
142
143
144
# File 'lib/dependabot/swift/update_checker/latest_version_resolver.rb', line 137

def release_date_to_seconds(release_date)
  return 0 unless release_date

  Time.parse(release_date).to_i
rescue ArgumentError => e
  Dependabot.logger.error("Invalid release date format: #{release_date} and error: #{e.message}")
  0 # Default to 360 days in seconds if parsing fails, so that it will not be in cooldown
end

#select_version_tags_in_cooldown_periodObject



73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/dependabot/swift/update_checker/latest_version_resolver.rb', line 73

def select_version_tags_in_cooldown_period
  version_tags_in_cooldown_period = T.let([], T::Array[String])

  package_details_fetcher.fetch_tag_and_release_date.each do |git_tag_with_detail|
    if check_if_version_in_cooldown_period?(git_tag_with_detail)
      version_tags_in_cooldown_period << git_tag_with_detail.tag
    end
  end
  version_tags_in_cooldown_period
rescue StandardError => e
  Dependabot.logger.error("Error checking if version is in cooldown: #{e.message}")
  version_tags_in_cooldown_period
end

#version_classObject



132
133
134
# File 'lib/dependabot/swift/update_checker/latest_version_resolver.rb', line 132

def version_class
  dependency.version_class
end