lockfile.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import os
  2. from abc import ABCMeta, abstractmethod
  3. from six import add_metaclass
  4. class LockfilePackageMetaInvalidError(RuntimeError):
  5. pass
  6. def is_tarball_url_valid(tarball_url):
  7. if not tarball_url.startswith("https://") and not tarball_url.startswith("http://"):
  8. return True
  9. return tarball_url.startswith("https://npm.yandex-team.ru/") or tarball_url.startswith("http://npm.yandex-team.ru/")
  10. class LockfilePackageMeta(object):
  11. """
  12. Basic struct representing package meta from lockfile.
  13. """
  14. __slots__ = ("key", "tarball_url", "sky_id", "integrity", "integrity_algorithm", "tarball_path")
  15. @staticmethod
  16. def from_str(s):
  17. return LockfilePackageMeta(*s.strip().split(" "))
  18. def __init__(self, key, tarball_url, sky_id, integrity, integrity_algorithm):
  19. if not is_tarball_url_valid(tarball_url):
  20. raise LockfilePackageMetaInvalidError(
  21. "tarball can only point to npm.yandex-team.ru, got {}".format(tarball_url)
  22. )
  23. # http://npm.yandex-team.ru/@scope%2fname/-/name-0.0.1.tgz
  24. parts = tarball_url.split("/")
  25. self.key = key
  26. self.tarball_url = tarball_url
  27. self.sky_id = sky_id
  28. self.integrity = integrity
  29. self.integrity_algorithm = integrity_algorithm
  30. self.tarball_path = "/".join(parts[-3:]).replace("%2f", "/") # @scope%2fname/-/name-0.0.1.tgz
  31. def to_str(self):
  32. return " ".join([self.tarball_url, self.sky_id, self.integrity, self.integrity_algorithm])
  33. def to_uri(self):
  34. tarball_url: str = self.tarball_url
  35. if not tarball_url.startswith("https://") and not tarball_url.startswith("http://"):
  36. tarball_url = "https://npm.yandex-team.ru/" + tarball_url
  37. pkg_uri = f"{tarball_url}#integrity={self.integrity_algorithm}-{self.integrity}"
  38. return pkg_uri
  39. @add_metaclass(ABCMeta)
  40. class BaseLockfile(object):
  41. @classmethod
  42. def load(cls, path):
  43. """
  44. :param path: lockfile path
  45. :type path: str
  46. :rtype: BaseLockfile
  47. """
  48. pj = cls(path)
  49. pj.read()
  50. return pj
  51. def __init__(self, path):
  52. if not os.path.isabs(path):
  53. raise TypeError("Absolute path required, given: {}".format(path))
  54. self.path = path
  55. self.data = None
  56. @abstractmethod
  57. def read(self):
  58. pass
  59. @abstractmethod
  60. def write(self, path=None):
  61. pass
  62. @abstractmethod
  63. def get_packages_meta(self):
  64. pass
  65. @abstractmethod
  66. def update_tarball_resolutions(self, fn):
  67. pass
  68. @abstractmethod
  69. def validate_has_addons_flags(self):
  70. pass
  71. @abstractmethod
  72. def get_requires_build_packages(self):
  73. pass