From 41de3f2afcb75a579468357917af9a3d4192f0d0 Mon Sep 17 00:00:00 2001 From: sireliah Date: Fri, 12 Mar 2021 09:59:33 +0100 Subject: [PATCH 1/6] Make mkPoetryPackages return nested dependencies --- default.nix | 7 ++- tests/default.nix | 1 + tests/mk-poetry-packages/default.nix | 10 +++ tests/mk-poetry-packages/poetry.lock | 81 +++++++++++++++++++++++++ tests/mk-poetry-packages/pyproject.toml | 15 +++++ 5 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 tests/mk-poetry-packages/default.nix create mode 100644 tests/mk-poetry-packages/poetry.lock create mode 100644 tests/mk-poetry-packages/pyproject.toml diff --git a/default.nix b/default.nix index c23b50b..6a1b1f0 100644 --- a/default.nix +++ b/default.nix @@ -161,7 +161,7 @@ lib.makeScope pkgs.newScope (self: { compatible = partitions.right; incompatible = partitions.wrong; - # Create an overriden version of pythonPackages + # Create an overridden 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 @@ -227,7 +227,10 @@ lib.makeScope pkgs.newScope (self: { inputAttrs = mkInputAttrs { inherit py pyProject; attrs = { }; includeBuildSystem = false; }; - storePackages = builtins.foldl' (acc: v: acc ++ v) [ ] (lib.attrValues inputAttrs); + currentPython = pkgs.lib.attrByPath [ python.pname ] python pkgs; + requiredPythonModules = currentPython.pkgs.requiredPythonModules; + # TODO: This deserves a comment + storePackages = requiredPythonModules (builtins.foldl' (acc: v: acc ++ v) [ ] (lib.attrValues inputAttrs)); in { python = py; diff --git a/tests/default.nix b/tests/default.nix index 37ae643..74ebd43 100644 --- a/tests/default.nix +++ b/tests/default.nix @@ -49,6 +49,7 @@ builtins.removeAttrs editable = callTest ./editable { }; editable-egg = callTest ./editable-egg { }; ansible-molecule = callTest ./ansible-molecule { }; + mk-poetry-packages = callTest ./mk-poetry-packages { }; # Test building poetry inherit poetry; diff --git a/tests/mk-poetry-packages/default.nix b/tests/mk-poetry-packages/default.nix new file mode 100644 index 0000000..c50564a --- /dev/null +++ b/tests/mk-poetry-packages/default.nix @@ -0,0 +1,10 @@ +{ lib, poetry2nix, python37 }: + +let + inherit (builtins) elem map; + drv = poetry2nix.mkPoetryPackages { + projectDir = ./.; + python = python37; + }; + packageNames = map (package: package.pname) drv.poetryPackages; +in assert builtins.elem "certifi" packageNames; drv diff --git a/tests/mk-poetry-packages/poetry.lock b/tests/mk-poetry-packages/poetry.lock new file mode 100644 index 0000000..b8084d2 --- /dev/null +++ b/tests/mk-poetry-packages/poetry.lock @@ -0,0 +1,81 @@ +[[package]] +name = "certifi" +version = "2020.12.5" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "chardet" +version = "4.0.0" +description = "Universal encoding detector for Python 2 and 3" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "idna" +version = "2.10" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "requests" +version = "2.25.1" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +certifi = ">=2017.4.17" +chardet = ">=3.0.2,<5" +idna = ">=2.5,<3" +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] +socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] + +[[package]] +name = "urllib3" +version = "1.26.3" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" + +[package.extras] +brotli = ["brotlipy (>=0.6.0)"] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[metadata] +lock-version = "1.1" +python-versions = "^3.7" +content-hash = "90aad50b58fecb5c614871cf7e4cecc70c09e06d669300e65510f7299ed21d30" + +[metadata.files] +certifi = [ + {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"}, + {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"}, +] +chardet = [ + {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, + {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, +] +idna = [ + {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, + {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, +] +requests = [ + {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"}, + {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"}, +] +urllib3 = [ + {file = "urllib3-1.26.3-py2.py3-none-any.whl", hash = "sha256:1b465e494e3e0d8939b50680403e3aedaa2bc434b7d5af64dfd3c958d7f5ae80"}, + {file = "urllib3-1.26.3.tar.gz", hash = "sha256:de3eedaad74a2683334e282005cd8d7f22f4d55fa690a2a1020a416cb0a47e73"}, +] diff --git a/tests/mk-poetry-packages/pyproject.toml b/tests/mk-poetry-packages/pyproject.toml new file mode 100644 index 0000000..a8e90bb --- /dev/null +++ b/tests/mk-poetry-packages/pyproject.toml @@ -0,0 +1,15 @@ +[tool.poetry] +name = "mk-poetry-packages" +version = "0.1.0" +description = "" +authors = ["Your Name "] + +[tool.poetry.dependencies] +python = "^3.7" +requests = "^2.25.1" + +[tool.poetry.dev-dependencies] + +[build-system] +requires = ["poetry>=1.0.0"] +build-backend = "poetry.masonry.api" From 3c651c6455b303ecf636ff252cec9b7f37afdf70 Mon Sep 17 00:00:00 2001 From: sireliah Date: Fri, 12 Mar 2021 11:32:35 +0100 Subject: [PATCH 2/6] Reformat mk-poetry-packages test --- tests/mk-poetry-packages/default.nix | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/mk-poetry-packages/default.nix b/tests/mk-poetry-packages/default.nix index c50564a..8e0c9b9 100644 --- a/tests/mk-poetry-packages/default.nix +++ b/tests/mk-poetry-packages/default.nix @@ -1,10 +1,10 @@ -{ lib, poetry2nix, python37 }: - +{ lib, poetry2nix, python38 }: let inherit (builtins) elem map; drv = poetry2nix.mkPoetryPackages { projectDir = ./.; - python = python37; + python = python38; }; packageNames = map (package: package.pname) drv.poetryPackages; -in assert builtins.elem "certifi" packageNames; drv +in +assert builtins.elem "certifi" packageNames; drv From 55ae3ee9c6e6144c8e47fbeb6015be9fc5c1cfff Mon Sep 17 00:00:00 2001 From: sireliah Date: Fri, 12 Mar 2021 12:53:39 +0100 Subject: [PATCH 3/6] Bump Python version to 3.8 in the mk-poetry-packages test --- tests/mk-poetry-packages/default.nix | 4 ++-- tests/mk-poetry-packages/poetry.lock | 4 ++-- tests/mk-poetry-packages/pyproject.toml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/mk-poetry-packages/default.nix b/tests/mk-poetry-packages/default.nix index 8e0c9b9..58c4a93 100644 --- a/tests/mk-poetry-packages/default.nix +++ b/tests/mk-poetry-packages/default.nix @@ -1,9 +1,9 @@ -{ lib, poetry2nix, python38 }: +{ lib, poetry2nix, python3 }: let inherit (builtins) elem map; drv = poetry2nix.mkPoetryPackages { projectDir = ./.; - python = python38; + python = python3; }; packageNames = map (package: package.pname) drv.poetryPackages; in diff --git a/tests/mk-poetry-packages/poetry.lock b/tests/mk-poetry-packages/poetry.lock index b8084d2..5d82056 100644 --- a/tests/mk-poetry-packages/poetry.lock +++ b/tests/mk-poetry-packages/poetry.lock @@ -55,8 +55,8 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [metadata] lock-version = "1.1" -python-versions = "^3.7" -content-hash = "90aad50b58fecb5c614871cf7e4cecc70c09e06d669300e65510f7299ed21d30" +python-versions = "^3.8" +content-hash = "c7b0119ca233bd369221338d4e3bd93bfe7ed46cd9c788ddccc23908d1a25c28" [metadata.files] certifi = [ diff --git a/tests/mk-poetry-packages/pyproject.toml b/tests/mk-poetry-packages/pyproject.toml index a8e90bb..5ce925f 100644 --- a/tests/mk-poetry-packages/pyproject.toml +++ b/tests/mk-poetry-packages/pyproject.toml @@ -5,7 +5,7 @@ description = "" authors = ["Your Name "] [tool.poetry.dependencies] -python = "^3.7" +python = "^3.8" requests = "^2.25.1" [tool.poetry.dev-dependencies] From 3cca68e31ec0624f507cf576e47c00bb639f9196 Mon Sep 17 00:00:00 2001 From: sireliah Date: Fri, 12 Mar 2021 12:56:53 +0100 Subject: [PATCH 4/6] Document how to run tests locally --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0984a1b..ce7b2a4 100644 --- a/README.md +++ b/README.md @@ -329,8 +329,11 @@ Contributions to this project are welcome in the form of GitHub PRs. Please cons - This project uses [nixpkgs-fmt](https://github.com/nix-community/nixpkgs-fmt) for formatting the Nix code. You can use `nix-shell --run "nixpkgs-fmt .` to format everything. - If you are planning to make any considerable changes, you should first present your plans in a GitHub issue so it can be discussed. -- If you add new features please consider adding tests. +- If you add new features please consider adding tests. You can run them locally as follows: +```bash +nix-build --keep-going --show-trace tests/default.nix +``` ## License _poetry2nix_ is released under the terms of the MIT license. From 74ab8c6274a7769a64507aa9cba9d4aca0efb083 Mon Sep 17 00:00:00 2001 From: sireliah Date: Fri, 12 Mar 2021 13:04:58 +0100 Subject: [PATCH 5/6] Document dependency changes --- default.nix | 5 ++++- tests/mk-poetry-packages/default.nix | 5 +++++ tests/mk-poetry-packages/pyproject.toml | 4 ++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/default.nix b/default.nix index 6a1b1f0..f9a4cf2 100644 --- a/default.nix +++ b/default.nix @@ -229,7 +229,10 @@ lib.makeScope pkgs.newScope (self: { currentPython = pkgs.lib.attrByPath [ python.pname ] python pkgs; requiredPythonModules = currentPython.pkgs.requiredPythonModules; - # TODO: This deserves a comment + /* Include all the nested dependencies which are required for each package. + This guarantees that using the "poetryPackages" attribute will return + complete list of dependencies for the poetry project to be portable. + */ storePackages = requiredPythonModules (builtins.foldl' (acc: v: acc ++ v) [ ] (lib.attrValues inputAttrs)); in { diff --git a/tests/mk-poetry-packages/default.nix b/tests/mk-poetry-packages/default.nix index 58c4a93..7e8b636 100644 --- a/tests/mk-poetry-packages/default.nix +++ b/tests/mk-poetry-packages/default.nix @@ -1,3 +1,8 @@ +/* It is assumed that propagated dependencies are included in the poetryPackages. + The "certifi" is direct dependency of "requests" library. + + Note: this test assumes that "certifi" lib is going to be a dep of "requests" in the future. +*/ { lib, poetry2nix, python3 }: let inherit (builtins) elem map; diff --git a/tests/mk-poetry-packages/pyproject.toml b/tests/mk-poetry-packages/pyproject.toml index 5ce925f..e870f16 100644 --- a/tests/mk-poetry-packages/pyproject.toml +++ b/tests/mk-poetry-packages/pyproject.toml @@ -1,8 +1,8 @@ [tool.poetry] name = "mk-poetry-packages" version = "0.1.0" -description = "" -authors = ["Your Name "] +description = "Tests if mkPoetryPackages API is stable" +authors = [] [tool.poetry.dependencies] python = "^3.8" From d157bd2605344a05eb3e83306ac0d38a880e4dcb Mon Sep 17 00:00:00 2001 From: sireliah Date: Fri, 12 Mar 2021 14:49:21 +0100 Subject: [PATCH 6/6] Extract the requiredPythonModules from current Python --- default.nix | 3 +-- tests/mk-poetry-packages/default.nix | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/default.nix b/default.nix index f9a4cf2..4bd427d 100644 --- a/default.nix +++ b/default.nix @@ -227,8 +227,7 @@ lib.makeScope pkgs.newScope (self: { inputAttrs = mkInputAttrs { inherit py pyProject; attrs = { }; includeBuildSystem = false; }; - currentPython = pkgs.lib.attrByPath [ python.pname ] python pkgs; - requiredPythonModules = currentPython.pkgs.requiredPythonModules; + requiredPythonModules = python.pkgs.requiredPythonModules; /* Include all the nested dependencies which are required for each package. This guarantees that using the "poetryPackages" attribute will return complete list of dependencies for the poetry project to be portable. diff --git a/tests/mk-poetry-packages/default.nix b/tests/mk-poetry-packages/default.nix index 7e8b636..e0541a9 100644 --- a/tests/mk-poetry-packages/default.nix +++ b/tests/mk-poetry-packages/default.nix @@ -3,13 +3,23 @@ Note: this test assumes that "certifi" lib is going to be a dep of "requests" in the future. */ -{ lib, poetry2nix, python3 }: +{ lib, poetry2nix, python3, python37 }: let inherit (builtins) elem map; - drv = poetry2nix.mkPoetryPackages { + drvPythonCurrent = poetry2nix.mkPoetryPackages { projectDir = ./.; python = python3; }; - packageNames = map (package: package.pname) drv.poetryPackages; + + # Test backward compatibility + drvPython37 = poetry2nix.mkPoetryPackages { + projectDir = ./.; + python = python37; + }; + + packageNamesCurrent = map (package: package.pname) drvPythonCurrent.poetryPackages; + packageNamesPython37 = map (package: package.pname) drvPython37.poetryPackages; in -assert builtins.elem "certifi" packageNames; drv +assert builtins.elem "certifi" packageNamesCurrent; +assert builtins.elem "certifi" packageNamesPython37; +drvPythonCurrent