File size: 2,470 Bytes
e98c0d7 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 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 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | # typed: strong
# frozen_string_literal: true
require "dependabot/dependency"
require "dependabot/file_parsers"
require "dependabot/file_parsers/base"
require "sorbet-runtime"
module Dependabot
module Shared
class SharedFileParser < Dependabot::FileParsers::Base
extend T::Sig
extend T::Helpers
abstract!
require "dependabot/file_parsers/base/dependency_set"
# Details of Docker regular expressions is at
# https://github.com/docker/distribution/blob/master/reference/regexp.go
DOMAIN_COMPONENT = /(?:[[:alnum:]]|[[:alnum:]][[[:alnum:]]-]*[[:alnum:]])/
DOMAIN = /(?:#{DOMAIN_COMPONENT}(?:\.#{DOMAIN_COMPONENT})+)/
REGISTRY = /(?<registry>#{DOMAIN}(?::\d+)?)/
NAME_COMPONENT = /(?:[a-z\d]+(?:(?:[._]|__|[-]*)[a-z\d]+)*)/
IMAGE = %r{(?<image>#{NAME_COMPONENT}(?:/#{NAME_COMPONENT})*)}
TAG = /:(?<tag>[\w][\w.-]{0,127})/
DIGEST = /@(?<digest>[^\s]+)/
NAME = /\s+AS\s+(?<name>[\w-]+)/
protected
sig { params(parsed_line: T::Hash[String, T.nilable(String)]).returns(T.nilable(String)) }
def version_from(parsed_line)
parsed_line.fetch("tag") || parsed_line.fetch("digest")
end
sig { params(parsed_line: T::Hash[String, T.nilable(String)]).returns(T::Hash[String, T.nilable(String)]) }
def source_from(parsed_line)
source = {}
source[:registry] = parsed_line.fetch("registry") if parsed_line.fetch("registry")
source[:tag] = parsed_line.fetch("tag") if parsed_line.fetch("tag")
source[:digest] = parsed_line.fetch("digest") if parsed_line.fetch("digest")
source
end
sig do
params(
file: Dependabot::DependencyFile,
details: T::Hash[String, T.nilable(String)],
version: String
).returns(Dependabot::Dependency)
end
def build_dependency(file, details, version)
Dependency.new(
name: T.must(details.fetch("image")),
version: version,
package_manager: package_manager,
requirements: [
requirement: nil,
groups: [],
file: file.name,
source: source_from(details)
]
)
end
private
sig { override.void }
def check_required_files; end
sig { abstract.returns(String) }
def package_manager; end
sig { abstract.returns(String) }
def file_type; end
end
end
end
|