_discovery.py 836 B

123456789101112131415161718192021222324252627282930313233
  1. import functools
  2. import operator
  3. import packaging.requirements
  4. # from coherent.build.discovery
  5. def extras_from_dep(dep):
  6. try:
  7. markers = packaging.requirements.Requirement(dep).marker._markers
  8. except AttributeError:
  9. markers = ()
  10. return set(
  11. marker[2].value
  12. for marker in markers
  13. if isinstance(marker, tuple) and marker[0].value == 'extra'
  14. )
  15. def extras_from_deps(deps):
  16. """
  17. >>> extras_from_deps(['requests'])
  18. set()
  19. >>> extras_from_deps(['pytest; extra == "test"'])
  20. {'test'}
  21. >>> sorted(extras_from_deps([
  22. ... 'requests',
  23. ... 'pytest; extra == "test"',
  24. ... 'pytest-cov; extra == "test"',
  25. ... 'sphinx; extra=="doc"']))
  26. ['doc', 'test']
  27. """
  28. return functools.reduce(operator.or_, map(extras_from_dep, deps), set())