logo

oasis-root

Compiled tree of Oasis Linux based on own branch at <https://hacktivis.me/git/oasis/> git clone https://anongit.hacktivis.me/git/oasis-root.git

_adapters.py (1862B)


  1. from contextlib import suppress
  2. from . import abc
  3. class SpecLoaderAdapter:
  4. """
  5. Adapt a package spec to adapt the underlying loader.
  6. """
  7. def __init__(self, spec, adapter=lambda spec: spec.loader):
  8. self.spec = spec
  9. self.loader = adapter(spec)
  10. def __getattr__(self, name):
  11. return getattr(self.spec, name)
  12. class TraversableResourcesLoader:
  13. """
  14. Adapt a loader to provide TraversableResources.
  15. """
  16. def __init__(self, spec):
  17. self.spec = spec
  18. def get_resource_reader(self, name):
  19. return DegenerateFiles(self.spec)._native()
  20. class DegenerateFiles:
  21. """
  22. Adapter for an existing or non-existant resource reader
  23. to provide a degenerate .files().
  24. """
  25. class Path(abc.Traversable):
  26. def iterdir(self):
  27. return iter(())
  28. def is_dir(self):
  29. return False
  30. is_file = exists = is_dir # type: ignore
  31. def joinpath(self, other):
  32. return DegenerateFiles.Path()
  33. def name(self):
  34. return ''
  35. def open(self):
  36. raise ValueError()
  37. def __init__(self, spec):
  38. self.spec = spec
  39. @property
  40. def _reader(self):
  41. with suppress(AttributeError):
  42. return self.spec.loader.get_resource_reader(self.spec.name)
  43. def _native(self):
  44. """
  45. Return the native reader if it supports files().
  46. """
  47. reader = self._reader
  48. return reader if hasattr(reader, 'files') else self
  49. def __getattr__(self, attr):
  50. return getattr(self._reader, attr)
  51. def files(self):
  52. return DegenerateFiles.Path()
  53. def wrap_spec(package):
  54. """
  55. Construct a package spec with traversable compatibility
  56. on the spec/loader/reader.
  57. """
  58. return SpecLoaderAdapter(package.__spec__, TraversableResourcesLoader)