def archive(request, test_zip_path, test_tar_gz_path, test_tar_bz2_path): if request.param == "tar": return Archive(path=test_tar_gz_path) elif request.param == "bz2": return Archive(path=test_tar_bz2_path) else: return Archive(path=test_zip_path)
def setupcfg_package_wheel( setupcfg_package_wheel_path: str, logger: Logger, requirement_parser: RequirementParser, current_platform: TargetPlatform, ) -> Wheel: archive = Archive(path=setupcfg_package_wheel_path) with archive.extracted_files() as directory: return Wheel.from_wheel_directory_path( os.path.join(directory, "setupcfg_package-1.0.dist-info"), current_platform, logger, requirement_parser, )
def _build_package(self, build_directory: Path, name: str, version: str) -> Archive: subprocess.run(["python", "setup.py", "sdist"], cwd=str(build_directory), check=True) tar_gz_path = build_directory / "dist" / f"{name}-{version}.tar.gz" return Archive(path=str(tar_gz_path))
def distribution_archive_for_jsonschema(pip, download_dir, requirements_for_jsonschema): pip.download_sources(requirements_for_jsonschema, download_dir) for file_name in os.listdir(download_dir): if "jsonschema" in file_name: return Archive(path=os.path.join(download_dir, file_name)) raise Exception("Could not download source distribution for `jsonschema`")
def from_archive( source_distribution, archive: Archive, logger: Logger, requirement_parser: RequirementParser, ) -> "SourceDistribution": with archive.extracted_files() as extraction_directory: extracted_files = [ os.path.join(directory_path, file_name) for directory_path, _, file_names in os.walk(extraction_directory) for file_name in file_names ] metadata = source_distribution.metadata_from_uncompressed_distribution( extracted_files, archive) name: str = metadata.get("name") if isinstance(name, Header): raise DistributionNotDetected( "Could not parse source distribution metadata, name detection failed" ) pyproject_toml = source_distribution.get_pyproject_toml( name, extracted_files, logger, requirement_parser) setup_cfg = source_distribution.get_setup_cfg( name, extracted_files, logger, requirement_parser) return source_distribution( name=name, pyproject_toml=pyproject_toml, setup_cfg=setup_cfg, logger=logger, requirement_parser=requirement_parser, )
def test_that_trying_to_create_source_distribution_from_random_zip_throws( test_zip_path, logger: Logger, requirement_parser: RequirementParser): archive = Archive(path=test_zip_path) with pytest.raises(DistributionNotDetected): SourceDistribution.from_archive( archive, logger, requirement_parser=requirement_parser, )
def flit_wheel(data_directory, current_platform, logger, requirement_parser): path = os.path.join(data_directory, "flit-1.3-py3-none-any.whl") with Archive(path=path).extracted_files() as wheel_directory: return Wheel.from_wheel_directory_path( os.path.join(wheel_directory, "flit-1.3.dist-info"), current_platform, logger, requirement_parser, )
def test_build_dependencies_for_invalid_deps_logs_warning( data_directory, current_platform, logger: Logger): spacy_distribution_path = os.path.join(data_directory, "spacy-2.1.0.tar.gz") archive = Archive(spacy_distribution_path) dist = SourceDistribution.from_archive(archive, logger) assert "WARNING:" not in get_logger_output(logger) dist.build_dependencies(current_platform) assert "WARNING:" in get_logger_output(logger)
def test_invalid_build_dependencies_for_setupcfg_package_logs_warning( data_directory, current_platform, logger): distribution_path = os.path.join(data_directory, "setupcfg-package", "setupcfg-package.tar.gz") archive = Archive(distribution_path) dist = SourceDistribution.from_archive(archive, logger) assert "WARNING:" not in get_logger_output(logger) dist.build_dependencies(current_platform) assert "WARNING:" in get_logger_output(logger)
def source_distribution_archive(pip, requirement, download_dir, current_platform): requirement_set = RequirementSet(current_platform) requirement_set.add(requirement) pip.download_sources(requirement_set, download_dir) for file_name in os.listdir(download_dir): if file_name.startswith(requirement.name()): return Archive(path=os.path.join(download_dir, file_name)) else: raise Exception( "Could not download source distribution for `{}`".format( requirement.name()))
def get_uninspected_source_distributions(self) -> List[SourceDistribution]: archives = [ Archive(path=path) for path in list_files(self.download_directory) if path not in self.inspected_source_distribution_files ] distributions = list() for archive in archives: try: distributions.append( SourceDistribution.from_archive(archive, self.logger)) except DistributionNotDetected: continue return distributions
def flit_distribution(pip, project_dir, download_dir, flit_requirements, logger): pip.download_sources(flit_requirements, download_dir) archives = [ Archive(path=os.path.join(download_dir, filename)) for filename in os.listdir(download_dir) ] distributions = list( map(lambda archive: SourceDistribution.from_archive(archive, logger), archives)) for distribution in distributions: if distribution.name == "flit": return distribution raise Exception("Could not download source distribution for `flit`")
def get_uninspected_source_distributions(self) -> List[SourceDistribution]: archives = [ Archive(path=str(path)) for path in self._download_directory.list_files() if path not in self.inspected_source_distribution_files ] distributions = list() for archive in archives: try: distribution = SourceDistribution.from_archive( archive, self.logger, requirement_parser=self.requirement_parser) except DistributionNotDetected: continue distributions.append(distribution) return distributions
def from_archive( source_distribution, archive: Archive, logger: Logger, requirement_parser: RequirementParser, ) -> "SourceDistribution": with archive.extracted_files() as extraction_directory: first_level_paths = os.listdir(extraction_directory) if len(first_level_paths) != 1: raise DistributionNotDetected( f"Multiple package directories or files extracted from {archive}" ) package_dir = os.path.join(extraction_directory, first_level_paths[0]) if not os.path.isdir(package_dir): raise DistributionNotDetected( f"No package directory could be extracted from source distribution {archive}" ) extracted_files = [ os.path.join(package_dir, file_name) for file_name in os.listdir(package_dir) if os.path.isfile(os.path.join(package_dir, file_name)) ] setup_cfg = source_distribution.get_setup_cfg( extracted_files, logger, requirement_parser ) metadata = source_distribution._get_package_metadata(package_dir) name = source_distribution._get_name(setup_cfg, metadata, archive) pyproject_toml = source_distribution.get_pyproject_toml( name, extracted_files, logger, requirement_parser ) return source_distribution( name=name, pyproject_toml=pyproject_toml, setup_cfg=setup_cfg, logger=logger, requirement_parser=requirement_parser, )
def distribution_archive_for_jsonschema(data_directory): return Archive( path=os.path.join(data_directory, "jsonschema-3.0.1.tar.gz"))
def six_source_distribution_archive(data_directory): return Archive(path=os.path.join(data_directory, "six-1.12.0.tar.gz"))
def source_distribution_archive(request, data_directory): return Archive(path=os.path.join(data_directory, request.param))
def six_source_distribution_archive(pip, download_dir, six_requirements): pip.download_sources(six_requirements, download_dir) for file_name in os.listdir(download_dir): if "six" in file_name: return Archive(path=os.path.join(download_dir, file_name)) raise Exception("Could not create source archive for `six`")
def flit_distribution(data_directory, logger): archive = Archive(os.path.join(data_directory, "flit-1.3.tar.gz")) return SourceDistribution.from_archive(archive, logger)
def flit_distribution(data_directory, logger: Logger, requirement_parser: RequirementParser): archive = Archive(os.path.join(data_directory, "flit-1.3.tar.gz")) return SourceDistribution.from_archive( archive, logger, requirement_parser=requirement_parser)
def test_that_we_can_inspect_the_content_of_a_wheel( setupcfg_package_wheel_path: str): archive = Archive(path=setupcfg_package_wheel_path) with archive.extracted_files() as directory: assert "setupcfg_package-1.0.dist-info" in os.listdir(directory)
def test_that_we_can_inspect_the_content_of_an_archive(archive: Archive): with archive.extracted_files() as directory: files = tuple(os.listdir(directory)) assert files == ("test.txt", )