Exemple #1
0
    async def write_package_expression(package: PyPIPackage):
        reqs: ChosenPackageRequirements
        reqs = ChosenPackageRequirements.from_package_requirements(
            await evaluate_package_requirements(package),
            version_chooser=version_chooser,
            load_tests=version_chooser.should_load_tests(package.pypi_name),
        )

        sha256 = await get_path_hash(await package.source())
        meta = await package.metadata()
        try:
            (pname, ext) = await get_pypi_data(package.download_url,
                                               str(package.version), sha256)
        except RuntimeError:
            expr = build_nix_expression(package, reqs, meta, sha256)
        else:
            expr = build_nix_expression(package,
                                        reqs,
                                        meta,
                                        sha256,
                                        fetchPypi=(pname, ext))
        expression_dir = (packages_path / f'{package.pypi_name}/')
        expression_dir.mkdir(exist_ok=True)
        expression_path = expression_dir / 'default.nix'
        with expression_path.open('w') as fp:
            fp.write(await nixfmt(expr))
        expression_path = expression_path.relative_to(base_path)
        overlays[package.attr] = expression_path
async def test_compiles(version_chooser):
    await version_chooser.require(Requirement("sampleproject"))
    result = build_nix_expression(version_chooser.package_for('sampleproject'),
                                  NO_REQUIREMENTS,
                                  NO_METADATA,
                                  sha256='aaaaaa')
    assert await is_valid_nix(result), "Invalid Nix expression"
async def test_build_sampleproject_expression(fetchPypi):
    data = await load_nixpkgs_data(PINNED_NIXPKGS_ARGS)
    nixpkgs = NixpkgsData(data)
    pypi = PyPIData(PyPICache())

    async def f(pkg):
        return await evaluate_package_requirements(pkg, PINNED_NIXPKGS_ARGS)

    c = VersionChooser(nixpkgs, pypi, f)
    await c.require(Requirement('sampleproject==1.3.1'))
    package: PyPIPackage = c.package_for('sampleproject')  # type: ignore
    sha256 = await get_path_hash(await package.source())
    reqs = ChosenPackageRequirements(
        build_requirements=[],
        test_requirements=[],
        runtime_requirements=[c.package_for('peppercorn')]  # type: ignore
    )
    meta = await package.metadata()
    expr = build_nix_expression(package, reqs, meta, sha256, fetchPypi)

    print(expr)
    wrapper_expr = f'(import <nixpkgs> {{}}).python3.pkgs.callPackage ({expr}) {{}}'
    print(wrapper_expr)

    result = await run_nix_build(wrapper_expr)
    proc = await asyncio.create_subprocess_shell(
        f'{result}/bin/sample', stdout=asyncio.subprocess.PIPE)
    stdout, stderr = await proc.communicate()
    assert (await proc.wait()) == 0
    assert b'Call your main application code here' in stdout
async def test_duplicate_parameter(version_chooser):
    await version_chooser.require(Requirement('pytest'))
    await version_chooser.require(Requirement("sampleproject"))
    pytest = version_chooser.package_for('pytest')  # type: ignore
    requirements = ChosenPackageRequirements(build_requirements=[pytest],
                                             test_requirements=[pytest],
                                             runtime_requirements=[pytest])
    result = build_nix_expression(version_chooser.package_for('sampleproject'),
                                  requirements,
                                  NO_METADATA,
                                  sha256='aaaaaa')
    assert await is_valid_nix(result), "Invalid Nix expression"
async def test_metadata(version_chooser):
    await version_chooser.require(Requirement("sampleproject"))
    desc = "${builtins.abort builtins.currentSystem}"
    result = build_nix_expression(version_chooser.package_for('sampleproject'),
                                  NO_REQUIREMENTS,
                                  sha256='aaaaaa',
                                  metadata=PackageMetadata(
                                      description=desc,
                                      url=None,
                                      license=None,
                                  ))
    assert await nix_instantiate(result,
                                 attr='meta.description',
                                 **DEFAULT_ARGS) == desc
async def test_build_sampleproject_nixpkgs():
    data = await load_nixpkgs_data(PINNED_NIXPKGS_ARGS)
    nixpkgs = NixpkgsData(data)
    pypi = PyPIData(PyPICache())

    async def f(pkg):
        return await evaluate_package_requirements(pkg, PINNED_NIXPKGS_ARGS)

    c = VersionChooser(nixpkgs, pypi, f)
    await c.require(Requirement('pytest'))
    await c.require(Requirement('sampleproject==1.3.1'))
    package: PyPIPackage = c.package_for('sampleproject')  # type: ignore
    sha256 = await get_path_hash(await package.source())
    reqs = ChosenPackageRequirements(
        build_requirements=[],
        test_requirements=[c.package_for('pytest')],  # type: ignore
        runtime_requirements=[c.package_for('peppercorn')]  # type: ignore
    )
    package.version = Version('1.2.3')
    meta = await package.metadata()
    assert package.version == Version('1.3.1')
    sampleproject_expr = build_nix_expression(package, reqs, meta, sha256)

    with tempfile.NamedTemporaryFile(suffix='.nix') as fp:
        fp.write(sampleproject_expr.encode())
        fp.flush()
        nixpkgs_expr = build_overlayed_nixpkgs(
            {'sampleproject': Path(fp.name)})
        print(nixpkgs_expr)
        wrapper_expr = f"""(({nixpkgs_expr}) {{}}).python3.pkgs.sampleproject"""
        result = await run_nix_build(wrapper_expr)

    assert 'default.nix' not in nixpkgs_expr

    proc = await asyncio.create_subprocess_shell(
        f'{result}/bin/sample', stdout=asyncio.subprocess.PIPE)
    stdout, stderr = await proc.communicate()
    assert (await proc.wait()) == 0
    assert b'Call your main application code here' in stdout
async def test_build_textwrap3_expression():
    data = await load_nixpkgs_data(PINNED_NIXPKGS_ARGS)
    nixpkgs = NixpkgsData(data)
    pypi = PyPIData(PyPICache())

    async def f(pkg):
        return await evaluate_package_requirements(pkg, PINNED_NIXPKGS_ARGS)

    c = VersionChooser(nixpkgs, pypi, f)
    await c.require(Requirement('textwrap3==0.9.1'))
    package: PyPIPackage = c.package_for('textwrap3')  # type: ignore
    sha256 = await get_path_hash(await package.source())
    reqs = ChosenPackageRequirements(
        build_requirements=[],
        test_requirements=[],
        runtime_requirements=[],
    )
    meta = await package.metadata()
    expr = build_nix_expression(package, reqs, meta, sha256,
                                ('textwrap3', 'zip'))
    print(expr)
    wrapper_expr = f'(import <nixpkgs> {{}}).python3.pkgs.callPackage ({expr}) {{}}'
    print(wrapper_expr)
    result = await run_nix_build(wrapper_expr)