codekingpro/portable-devtools
114k
1import functools2import operator3 4import packaging.requirements5 6 7# from coherent.build.discovery8def extras_from_dep(dep):9 try:10 markers = packaging.requirements.Requirement(dep).marker._markers11 except AttributeError:12 markers = ()13 return set(14 marker[2].value15 for marker in markers16 if isinstance(marker, tuple) and marker[0].value == 'extra'17 )18 19 20def extras_from_deps(deps):21 """22 >>> extras_from_deps(['requests'])23 set()24 >>> extras_from_deps(['pytest; extra == "test"'])25 {'test'}26 >>> sorted(extras_from_deps([27 ... 'requests',28 ... 'pytest; extra == "test"',29 ... 'pytest-cov; extra == "test"',30 ... 'sphinx; extra=="doc"']))31 ['doc', 'test']32 """33 return functools.reduce(operator.or_, map(extras_from_dep, deps), set())34 