123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- import os
- from abc import ABCMeta, abstractmethod
- from six import add_metaclass
- class LockfilePackageMetaInvalidError(RuntimeError):
- pass
- def is_tarball_url_valid(tarball_url):
- if not tarball_url.startswith("https://") and not tarball_url.startswith("http://"):
- return True
- return tarball_url.startswith("https://npm.yandex-team.ru/") or tarball_url.startswith("http://npm.yandex-team.ru/")
- class LockfilePackageMeta(object):
- """
- Basic struct representing package meta from lockfile.
- """
- __slots__ = ("key", "tarball_url", "sky_id", "integrity", "integrity_algorithm", "tarball_path")
- @staticmethod
- def from_str(s):
- return LockfilePackageMeta(*s.strip().split(" "))
- def __init__(self, key, tarball_url, sky_id, integrity, integrity_algorithm):
- if not is_tarball_url_valid(tarball_url):
- raise LockfilePackageMetaInvalidError(
- "tarball can only point to npm.yandex-team.ru, got {}".format(tarball_url)
- )
- # http://npm.yandex-team.ru/@scope%2fname/-/name-0.0.1.tgz
- parts = tarball_url.split("/")
- self.key = key
- self.tarball_url = tarball_url
- self.sky_id = sky_id
- self.integrity = integrity
- self.integrity_algorithm = integrity_algorithm
- self.tarball_path = "/".join(parts[-3:]).replace("%2f", "/") # @scope%2fname/-/name-0.0.1.tgz
- def to_str(self):
- return " ".join([self.tarball_url, self.sky_id, self.integrity, self.integrity_algorithm])
- def to_uri(self):
- tarball_url: str = self.tarball_url
- if not tarball_url.startswith("https://") and not tarball_url.startswith("http://"):
- tarball_url = "https://npm.yandex-team.ru/" + tarball_url
- pkg_uri = f"{tarball_url}#integrity={self.integrity_algorithm}-{self.integrity}"
- return pkg_uri
- @add_metaclass(ABCMeta)
- class BaseLockfile(object):
- @classmethod
- def load(cls, path):
- """
- :param path: lockfile path
- :type path: str
- :rtype: BaseLockfile
- """
- pj = cls(path)
- pj.read()
- return pj
- def __init__(self, path):
- if not os.path.isabs(path):
- raise TypeError("Absolute path required, given: {}".format(path))
- self.path = path
- self.data = None
- @abstractmethod
- def read(self):
- pass
- @abstractmethod
- def write(self, path=None):
- pass
- @abstractmethod
- def get_packages_meta(self):
- pass
- @abstractmethod
- def update_tarball_resolutions(self, fn):
- pass
- @abstractmethod
- def validate_has_addons_flags(self):
- pass
- @abstractmethod
- def get_requires_build_packages(self):
- pass
|