예제 #1
0
class _RequirementLineHandler:
    def __init__(
        self, line: str, requirement_parser: RequirementParser, original_path: str
    ) -> None:
        self._line = line
        self._requirement_parser = requirement_parser
        self._original_path = original_path
        self._sources = Sources()

    def process(self) -> Tuple[str, Sources]:
        try:
            requirement = self._requirement_parser.parse(self._line)
        except ParsingFailed:
            return self._line, self._sources
        else:
            if isinstance(requirement, PathRequirement):
                requirement = requirement.change_path(
                    lambda path: self._update_path(requirement.name(), path)
                )
            return requirement.to_line(), self._sources

    def _update_path(self, requirement_name: str, requirement_path: str) -> str:
        if not os.path.isabs(requirement_path):
            requirement_path = os.path.relpath(
                os.path.join(os.path.dirname(self._original_path), requirement_path)
            )
        self._sources.add(requirement_name, PathSource(path=requirement_path))
        if os.path.isabs(requirement_path):
            return requirement_path
        else:
            absolute_path = os.path.abspath(requirement_path)
            return absolute_path
예제 #2
0
 def sources(self) -> Sources:
     sources = Sources()
     for requirement in self.requirements.values():
         source = requirement.source()
         if source is None:
             continue
         else:
             sources.add(requirement.name(), source)
     return sources
예제 #3
0
def sources_for_test_packages(data_directory):
    sources = Sources()
    package_names = ["setupcfg-package"]
    for package_name in package_names:
        sources.add(
            package_name,
            PathSource(
                os.path.join(data_directory, f"{package_name}-1.0.tar.gz")),
        )
    return sources
class RequirementsCollector:
    def __init__(
        self,
        platform: TargetPlatform,
        requirement_parser: RequirementParser,
        logger: Logger,
        project_directory: str,
    ):
        self.platform = platform
        self.requirement_set = RequirementSet(platform)
        self.requirement_parser = requirement_parser
        self.logger = logger
        self._project_directory = project_directory
        self._sources = Sources()

    def requirements(self) -> RequirementSet:
        return self.requirement_set

    def add_line(self, line: str) -> None:
        requirement = self.requirement_parser.parse(line)
        if isinstance(requirement, PathRequirement):
            requirement = requirement.change_path(
                lambda path: self._handle_requirements_path(
                    name=requirement.name(), path=path))
        self.requirement_set.add(requirement)

    def add_file(self, file_path: str) -> None:
        requirements_file = RequirementsFile(file_path,
                                             self._project_directory,
                                             self.requirement_parser,
                                             self.logger)
        requirements_file.process()
        self._sources.update(requirements_file.sources())
        added_requirements = RequirementSet.from_file(requirements_file,
                                                      self.platform,
                                                      self.requirement_parser,
                                                      self.logger)
        self.requirement_set += added_requirements

    def sources(self) -> Sources:
        sources = Sources()
        sources.update(self.requirement_set.sources())
        sources.update(self._sources)
        return sources

    def _handle_requirements_path(self, name: str, path: str) -> str:
        self._sources.add(name, PathSource(path))
        return os.path.abspath(path)
예제 #5
0
class RequirementsCollector:
    def __init__(
        self,
        platform: TargetPlatform,
        requirement_parser: RequirementParser,
        logger: Logger,
        project_directory: str,
        base_dependency_graph: DependencyGraph,
    ):
        self.platform = platform
        self.requirement_set = RequirementSet(platform)
        self.requirement_parser = requirement_parser
        self.logger = logger
        self._project_directory = project_directory
        self._sources = Sources()
        self._base_dependency_graph = base_dependency_graph

    def requirements(self) -> RequirementSet:
        return self.requirement_set

    def add_line(self, line: str) -> None:
        original_dependency = self.requirement_parser.parse(line)
        transitive_requirements = self._base_dependency_graph.get_all_build_dependency_names(
            original_dependency)
        self._add_line_without_dependency_check(line)
        for requirement in transitive_requirements:
            self._add_line_without_dependency_check(requirement)

    def add_file(self, file_path: str) -> None:
        requirements_file = RequirementsFile(file_path,
                                             self._project_directory,
                                             self.requirement_parser,
                                             self.logger)
        requirements_file.process()
        self._sources.update(requirements_file.sources())
        added_requirements = RequirementSet.from_file(requirements_file,
                                                      self.platform,
                                                      self.requirement_parser,
                                                      self.logger)
        transitive_requirements = set()
        for requirement in added_requirements:
            transitive_requirements.update(
                self._base_dependency_graph.get_all_build_dependency_names(
                    requirement))
        for line in transitive_requirements:
            self._add_line_without_dependency_check(line)
        self.requirement_set += added_requirements

    def sources(self) -> Sources:
        sources = Sources()
        sources.update(self.requirement_set.sources())
        sources.update(self._sources)
        return sources

    def _add_line_without_dependency_check(self, line: str) -> None:
        requirement = self.requirement_parser.parse(line)
        if isinstance(requirement, PathRequirement):
            requirement = requirement.change_path(
                lambda path: self._handle_requirements_path(
                    name=requirement.name(), path=path))
        self.requirement_set.add(requirement)

    def _handle_requirements_path(self, name: str, path: str) -> str:
        self._sources.add(name, PathSource(path))
        return os.path.abspath(path)