Class: Dependabot::Devcontainers::Package::PackageDetailsFetcher

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(dependency:) ⇒ PackageDetailsFetcher

Returns a new instance of PackageDetailsFetcher.



27
28
29
# File 'lib/dependabot/devcontainers/package/package_details_fetcher.rb', line 27

def initialize(dependency:)
  @dependency = dependency
end

Instance Attribute Details

#dependencyObject (readonly)

Returns the value of attribute dependency.



32
33
34
# File 'lib/dependabot/devcontainers/package/package_details_fetcher.rb', line 32

def dependency
  @dependency
end

Instance Method Details

#fetch_package_releasesObject



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/dependabot/devcontainers/package/package_details_fetcher.rb', line 35

def fetch_package_releases
  releases = T.let([], T::Array[Dependabot::Package::PackageRelease])

  begin
    Dependabot.logger.info("Fetching package info (Dev Containers) for #{dependency.name}")

    cmd = "devcontainer features info tags #{dependency.name} --output-format json"
    Dependabot.logger.info("Running command: `#{cmd}`")

    output = SharedHelpers.run_shell_command(cmd, stderr_to_stdout: false)
     = JSON.parse(output).fetch("publishedTags")

    .each do |release|
      next unless version_class.correct?(release) &&
                  T.cast(version_class.new(release), Dependabot::Devcontainers::Version)

      releases << Dependabot::Package::PackageRelease.new(
        version: Devcontainers::Version.new(release),
        released_at: nil
      )
    end

    releases.sort_by!(&:version)
  rescue StandardError => e
    Dependabot.logger.error("Error while fetching package info for dev container packages: #{e.message}")
    releases
  end
end

#fetch_release_metadata(release:) ⇒ Object



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/dependabot/devcontainers/package/package_details_fetcher.rb', line 67

def (release:)
  Dependabot.logger.info("Fetching release metadata (Dev Containers) for #{dependency.name}:#{release.version}")

  response = fetch_response(release: release)
  return release unless response.status == 200

   = JSON.parse(response.body)["layers"][0]
  released_at = ["annotations"]["org.opencontainers.image.created"]

  release.instance_variable_set(:@tag, ["digest"])

  # Annotations properties are optional, So getting a release date is not guaranteed.
  # https://specs.opencontainers.org/image-spec/annotations/#annotations
  release.instance_variable_set(
    :@released_at,
    released_at ? Time.parse(released_at) : nil
  )

  release
rescue StandardError => e
  Dependabot.logger.error(
    "Error while fetching metadata (Dev Container) " \
    "for #{dependency.name}: #{e.message}"
  )
  release
end