dependabot-docker 0.385.0 → 0.386.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cd34c41d8f34c7fbd8a68dac70aa18a7a7aec37180044321b75b6b9add0f31cb
4
- data.tar.gz: 3c2c803bab214190b06d60ffe76c4de7781cc81254403a616220d685f1040347
3
+ metadata.gz: ffe99e23ddb69d7afac96bf33d403c43b104fa4498dc2ad969025db5cc2dc391
4
+ data.tar.gz: '0785c238b7814483f797a6d31642deb80748a718b386be4f188dc32886d7b6c5'
5
5
  SHA512:
6
- metadata.gz: 971bb0776d6b9910f0d8f12f1e8f8f124a8b614b7ce68f9b4f9e48ec4e312ebd06180f6b26bd95d6c9827f5e99a440458ac96e30e56f4a1deef3ea38e6641537
7
- data.tar.gz: f3d93ecfb28273c0af1fe959cc830b67121c20ec8010f086865bbcf3191bbff301da0e406b7305a609e946ae6342898a50b815eea776bf782f09512f3dccc585
6
+ metadata.gz: bb35d82d30d4764f37e39346ab21907caa08a895fc7c01d13c3d5e31c916a8b7376fef385c38d77e5dd93c230dd8fc9716f1b642642e4230dfa4db16f5e10cb3
7
+ data.tar.gz: a451bc5070ef987e560032f7761cb8a29d349947cb4dc9e4988a9954fd3e554538f56cde67347ab23a5feb6fb2a6da6e7633eba9a4072a8d063689dcd95b03e9
@@ -1,4 +1,4 @@
1
- # typed: strict
1
+ # typed: strong
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "dependabot/shared/shared_file_parser"
@@ -120,7 +120,7 @@ module Dependabot
120
120
  end
121
121
  end
122
122
 
123
- sig { params(json_object: T::Hash[T.untyped, T.untyped]).returns(T::Array[String]) }
123
+ sig { params(json_object: T::Hash[Object, Object]).returns(T::Array[String]) }
124
124
  def deep_fetch_images_from_hash(json_object)
125
125
  img = json_object.fetch("image", nil)
126
126
 
@@ -136,13 +136,13 @@ module Dependabot
136
136
  images + json_object.values.flat_map { |obj| deep_fetch_images(obj) }
137
137
  end
138
138
 
139
- sig { params(img_hash: T::Hash[String, T.nilable(String)]).returns(T::Array[String]) }
139
+ sig { params(img_hash: T::Hash[Object, Object]).returns(T::Array[String]) }
140
140
  def parse_helm(img_hash)
141
141
  tag_value = img_hash.key?("tag") ? img_hash.fetch("tag", nil) : img_hash.fetch("version", nil)
142
142
  return [] unless tag_value
143
143
 
144
144
  repo = img_hash.fetch("repository", nil)
145
- return [] unless repo
145
+ return [] unless repo.is_a?(String)
146
146
 
147
147
  match = tag_value.to_s.match(TAG_WITH_DIGEST)
148
148
  return [] unless match
@@ -11,6 +11,14 @@ module Dependabot
11
11
  class MetadataFinder < Dependabot::MetadataFinders::Base
12
12
  extend T::Sig
13
13
 
14
+ DockerSource = T.type_alias do
15
+ T::Hash[Symbol, T.nilable(String)]
16
+ end
17
+
18
+ ImageDetails = T.type_alias do
19
+ T::Hash[String, Object]
20
+ end
21
+
14
22
  private
15
23
 
16
24
  # Finds the repository for the Docker image using OCI annotations.
@@ -23,8 +31,7 @@ module Dependabot
23
31
  return unless new_source && new_source[:registry] && (new_source[:tag] || new_source[:digest])
24
32
 
25
33
  details = image_details(new_source)
26
- image_source = details.dig("config", "Labels", "org.opencontainers.image.source")
27
- # Return early if the org.opencontainers.image.source label is not present
34
+ image_source = image_label(details, "org.opencontainers.image.source")
28
35
  return unless image_source
29
36
 
30
37
  # If we have a tag, return the source directly without additional version metadata
@@ -39,9 +46,9 @@ module Dependabot
39
46
 
40
47
  sig do
41
48
  params(
42
- source: T::Hash[Symbol, T.untyped]
49
+ source: DockerSource
43
50
  ).returns(
44
- T::Hash[String, T.untyped]
51
+ ImageDetails
45
52
  )
46
53
  end
47
54
  def image_details(source)
@@ -62,18 +69,35 @@ module Dependabot
62
69
  JSON.parse(output)
63
70
  end
64
71
 
72
+ sig { params(details: ImageDetails).returns(T.nilable(T::Hash[String, Object])) }
73
+ def image_labels(details)
74
+ config = details["config"]
75
+ return unless config.is_a?(Hash)
76
+
77
+ labels = config["Labels"]
78
+ return unless labels.is_a?(Hash)
79
+
80
+ labels
81
+ end
82
+
83
+ sig { params(details: ImageDetails, label: String).returns(T.nilable(String)) }
84
+ def image_label(details, label)
85
+ value = image_labels(details)&.fetch(label, nil)
86
+ value if value.is_a?(String)
87
+ end
88
+
65
89
  # Builds a Dependabot::Source object using the OCI image version label.
66
90
  #
67
91
  # This is used as a fallback when an image is referenced by digest rather than a tag
68
92
  sig do
69
93
  params(
70
94
  image_source: String,
71
- details: T::Hash[String, T.untyped]
95
+ details: ImageDetails
72
96
  ).returns(T.nilable(Dependabot::Source))
73
97
  end
74
98
  def build_source_from_image_version(image_source, details)
75
- image_version = details.dig("config", "Labels", "org.opencontainers.image.version")
76
- revision = details.dig("config", "Labels", "org.opencontainers.image.revision")
99
+ image_version = image_label(details, "org.opencontainers.image.version")
100
+ revision = image_label(details, "org.opencontainers.image.revision")
77
101
  # Sometimes the versions are not tags (e.g., "24.04")
78
102
  # We only want to build a source if the version looks like a tag (starts with "v")
79
103
  # This is a safeguard for a first iteration. We may adjust this later based on user feedback.
@@ -25,7 +25,7 @@ rescue LoadError
25
25
  class Response
26
26
  extend T::Sig
27
27
 
28
- sig { returns(T::Hash[T.untyped, T.untyped]) }
28
+ sig { returns(T::Hash[Symbol, String]) }
29
29
  def headers
30
30
  {}
31
31
  end
@@ -80,6 +80,18 @@ module Dependabot
80
80
  # so we cap the attempts to avoid rate limiting or excessive latency.
81
81
  MAX_PLATFORM_VALIDATION_ATTEMPTS = T.let(5, Integer)
82
82
 
83
+ DockerSource = T.type_alias do
84
+ T::Hash[Symbol, T.nilable(String)]
85
+ end
86
+
87
+ ManifestHash = T.type_alias do
88
+ T::Hash[T.any(String, Symbol), Object]
89
+ end
90
+
91
+ ManifestList = T.type_alias do
92
+ T::Array[ManifestHash]
93
+ end
94
+
83
95
  # Legacy patterns used when docker_created_timestamp_validation experiment is disabled.
84
96
  # The broad alphanumeric regex matches tokens like "alpine3", "ltsc2022", "rc1"
85
97
  # and classifies them as version-related, preserving pre-experiment behavior.
@@ -220,7 +232,7 @@ module Dependabot
220
232
  digest_requirements.all? { |req| digest_requirement_up_to_date?(req) }
221
233
  end
222
234
 
223
- sig { params(req: T::Hash[Symbol, T.untyped]).returns(T::Boolean) }
235
+ sig { params(req: Dependabot::DependencyRequirement).returns(T::Boolean) }
224
236
  def digest_requirement_up_to_date?(req)
225
237
  source = req.fetch(:source)
226
238
  source_digest = source.fetch(:digest)
@@ -467,8 +479,7 @@ module Dependabot
467
479
  client.dohead "v2/#{docker_repo_name}/#{endpoint}/#{first_digest}"
468
480
  end
469
481
 
470
- last_modified = head_response.headers[:last_modified]
471
- published_date = last_modified ? Time.parse(last_modified) : nil
482
+ published_date = published_date_from_response_headers(head_response.headers, tag.name)
472
483
 
473
484
  Dependabot::Package::PackageRelease.new(
474
485
  version: release_version_for(tag),
@@ -489,9 +500,25 @@ module Dependabot
489
500
  nil
490
501
  end
491
502
 
503
+ sig { params(headers: T::Hash[Symbol, String], tag_name: String).returns(T.nilable(Time)) }
504
+ def published_date_from_response_headers(headers, tag_name)
505
+ last_modified = headers[:last_modified]
506
+ published_date = begin
507
+ Time.parse(last_modified) if last_modified
508
+ rescue ArgumentError, TypeError => e
509
+ Dependabot.logger.info(
510
+ "Invalid Last-Modified header for #{docker_repo_name}:#{tag_name}: #{e.message}"
511
+ )
512
+ nil
513
+ end
514
+ # Fall back to the image config blob's "created" timestamp when Last-Modified
515
+ # is absent (e.g., Docker Hub multi-arch manifest lists).
516
+ published_date || fetch_image_config_created(tag_name)
517
+ end
518
+
492
519
  sig do
493
520
  params(
494
- digest_info: T.untyped,
521
+ digest_info: Object,
495
522
  tag: Dependabot::Docker::Tag
496
523
  ).returns(T.nilable(String))
497
524
  end
@@ -505,7 +532,8 @@ module Dependabot
505
532
  )
506
533
  return nil
507
534
  end
508
- digest_info.first&.fetch("digest")
535
+ digest = digest_info.first&.fetch("digest")
536
+ digest if digest.is_a?(String)
509
537
  when String
510
538
  digest_info
511
539
  else
@@ -518,11 +546,11 @@ module Dependabot
518
546
  end
519
547
 
520
548
  sig do
521
- params(
549
+ type_parameters(:Result).params(
522
550
  max_attempts: Integer,
523
551
  errors: T::Array[T.class_of(StandardError)],
524
- _blk: T.proc.returns(T.untyped)
525
- ).returns(T.untyped)
552
+ _blk: T.proc.returns(T.type_parameter(:Result))
553
+ ).returns(T.type_parameter(:Result))
526
554
  end
527
555
  def with_retries(max_attempts: 3, errors: [], &_blk)
528
556
  attempt = 0
@@ -912,7 +940,7 @@ module Dependabot
912
940
  end
913
941
  end
914
942
 
915
- sig { returns(T::Array[T::Hash[Symbol, T.untyped]]) }
943
+ sig { returns(T::Array[Dependabot::DependencyRequirement]) }
916
944
  def digest_requirements
917
945
  dependency.requirements.select do |requirement|
918
946
  requirement.dig(:source, :digest)
@@ -1027,7 +1055,7 @@ module Dependabot
1027
1055
  # digest moved; otherwise this is a genuine version/digest change.
1028
1056
  sig do
1029
1057
  params(
1030
- source: T::Hash[Symbol, T.untyped],
1058
+ source: DockerSource,
1031
1059
  current_digest: String,
1032
1060
  expected_digest: String,
1033
1061
  digest_only_refresh: T::Boolean
@@ -1045,7 +1073,7 @@ module Dependabot
1045
1073
  # Fails open (returns false) whenever a confident comparison isn't possible.
1046
1074
  sig do
1047
1075
  params(
1048
- source: T::Hash[Symbol, T.untyped],
1076
+ source: DockerSource,
1049
1077
  current_digest: String,
1050
1078
  candidate_digest: String
1051
1079
  ).returns(T::Boolean)
@@ -1109,8 +1137,11 @@ module Dependabot
1109
1137
  resolved = resolve_platform_manifest(manifest)
1110
1138
  return nil unless resolved
1111
1139
 
1112
- config_digest = resolved.dig("config", "digest")
1113
- return nil unless config_digest
1140
+ config = resolved["config"]
1141
+ return nil unless config.is_a?(Hash)
1142
+
1143
+ config_digest = config["digest"]
1144
+ return nil unless config_digest.is_a?(String)
1114
1145
 
1115
1146
  parse_created_from_config_blob(config_digest)
1116
1147
  end
@@ -1137,13 +1168,11 @@ module Dependabot
1137
1168
  # Resolves a manifest to a single platform-specific manifest.
1138
1169
  # If the manifest is a manifest list (multi-arch), selects the most
1139
1170
  # appropriate platform (preferring linux/amd64).
1140
- sig { params(manifest: T.untyped).returns(T.nilable(T::Hash[String, T.untyped])) }
1171
+ sig { params(manifest: ManifestHash).returns(T.nilable(ManifestHash)) }
1141
1172
  def resolve_platform_manifest(manifest)
1142
1173
  media_type = manifest["mediaType"] || manifest[:mediaType]
1143
1174
 
1144
- unless MANIFEST_LIST_TYPES.include?(media_type)
1145
- return manifest.is_a?(Hash) ? manifest : manifest.to_h
1146
- end
1175
+ return manifest unless MANIFEST_LIST_TYPES.include?(media_type)
1147
1176
 
1148
1177
  platform_digest = select_platform_digest(manifest)
1149
1178
  return nil unless platform_digest
@@ -1157,19 +1186,25 @@ module Dependabot
1157
1186
 
1158
1187
  # Selects the digest of the best platform-specific manifest from a manifest list,
1159
1188
  # preferring linux/amd64.
1160
- sig { params(manifest: T.untyped).returns(T.nilable(String)) }
1189
+ sig { params(manifest: ManifestHash).returns(T.nilable(String)) }
1161
1190
  def select_platform_digest(manifest)
1162
1191
  manifests = manifest["manifests"] || manifest[:manifests] || []
1192
+ return nil unless manifests.is_a?(Array)
1163
1193
  return nil if manifests.empty?
1164
1194
 
1165
1195
  selected = find_amd64_manifest(manifests) || manifests.first
1166
- selected&.dig("digest") || selected&.dig(:digest)
1196
+ return nil unless selected.is_a?(Hash)
1197
+
1198
+ digest = selected["digest"] || selected[:digest]
1199
+ digest if digest.is_a?(String)
1167
1200
  end
1168
1201
 
1169
- sig { params(manifests: T.untyped).returns(T.untyped) }
1202
+ sig { params(manifests: ManifestList).returns(T.nilable(ManifestHash)) }
1170
1203
  def find_amd64_manifest(manifests)
1171
1204
  manifests.find do |m|
1172
1205
  platform = m["platform"] || m[:platform] || {}
1206
+ next false unless platform.is_a?(Hash)
1207
+
1173
1208
  (platform["architecture"] || platform[:architecture]) == "amd64"
1174
1209
  end
1175
1210
  end
@@ -1338,7 +1373,7 @@ module Dependabot
1338
1373
  # array of per-platform manifest entries, or nil for single-platform images
1339
1374
  # (not a manifest list). Cached so the platform-inspection methods below
1340
1375
  # share a single registry GET per tag.
1341
- sig { params(tag_name: String).returns(T.nilable(T::Array[T::Hash[String, T.untyped]])) }
1376
+ sig { params(tag_name: String).returns(T.nilable(ManifestList)) }
1342
1377
  def fetch_manifest_list(tag_name)
1343
1378
  return manifest_list_cache[tag_name] if manifest_list_cache.key?(tag_name)
1344
1379
 
@@ -1356,7 +1391,7 @@ module Dependabot
1356
1391
  nil
1357
1392
  end
1358
1393
 
1359
- sig { params(tag_name: String).returns(T.nilable(T::Array[T::Hash[String, T.untyped]])) }
1394
+ sig { params(tag_name: String).returns(T.nilable(ManifestList)) }
1360
1395
  def fetch_manifest_list_from_registry(tag_name)
1361
1396
  manifest = with_retries(max_attempts: 3, errors: transient_docker_errors) do
1362
1397
  docker_registry_client.manifest(docker_repo_name, tag_name)
@@ -1365,7 +1400,10 @@ module Dependabot
1365
1400
  media_type = manifest["mediaType"] || manifest[:mediaType]
1366
1401
  return nil unless MANIFEST_LIST_TYPES.include?(media_type)
1367
1402
 
1368
- manifest["manifests"] || manifest[:manifests] || []
1403
+ manifests = manifest["manifests"] || manifest[:manifests] || []
1404
+ return [] unless manifests.is_a?(Array)
1405
+
1406
+ manifests.grep(Hash)
1369
1407
  end
1370
1408
 
1371
1409
  # Fetches a map of platform key (e.g. "linux/amd64") to platform manifest
@@ -1395,7 +1433,7 @@ module Dependabot
1395
1433
  collect_platform_digests(manifests)
1396
1434
  end
1397
1435
 
1398
- sig { params(manifests: T.untyped).returns(T::Hash[String, String]) }
1436
+ sig { params(manifests: ManifestList).returns(T::Hash[String, String]) }
1399
1437
  def collect_platform_digests(manifests)
1400
1438
  digests = {}
1401
1439
 
@@ -1404,7 +1442,7 @@ module Dependabot
1404
1442
  next unless platform
1405
1443
 
1406
1444
  digest = m["digest"] || m[:digest]
1407
- next unless digest
1445
+ next unless digest.is_a?(String)
1408
1446
 
1409
1447
  digests[platform_key(platform)] = digest
1410
1448
  end
@@ -1414,7 +1452,7 @@ module Dependabot
1414
1452
 
1415
1453
  # Fetches the platform entries from a manifest list for a given tag.
1416
1454
  # Returns nil if the tag is a single-platform image (not a manifest list).
1417
- sig { params(tag_name: String).returns(T.nilable(T::Array[T::Hash[String, T.untyped]])) }
1455
+ sig { params(tag_name: String).returns(T.nilable(ManifestList)) }
1418
1456
  def fetch_manifest_platforms(tag_name)
1419
1457
  return manifest_platforms_cache[tag_name] if manifest_platforms_cache.key?(tag_name)
1420
1458
 
@@ -1430,7 +1468,7 @@ module Dependabot
1430
1468
  nil
1431
1469
  end
1432
1470
 
1433
- sig { params(tag_name: String).returns(T.nilable(T::Array[T::Hash[String, T.untyped]])) }
1471
+ sig { params(tag_name: String).returns(T.nilable(ManifestList)) }
1434
1472
  def fetch_manifest_platforms_from_registry(tag_name)
1435
1473
  manifests = fetch_manifest_list(tag_name)
1436
1474
  return nil unless manifests
@@ -1452,10 +1490,10 @@ module Dependabot
1452
1490
  digests
1453
1491
  end
1454
1492
 
1455
- sig { params(manifest_entry: T.untyped).returns(T.nilable(T::Hash[String, T.untyped])) }
1493
+ sig { params(manifest_entry: ManifestHash).returns(T.nilable(ManifestHash)) }
1456
1494
  def extract_platform(manifest_entry)
1457
1495
  platform = manifest_entry["platform"] || manifest_entry[:platform]
1458
- return unless platform
1496
+ return unless platform.is_a?(Hash)
1459
1497
 
1460
1498
  os = platform["os"] || platform[:os]
1461
1499
  arch = platform["architecture"] || platform[:architecture]
@@ -1465,7 +1503,7 @@ module Dependabot
1465
1503
  end
1466
1504
 
1467
1505
  # Builds a normalized string key from a platform hash, e.g. "linux/amd64" or "linux/arm64/v8"
1468
- sig { params(platform: T::Hash[T.any(String, Symbol), T.untyped]).returns(String) }
1506
+ sig { params(platform: ManifestHash).returns(String) }
1469
1507
  def platform_key(platform)
1470
1508
  os = platform["os"] || platform[:os]
1471
1509
  arch = platform["architecture"] || platform[:architecture]
@@ -1502,7 +1540,7 @@ module Dependabot
1502
1540
  collect_platform_timestamps(manifests)
1503
1541
  end
1504
1542
 
1505
- sig { params(manifests: T.untyped).returns(T::Hash[String, T.nilable(Time)]) }
1543
+ sig { params(manifests: ManifestList).returns(T::Hash[String, T.nilable(Time)]) }
1506
1544
  def collect_platform_timestamps(manifests)
1507
1545
  timestamps = {}
1508
1546
 
@@ -1511,7 +1549,7 @@ module Dependabot
1511
1549
  next unless platform
1512
1550
 
1513
1551
  digest = m["digest"] || m[:digest]
1514
- next unless digest
1552
+ next unless digest.is_a?(String)
1515
1553
 
1516
1554
  key = platform_key(platform)
1517
1555
  timestamps[key] = fetch_platform_created_timestamp(digest)
@@ -1533,11 +1571,11 @@ module Dependabot
1533
1571
  parse_created_from_config_blob(config_digest)
1534
1572
  end
1535
1573
 
1536
- sig { returns(T::Hash[String, T.nilable(T::Array[T::Hash[String, T.untyped]])]) }
1574
+ sig { returns(T::Hash[String, T.nilable(ManifestList)]) }
1537
1575
  def manifest_list_cache
1538
1576
  @manifest_list_cache ||= T.let(
1539
1577
  {},
1540
- T.nilable(T::Hash[String, T.nilable(T::Array[T::Hash[String, T.untyped]])])
1578
+ T.nilable(T::Hash[String, T.nilable(ManifestList)])
1541
1579
  )
1542
1580
  end
1543
1581
 
@@ -1549,11 +1587,11 @@ module Dependabot
1549
1587
  )
1550
1588
  end
1551
1589
 
1552
- sig { returns(T::Hash[String, T.nilable(T::Array[T::Hash[String, T.untyped]])]) }
1590
+ sig { returns(T::Hash[String, T.nilable(ManifestList)]) }
1553
1591
  def manifest_platforms_cache
1554
1592
  @manifest_platforms_cache ||= T.let(
1555
1593
  {},
1556
- T.nilable(T::Hash[String, T.nilable(T::Array[T::Hash[String, T.untyped]])])
1594
+ T.nilable(T::Hash[String, T.nilable(ManifestList)])
1557
1595
  )
1558
1596
  end
1559
1597
 
@@ -61,16 +61,18 @@ module Dependabot
61
61
 
62
62
  private
63
63
 
64
- sig { params(service: T.untyped).returns(T.nilable(T::Hash[String, T.nilable(String)])) }
64
+ sig { params(service: T::Hash[String, Object]).returns(T.nilable(T::Hash[String, T.nilable(String)])) }
65
65
  def parse_image_spec(service)
66
- return nil unless service
66
+ image = service["image"]
67
+ return service_image(image) if image.is_a?(String)
67
68
 
68
- if service["image"]
69
- return service_image(service["image"])
70
- elsif service["build"].is_a?(Hash) && service["build"]["dockerfile_inline"]
71
- return nil if service["build"]["dockerfile_inline"].match?(/^FROM\s+\${[^}]+}$/)
69
+ build = service["build"]
70
+ if build.is_a?(Hash)
71
+ dockerfile_inline = build["dockerfile_inline"]
72
+ return nil unless dockerfile_inline.is_a?(String)
73
+ return nil if dockerfile_inline.match?(/^FROM\s+\${[^}]+}$/)
72
74
 
73
- match = FROM_LINE.match(service["build"]["dockerfile_inline"])
75
+ match = FROM_LINE.match(dockerfile_inline)
74
76
  return match&.named_captures
75
77
  end
76
78
 
@@ -232,13 +232,13 @@ module Dependabot
232
232
  !source[:digest].nil?
233
233
  end
234
234
 
235
- sig { params(file: Dependabot::DependencyFile).returns(T::Array[T::Hash[Symbol, T.untyped]]) }
235
+ sig { params(file: Dependabot::DependencyFile).returns(T::Array[Dependabot::DependencyRequirement]) }
236
236
  def requirements(file)
237
237
  T.must(dependency).requirements
238
238
  .select { |r| r[:file] == file.name }
239
239
  end
240
240
 
241
- sig { params(file: Dependabot::DependencyFile).returns(T.nilable(T::Array[T::Hash[Symbol, T.untyped]])) }
241
+ sig { params(file: Dependabot::DependencyFile).returns(T.nilable(T::Array[Dependabot::DependencyRequirement])) }
242
242
  def previous_requirements(file)
243
243
  T.must(dependency).previous_requirements
244
244
  &.select { |r| r[:file] == file.name }
@@ -6,7 +6,7 @@ require "sorbet-runtime"
6
6
  module Dependabot
7
7
  module Shared
8
8
  module Utils
9
- HELM_REGEXP = /values[\-a-zA-Z_0-9]*\.ya?ml$/i
9
+ HELM_REGEXP = /values[\-a-zA-Z_0-9.]*\.ya?ml$/i
10
10
 
11
11
  extend T::Sig
12
12
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-docker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.385.0
4
+ version: 0.386.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
@@ -15,14 +15,14 @@ dependencies:
15
15
  requirements:
16
16
  - - '='
17
17
  - !ruby/object:Gem::Version
18
- version: 0.385.0
18
+ version: 0.386.0
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - '='
24
24
  - !ruby/object:Gem::Version
25
- version: 0.385.0
25
+ version: 0.386.0
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: debug
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -266,7 +266,7 @@ licenses:
266
266
  - MIT
267
267
  metadata:
268
268
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
269
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.385.0
269
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.386.0
270
270
  rdoc_options: []
271
271
  require_paths:
272
272
  - lib