From e0e2a3f659313fd3aa6cc579916a8a706da2f3a4 Mon Sep 17 00:00:00 2001 From: adisbladis Date: Mon, 24 Jun 2019 16:23:02 +0100 Subject: [PATCH] Properly fetch sdists with extension --- Makefile | 9 +++++++++ README.org | 1 + default.nix | 34 ++++++++++++++++++++-------------- extensions.json | 14 ++++++++++++++ generate.py | 14 ++++++++++++++ overrides.nix | 15 +++++++++++++++ 6 files changed, 73 insertions(+), 14 deletions(-) create mode 100644 Makefile create mode 100644 extensions.json create mode 100755 generate.py diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..24824df --- /dev/null +++ b/Makefile @@ -0,0 +1,9 @@ +.PHONY: all generate + +all: generate test + +generate: + ./generate.py + +test: + nix-shell -p python3Packages.flake8 --run 'flake8 ./*.py' diff --git a/README.org b/README.org index f1ae21a..82c9caa 100644 --- a/README.org +++ b/README.org @@ -8,6 +8,7 @@ Need to filter out certain deps like enum34 *** TODO Lock file hashes not distinguishable by origin Reported upstream at https://github.com/sdispater/poetry/issues/1172 and fixed in https://github.com/sdispater/poetry/pull/1183 +This branch depends on upstream PR #1183. *** TODO Non-pypi dependencies Not implemented at all currently diff --git a/default.nix b/default.nix index cc84c5d..a5633de 100644 --- a/default.nix +++ b/default.nix @@ -12,6 +12,11 @@ let then builtins.getAttr attribute set else default; + extensions = pkgs.lib.importJSON ./extensions.json; + getExtension = filename: builtins.elemAt + (builtins.filter (ext: builtins.match "^.*\.${ext}" filename != null) extensions) + 0; + defaultPoetryOverrides = import ./overrides.nix { inherit pkgs; }; mkPoetryPackage = { @@ -19,9 +24,6 @@ let pyproject ? src + "/pyproject.toml", poetrylock ? src + "/poetry.lock", overrides ? defaultPoetryOverrides, - buildInputs ? [ ], - checkInputs ? [ ], - propagatedBuildInputs ? [ ], ... }@attrs: let pyProject = importTOML pyproject; @@ -51,12 +53,13 @@ let src = let files = getAttrDefault "files" pkgMeta []; files_sdist = builtins.filter (f: f.packagetype == "sdist") files; - files_tar = builtins.filter (f: (builtins.match "^.*?tar.gz$" f.name) != null) files_sdist; - file = assert builtins.length files_tar == 1; builtins.elemAt files_tar 0; + # Grab the first sdist, we dont care about which one + file = assert builtins.length files_sdist >= 1; builtins.elemAt files_sdist 0; in self.fetchPypi { pname = pkgMeta.name; version = pkgMeta.version; sha256 = file.hash; + extension = getExtension file.name; }; }; @@ -82,27 +85,30 @@ let }).pkgs; - getDeps = deps: let + getDeps = depAttr: let + deps = builtins.getAttr depAttr pyProject.tool.poetry; depAttrs = builtins.attrNames deps; in builtins.map (dep: pythonPackages."${dep}") depAttrs; + getInputs = attr: getAttrDefault attr attrs []; + mkInput = attr: extraInputs: getInputs attr ++ extraInputs; + in pythonPackages.buildPythonApplication (passedAttrs // { pname = pyProject.tool.poetry.name; version = pyProject.tool.poetry.version; format = "pyproject"; - buildInputs = [ pythonPackages.poetry ] - ++ buildInputs; + buildInputs = mkInput "buildInputs" ([ pythonPackages.poetry ]); + propagatedBuildInputs = mkInput "propagatedBuildInputs" (getDeps "dependencies"); + checkInputs = mkInput "checkInputs" (getDeps "dev-dependencies"); - propagatedBuildInputs = getDeps pyProject.tool.poetry.dependencies - ++ propagatedBuildInputs; - - checkInputs = getDeps pyProject.tool.poetry.dev-dependencies - ++ checkInputs; + passthru = { + inherit pythonPackages; + }; meta = { - description = pyProject.tool.poetry.description; + inherit (pyProject.tool.poetry) description; licenses = [ pyProject.tool.poetry.license ]; }; diff --git a/extensions.json b/extensions.json new file mode 100644 index 0000000..2cce8e2 --- /dev/null +++ b/extensions.json @@ -0,0 +1,14 @@ +[ + "tar", + "tar.bz2", + "tar.gz", + "tar.lz", + "tar.lzma", + "tar.xz", + "tbz", + "tgz", + "tlz", + "txz", + "whl", + "zip" +] \ No newline at end of file diff --git a/generate.py b/generate.py new file mode 100755 index 0000000..3149db5 --- /dev/null +++ b/generate.py @@ -0,0 +1,14 @@ +#!/usr/bin/env nix-shell +#! nix-shell -i python3 -p python3Packages.poetry + +# Run code generation used by poetry2nix + +from poetry.packages.utils.utils import SUPPORTED_EXTENSIONS +import json + +EXT_FILE = 'extensions.json' + +if __name__ == '__main__': + with open(EXT_FILE, 'w') as f: + ext = sorted(ext.lstrip('.') for ext in SUPPORTED_EXTENSIONS) + f.write(json.dumps(ext, indent=2)) diff --git a/overrides.nix b/overrides.nix index 9b3baa0..6f17556 100644 --- a/overrides.nix +++ b/overrides.nix @@ -38,6 +38,21 @@ in { jsonschema = addSetupTools; + python-dateutil = addSetupTools; + + numpy = self: super: drv: drv.overrideAttrs(old: { + nativeBuildInputs = old.nativeBuildInputs ++ [ pkgs.gfortran ]; + buildInputs = old.buildInputs ++ [ pkgs.openblasCompat ]; + + # inherit (super.numpy) preConfigure preBuild enableParallelBuilding; + }); + + shapely = self: super: drv: drv.overrideAttrs(old: { + buildInputs = old.buildInputs ++ [ pkgs.geos self.cython ]; + + inherit (super.shapely) patches GEOS_LIBRARY_PATH; + }); + lockfile = self: super: drv: drv.overrideAttrs(old: { propagatedBuildInputs = old.propagatedBuildInputs ++ [ self.pbr ]; });