diff options
Diffstat (limited to 'pkgs/development/tools/poetry2nix/poetry2nix/default.nix')
-rw-r--r-- | pkgs/development/tools/poetry2nix/poetry2nix/default.nix | 297 |
1 files changed, 152 insertions, 145 deletions
diff --git a/pkgs/development/tools/poetry2nix/poetry2nix/default.nix b/pkgs/development/tools/poetry2nix/poetry2nix/default.nix index 7d3164fcec6..e7f718519a5 100644 --- a/pkgs/development/tools/poetry2nix/poetry2nix/default.nix +++ b/pkgs/development/tools/poetry2nix/poetry2nix/default.nix @@ -7,7 +7,7 @@ let inherit (poetryLib) isCompatible readTOML; # Poetry2nix version - version = "1.6.0"; + version = "1.7.1"; /* The default list of poetry2nix override overlays */ defaultPoetryOverrides = (import ./overrides.nix { inherit pkgs lib; }); @@ -34,91 +34,95 @@ let , overrides ? [ defaultPoetryOverrides ] , python ? pkgs.python3 , pwd ? projectDir - }@attrs: let - poetryPkg = poetry.override { inherit python; }; - - pyProject = readTOML pyproject; - poetryLock = readTOML poetrylock; - lockFiles = lib.getAttrFromPath [ "metadata" "files" ] poetryLock; + }@attrs: + let + poetryPkg = poetry.override { inherit python; }; - specialAttrs = [ - "overrides" - "poetrylock" - "pwd" - ]; - passedAttrs = builtins.removeAttrs attrs specialAttrs; + pyProject = readTOML pyproject; + poetryLock = readTOML poetrylock; + lockFiles = lib.getAttrFromPath [ "metadata" "files" ] poetryLock; - evalPep508 = mkEvalPep508 python; + specialAttrs = [ + "overrides" + "poetrylock" + "projectDir" + "pwd" + ]; + passedAttrs = builtins.removeAttrs attrs specialAttrs; - # 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; + evalPep508 = mkEvalPep508 python; - compatible = partitions.right; - incompatible = partitions.wrong; + # 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 + ); + in + lockPkgs; + overlays = builtins.map getFunctorFn ( + [ + ( + self: super: + let + 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; + } + ) + # 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)) + # Create poetry2nix layer + baseOverlay + ] ++ # User provided overrides + overrides + ); - # 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}; + packageOverrides = lib.foldr lib.composeExtensions (self: super: {}) overlays; - 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; - } - ); - } - ) compatible - ); - in - lockPkgs; - overlays = builtins.map getFunctorFn ( - [ - ( - self: super: let - 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; - } - ) - # 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)) - # 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; - }; + py = python.override { inherit packageOverrides; self = py; }; + in + { + python = py; + poetryPackages = map (pkg: py.pkgs.${pkg.name}) compatible; + poetryLock = poetryLock; + inherit pyProject; + }; /* Returns a package with a python interpreter and all packages specified in the poetry.lock lock file. @@ -153,76 +157,78 @@ let , python ? pkgs.python3 , pwd ? projectDir , ... - }@attrs: let - poetryPython = mkPoetryPackages { - inherit pyproject poetrylock overrides python pwd; - }; - py = poetryPython.python; - - inherit (poetryPython) pyProject; - - specialAttrs = [ - "overrides" - "poetrylock" - "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; + }@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 - 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; + 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; + inherit src; - format = "pyproject"; + 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"); + 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; - }; + passthru = { + python = py; + }; - meta = meta // { - inherit (pyProject.tool.poetry) description homepage; - inherit (py.meta) platforms; - license = getLicenseBySpdxId (pyProject.tool.poetry.license or "unknown"); - }; + 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; }; - in { inherit mkPoetryEnv mkPoetryApplication mkPoetryPackages cli version; @@ -236,11 +242,12 @@ in */ defaultPoetryOverrides = { __functor = defaultPoetryOverrides; - overrideOverlay = fn: self: super: let - defaultSet = defaultPoetryOverrides self super; - customSet = fn self super; - in - defaultSet // customSet; + overrideOverlay = fn: self: super: + let + defaultSet = defaultPoetryOverrides self super; + customSet = fn self super; + in + defaultSet // customSet; }; /* |