Class: Dependabot::Terraform::Package::PackageDetailsFetcher

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
Defined in:
lib/dependabot/terraform/package/package_details_fetcher.rb

Constant Summary collapse

RELEASES_URL_GIT =
"https://api.github.com/repos/"
RELEASE_URL_FOR_PROVIDER =
"https://registry.terraform.io/v2/providers/"
RELEASE_URL_FOR_MODULE =
"https://registry.terraform.io/v2/modules/"
APPLICATION_JSON =
"JSON"
INCLUDE_FOR_PROVIDER =
"?include=provider-versions"
INCLUDE_FOR_MODULE =
"?include=module-versions"
ELIGIBLE_SOURCE_TYPES =
T.let(
  %w(git provider registry).freeze,
  T::Array[String]
)

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(dependency:, credentials:, git_commit_checker:) ⇒ PackageDetailsFetcher

Returns a new instance of PackageDetailsFetcher.



38
39
40
41
42
# File 'lib/dependabot/terraform/package/package_details_fetcher.rb', line 38

def initialize(dependency:, credentials:, git_commit_checker:)
  @dependency = dependency
  @credentials = credentials
  @git_commit_checker = git_commit_checker
end

Instance Attribute Details

#credentialsObject (readonly)

Returns the value of attribute credentials.



48
49
50
# File 'lib/dependabot/terraform/package/package_details_fetcher.rb', line 48

def credentials
  @credentials
end

#git_commit_checkerObject (readonly)

Returns the value of attribute git_commit_checker.



45
46
47
# File 'lib/dependabot/terraform/package/package_details_fetcher.rb', line 45

def git_commit_checker
  @git_commit_checker
end

Instance Method Details

#dependency_source_detailsObject



140
141
142
143
144
# File 'lib/dependabot/terraform/package/package_details_fetcher.rb', line 140

def dependency_source_details
  return nil unless @dependency.source_details

  @dependency.source_details(allowed_types: ELIGIBLE_SOURCE_TYPES)
end

#fetch_tag_and_release_dateObject



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/dependabot/terraform/package/package_details_fetcher.rb', line 51

def fetch_tag_and_release_date
  truncate_github_url = @dependency.name.gsub("github.com/", "")
  url = RELEASES_URL_GIT + "#{truncate_github_url}/releases"
  result_lines = T.let([], T::Array[GitTagWithDetail])
  # Fetch the releases from the GitHub API
  response = Excon.get(url, headers: { "Accept" => "application/vnd.github.v3+json" })
  Dependabot.logger.error("Failed call details: #{response.body}") unless response.status == 200
  return result_lines unless response.status == 200

  # Parse the JSON response
  releases = JSON.parse(response.body)

  # Extract version names and release dates into a hash
  releases.map do |release|
    result_lines << GitTagWithDetail.new(
      tag: release["tag_name"],
      release_date: release["published_at"]
    )
  end

  # sort the result lines by tag in descending order
  result_lines = result_lines.sort_by(&:tag).reverse
  # Log the extracted details for debugging
  Dependabot.logger.info("Extracted release details: #{result_lines}")
  result_lines
end

#fetch_tag_and_release_date_from_moduleObject



111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# File 'lib/dependabot/terraform/package/package_details_fetcher.rb', line 111

def fetch_tag_and_release_date_from_module
  return [] unless dependency_source_details

  url = RELEASE_URL_FOR_MODULE + dependency_source_details&.fetch(:module_identifier) +
        INCLUDE_FOR_MODULE
  Dependabot.logger.info("Fetching provider release details from URL: #{url}")
  result_lines = T.let([], T::Array[GitTagWithDetail])
  # Fetch the releases from the provider API
  response = Excon.get(url, headers: { "Accept" => "application/vnd.github.v3+json" })
  Dependabot.logger.error("Failed call details: #{response.body}") unless response.status == 200
  return result_lines unless response.status == 200

  # Parse the JSON response
  releases = JSON.parse(response.body).fetch("included", [])
                 .select { |item| item["type"] == "module-versions" }
  releases = releases.map { |release| release.fetch("attributes", {}) }

  # Extract version names and release dates into result_lines
  releases.each do |release|
    result_lines << GitTagWithDetail.new(
      tag: release["version"],
      release_date: release["published-at"]
    )
  end
  # Sort the result lines by tag in descending order
  result_lines.sort_by(&:tag).reverse
end

#fetch_tag_and_release_date_from_providerObject

rubocop:disable Metrics/AbcSize,Metrics/PerceivedComplexity



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/dependabot/terraform/package/package_details_fetcher.rb', line 79

def fetch_tag_and_release_date_from_provider # rubocop:disable Metrics/AbcSize,Metrics/PerceivedComplexity
  return [] unless dependency_source_details

  url = RELEASE_URL_FOR_PROVIDER + dependency_source_details&.fetch(:module_identifier) +
        INCLUDE_FOR_PROVIDER
  Dependabot.logger.info("Fetching provider release details from URL: #{url}")
  result_lines = T.let([], T::Array[GitTagWithDetail])
  # Fetch the releases from the provider API
  response = Excon.get(url, headers: { "Accept" => "application/vnd.github.v3+json" })
  Dependabot.logger.error("Failed call details: #{response.body}") unless response.status == 200
  return result_lines unless response.status == 200

  # Parse the JSON response
  releases = JSON.parse(response.body).fetch("included", [])
                 .select { |item| item["type"] == "provider-versions" }
  releases = releases.map { |release| release.fetch("attributes", {}) }
  # Check if releases is an array and not empty
  return result_lines unless releases.is_a?(Array) && !releases.empty?

  # Extract version names and release dates into result_lines
  releases.each do |release|
    result_lines << GitTagWithDetail.new(
      tag: release["version"],
      release_date: release["published-at"]
    )
  end
  # Sort the result lines by tag in descending order
  result_lines.sort_by(&:tag).reverse
end