mirror of
https://github.com/vale981/poetry2nix
synced 2025-03-04 16:51:40 -05:00
81 lines
2.7 KiB
Nix
81 lines
2.7 KiB
Nix
{ 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
|
|
knownBuildSystems = {
|
|
"intreehooks:loader" = [ pythonPackages.intreehooks ];
|
|
"poetry.masonry.api" = [ pythonPackages.poetry ];
|
|
"" = [];
|
|
};
|
|
buildSystem = lib.getAttrFromPath [ "build-system" "build-backend" ] pyProject;
|
|
in
|
|
knownBuildSystems.${buildSystem} or (throw "unsupported build system ${buildSystem}");
|
|
|
|
in
|
|
{
|
|
inherit
|
|
fetchFromPypi
|
|
getManyLinuxDeps
|
|
isCompatible
|
|
readTOML
|
|
getBuildSystemPkgs
|
|
;
|
|
}
|