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
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
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)
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)