def load(self, fetch=True, **kwargs): """Retrieves and stubs project requirements.""" self.pkg_path.mkdir(exist_ok=True) if self.path.exists(): packages = utils.iter_requirements(self.path) for p in packages: pkg = create_dependency_source(p.line).package self.packages.update({pkg.name: pkg.pretty_specs}) self.parent.config.set(f'{self.name}.{pkg.name}', pkg.pretty_specs) pkg_keys = set(self.packages.keys()) pkg_cache = self.parent._get_cache(self.name) new_pkgs = pkg_keys.copy() if pkg_cache: new_pkgs = new_pkgs - set(pkg_cache) new_pkgs = [ f"{name}{s if s != '*' else ''}" for name, s in self.packages.items() if name in new_pkgs ] if fetch: if new_pkgs: self.log.title("Fetching Requirements") for req in new_pkgs: def format_desc(p): return "".join(self.log.iter_formatted(f"$B[{p}]")) source = create_dependency_source( req, format_desc=lambda p: f"{self.log.get_service()} {format_desc(p)}") self.install_package(source) self.update() self.parent._set_cache(self.name, list(pkg_keys))
def load(self, fetch=True, **kwargs): """Retrieves and stubs project requirements.""" self.pkg_path.mkdir(parents=True, exist_ok=True) if self.path.exists(): reqs = utils.iter_requirements(self.path) for r in reqs: pkg = create_dependency_source(r.line).package if not self.packages.get(pkg.name): self.config.add(self.name + '/' + pkg.name, pkg.pretty_specs) if pkg.editable: self.context.extend('local_paths', [pkg.path], unique=True) pkg_keys = set(self.packages.keys()) pkg_cache = self.cache.get(self.name) new_pkgs = pkg_keys.copy() if pkg_cache: new_pkgs = new_pkgs - set(pkg_cache) new_packages = [Package.from_text(name, spec) for name, spec in self.packages.items() if name in new_pkgs] if fetch: if new_packages: self.log.title("Fetching Requirements") for req in new_packages: def format_desc(p): return "".join(self.log.iter_formatted(f"$B[{p}]")) source = create_dependency_source( str(req), name=req.name, format_desc=lambda p: f"{self.log.get_service()} {format_desc(p)}") self.install_package(source) self.update() self.cache.upsert(self.name, list(pkg_keys))
def load(self, fetch=True, **kwargs): """Retrieves and stubs project requirements.""" self.pkg_path.mkdir(parents=True, exist_ok=True) if self.path.exists(): self.add_from_file(self.path) pkg_keys = set(self.packages.keys()) pkg_cache = self.cache.get(self.name) new_pkgs = pkg_keys.copy() if pkg_cache: new_pkgs = new_pkgs - set(pkg_cache) new_packages = [ Package.from_text(name, spec) for name, spec in self.packages.items() if name in new_pkgs ] if fetch: if new_packages: self.log.title("Fetching Requirements") for req in new_packages: def format_desc(p): return "".join(self.log.iter_formatted(f"$B[{p}]")) source = create_dependency_source( str(req), name=req.name, format_desc=lambda p: f"{self.log.get_service()} {format_desc(p)}") self.install_package(source) self.update() self.cache.upsert(self.name, list(pkg_keys))
def add_package(self, package, dev=False, **kwargs): """Add requirement to project. Args: package (str): package name/spec dev (bool, optional): If dev requirements should be loaded. Defaults to False. Returns: dict: Dictionary of packages """ self.log.debug(f"adding new dependency: {package}") source = create_dependency_source(package, **kwargs) pkg = source.package self.log.info(f"Adding $[{pkg.name}] to requirements...") if self.packages.get(pkg.name, None): self.log.error(f"$[{pkg}] is already installed!") self.update() return None self.config.add(self.name + '/' + pkg.name, pkg.pretty_specs) try: self.load() except Exception: self.log.debug(f"failed to install: {pkg.name}") self.config.pop(self.name + '/' + pkg.name) raise else: if pkg.editable: self.context.extend('local_paths', [pkg.path], unique=True) self.log.success("Package installed!") finally: self.parent.update() return self.packages
def test_package_path(self, mock_source_path): source = packages.create_dependency_source(f'-e {mock_source_path.pkg}') with source as files: if mock_source_path.has_init: # is proper package assert files.is_dir() if mock_source_path.has_init is False: # is module assert files.is_dir() assert files == source.package.path
def test_package_source(self, mock_source): def format_desc(x): return f"desc{x}" source = packages.create_dependency_source('blynklib', format_desc=format_desc) with source as files: if mock_source.has_init: assert isinstance(files, Path) assert mock_source.pkg.name == files.name else: assert isinstance(files, list) file_names = [(p.name, s.name) for p, s in files] file_names = list(sum(file_names, ())) assert sorted(['file.py', 'file.pyi', 'module.py', 'module.pyi']) == sorted(file_names)
def add_from_file(self, path: Optional[Path] = None, dev: bool = False, **kwargs: Any) -> dict: """Loads all requirements from file. Args: path: Path to file. Defaults to self.path. dev: If dev requirements should be loaded. Defaults to False. """ path = path or self.path reqs = utils.iter_requirements(path) self.log.debug(f"loading requirements from: {path}") for r in reqs: pkg = create_dependency_source(r.line).package if not self.packages.get(pkg.name): self.config.add(self.name + "/" + pkg.name, pkg.pretty_specs) if pkg.editable: self.context.extend("local_paths", [pkg.path], unique=True) return self.packages
def add_package(self, package, dev=False, **kwargs): """Add requirement to project. Args: package (str): package name/spec dev (bool, optional): If dev requirements should be loaded. Defaults to False. Returns: dict: Dictionary of packages """ source = create_dependency_source(package) pkg = source.package self.log.info(f"Adding $[{pkg.name}] to requirements...") if self.packages.get(pkg.name, None): self.log.error(f"$[{pkg}] is already installed!") self.update() return None self.packages[pkg.name] = pkg.pretty_specs try: self.load() except ValueError: self.log.error(f"Failed to find package $[{pkg.name}]!") self.log.error("Is it available on PyPi?") self.packages.pop(pkg.name) self.parent.config.pop(f"{self.name}.{pkg}") except Exception as e: self.log.error( f"An error occured during the installation of $[{pkg.name}]!", exception=e) self.packages.pop(pkg.name) self.parent.config.pop(f"{self.name}.{pkg}") else: self.parent.config.set(f"{self.name}.{pkg}", pkg.pretty_specs) self.log.success("Package installed!") finally: return self.packages
def test_package(self, mock_pkg, requirement, expect): source = packages.create_dependency_source(*requirement) pkg = source.package assert pkg.name == expect[0] # name assert pkg.pretty_specs == expect[1] # specs assert str(pkg) == expect[2] # full name ()
def test_factory(self, package, expect): source = packages.create_dependency_source(package) assert isinstance(source, expect)