| import functools |
| import operator |
|
|
| import packaging.requirements |
|
|
|
|
| |
| def extras_from_dep(dep): |
| try: |
| markers = packaging.requirements.Requirement(dep).marker._markers |
| except AttributeError: |
| markers = () |
| return set( |
| marker[2].value |
| for marker in markers |
| if isinstance(marker, tuple) and marker[0].value == 'extra' |
| ) |
|
|
|
|
| def extras_from_deps(deps): |
| """ |
| >>> extras_from_deps(['requests']) |
| set() |
| >>> extras_from_deps(['pytest; extra == "test"']) |
| {'test'} |
| >>> sorted(extras_from_deps([ |
| ... 'requests', |
| ... 'pytest; extra == "test"', |
| ... 'pytest-cov; extra == "test"', |
| ... 'sphinx; extra=="doc"'])) |
| ['doc', 'test'] |
| """ |
| return functools.reduce(operator.or_, map(extras_from_dep, deps), set()) |
|
|