示例#1
0
    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))
示例#2
0
 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))
示例#3
0
    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))
示例#4
0
    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
示例#5
0
 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
示例#6
0
 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)
示例#7
0
    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
示例#8
0
    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
示例#9
0
 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 ()
示例#10
0
 def test_factory(self, package, expect):
     source = packages.create_dependency_source(package)
     assert isinstance(source, expect)