about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/tools/poetry2nix/poetry2nix/lib.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/development/tools/poetry2nix/poetry2nix/lib.nix')
-rw-r--r--nixpkgs/pkgs/development/tools/poetry2nix/poetry2nix/lib.nix79
1 files changed, 79 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/tools/poetry2nix/poetry2nix/lib.nix b/nixpkgs/pkgs/development/tools/poetry2nix/poetry2nix/lib.nix
new file mode 100644
index 000000000000..9ec76defb7da
--- /dev/null
+++ b/nixpkgs/pkgs/development/tools/poetry2nix/poetry2nix/lib.nix
@@ -0,0 +1,79 @@
+{ lib, pkgs }:
+let
+  inherit (import ./semver.nix { inherit lib; }) satisfiesSemver;
+
+  # Returns true if pythonVersion matches with the expression in pythonVersions
+  isCompatible = pythonVersion: pythonVersions:
+    let
+      operators = {
+        "||" = cond1: cond2: cond1 || cond2;
+        "," = cond1: cond2: cond1 && cond2; # , means &&
+      };
+      # split string at "," and "||"
+      tokens = builtins.filter (x: x != "") (builtins.split "(,|\\|\\|)" pythonVersions);
+      combine = acc: v:
+        let
+          isOperator = builtins.typeOf v == "list";
+          operator = if isOperator then (builtins.elemAt v 0) else acc.operator;
+        in
+          if isOperator then (acc // { inherit operator; }) else {
+            inherit operator;
+            state = operators."${operator}" acc.state (satisfiesSemver pythonVersion v);
+          };
+      initial = { operator = ","; state = true; };
+    in
+      (builtins.foldl' combine initial tokens).state;
+
+  readTOML = path: builtins.fromTOML (builtins.readFile path);
+
+  #
+  # Returns the appropriate manylinux dependencies and string representation for the file specified
+  #
+  getManyLinuxDeps = f:
+    let
+      ml = pkgs.pythonManylinuxPackages;
+    in
+      if lib.strings.hasInfix "manylinux1" f then { pkg = [ ml.manylinux1 ]; str = "1"; }
+      else if lib.strings.hasInfix "manylinux2010" f then { pkg = [ ml.manylinux2010 ]; str = "2010"; }
+      else if lib.strings.hasInfix "manylinux2014" f then { pkg = [ ml.manylinux2014 ]; str = "2014"; }
+      else { pkg = []; str = null; };
+
+  # Fetch the artifacts from the PyPI index. Since we get all
+  # info we need from the lock file we don't use nixpkgs' fetchPyPi
+  # as it modifies casing while not providing anything we don't already
+  # have.
+  #
+  # Args:
+  #   pname: package name
+  #   file: filename including extension
+  #   hash: SRI hash
+  #   kind: Language implementation and version tag https://www.python.org/dev/peps/pep-0427/#file-name-convention
+  fetchFromPypi = lib.makeOverridable (
+    { pname, file, hash, kind }:
+      pkgs.fetchurl {
+        url = "https://files.pythonhosted.org/packages/${kind}/${lib.toLower (builtins.substring 0 1 file)}/${pname}/${file}";
+        inherit hash;
+      }
+  );
+
+  getBuildSystemPkgs =
+    { pythonPackages
+    , pyProject
+    }: let
+      buildSystem = lib.getAttrFromPath [ "build-system" "build-backend" ] pyProject;
+      drvAttr = builtins.elemAt (builtins.split "\\.|:" buildSystem) 0;
+    in
+      if buildSystem == "" then [] else (
+        [ pythonPackages.${drvAttr} or (throw "unsupported build system ${buildSystem}") ]
+      );
+
+in
+{
+  inherit
+    fetchFromPypi
+    getManyLinuxDeps
+    isCompatible
+    readTOML
+    getBuildSystemPkgs
+    ;
+}