about summary refs log tree commit diff
path: root/pkgs/development/tools/poetry2nix/poetry2nix/pep425.nix
diff options
context:
space:
mode:
authoradisbladis <adisbladis@gmail.com>2019-12-29 16:43:45 +0000
committeradisbladis <adisbladis@gmail.com>2020-01-02 21:59:56 +0000
commitded1080db4d9bc8535bd649d1cd47683870f587f (patch)
treeef952f598101ed2da7cc72252dd12d1060d25606 /pkgs/development/tools/poetry2nix/poetry2nix/pep425.nix
parent1c9af6e7c127799ed9c80303e9cc5da990a95d42 (diff)
downloadnixlib-ded1080db4d9bc8535bd649d1cd47683870f587f.tar
nixlib-ded1080db4d9bc8535bd649d1cd47683870f587f.tar.gz
nixlib-ded1080db4d9bc8535bd649d1cd47683870f587f.tar.bz2
nixlib-ded1080db4d9bc8535bd649d1cd47683870f587f.tar.lz
nixlib-ded1080db4d9bc8535bd649d1cd47683870f587f.tar.xz
nixlib-ded1080db4d9bc8535bd649d1cd47683870f587f.tar.zst
nixlib-ded1080db4d9bc8535bd649d1cd47683870f587f.zip
poetry2nix: init at 1.1.0
Diffstat (limited to 'pkgs/development/tools/poetry2nix/poetry2nix/pep425.nix')
-rw-r--r--pkgs/development/tools/poetry2nix/poetry2nix/pep425.nix106
1 files changed, 106 insertions, 0 deletions
diff --git a/pkgs/development/tools/poetry2nix/poetry2nix/pep425.nix b/pkgs/development/tools/poetry2nix/poetry2nix/pep425.nix
new file mode 100644
index 000000000000..b2e11205c36c
--- /dev/null
+++ b/pkgs/development/tools/poetry2nix/poetry2nix/pep425.nix
@@ -0,0 +1,106 @@
+{ lib, stdenv, python, isLinux ? stdenv.isLinux }:
+
+let
+  inherit (lib.strings) hasSuffix hasInfix splitString removeSuffix;
+
+  # The 'cpxy" as determined by `python.version`
+  #
+  # e.g "2.7.17" -> "cp27"
+  #     "3.5.9"  -> "cp35"
+  pythonTag =
+    let
+      ver = builtins.splitVersion python.version;
+      major = builtins.elemAt ver 0;
+      minor = builtins.elemAt ver 1;
+    in
+      "cp${major}${minor}";
+
+  abiTag = "${pythonTag}m";
+
+  #
+  # Parses wheel file returning an attribute set
+  #
+  toWheelAttrs = str:
+    let
+      entries = splitString "-" str;
+      p = removeSuffix ".whl" (builtins.elemAt entries 4);
+    in
+      {
+        pkgName = builtins.elemAt entries 0;
+        pkgVer = builtins.elemAt entries 1;
+        pyVer = builtins.elemAt entries 2;
+        abi = builtins.elemAt entries 3;
+        platform = p;
+      };
+
+  #
+  # Builds list of acceptable osx wheel files
+  #
+  # <versions>   accepted versions in descending order of preference
+  # <candidates> list of wheel files to select from
+  findBestMatches = versions: candidates:
+    let
+      v = lib.lists.head versions;
+      vs = lib.lists.tail versions;
+    in
+      if (builtins.length versions == 0)
+      then []
+      else (builtins.filter (x: hasInfix v x.file) candidates) ++ (findBestMatches vs candidates);
+
+  # pyver = "cpXX"
+  # x     = "cpXX" | "py2" | "py3" | "py2.py3"
+  isPyVersionCompatible = pyver: x:
+    let
+      normalize = y: ''cp${lib.strings.removePrefix "cp" (lib.strings.removePrefix "py" y)}'';
+      isCompat = p: x: lib.strings.hasPrefix (normalize x) p;
+    in
+      lib.lists.any (isCompat pyver) (lib.strings.splitString "." x);
+
+  #
+  # Selects the best matching wheel file from a list of files
+  #
+  selectWheel = files:
+    let
+      filesWithoutSources = (builtins.filter (x: hasSuffix ".whl" x.file) files);
+
+      isPyAbiCompatible = pyabi: x: x == "none" || pyabi == x;
+
+      withPython = ver: abi: x: (isPyVersionCompatible ver x.pyVer) && (isPyAbiCompatible abi x.abi);
+
+      withPlatform = if isLinux
+      then (
+        x: x.platform == "manylinux1_${stdenv.platform.kernelArch}"
+        || x.platform == "manylinux2010_${stdenv.platform.kernelArch}"
+        || x.platform == "manylinux2014_${stdenv.platform.kernelArch}"
+        || x.platform == "any"
+      )
+      else (x: hasInfix "macosx" x.platform || x.platform == "any");
+
+      filterWheel = x:
+        let
+          f = toWheelAttrs x.file;
+        in
+          (withPython pythonTag abiTag f) && (withPlatform f);
+
+      filtered = builtins.filter filterWheel filesWithoutSources;
+
+      choose = files:
+        let
+          osxMatches = [ "10_12" "10_11" "10_10" "10_9" "any" ];
+          linuxMatches = [ "manylinux1_" "manylinux2010_" "manylinux2014_" "any" ];
+          chooseLinux = x: lib.singleton (builtins.head (findBestMatches linuxMatches x));
+          chooseOSX = x: lib.singleton (builtins.head (findBestMatches osxMatches x));
+        in
+          if isLinux
+          then chooseLinux files
+          else chooseOSX files;
+
+    in
+      if (builtins.length filtered == 0)
+      then []
+      else choose (filtered);
+
+in
+{
+  inherit selectWheel toWheelAttrs isPyVersionCompatible;
+}