summary refs log tree commit diff
path: root/pkgs/development/tools/poetry2nix/poetry2nix/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development/tools/poetry2nix/poetry2nix/default.nix')
-rw-r--r--pkgs/development/tools/poetry2nix/poetry2nix/default.nix310
1 files changed, 157 insertions, 153 deletions
diff --git a/pkgs/development/tools/poetry2nix/poetry2nix/default.nix b/pkgs/development/tools/poetry2nix/poetry2nix/default.nix
index e7f718519a5..a7fb382c755 100644
--- a/pkgs/development/tools/poetry2nix/poetry2nix/default.nix
+++ b/pkgs/development/tools/poetry2nix/poetry2nix/default.nix
@@ -1,22 +1,20 @@
-{ pkgs ? import <nixpkgs> {}
+{ pkgs ? import <nixpkgs> { }
 , lib ? pkgs.lib
 , poetry ? null
 , poetryLib ? import ./lib.nix { inherit lib pkgs; }
 }:
 let
-  inherit (poetryLib) isCompatible readTOML;
+  inherit (poetryLib) isCompatible readTOML moduleName;
 
   # Poetry2nix version
-  version = "1.7.1";
+  version = "1.8.0";
 
   /* The default list of poetry2nix override overlays */
   defaultPoetryOverrides = (import ./overrides.nix { inherit pkgs lib; });
-
   mkEvalPep508 = import ./pep508.nix {
     inherit lib poetryLib;
     stdenv = pkgs.stdenv;
   };
-
   getFunctorFn = fn: if builtins.typeOf fn == "set" then fn.__functor else fn;
 
   # Map SPDX identifiers to license names
@@ -34,95 +32,99 @@ let
     , overrides ? [ defaultPoetryOverrides ]
     , python ? pkgs.python3
     , pwd ? projectDir
+    , preferWheels ? false
     }@attrs:
-      let
-        poetryPkg = poetry.override { inherit python; };
-
-        pyProject = readTOML pyproject;
-        poetryLock = readTOML poetrylock;
-        lockFiles = lib.getAttrFromPath [ "metadata" "files" ] poetryLock;
-
-        specialAttrs = [
-          "overrides"
-          "poetrylock"
-          "projectDir"
-          "pwd"
-        ];
-        passedAttrs = builtins.removeAttrs attrs specialAttrs;
-
-        evalPep508 = mkEvalPep508 python;
-
-        # Filter packages by their PEP508 markers & pyproject interpreter version
-        partitions = let
+    let
+      poetryPkg = poetry.override { inherit python; };
+      pyProject = readTOML pyproject;
+      poetryLock = readTOML poetrylock;
+      lockFiles =
+        let
+          lockfiles = lib.getAttrFromPath [ "metadata" "files" ] poetryLock;
+        in
+        lib.listToAttrs (lib.mapAttrsToList (n: v: { name = moduleName n; value = v; }) lockfiles);
+      specialAttrs = [
+        "overrides"
+        "poetrylock"
+        "projectDir"
+        "pwd"
+        "preferWheels"
+      ];
+      passedAttrs = builtins.removeAttrs attrs specialAttrs;
+      evalPep508 = mkEvalPep508 python;
+
+      # Filter packages by their PEP508 markers & pyproject interpreter version
+      partitions =
+        let
           supportsPythonVersion = pkgMeta: if pkgMeta ? marker then (evalPep508 pkgMeta.marker) else true;
         in
-          lib.partition supportsPythonVersion poetryLock.package;
-
-        compatible = partitions.right;
-        incompatible = partitions.wrong;
-
-        # Create an overriden version of pythonPackages
-        #
-        # We need to avoid mixing multiple versions of pythonPackages in the same
-        # closure as python can only ever have one version of a dependency
-        baseOverlay = self: super:
-          let
-            getDep = depName: self.${depName};
-
-            lockPkgs = builtins.listToAttrs (
-              builtins.map (
-                pkgMeta: rec {
-                  name = pkgMeta.name;
-                  value = self.mkPoetryDep (
-                    pkgMeta // {
-                      inherit pwd;
-                      source = pkgMeta.source or null;
-                      files = lockFiles.${name};
-                      pythonPackages = self;
-                      sourceSpec = pyProject.tool.poetry.dependencies.${name} or pyProject.tool.poetry.dev-dependencies.${name};
-                    }
-                  );
-                }
-              ) compatible
+        lib.partition supportsPythonVersion poetryLock.package;
+      compatible = partitions.right;
+      incompatible = partitions.wrong;
+
+      # Create an overriden version of pythonPackages
+      #
+      # We need to avoid mixing multiple versions of pythonPackages in the same
+      # closure as python can only ever have one version of a dependency
+      baseOverlay = self: super:
+        let
+          getDep = depName: self.${depName};
+          lockPkgs = builtins.listToAttrs
+            (
+              builtins.map
+                (
+                  pkgMeta: rec {
+                    name = moduleName pkgMeta.name;
+                    value = self.mkPoetryDep
+                      (
+                        pkgMeta // {
+                          inherit pwd preferWheels;
+                          source = pkgMeta.source or null;
+                          files = lockFiles.${name};
+                          pythonPackages = self;
+                          sourceSpec = pyProject.tool.poetry.dependencies.${name} or pyProject.tool.poetry.dev-dependencies.${name};
+                        }
+                      );
+                  }
+                ) compatible
             );
-          in
-            lockPkgs;
-        overlays = builtins.map getFunctorFn (
+        in
+        lockPkgs;
+      overlays = builtins.map getFunctorFn
+        (
           [
             (
               self: super:
                 let
-                  hooks = self.callPackage ./hooks {};
+                  hooks = self.callPackage ./hooks { };
                 in
-                  {
-                    mkPoetryDep = self.callPackage ./mk-poetry-dep.nix {
-                      inherit pkgs lib python poetryLib;
-                    };
-                    poetry = poetryPkg;
-                    # The canonical name is setuptools-scm
-                    setuptools-scm = super.setuptools_scm;
-
-                    inherit (hooks) removePathDependenciesHook poetry2nixFixupHook;
-                  }
+                {
+                  mkPoetryDep = self.callPackage ./mk-poetry-dep.nix {
+                    inherit pkgs lib python poetryLib;
+                  };
+                  poetry = poetryPkg;
+                  # The canonical name is setuptools-scm
+                  setuptools-scm = super.setuptools_scm;
+
+                  inherit (hooks) pipBuildHook removePathDependenciesHook poetry2nixFixupHook;
+                }
             )
             # Null out any filtered packages, we don't want python.pkgs from nixpkgs
-            (self: super: builtins.listToAttrs (builtins.map (x: { name = x.name; value = null; }) incompatible))
+            (self: super: builtins.listToAttrs (builtins.map (x: { name = moduleName x.name; value = null; }) incompatible))
             # Create poetry2nix layer
             baseOverlay
           ] ++ # User provided overrides
           overrides
         );
-
-        packageOverrides = lib.foldr lib.composeExtensions (self: super: {}) overlays;
-
-        py = python.override { inherit packageOverrides; self = py; };
-      in
-        {
-          python = py;
-          poetryPackages = map (pkg: py.pkgs.${pkg.name}) compatible;
-          poetryLock = poetryLock;
-          inherit pyProject;
-        };
+      packageOverrides = lib.foldr lib.composeExtensions (self: super: { }) overlays;
+      py = python.override { inherit packageOverrides; self = py; };
+    in
+    {
+      python = py;
+      poetryPackages = map (pkg: py.pkgs.${moduleName pkg.name}) compatible;
+      poetryLock = poetryLock;
+      inherit pyProject;
+    };
 
   /* Returns a package with a python interpreter and all packages specified in the poetry.lock lock file.
 
@@ -136,15 +138,17 @@ let
     , overrides ? [ defaultPoetryOverrides ]
     , pwd ? projectDir
     , python ? pkgs.python3
+    , preferWheels ? false
     }:
-      let
-        py = mkPoetryPackages (
+    let
+      py = mkPoetryPackages
+        (
           {
-            inherit pyproject poetrylock overrides python pwd;
+            inherit pyproject poetrylock overrides python pwd preferWheels;
           }
         );
-      in
-        py.python.withPackages (_: py.poetryPackages);
+    in
+    py.python.withPackages (_: py.poetryPackages);
 
   /* Creates a Python application from pyproject.toml and poetry.lock */
   mkPoetryApplication =
@@ -153,79 +157,79 @@ let
     , pyproject ? projectDir + "/pyproject.toml"
     , poetrylock ? projectDir + "/poetry.lock"
     , overrides ? [ defaultPoetryOverrides ]
-    , meta ? {}
+    , meta ? { }
     , python ? pkgs.python3
     , pwd ? projectDir
+    , preferWheels ? false
     , ...
     }@attrs:
-      let
-        poetryPython = mkPoetryPackages {
-          inherit pyproject poetrylock overrides python pwd;
-        };
-        py = poetryPython.python;
-
-        inherit (poetryPython) pyProject;
-
-        specialAttrs = [
-          "overrides"
-          "poetrylock"
-          "projectDir"
-          "pwd"
-          "pyproject"
-        ];
-        passedAttrs = builtins.removeAttrs attrs specialAttrs;
-
-        # Get dependencies and filter out depending on interpreter version
-        getDeps = depAttr:
-          let
-            compat = isCompatible py.pythonVersion;
-            deps = pyProject.tool.poetry.${depAttr} or {};
-            depAttrs = builtins.map (d: lib.toLower d) (builtins.attrNames deps);
-          in
-            builtins.map (
-              dep:
-                let
-                  pkg = py.pkgs."${dep}";
-                  constraints = deps.${dep}.python or "";
-                  isCompat = compat constraints;
-                in
-                  if isCompat then pkg else null
-            ) depAttrs;
-
-        getInputs = attr: attrs.${attr} or [];
-        mkInput = attr: extraInputs: getInputs attr ++ extraInputs;
-
-        buildSystemPkgs = poetryLib.getBuildSystemPkgs {
-          inherit pyProject;
-          pythonPackages = py.pkgs;
-        };
-      in
-        py.pkgs.buildPythonApplication (
-          passedAttrs // {
-            pname = pyProject.tool.poetry.name;
-            version = pyProject.tool.poetry.version;
-
-            inherit src;
-
-            format = "pyproject";
-
-            buildInputs = mkInput "buildInputs" buildSystemPkgs;
-            propagatedBuildInputs = mkInput "propagatedBuildInputs" (getDeps "dependencies") ++ ([ py.pkgs.setuptools ]);
-            nativeBuildInputs = mkInput "nativeBuildInputs" [ pkgs.yj py.pkgs.removePathDependenciesHook ];
-            checkInputs = mkInput "checkInputs" (getDeps "dev-dependencies");
-
-            passthru = {
-              python = py;
-            };
-
-            meta = meta // {
-              inherit (pyProject.tool.poetry) description homepage;
-              inherit (py.meta) platforms;
-              license = getLicenseBySpdxId (pyProject.tool.poetry.license or "unknown");
-            };
-
-          }
-        );
+    let
+      poetryPython = mkPoetryPackages {
+        inherit pyproject poetrylock overrides python pwd preferWheels;
+      };
+      py = poetryPython.python;
+
+      inherit (poetryPython) pyProject;
+      specialAttrs = [
+        "overrides"
+        "poetrylock"
+        "projectDir"
+        "pwd"
+        "pyproject"
+        "preferWheels"
+      ];
+      passedAttrs = builtins.removeAttrs attrs specialAttrs;
+
+      # Get dependencies and filter out depending on interpreter version
+      getDeps = depAttr:
+        let
+          compat = isCompatible (poetryLib.getPythonVersion py);
+          deps = pyProject.tool.poetry.${depAttr} or { };
+          depAttrs = builtins.map (d: lib.toLower d) (builtins.attrNames deps);
+        in
+        builtins.map
+          (
+            dep:
+            let
+              pkg = py.pkgs."${dep}";
+              constraints = deps.${dep}.python or "";
+              isCompat = compat constraints;
+            in if isCompat then pkg else null
+          ) depAttrs;
+      getInputs = attr: attrs.${attr} or [ ];
+      mkInput = attr: extraInputs: getInputs attr ++ extraInputs;
+      buildSystemPkgs = poetryLib.getBuildSystemPkgs {
+        inherit pyProject;
+        pythonPackages = py.pkgs;
+      };
+    in
+    py.pkgs.buildPythonApplication
+      (
+        passedAttrs // {
+          pname = moduleName pyProject.tool.poetry.name;
+          version = pyProject.tool.poetry.version;
+
+          inherit src;
+
+          format = "pyproject";
+
+          buildInputs = mkInput "buildInputs" buildSystemPkgs;
+          propagatedBuildInputs = mkInput "propagatedBuildInputs" (getDeps "dependencies") ++ ([ py.pkgs.setuptools ]);
+          nativeBuildInputs = mkInput "nativeBuildInputs" [ pkgs.yj py.pkgs.removePathDependenciesHook ];
+          checkInputs = mkInput "checkInputs" (getDeps "dev-dependencies");
+
+          passthru = {
+            python = py;
+          };
+
+          meta = meta // {
+            inherit (pyProject.tool.poetry) description homepage;
+            inherit (py.meta) platforms;
+            license = getLicenseBySpdxId (pyProject.tool.poetry.license or "unknown");
+          };
+
+        }
+      );
 
   /* Poetry2nix CLI used to supplement SHA-256 hashes for git dependencies  */
   cli = import ./cli.nix { inherit pkgs lib version; };
@@ -247,7 +251,7 @@ in
         defaultSet = defaultPoetryOverrides self super;
         customSet = fn self super;
       in
-        defaultSet // customSet;
+      defaultSet // customSet;
   };
 
   /*