Class: Dependabot::Terraform::UpdateChecker::LatestVersionResolver

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
Defined in:
lib/dependabot/terraform/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.



25
26
27
28
29
30
31
32
33
# File 'lib/dependabot/terraform/update_checker/latest_version_resolver.rb', line 25

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

#credentialsObject (readonly)

Returns the value of attribute credentials.



213
214
215
# File 'lib/dependabot/terraform/update_checker/latest_version_resolver.rb', line 213

def credentials
  @credentials
end

#dependencyObject (readonly)

Returns the value of attribute dependency.



36
37
38
# File 'lib/dependabot/terraform/update_checker/latest_version_resolver.rb', line 36

def dependency
  @dependency
end

#git_commit_checkerObject (readonly)

Returns the value of attribute git_commit_checker.



210
211
212
# File 'lib/dependabot/terraform/update_checker/latest_version_resolver.rb', line 210

def git_commit_checker
  @git_commit_checker
end

Instance Method Details

#check_if_version_in_cooldown_period?(release_date) ⇒ Boolean

Returns:

  • (Boolean)


134
135
136
137
138
139
140
141
142
143
144
145
146
# File 'lib/dependabot/terraform/update_checker/latest_version_resolver.rb', line 134

def check_if_version_in_cooldown_period?(release_date)
  return false unless release_date.length.positive?

  cooldown = @cooldown_options
  return false unless cooldown

  return false if cooldown.nil?

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

#cooldown_enabled?Boolean

Returns:

  • (Boolean)


199
200
201
202
203
204
205
206
207
# File 'lib/dependabot/terraform/update_checker/latest_version_resolver.rb', line 199

def cooldown_enabled?
  # This is a simple check to see if user has put cooldown days.
  # If not set, then we aassume user does not want cooldown.
  # Since Terraform does not support Semver versioning, So option left
  # for the user is to set cooldown default days.
  return false if @cooldown_options.nil?

  @cooldown_options.default_days.positive?
end

#filter_versions_in_cooldown_period_from_module(versions) ⇒ Object



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/dependabot/terraform/update_checker/latest_version_resolver.rb', line 97

def filter_versions_in_cooldown_period_from_module(versions)
  # to make call for registry to get the versions
  # step one fetch allowed version tags and

  # sort the allowed version tags by name in descending order
  select_tags_which_in_cooldown_from_module&.each do |tag_name|
    # Iterate through versions and filter out those matching the tag_name
    versions.reject! do |version|
      version.to_s == tag_name
    end
  end
  Dependabot.logger.info(
    "filter_versions_in_cooldown_period_from_module::
      Allowed version tags after filtering versions in cooldown:#{versions.map(&:to_s).join(', ')}"
  )
  versions
rescue StandardError => e
  Dependabot.logger.error("Error fetching latest version tag: #{e.message}")
  versions
end

#filter_versions_in_cooldown_period_from_provider(versions) ⇒ Object



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/dependabot/terraform/update_checker/latest_version_resolver.rb', line 71

def filter_versions_in_cooldown_period_from_provider(versions)
  # to make call for registry to get the versions
  # step one fetch allowed version tags and

  # sort the allowed version tags by name in descending order
  select_tags_which_in_cooldown_from_provider&.each do |tag_name|
    # Iterate through versions and filter out those matching the tag_name
    versions.reject! do |version|
      version.to_s == tag_name
    end
  end
  Dependabot.logger.info(
    "Allowed version tags after filtering versions in cooldown:
        #{versions.map(&:to_s).join(', ')}"
  )
  versions
rescue StandardError => e
  Dependabot.logger.error("Error filter_versions_in_cooldown_period_from_provider(versions): #{e.message}")
  versions
end

#latest_version_tagObject



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/dependabot/terraform/update_checker/latest_version_resolver.rb', line 42

def latest_version_tag
  # step one fetch allowed version tags and
  allowed_version_tags = git_commit_checker.allowed_version_tags
  begin
    if cooldown_enabled?
      # sort the allowed version tags by name in descending order
      select_version_tags_in_cooldown_period&.each do |tag_name|
        # filter out if name is not in cooldown period
        allowed_version_tags.reject! do |gitref_filtered|
          true if gitref_filtered.name == tag_name
        end
      end
    end
    Dependabot.logger.info(
      "Allowed version tags after filtering versions in cooldown:
      #{allowed_version_tags.map(&:name).join(', ')}"
    )
    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
end

#package_details_fetcherObject



187
188
189
190
191
192
193
194
195
196
# File 'lib/dependabot/terraform/update_checker/latest_version_resolver.rb', line 187

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



149
150
151
152
153
154
# File 'lib/dependabot/terraform/update_checker/latest_version_resolver.rb', line 149

def release_date_to_seconds(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_tags_which_in_cooldown_from_moduleObject



172
173
174
175
176
177
178
179
180
181
182
183
184
# File 'lib/dependabot/terraform/update_checker/latest_version_resolver.rb', line 172

def select_tags_which_in_cooldown_from_module
  version_tags_in_cooldown_from_module = T.let([], T::Array[String])

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

#select_tags_which_in_cooldown_from_providerObject



157
158
159
160
161
162
163
164
165
166
167
168
169
# File 'lib/dependabot/terraform/update_checker/latest_version_resolver.rb', line 157

def select_tags_which_in_cooldown_from_provider
  version_tags_in_cooldown_from_provider = T.let([], T::Array[String])

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

#select_version_tags_in_cooldown_periodObject



119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/dependabot/terraform/update_checker/latest_version_resolver.rb', line 119

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?(T.must(git_tag_with_detail.release_date))
      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