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.



159
160
161
# File 'lib/dependabot/terraform/update_checker/latest_version_resolver.rb', line 159

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.



156
157
158
# File 'lib/dependabot/terraform/update_checker/latest_version_resolver.rb', line 156

def git_commit_checker
  @git_commit_checker
end

Instance Method Details

#check_if_version_in_cooldown_period?(release_date) ⇒ Boolean

Returns:

  • (Boolean)


91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/dependabot/terraform/update_checker/latest_version_resolver.rb', line 91

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

#filter_versions_in_cooldown_period_from_module(versions) ⇒ Object



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

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.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



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

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.join(', ')}"
  )
  versions
rescue StandardError => e
  Dependabot.logger.error("Error filter_versions_in_cooldown_period_from_provider(versions): #{e.message}")
  versions
end

#package_details_fetcherObject



144
145
146
147
148
149
150
151
152
153
# File 'lib/dependabot/terraform/update_checker/latest_version_resolver.rb', line 144

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



106
107
108
109
110
111
# File 'lib/dependabot/terraform/update_checker/latest_version_resolver.rb', line 106

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



129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/dependabot/terraform/update_checker/latest_version_resolver.rb', line 129

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



114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/dependabot/terraform/update_checker/latest_version_resolver.rb', line 114

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