Class: Dependabot::Python::RequirementParser

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
Defined in:
lib/dependabot/python/requirement_parser.rb

Constant Summary collapse

NAME =
/[a-zA-Z0-9](?:[a-zA-Z0-9\-_\.]*[a-zA-Z0-9])?/
EXTRA =
/[a-zA-Z0-9\-_\.]+/
COMPARISON =
/===|==|>=|<=|<|>|~=|!=/
VERSION =
/([1-9][0-9]*!)?[0-9]+[a-zA-Z0-9\-_.*]*(\+[0-9a-zA-Z]+(\.[0-9a-zA-Z]+)*)?/
REQUIREMENT =
/(?<comparison>#{COMPARISON})\s*\\?\s*v?(?<version>#{VERSION})/
HASH =
/--hash=(?<algorithm>.*?):(?<hash>.*?)(?=\s|\\|$)/
REQUIREMENTS =
/#{REQUIREMENT}(\s*,\s*\\?\s*#{REQUIREMENT})*/
HASHES =
/#{HASH}(\s*\\?\s*#{HASH})*/
MARKER_OP =
/\s*(#{COMPARISON}|(\s*in)|(\s*not\s*in))/
PYTHON_STR_C =
%r{[a-zA-Z0-9\s\(\)\.\{\}\-_\*#:;/\?\[\]!~`@\$%\^&=\+\|<>]}
PYTHON_STR =
/('(#{PYTHON_STR_C}|")*'|"(#{PYTHON_STR_C}|')*")/
ENV_VAR =
/python_version|python_full_version|os_name|sys_platform|
platform_release|platform_system|platform_version|platform_machine|
platform_python_implementation|implementation_name|
implementation_version/x
MARKER_VAR =
/\s*(#{ENV_VAR}|#{PYTHON_STR})/
MARKER_EXPR_ONE =
/#{MARKER_VAR}#{MARKER_OP}#{MARKER_VAR}/
MARKER_EXPR =
/(#{MARKER_EXPR_ONE}|\(\s*|\s*\)|\s+and\s+|\s+or\s+)+/
INSTALL_REQ_WITH_REQUIREMENT =
/\s*\\?\s*(?<name>#{NAME})
  \s*\\?\s*(\[\s*(?<extras>#{EXTRA}(\s*,\s*#{EXTRA})*)\s*\])?
  \s*\\?\s*\(?(?<requirements>#{REQUIREMENTS})\)?
  \s*\\?\s*(;\s*(?<markers>#{MARKER_EXPR}))?
  \s*\\?\s*(?<hashes>#{HASHES})?
  \s*#*\s*(?<comment>.+)?
/x
INSTALL_REQ_WITHOUT_REQUIREMENT =
/^\s*\\?\s*(?<name>#{NAME})
  \s*\\?\s*(\[\s*(?<extras>#{EXTRA}(\s*,\s*#{EXTRA})*)\s*\])?
  \s*\\?\s*(;\s*(?<markers>#{MARKER_EXPR}))?
  \s*\\?\s*(?<hashes>#{HASHES})?
  \s*#*\s*(?<comment>.+)?$
/x
VALID_REQ_TXT_REQUIREMENT =
/^\s*\\?\s*(?<name>#{NAME})
  \s*\\?\s*(\[\s*(?<extras>#{EXTRA}(\s*,\s*#{EXTRA})*)\s*\])?
  \s*\\?\s*\(?(?<requirements>#{REQUIREMENTS})?\)?
  \s*\\?\s*(;\s*(?<markers>#{MARKER_EXPR}))?
  \s*\\?\s*(?<hashes>#{HASHES})?
  \s*(\#+\s*(?<comment>.*))?$
/x
NAME_WITH_EXTRAS =
/\s*\\?\s*(?<name>#{NAME})
  (\s*\\?\s*\[\s*(?<extras>#{EXTRA}(\s*,\s*#{EXTRA})*)\s*\])?
/x

Class Method Summary collapse

Class Method Details

.parse(dependency_string) ⇒ Object



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/dependabot/python/requirement_parser.rb', line 69

def self.parse(dependency_string)
  match = dependency_string.strip.match(VALID_REQ_TXT_REQUIREMENT)
  return nil unless match

  name = T.must(match[:name])
  requirements_string = match[:requirements]
  return nil if requirements_string.nil? || requirements_string.strip.empty?

  version = extract_pinned_version(requirements_string)
  return nil unless version

  {
    name: name,
    normalised_name: NameNormaliser.normalise(name),
    version: version,
    requirement: requirements_string,
    extras: match[:extras],
    markers: match[:markers]
  }
end