diff options
author | adisbladis <adisbladis@gmail.com> | 2019-12-29 16:43:45 +0000 |
---|---|---|
committer | adisbladis <adisbladis@gmail.com> | 2020-01-02 21:59:56 +0000 |
commit | ded1080db4d9bc8535bd649d1cd47683870f587f (patch) | |
tree | ef952f598101ed2da7cc72252dd12d1060d25606 /pkgs/development/tools/poetry2nix/poetry2nix/pep425.nix | |
parent | 1c9af6e7c127799ed9c80303e9cc5da990a95d42 (diff) | |
download | nixlib-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.nix | 106 |
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; +} |