Class: Dependabot::Swift::FileParser::ManifestParser

Inherits:
Object
  • Object
show all
Extended by:
T::Helpers, T::Sig
Defined in:
lib/dependabot/swift/file_parser/manifest_parser.rb

Constant Summary collapse

NAME_ARGUMENT =

An optional name: label may precede the url: argument.

/(?:name:\s+"[^"]+",\s*)?/
URL_ARGUMENT =

The url: argument identifies the dependency's source.

/url:\s+"(?<url>[^"]+)",\s*/
REQUIREMENT_ARGUMENT =

The version requirement (e.g. from: "1.0.0", .upToNextMajor(from: "1.0.0"), a range).

/(?<requirement>#{NativeRequirement::REGEXP})/
TRAILING_ARGUMENT =

A single additional labeled argument (e.g. traits: []) whose value may be an array, a string, or a bare token. The leading comma is optional so the final argument matches too.

/\s*,?\s*\w+\s*:\s*(?:\[[^\]]*\]|"[^"]*"|[^\s,)]+)/
TRAILING_ARGUMENTS =

After the requirement there may be any number of trailing arguments (which can span onto following lines) before the closing ), optionally followed by a trailing comma.

/(?:#{TRAILING_ARGUMENT})*\s*,?\s*/
DEPENDENCY =
/(?<declaration>\.package\(\s*
 #{NAME_ARGUMENT}#{URL_ARGUMENT}#{REQUIREMENT_ARGUMENT}#{TRAILING_ARGUMENTS}
\))/x

Instance Method Summary collapse

Constructor Details

#initialize(manifest, requirement:) ⇒ ManifestParser

Returns a new instance of ManifestParser.



43
44
45
46
# File 'lib/dependabot/swift/file_parser/manifest_parser.rb', line 43

def initialize(manifest, requirement:)
  @manifest = manifest
  @requirement = requirement
end

Instance Method Details

#requirementsObject



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/dependabot/swift/file_parser/manifest_parser.rb', line 49

def requirements
  found = manifest.content&.scan(DEPENDENCY)&.find do |_declaration, url, _requirement|
    SharedHelpers.scp_to_standard(url.to_s) == requirement.source_string("url")
  end

  return [] unless found

  declaration = T.cast(found, T::Array[String]).first
  requirement = NativeRequirement.new(T.must(T.cast(found, T::Array[String]).last))

  [
    {
      requirement: requirement.to_s,
      groups: ["dependencies"],
      file: manifest.name,
      source: T.must(self.requirement.source_hash),
      metadata: { declaration_string: declaration, requirement_string: requirement.declaration }
    }
  ]
end