Skip to content

Commit

Permalink
Refactor parse_pep621_dependencies to parse optional-dependencies
Browse files Browse the repository at this point in the history
  • Loading branch information
Nishnha committed Oct 18, 2022
1 parent 34cfbcd commit d0f8d48
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 15 deletions.
48 changes: 33 additions & 15 deletions python/helpers/lib/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,33 +21,51 @@


def parse_pep621_dependencies(pyproject_path):
dependencies = toml.load(pyproject_path)['project']['dependencies']

requirement_packages = []
DEPENDENCY_TYPES = ['dependencies', 'optional-dependencies']

def version_from_req(specifier_set):
if (len(specifier_set) == 1 and
next(iter(specifier_set)).operator in {"==", "==="}):
return next(iter(specifier_set)).version

for dependency in dependencies:
def flatten(foo):
for x in foo:
if hasattr(x, '__iter__') and not isinstance(x, str):
for y in flatten(x):
yield y
else:
yield x

def parse_dependencies(dependency_type):
dependencies = []
requirement_packages = []

try:
req = Requirement(dependency)
project = toml.load(pyproject_path)['project']
if dependency_type in project:
dependencies = flatten(project[dependency_type])
for dependency in dependencies:
req = Requirement(dependency)
requirement_packages.append({
"name": req.name,
"version": version_from_req(req.specifier),
"markers": str(req.marker) or None,
"file": pyproject_path,
"requirement": str(req.specifier),
"requirement_type": dependency_type,
"extras": sorted(list(req.extras))
})
except KeyError as e:
print(json.dumps({"error": repr(e)}))
exit(1)
except InvalidRequirement as e:
print(json.dumps({"error": repr(e)}))
exit(1)
else:
requirement_packages.append({
"name": req.name,
"version": version_from_req(req.specifier),
"markers": str(req.marker) or None,
"file": pyproject_path,
"requirement": str(req.specifier),
"extras": sorted(list(req.extras))
})

return json.dumps({"result": requirement_packages})
return requirement_packages

parsed_dependencies = list(map(parse_dependencies, DEPENDENCY_TYPES))
return json.dumps({"result": parsed_dependencies})

def parse_requirements(directory):
# Parse the requirements.txt
Expand Down
8 changes: 8 additions & 0 deletions python/spec/fixtures/pyproject_files/standard_python.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,11 @@ dynamic = ["version", "description"]
dependencies = [
"ansys-templates==0.3.0",
]

[project.optional-dependencies]
socks = [ 'PySocks >= 1.5.6, != 1.5.7, < 2' ]
tests = [
'ddt >= 1.2.2, < 2',
'pytest < 6',
'mock >= 1.0.1, < 4; python_version < "3.4"',
]

0 comments on commit d0f8d48

Please sign in to comment.