Skip to content

Commit

Permalink
generate different expressions for nixpkgs<=22.11
Browse files Browse the repository at this point in the history
  • Loading branch information
cript0nauta committed May 20, 2023
1 parent 031993c commit 175b104
Show file tree
Hide file tree
Showing 11 changed files with 66 additions and 62 deletions.
13 changes: 10 additions & 3 deletions acceptance_tests/test_nixpkgs_source_acceptance.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.

import re
import sys
import pytest
import asyncio
Expand All @@ -23,6 +24,7 @@
from packaging.version import Version, parse
from pynixify.nixpkgs_sources import (
load_nixpkgs_data,
load_nixpkgs_version,
NixpkgsData,
)
from pynixify.pypi_api import (
Expand Down Expand Up @@ -210,7 +212,7 @@ async def f(pkg):
runtime_requirements=[c.package_for('peppercorn')] # type: ignore
)
meta = await package.metadata()
expr = build_nix_expression(package, reqs, meta, sha256, fetchPypi)
expr = build_nix_expression(package, reqs, meta, sha256, await load_nixpkgs_version(), fetchPypi)

print(expr)
wrapper_expr = f'(import <nixpkgs> {{}}).python3.pkgs.callPackage ({expr}) {{}}'
Expand Down Expand Up @@ -242,7 +244,7 @@ async def f(pkg):
runtime_requirements=[],
)
meta = await package.metadata()
expr = build_nix_expression(package, reqs, meta, sha256, ('textwrap3', 'zip'))
expr = build_nix_expression(package, reqs, meta, sha256, await load_nixpkgs_version(), ('textwrap3', 'zip'))
print(expr)
wrapper_expr = f'(import <nixpkgs> {{}}).python3.pkgs.callPackage ({expr}) {{}}'
print(wrapper_expr)
Expand All @@ -269,7 +271,7 @@ async def f(pkg):
meta = await package.metadata()
assert package.version == Version('1.3.1')
sampleproject_expr = build_nix_expression(
package, reqs, meta, sha256)
package, reqs, meta, sha256, await load_nixpkgs_version())

with tempfile.NamedTemporaryFile(suffix='.nix') as fp:
fp.write(sampleproject_expr.encode())
Expand All @@ -287,3 +289,8 @@ async def f(pkg):
stdout, stderr = await proc.communicate()
assert (await proc.wait()) == 0
assert b'Call your main application code here' in stdout

@pytest.mark.asyncio
async def test_nixpkgs_version():
ver = await load_nixpkgs_version()
assert re.match(r'^\d{2}\.\d{2}', ver) is not None
48 changes: 22 additions & 26 deletions default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -3,36 +3,32 @@ with (import ./nix/nixpkgs.nix { });

let
outerNixfmt = nixfmt;
in

# Allow specifying a custom version of nixfmt
{ nixfmt ? null, runMypy ? true }:
# Allow specifying a custom version of nixfmt
in { nixfmt ? null, runMypy ? true }:

let
chosenNixfmt =
if isNull nixfmt then
outerNixfmt
else
nixfmt;
in
chosenNixfmt = if isNull nixfmt then outerNixfmt else nixfmt;

# Use pynixify's generated expression, but override it to add additional
# dependencies and to convert it to an application in order to improve the
# derivation name.
python3.pkgs.toPythonApplication (python3.pkgs.pynixify.overridePythonAttrs
(drv: rec {
# Add system dependencies
checkInputs = drv.checkInputs ++ [ nix chosenNixfmt bats ];
# Use pynixify's generated expression, but override it to add additional
# dependencies and to convert it to an application in order to improve the
# derivation name.
in python3.pkgs.toPythonApplication (python3.pkgs.pynixify.overridePythonAttrs
(drv:

nativeBuildInputs = checkInputs; # TODO check why we need this
(if lib.versions.major lib.version >= "23" then {
nativeBuildInputs = drv.nativeBuildInputs ++ [ nix chosenNixfmt bats ];
} else {
checkInputs = drv.nativeBuildInputs ++ [ nix chosenNixfmt bats ];
}) // {

checkPhase = ''
${if runMypy then "mypy pynixify/ tests/ acceptance_tests/" else ""}
pytest tests/ -m 'not usesnix' # We can't run Nix inside Nix builds
'';
checkPhase = ''
${if runMypy then "mypy pynixify/ tests/ acceptance_tests/" else ""}
pytest tests/ -m 'not usesnix' # We can't run Nix inside Nix builds
'';

postInstall = ''
# Add nixfmt to pynixify's PATH
wrapProgram $out/bin/pynixify --prefix PATH : "${chosenNixfmt}/bin"
'';
}))
postInstall = ''
# Add nixfmt to pynixify's PATH
wrapProgram $out/bin/pynixify --prefix PATH : "${chosenNixfmt}/bin"
'';
}))
2 changes: 0 additions & 2 deletions nix/nixpkgs.nix
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,6 @@ let

types-aiofiles = self.callPackage ./packages/types-aiofiles { };

types-setuptools = self.callPackage ./packages/types-setuptools { };

};

in import nixpkgs (args // { overlays = [ pynixifyOverlay ] ++ overlays; })
3 changes: 2 additions & 1 deletion nix/packages/pynixify/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ buildPythonPackage rec {
src = lib.cleanSource ../../..;

propagatedBuildInputs = [ packaging setuptools aiohttp aiofiles Mako ];
checkInputs = [ pytest pytest-asyncio mypy types-aiofiles types-setuptools ];
nativeBuildInputs =
[ pytest pytest-asyncio mypy types-aiofiles types-setuptools ];

checkPhase = "true # TODO fill with the real command for testing";

Expand Down
4 changes: 2 additions & 2 deletions nix/packages/types-aiofiles/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@

buildPythonPackage rec {
pname = "types-aiofiles";
version = "0.7.3";
version = "23.1.0.2";

src = fetchPypi {
inherit pname version;
sha256 = "1nhcm80pybyfg1a9lk67f87i0zalx3vxh51ypbsh48r58lvphm2w";
sha256 = "0qhllm1zhrr562sqjiwq8s5q8g2xkllp0qg5lijrls6xgjgna2pa";
};

# TODO FIXME
Expand Down
23 changes: 0 additions & 23 deletions nix/packages/types-setuptools/default.nix

This file was deleted.

3 changes: 1 addition & 2 deletions pynixify/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
from pathlib import Path
from dataclasses import dataclass
from typing import Optional, Dict
from packaging.version import Version, LegacyVersion, parse as parse_original
from packaging.version import Version, parse as parse_original

@dataclass
class PackageMetadata:
Expand Down Expand Up @@ -81,5 +81,4 @@ async def metadata(self) -> PackageMetadata:
# mypy hack
def parse_version(version: str) -> Version:
v = parse_original(version)
assert not isinstance(v, LegacyVersion)
return v
6 changes: 4 additions & 2 deletions pynixify/command.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
from pynixify.nixpkgs_sources import (
NixpkgsData,
load_nixpkgs_data,
load_nixpkgs_version,
set_max_jobs,
)
from pynixify.pypi_api import (
Expand Down Expand Up @@ -224,6 +225,7 @@ async def write_package_expression(package: PyPIPackage):

sha256 = await get_path_hash(await package.source())
meta = await package.metadata()
version = await load_nixpkgs_version()
try:
(pname, ext) = await get_pypi_data(
package.download_url,
Expand All @@ -232,10 +234,10 @@ async def write_package_expression(package: PyPIPackage):
)
except RuntimeError:
expr = build_nix_expression(
package, reqs, meta, sha256)
package, reqs, meta, sha256, version)
else:
expr = build_nix_expression(
package, reqs, meta, sha256, fetchPypi=(pname, ext))
package, reqs, meta, sha256, version, fetchPypi=(pname, ext))
expression_dir = (packages_path / f'{package.pypi_name}/')
expression_dir.mkdir(exist_ok=True)
expression_path = expression_dir / 'default.nix'
Expand Down
4 changes: 3 additions & 1 deletion pynixify/expression_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@
propagatedBuildInputs = [ ${' '.join(runtime_requirements)} ];
% endif
% if test_requirements:
checkInputs = [ ${' '.join(test_requirements)} ];
${ 'checkInputs' if is_old_nixpkgs else 'nativeBuildInputs' } = [ ${' '.join(test_requirements)} ];
% endif
% if test_requirements:
Expand Down Expand Up @@ -145,6 +145,7 @@ def build_nix_expression(
requirements: ChosenPackageRequirements,
metadata: PackageMetadata,
sha256: str,
nixpkgs_version: str,
fetchPypi: Optional[Tuple[str, str]] = None,
) -> str:
non_python_dependencies = ['lib', 'fetchPypi', 'buildPythonPackage']
Expand All @@ -162,6 +163,7 @@ def build_nix_expression(

version = str(package.version)
nix = escape_string
is_old_nixpkgs = int(nixpkgs_version.split('.')[0]) <= 22
return expression_template.render(DISCLAIMER=DISCLAIMER, **locals())

def build_overlay_expr(overlays: Mapping[str, Path]):
Expand Down
18 changes: 18 additions & 0 deletions pynixify/nixpkgs_sources.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,24 @@ async def load_nixpkgs_data(extra_args):
ret = json.loads(stdout)
return ret

async def load_nixpkgs_version() -> str:
args = [
'--eval',
'--strict',
'--expr',
'with import <nixpkgs> {}; lib.version'
]
if NIXPKGS_URL is not None:
args += ['-I', f'nixpkgs={NIXPKGS_URL}']
proc = await asyncio.create_subprocess_exec(
'nix-instantiate', *args, stdout=asyncio.subprocess.PIPE)
(stdout, _) = await proc.communicate()
status = await proc.wait()
assert status == 0
ret = json.loads(stdout)
return ret



async def _run_nix_build(*args: Sequence[str], retries=0, max_retries=5) -> Path:
if NIXPKGS_URL is not None:
Expand Down
4 changes: 4 additions & 0 deletions tests/test_expression_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ async def test_compiles(version_chooser):
version_chooser.package_for('sampleproject'),
NO_REQUIREMENTS,
NO_METADATA,
nixpkgs_version="23.05",
sha256='aaaaaa')
assert await is_valid_nix(result), "Invalid Nix expression"

Expand All @@ -117,6 +118,7 @@ async def test_duplicate_parameter(version_chooser):
version_chooser.package_for('sampleproject'),
requirements,
NO_METADATA,
nixpkgs_version="23.05",
sha256='aaaaaa')
assert await is_valid_nix(result), "Invalid Nix expression"

Expand All @@ -129,6 +131,7 @@ async def test_call(version_chooser):
version_chooser.package_for('sampleproject'),
NO_REQUIREMENTS,
NO_METADATA,
nixpkgs_version="23.05",
sha256='aaaaaa')
assert await is_valid_nix(result, **DEFAULT_ARGS), "Invalid Nix expression"

Expand Down Expand Up @@ -162,6 +165,7 @@ async def test_metadata(version_chooser):
version_chooser.package_for('sampleproject'),
NO_REQUIREMENTS,
sha256='aaaaaa',
nixpkgs_version="23.05",
metadata=PackageMetadata(
description=desc,
url=None,
Expand Down

0 comments on commit 175b104

Please sign in to comment.