sitecustomize.pyx 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import re
  2. import sys
  3. import __res
  4. from importlib.abc import ResourceReader
  5. from importlib.metadata import Distribution, DistributionFinder, PackageNotFoundError, Prepared
  6. ResourceReader.register(__res._ResfsResourceReader)
  7. METADATA_NAME = re.compile('^Name: (.*)$', re.MULTILINE)
  8. class ArcadiaDistribution(Distribution):
  9. def __init__(self, prefix):
  10. self.prefix = prefix
  11. def read_text(self, filename):
  12. data = __res.resfs_read(f'{self.prefix}{filename}')
  13. if data:
  14. return data.decode('utf-8')
  15. read_text.__doc__ = Distribution.read_text.__doc__
  16. def locate_file(self, path):
  17. return f'{self.prefix}{path}'
  18. class ArcadiaMetadataFinder(DistributionFinder):
  19. prefixes = {}
  20. @classmethod
  21. def find_distributions(cls, context=DistributionFinder.Context()):
  22. found = cls._search_prefixes(context.name)
  23. return map(ArcadiaDistribution, found)
  24. @classmethod
  25. def _init_prefixes(cls):
  26. cls.prefixes.clear()
  27. for resource in __res.resfs_files():
  28. resource = resource.decode('utf-8')
  29. if not resource.endswith('METADATA'):
  30. continue
  31. data = __res.resfs_read(resource).decode('utf-8')
  32. metadata_name = METADATA_NAME.search(data)
  33. if metadata_name:
  34. metadata_name = Prepared(metadata_name.group(1))
  35. cls.prefixes[metadata_name.normalized] = resource[:-len('METADATA')]
  36. @classmethod
  37. def _search_prefixes(cls, name):
  38. if not cls.prefixes:
  39. cls._init_prefixes()
  40. if name:
  41. try:
  42. yield cls.prefixes[Prepared(name).normalized]
  43. except KeyError:
  44. raise PackageNotFoundError(name)
  45. else:
  46. for prefix in sorted(cls.prefixes.values()):
  47. yield prefix
  48. # monkeypatch standart library
  49. import importlib.metadata
  50. importlib.metadata.MetadataPathFinder = ArcadiaMetadataFinder