From 6fbe854e7fa9b579fac93f902d96323675c7e8a9 Mon Sep 17 00:00:00 2001 From: Hofer-Julian <30049909+Hofer-Julian@users.noreply.github.com> Date: Tue, 17 Dec 2024 11:11:25 +0100 Subject: [PATCH] docs: add tutorial for Python and pixi-build (#2715) --- docs/build/python.md | 109 ++++ .../pixi_build_python}/.gitattributes | 0 .../pixi_build_python}/.gitignore | 0 .../pixi_build_python}/pixi.lock | 482 ++++++++---------- .../pixi_projects/pixi_build_python/pixi.toml | 27 + .../pixi_build_python/pyproject.toml | 10 + .../src/rich_example/__init__.py | 8 +- examples/rich_example/pyproject.toml | 65 --- mkdocs.yml | 1 + tests/integration_python/conftest.py | 5 + .../pixi_build/test_build.py | 11 +- tests/integration_python/test_docs.py | 28 + 12 files changed, 414 insertions(+), 332 deletions(-) create mode 100644 docs/build/python.md rename {examples/rich_example => docs/source_files/pixi_projects/pixi_build_python}/.gitattributes (100%) rename {examples/rich_example => docs/source_files/pixi_projects/pixi_build_python}/.gitignore (100%) rename {examples/rich_example => docs/source_files/pixi_projects/pixi_build_python}/pixi.lock (75%) create mode 100644 docs/source_files/pixi_projects/pixi_build_python/pixi.toml create mode 100644 docs/source_files/pixi_projects/pixi_build_python/pyproject.toml rename {examples/rich_example => docs/source_files/pixi_projects/pixi_build_python}/src/rich_example/__init__.py (56%) delete mode 100644 examples/rich_example/pyproject.toml create mode 100644 tests/integration_python/test_docs.py diff --git a/docs/build/python.md b/docs/build/python.md new file mode 100644 index 000000000..6d2166e9a --- /dev/null +++ b/docs/build/python.md @@ -0,0 +1,109 @@ +# Tutorial: Doing Python development with Pixi + +In this tutorial, we will show you how to create a simple Python package with pixi. + +## Why is this useful? + +Pixi builds upon the conda ecosystem, which allows you to create a Python environment with all the dependencies you need. +Unlike PyPI, the conda ecosystem is cross-language and also offers packages written in Rust, R, C, C++ and many other languages. + +By building a Python package with pixi, you can: + +1. manage Python packages and packages written in other languages in the same workspace +2. build both conda and Python packages with the same tool + +In this tutorial we will focus on point 1. + +## Let's get started + +First, we create a simple Python package with a `pyproject.toml` and a single Python file. +The package will be called `rich_example`, so we will create the following structure + +```shell +├── src # (1)! +│ └── rich_example +│ └── __init__.py +└── pyproject.toml +``` + +1. This project uses a src-layout, but pixi supports both [flat- and src-layouts](https://packaging.python.org/en/latest/discussions/src-layout-vs-flat-layout/#src-layout-vs-flat-layout). + + +The Python package has a single function `main`. +Calling that, will print a table containing the name, age and city of three people. + +```py title="src/rich_example/__init__.py" +--8<-- "docs/source_files/pixi_projects/pixi_build_python/src/rich_example/__init__.py" +``` + + +The metadata of the Python package is defined in `pyproject.toml`. + +```toml title="pyproject.toml" +--8<-- "docs/source_files/pixi_projects/pixi_build_python/pyproject.toml" +``` + +1. We use the `rich` package to print the table in the terminal. +2. By specifying a script, the executable `rich-example-main` will be available in the environment. When being called it will in return call the `main` function of the `rich_example` module. +3. One can choose multiple backends to build a Python package, we choose `hatchling` which works well without additional configuration. + + +### Adding a `pixi.toml` + +What we have in the moment, constitutes a full Python package. +It could be uploaded to [PyPI](https://pypi.org/) as-is. + +However, we still need a tool to manage our environments and if we want other pixi projects to depend on our tool, we need to include more information. +We will do exactly that by creating a `pixi.toml`. + +!!! note + The pixi manifest can be in its own `pixi.toml` file or integrated in `pyproject.toml` + In this tutorial, we will use `pixi.toml`. + If you want everything integrated in `pyproject.toml` just copy the content of `pixi.toml` in this tutorial to your `pyproject.toml` and append `tool.pixi` to each table. + +The file structure will then look like this: + +```shell +├── src +│ └── rich_example +│ └── __init__.py +├── pixi.toml +└── pyproject.toml +``` + +This is the content of the `pixi.toml`: + +```toml title="pixi.toml" +--8<-- "docs/source_files/pixi_projects/pixi_build_python/pixi.toml" +``` + +1. In `workspace` information is set that is shared across all packages in the workspace. +2. In `dependencies` you specify all of your pixi packages. Here, this includes only our own package that is defined further below under `package` +3. We define a task that runs the `rich-example-main` executable we defined earlier. You can learn more about tasks in this [section](../features/advanced_tasks.md) +4. In `package` we define the actual pixi package. This information will be used when other pixi packages or workspaces depend on our package or when we upload it to a conda channel. +5. The same way, Python uses build backends to build a Python package, pixi uses build backends to build pixi packages. `pixi-build-python` creates a pixi package out of a Python package. +6. In `host-dependencies`, we add Python dependencies that are necessary to build the Python package. By adding them here as well, the dependencies will come from the conda channel rather than PyPI. +7. In `run-dependencies`, we add the Python dependencies needed during runtime. + + +When we now run `pixi run start`, we get the following output: + +``` +┏━━━━━━━━━━━━━━┳━━━━━┳━━━━━━━━━━━━━┓ +┃ Name ┃ Age ┃ City ┃ +┡━━━━━━━━━━━━━━╇━━━━━╇━━━━━━━━━━━━━┩ +│ John Doe │ 30 │ New York │ +│ Jane Smith │ 25 │ Los Angeles │ +│ Tim de Jager │ 35 │ Utrecht │ +└──────────────┴─────┴─────────────┘ +``` + +## Conclusion + +In this tutorial, we created a pixi package based on Python. +It can be used as-is, to upload to a conda channel or to PyPI. +In another tutorial we will learn how to add multiple pixi packages to the same workspace and let one pixi package use another. + +Thanks for reading! Happy Coding 🚀 + +Any questions? Feel free to reach out or share this tutorial on [X](https://twitter.com/prefix_dev), [join our Discord](https://discord.gg/kKV8ZxyzY4), send us an [e-mail](mailto:hi@prefix.dev) or follow our [GitHub](https://github.com/prefix-dev). diff --git a/examples/rich_example/.gitattributes b/docs/source_files/pixi_projects/pixi_build_python/.gitattributes similarity index 100% rename from examples/rich_example/.gitattributes rename to docs/source_files/pixi_projects/pixi_build_python/.gitattributes diff --git a/examples/rich_example/.gitignore b/docs/source_files/pixi_projects/pixi_build_python/.gitignore similarity index 100% rename from examples/rich_example/.gitignore rename to docs/source_files/pixi_projects/pixi_build_python/.gitignore diff --git a/examples/rich_example/pixi.lock b/docs/source_files/pixi_projects/pixi_build_python/pixi.lock similarity index 75% rename from examples/rich_example/pixi.lock rename to docs/source_files/pixi_projects/pixi_build_python/pixi.lock index 63f626a48..03f905d62 100644 --- a/examples/rich_example/pixi.lock +++ b/docs/source_files/pixi_projects/pixi_build_python/pixi.lock @@ -8,86 +8,91 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - - conda: https://prefix.dev/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/ca-certificates-2024.12.14-hbcca054_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 - conda: https://prefix.dev/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.6.3-hb9d3cd8_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-h4bc722e_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.47.2-hee588c1_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.0-h6355ac2_1_cp313t.conda - - conda: https://prefix.dev/conda-forge/linux-64/python_abi-3.13-5_cp313t.conda + - conda: https://prefix.dev/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_102_cp313.conda + - conda: https://prefix.dev/conda-forge/linux-64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8228510_1.conda - - conda: https://prefix.dev/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda - conda: https://prefix.dev/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - conda: . osx-64: - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda - - conda: https://prefix.dev/conda-forge/osx-64/ca-certificates-2024.8.30-h8857fd0_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/ca-certificates-2024.12.14-h8857fd0_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.6.4-h240833e_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 - - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.47.0-h2f8c449_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.6.3-hd471939_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-hfdf4475_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.47.2-hdb6dae5_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-hf036a51_1.conda - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.4.0-hd471939_0.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/python-3.12.7-h8f8b54e_0_cpython.conda + - conda: https://prefix.dev/conda-forge/osx-64/python-3.13.1-h2334245_102_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda - - conda: https://prefix.dev/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda - conda: https://prefix.dev/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 - conda: . osx-arm64: - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/ca-certificates-2024.8.30-hf0a4a13_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/ca-certificates-2024.12.14-hf0a4a13_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.6.3-h39f12f2_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h99b78c6_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.47.2-h3f77e49_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h39f12f2_0.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.0-h536b44d_1_cp313t.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/python_abi-3.13-5_cp313t.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_102_cp313.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/python_abi-3.13-5_cp313.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - - conda: https://prefix.dev/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda - conda: https://prefix.dev/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - conda: . win-64: - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda - - conda: https://prefix.dev/conda-forge/win-64/ca-certificates-2024.8.30-h56e8100_0.conda + - conda: https://prefix.dev/conda-forge/win-64/ca-certificates-2024.12.14-h56e8100_0.conda - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.6.4-he0c23c2_0.conda - conda: https://prefix.dev/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 - - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.47.0-h2466b09_1.conda + - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.6.3-h2466b09_1.conda + - conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.47.2-h67fdade_0.conda - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-h2466b09_0.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda - - conda: https://prefix.dev/conda-forge/win-64/python-3.12.7-hce54a09_0_cpython.conda - - conda: https://prefix.dev/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_102_cp313.conda + - conda: https://prefix.dev/conda-forge/win-64/python_abi-3.13-5_cp313.conda + - conda: https://prefix.dev/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h5226925_1.conda - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda - conda: https://prefix.dev/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda @@ -95,14 +100,12 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-ha32ba9b_23.conda - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.42.34433-he29a5d6_23.conda - conda: https://prefix.dev/conda-forge/win-64/vs2015_runtime-14.42.34433-hdffcdeb_23.conda - - conda: https://prefix.dev/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 - conda: . packages: - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 md5: d7c89558ba9fa0495403155b64376d81 license: None - purls: [] size: 2562 timestamp: 1578324546067 - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 @@ -116,7 +119,6 @@ packages: - openmp_impl 9999 license: BSD-3-Clause license_family: BSD - purls: [] size: 23621 timestamp: 1650670423406 - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda @@ -127,7 +129,6 @@ packages: - libgcc-ng >=12 license: bzip2-1.0.6 license_family: BSD - purls: [] size: 252783 timestamp: 1720974456583 - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-hfdf4475_7.conda @@ -137,7 +138,6 @@ packages: - __osx >=10.13 license: bzip2-1.0.6 license_family: BSD - purls: [] size: 134188 timestamp: 1720974491916 - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda @@ -147,7 +147,6 @@ packages: - __osx >=11.0 license: bzip2-1.0.6 license_family: BSD - purls: [] size: 122909 timestamp: 1720974522888 - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda @@ -159,37 +158,32 @@ packages: - vc14_runtime >=14.29.30139 license: bzip2-1.0.6 license_family: BSD - purls: [] size: 54927 timestamp: 1720974860185 -- conda: https://prefix.dev/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda - sha256: afee721baa6d988e27fef1832f68d6f32ac8cc99cdf6015732224c2841a09cea - md5: c27d1c142233b5bc9ca570c6e2e0c244 +- conda: https://prefix.dev/conda-forge/linux-64/ca-certificates-2024.12.14-hbcca054_0.conda + sha256: 1afd7274cbc9a334d6d0bc62fa760acc7afdaceb0b91a8df370ec01fd75dc7dd + md5: 720523eb0d6a9b0f6120c16b2aa4e7de license: ISC - purls: [] - size: 159003 - timestamp: 1725018903918 -- conda: https://prefix.dev/conda-forge/osx-64/ca-certificates-2024.8.30-h8857fd0_0.conda - sha256: 593f302d0f44c2c771e1614ee6d56fffdc7d616e6f187669c8b0e34ffce3e1ae - md5: b7e5424e7f06547a903d28e4651dbb21 + size: 157088 + timestamp: 1734208393264 +- conda: https://prefix.dev/conda-forge/osx-64/ca-certificates-2024.12.14-h8857fd0_0.conda + sha256: ddaafdcd1b8ace6ffeea22b6824ca9db8a64cf0a2652a11d7554ece54935fa06 + md5: b7b887091c99ed2e74845e75e9128410 license: ISC - purls: [] - size: 158665 - timestamp: 1725019059295 -- conda: https://prefix.dev/conda-forge/osx-arm64/ca-certificates-2024.8.30-hf0a4a13_0.conda - sha256: 2db1733f4b644575dbbdd7994a8f338e6ef937f5ebdb74acd557e9dda0211709 - md5: 40dec13fd8348dbe303e57be74bd3d35 + size: 156925 + timestamp: 1734208413176 +- conda: https://prefix.dev/conda-forge/osx-arm64/ca-certificates-2024.12.14-hf0a4a13_0.conda + sha256: 256be633fd0882ccc1a7a32bc278547e1703f85082c0789a87a603ee3ab8fb82 + md5: 7cb381a6783d91902638e4ed1ebd478e license: ISC - purls: [] - size: 158482 - timestamp: 1725019034582 -- conda: https://prefix.dev/conda-forge/win-64/ca-certificates-2024.8.30-h56e8100_0.conda - sha256: 0fcac3a7ffcc556649e034a1802aedf795e64227eaa7194d207b01eaf26454c4 - md5: 4c4fd67c18619be5aa65dc5b6c72e490 + size: 157091 + timestamp: 1734208344343 +- conda: https://prefix.dev/conda-forge/win-64/ca-certificates-2024.12.14-h56e8100_0.conda + sha256: 424d82db36cd26234bc4772426170efd60e888c2aed0099a257a95e131683a5e + md5: cb2eaeb88549ddb27af533eccf9a45c1 license: ISC - purls: [] - size: 158773 - timestamp: 1725019107649 + size: 157422 + timestamp: 1734208404685 - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda sha256: 7c91cea91b13f4314d125d1bedb9d03a29ebbd5080ccdea70260363424646dbe md5: 048b02e3962f066da18efe3a21b77672 @@ -199,7 +193,6 @@ packages: - binutils_impl_linux-64 2.43 license: GPL-3.0-only license_family: GPL - purls: [] size: 669211 timestamp: 1729655358674 - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.6.4-h5888daf_0.conda @@ -212,7 +205,6 @@ packages: - expat 2.6.4.* license: MIT license_family: MIT - purls: [] size: 73304 timestamp: 1730967041968 - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.6.4-h240833e_0.conda @@ -224,7 +216,6 @@ packages: - expat 2.6.4.* license: MIT license_family: MIT - purls: [] size: 70758 timestamp: 1730967204736 - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda @@ -236,7 +227,6 @@ packages: - expat 2.6.4.* license: MIT license_family: MIT - purls: [] size: 64693 timestamp: 1730967175868 - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.6.4-he0c23c2_0.conda @@ -250,7 +240,6 @@ packages: - expat 2.6.4.* license: MIT license_family: MIT - purls: [] size: 139068 timestamp: 1730967442102 - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 @@ -260,7 +249,6 @@ packages: - libgcc-ng >=9.4.0 license: MIT license_family: MIT - purls: [] size: 58292 timestamp: 1636488182923 - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 @@ -268,7 +256,6 @@ packages: md5: ccb34fb14960ad8b125962d3d79b31a9 license: MIT license_family: MIT - purls: [] size: 51348 timestamp: 1636488394370 - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 @@ -276,7 +263,6 @@ packages: md5: 086914b672be056eb70fd4285b6783b6 license: MIT license_family: MIT - purls: [] size: 39020 timestamp: 1636488587153 - conda: https://prefix.dev/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 @@ -287,7 +273,6 @@ packages: - vs2015_runtime >=14.16.27012 license: MIT license_family: MIT - purls: [] size: 42063 timestamp: 1636489106777 - conda: https://prefix.dev/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda @@ -301,7 +286,6 @@ packages: - libgcc-ng ==14.2.0=*_1 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - purls: [] size: 848745 timestamp: 1729027721139 - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda @@ -311,7 +295,6 @@ packages: - libgcc 14.2.0 h77fa898_1 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - purls: [] size: 54142 timestamp: 1729027726517 - conda: https://prefix.dev/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda @@ -321,9 +304,43 @@ packages: - _libgcc_mutex 0.1 conda_forge license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - purls: [] size: 460992 timestamp: 1729027639220 +- conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.6.3-hb9d3cd8_1.conda + sha256: e6e425252f3839e2756e4af1ea2074dffd3396c161bf460629f9dfd6a65f15c6 + md5: 2ecf2f1c7e4e21fcfe6423a51a992d84 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: 0BSD + size: 111132 + timestamp: 1733407410083 +- conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.6.3-hd471939_1.conda + sha256: c70639ff3cb034a8e31cb081c907879b6a639bb12b0e090069a68eb69125b10e + md5: f9e9205fed9c664421c1c09f0b90ce6d + depends: + - __osx >=10.13 + license: 0BSD + size: 103745 + timestamp: 1733407504892 +- conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.6.3-h39f12f2_1.conda + sha256: d863b8257406918ffdc50ae65502f2b2d6cede29404d09a094f59509d6a0aaf1 + md5: b2553114a7f5e20ccd02378a77d836aa + depends: + - __osx >=11.0 + license: 0BSD + size: 99129 + timestamp: 1733407496073 +- conda: https://prefix.dev/conda-forge/win-64/liblzma-5.6.3-h2466b09_1.conda + sha256: 24d04bd55adfa44c421c99ce169df38cb1ad2bba5f43151bc847fc802496a1fa + md5: 015b9c0bd1eef60729ab577a38aaf0b5 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: 0BSD + size: 104332 + timestamp: 1733407872569 - conda: https://prefix.dev/conda-forge/linux-64/libmpdec-4.0.0-h4bc722e_0.conda sha256: d02d1d3304ecaf5c728e515eb7416517a0b118200cd5eacbe829c432d1664070 md5: aeb98fdeb2e8f25d43ef71fbacbeec80 @@ -332,9 +349,17 @@ packages: - libgcc-ng >=12 license: BSD-2-Clause license_family: BSD - purls: [] size: 89991 timestamp: 1723817448345 +- conda: https://prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-hfdf4475_0.conda + sha256: 791be3d30d8e37ec49bcc23eb8f1e1415d911a7c023fa93685f2ea485179e258 + md5: ed625b2e59dff82859c23dd24774156b + depends: + - __osx >=10.13 + license: BSD-2-Clause + license_family: BSD + size: 76561 + timestamp: 1723817691512 - conda: https://prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h99b78c6_0.conda sha256: f7917de9117d3a5fe12a39e185c7ce424f8d5010a6f97b4333e8a1dcb2889d16 md5: 7476305c35dd9acef48da8f754eedb40 @@ -342,51 +367,57 @@ packages: - __osx >=11.0 license: BSD-2-Clause license_family: BSD - purls: [] size: 69263 timestamp: 1723817629767 -- conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_1.conda - sha256: 8a9aadf996a2399f65b679c6e7f29139d5059f699c63e6d7b50e20db10c00508 - md5: b6f02b52a174e612e89548f4663ce56a +- conda: https://prefix.dev/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda + sha256: fc529fc82c7caf51202cc5cec5bb1c2e8d90edbac6d0a4602c966366efe3c7bf + md5: 74860100b2029e2523cf480804c76b9b + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-2-Clause + license_family: BSD + size: 88657 + timestamp: 1723861474602 +- conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.47.2-hee588c1_0.conda + sha256: 48af21ebc2cbf358976f1e0f4a0ab9e91dfc83d0ef337cf3837c6f5bc22fb352 + md5: b58da17db24b6e08bcbf8fed2fb8c915 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=13 - libzlib >=1.3.1,<2.0a0 license: Unlicense - purls: [] - size: 875349 - timestamp: 1730208050020 -- conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.47.0-h2f8c449_1.conda - sha256: a0f7381c867898a45018b1e5cf1aca68659d292d58252e8f489a4270b010fed8 - md5: af445c495253a871c3d809e1199bb12b + size: 873551 + timestamp: 1733761824646 +- conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.47.2-hdb6dae5_0.conda + sha256: 4d5e188d921f93c97ce172fc8c4341e8171670ec98d76f9961f65f6306fcda77 + md5: 44d9799fda97eb34f6d88ac1e3eb0ea6 depends: - __osx >=10.13 - libzlib >=1.3.1,<2.0a0 license: Unlicense - purls: [] - size: 915300 - timestamp: 1730208101739 -- conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_1.conda - sha256: 5a96caa566c11e5a5ebdcdb86a0759a7fb27d3c5f42e6a0fd0d6023c1e935d9e - md5: 07a14fbe439eef078cc479deca321161 + size: 923167 + timestamp: 1733761860127 +- conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.47.2-h3f77e49_0.conda + sha256: f192f3c8973de9ec4c214990715f13b781965247a5cedf9162e7f9e699cfc3c4 + md5: 122d6f29470f1a991e85608e77e56a8a depends: - __osx >=11.0 - libzlib >=1.3.1,<2.0a0 license: Unlicense - purls: [] - size: 837683 - timestamp: 1730208293578 -- conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.47.0-h2466b09_1.conda - sha256: 3342d6fe787f5830f7e8466d9c65c914bfd8d67220fb5673041b338cbba47afe - md5: 5b1f36012cc3d09c4eb9f24ad0e2c379 + size: 850553 + timestamp: 1733762057506 +- conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.47.2-h67fdade_0.conda + sha256: ecfc0182c3b2e63c870581be1fa0e4dbdfec70d2011cb4f5bde416ece26c41df + md5: ff00095330e0d35a16bd3bdbd1a2d3e7 depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: Unlicense - purls: [] - size: 892175 - timestamp: 1730208431651 + size: 891292 + timestamp: 1733762116902 - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 md5: 40b61aab5c7ba9ff276c41cfffe6b80b @@ -394,7 +425,6 @@ packages: - libgcc-ng >=12 license: BSD-3-Clause license_family: BSD - purls: [] size: 33601 timestamp: 1680112270483 - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda @@ -407,7 +437,6 @@ packages: - zlib 1.3.1 *_2 license: Zlib license_family: Other - purls: [] size: 60963 timestamp: 1727963148474 - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda @@ -419,7 +448,6 @@ packages: - zlib 1.3.1 *_2 license: Zlib license_family: Other - purls: [] size: 57133 timestamp: 1727963183990 - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda @@ -431,7 +459,6 @@ packages: - zlib 1.3.1 *_2 license: Zlib license_family: Other - purls: [] size: 46438 timestamp: 1727963202283 - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda @@ -445,32 +472,27 @@ packages: - zlib 1.3.1 *_2 license: Zlib license_family: Other - purls: [] size: 55476 timestamp: 1727963768015 -- conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - sha256: c041b0eaf7a6af3344d5dd452815cdc148d6284fec25a4fa3f4263b3a021e962 - md5: 93a8e71256479c62074356ef6ebf501b +- conda: https://prefix.dev/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + sha256: 0fbacdfb31e55964152b24d5567e9a9996e1e7902fb08eb7d91b5fd6ce60803a + md5: fee3164ac23dfca50cfcc8b85ddefb81 depends: - mdurl >=0.1,<1 - - python >=3.8 + - python >=3.9 license: MIT license_family: MIT - purls: - - pkg:pypi/markdown-it-py?source=hash-mapping - size: 64356 - timestamp: 1686175179621 -- conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - sha256: 64073dfb6bb429d52fff30891877b48c7ec0f89625b1bf844905b66a81cce6e1 - md5: 776a8dd9e824f77abac30e6ef43a8f7a - depends: - - python >=3.6 + size: 64430 + timestamp: 1733250550053 +- conda: https://prefix.dev/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 + md5: 592132998493b3ff25fd7479396e8351 + depends: + - python >=3.9 license: MIT license_family: MIT - purls: - - pkg:pypi/mdurl?source=hash-mapping - size: 14680 - timestamp: 1704317789138 + size: 14465 + timestamp: 1733255681319 - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda sha256: 6a1d5d8634c1a07913f1c525db6455918cbc589d745fac46d9d6e30340c8731a md5: 70caf8bb6cf39a0b6b7efc885f51c0fe @@ -478,7 +500,6 @@ packages: - __glibc >=2.17,<3.0.a0 - libgcc-ng >=12 license: X11 AND BSD-3-Clause - purls: [] size: 889086 timestamp: 1724658547447 - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.5-hf036a51_1.conda @@ -487,7 +508,6 @@ packages: depends: - __osx >=10.13 license: X11 AND BSD-3-Clause - purls: [] size: 822066 timestamp: 1724658603042 - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda @@ -496,7 +516,6 @@ packages: depends: - __osx >=11.0 license: X11 AND BSD-3-Clause - purls: [] size: 802321 timestamp: 1724658775723 - conda: https://prefix.dev/conda-forge/linux-64/openssl-3.4.0-hb9d3cd8_0.conda @@ -508,7 +527,6 @@ packages: - libgcc >=13 license: Apache-2.0 license_family: Apache - purls: [] size: 2947466 timestamp: 1731377666602 - conda: https://prefix.dev/conda-forge/osx-64/openssl-3.4.0-hd471939_0.conda @@ -519,7 +537,6 @@ packages: - ca-certificates license: Apache-2.0 license_family: Apache - purls: [] size: 2590683 timestamp: 1731378034404 - conda: https://prefix.dev/conda-forge/osx-arm64/openssl-3.4.0-h39f12f2_0.conda @@ -530,7 +547,6 @@ packages: - ca-certificates license: Apache-2.0 license_family: Apache - purls: [] size: 2935176 timestamp: 1731377561525 - conda: https://prefix.dev/conda-forge/win-64/openssl-3.4.0-h2466b09_0.conda @@ -543,34 +559,21 @@ packages: - vc14_runtime >=14.29.30139 license: Apache-2.0 license_family: Apache - purls: [] size: 8491156 timestamp: 1731379715927 -- conda: https://prefix.dev/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda - sha256: 78267adf4e76d0d64ea2ffab008c501156c108bb08fecb703816fb63e279780b - md5: b7f5c092b8f9800150d998a71b76d5a1 - depends: - - python >=3.8 - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/pygments?source=hash-mapping - size: 879295 - timestamp: 1714846885370 - conda: https://prefix.dev/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_1.conda sha256: 0d6133545f268b2b89c2617c196fc791f365b538d4057ecd636d658c3b1e885d md5: b38dc0206e2a530e5c2cf11dc086b31a depends: - python >=3.9 license: BSD-2-Clause - purls: - - pkg:pypi/pygments?source=hash-mapping + license_family: BSD size: 876700 timestamp: 1733221731178 -- conda: https://prefix.dev/conda-forge/linux-64/python-3.13.0-h6355ac2_1_cp313t.conda - build_number: 1 - sha256: 9f9372b26c3509a8d798d5c1ffc58b0d34d96b7309efcbc5df40d1e72d5f8ef8 - md5: 7642e52774e72aa98c2eb1211e2978fd +- conda: https://prefix.dev/conda-forge/linux-64/python-3.13.1-ha99a958_102_cp313.conda + build_number: 102 + sha256: b10f25c5edc203d15b3f54861bec4868b8200ebc16c8cbc82202e4c8da2b183e + md5: 6e7535f1d1faf524e9210d2689b3149b depends: - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 @@ -578,114 +581,126 @@ packages: - libexpat >=2.6.4,<3.0a0 - libffi >=3.4,<4.0a0 - libgcc >=13 + - liblzma >=5.6.3,<6.0a0 - libmpdec >=4.0.0,<5.0a0 - libsqlite >=3.47.0,<4.0a0 - libuuid >=2.38.1,<3.0a0 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - openssl >=3.4.0,<4.0a0 - - python_abi 3.13.* *_cp313t + - python_abi 3.13.* *_cp313 - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata - - xz >=5.2.6,<6.0a0 - track_features: - - py_freethreading license: Python-2.0 - purls: [] - size: 41182351 - timestamp: 1732737151090 -- conda: https://prefix.dev/conda-forge/osx-64/python-3.12.7-h8f8b54e_0_cpython.conda - sha256: 28172d94f7193c5075c0fc3c4b1bb617c512ffc991f4e2af0dbb6a2916872b76 - md5: 7f81191b1ca1113e694e90e15c27a12f + size: 33263183 + timestamp: 1733436074842 +- conda: https://prefix.dev/conda-forge/osx-64/python-3.13.1-h2334245_102_cp313.conda + build_number: 102 + sha256: 8f424519d207379f0410d2783b257426f6d362edbc0b6c6b2a5ed61ff87821f9 + md5: bacdbf2fd86557ad1fb862cb2d30d821 depends: - __osx >=10.13 - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.6.3,<3.0a0 + - libexpat >=2.6.4,<3.0a0 - libffi >=3.4,<4.0a0 - - libsqlite >=3.46.1,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.47.0,<4.0a0 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - - openssl >=3.3.2,<4.0a0 + - openssl >=3.4.0,<4.0a0 + - python_abi 3.13.* *_cp313 - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata - - xz >=5.2.6,<6.0a0 - constrains: - - python_abi 3.12.* *_cp312 license: Python-2.0 - purls: [] - size: 13761315 - timestamp: 1728058247482 -- conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.0-h536b44d_1_cp313t.conda - build_number: 1 - sha256: efa6f1cbe92cccb0c3423a239cd0f7294273f3940954f20a523ba3ab66e97a0d - md5: 4c67396d5d15c84bf6493d6e3a76e484 + size: 14067313 + timestamp: 1733434634823 +- conda: https://prefix.dev/conda-forge/osx-arm64/python-3.13.1-h4f43103_102_cp313.conda + build_number: 102 + sha256: 0379adf6bb35ca47036860983701e8f6fae89c028d422f2b9439f3110893bc24 + md5: 8c65c1dfc98312ef8666dbb7c7fc47ca depends: - __osx >=11.0 - bzip2 >=1.0.8,<2.0a0 - libexpat >=2.6.4,<3.0a0 - libffi >=3.4,<4.0a0 + - liblzma >=5.6.3,<6.0a0 - libmpdec >=4.0.0,<5.0a0 - libsqlite >=3.47.0,<4.0a0 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - openssl >=3.4.0,<4.0a0 - - python_abi 3.13.* *_cp313t + - python_abi 3.13.* *_cp313 - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata - - xz >=5.2.6,<6.0a0 - track_features: - - py_freethreading license: Python-2.0 - purls: [] - size: 14646542 - timestamp: 1732735528561 -- conda: https://prefix.dev/conda-forge/win-64/python-3.12.7-hce54a09_0_cpython.conda - sha256: 2308cfa9ec563360d29ced7fd13a6b60b9a7b3cf8961a95c78c69f486211d018 - md5: 21f1f7c6ccf6b747c5086d2422c230e1 + size: 12905237 + timestamp: 1733433280639 +- conda: https://prefix.dev/conda-forge/win-64/python-3.13.1-h071d269_102_cp313.conda + build_number: 102 + sha256: ee41eda85ebc3a257a3b21a76d255d986b08a285d891e418cbfb70113ee14684 + md5: 70568ba8bbd5f0c7b830e690775eb8b7 depends: - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.6.3,<3.0a0 + - libexpat >=2.6.4,<3.0a0 - libffi >=3.4,<4.0a0 - - libsqlite >=3.46.1,<4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.47.0,<4.0a0 - libzlib >=1.3.1,<2.0a0 - - openssl >=3.3.2,<4.0a0 + - openssl >=3.4.0,<4.0a0 + - python_abi 3.13.* *_cp313 - tk >=8.6.13,<8.7.0a0 - tzdata - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - - xz >=5.2.6,<6.0a0 - constrains: - - python_abi 3.12.* *_cp312 license: Python-2.0 - purls: [] - size: 15987537 - timestamp: 1728057382072 -- conda: https://prefix.dev/conda-forge/linux-64/python_abi-3.13-5_cp313t.conda + size: 16753813 + timestamp: 1733433028707 +- conda: https://prefix.dev/conda-forge/linux-64/python_abi-3.13-5_cp313.conda build_number: 5 - sha256: 3405de6b376bc49b228b7650d2aa119a42224a7e567a82951a708fc4b914c035 - md5: ea4c21b96e8280414d9e243da0ec3201 + sha256: 438225b241c5f9bddae6f0178a97f5870a89ecf927dfca54753e689907331442 + md5: 381bbd2a92c863f640a55b6ff3c35161 constrains: - - python 3.13.* *_cp313t + - python 3.13.* *_cp313 license: BSD-3-Clause license_family: BSD - purls: [] - size: 6247 - timestamp: 1723823372966 -- conda: https://prefix.dev/conda-forge/osx-arm64/python_abi-3.13-5_cp313t.conda + size: 6217 + timestamp: 1723823393322 +- conda: https://prefix.dev/conda-forge/osx-64/python_abi-3.13-5_cp313.conda build_number: 5 - sha256: 2165466ff175e1890b66d079d64449a1b6dd9873fb0f5e977839ccc4639b813b - md5: 24a9a05eba65586da53ad7b56a06dc02 + sha256: 075ad768648e88b78d2a94099563b43d3082e7c35979f457164f26d1079b7b5c + md5: 927a2186f1f997ac018d67c4eece90a6 constrains: - - python 3.13.* *_cp313t + - python 3.13.* *_cp313 license: BSD-3-Clause license_family: BSD - purls: [] - size: 6317 - timestamp: 1723823118660 + size: 6291 + timestamp: 1723823083064 +- conda: https://prefix.dev/conda-forge/osx-arm64/python_abi-3.13-5_cp313.conda + build_number: 5 + sha256: 4437198eae80310f40b23ae2f8a9e0a7e5c2b9ae411a8621eb03d87273666199 + md5: b8e82d0a5c1664638f87f63cc5d241fb + constrains: + - python 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + size: 6322 + timestamp: 1723823058879 +- conda: https://prefix.dev/conda-forge/win-64/python_abi-3.13-5_cp313.conda + build_number: 5 + sha256: 0c12cc1b84962444002c699ed21e815fb9f686f950d734332a1b74d07db97756 + md5: 44b4fe6f22b57103afb2299935c8b68e + constrains: + - python 3.13.* *_cp313 + license: BSD-3-Clause + license_family: BSD + size: 6716 + timestamp: 1723823166911 - conda: https://prefix.dev/conda-forge/linux-64/readline-8.2-h8228510_1.conda sha256: 5435cf39d039387fbdc977b0a762357ea909a7694d9528ab40f005e9208744d7 md5: 47d31b792659ce70f470b5c82fdfb7a4 @@ -694,7 +709,6 @@ packages: - ncurses >=6.3,<7.0a0 license: GPL-3.0-only license_family: GPL - purls: [] size: 281456 timestamp: 1679532220005 - conda: https://prefix.dev/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda @@ -704,7 +718,6 @@ packages: - ncurses >=6.3,<7.0a0 license: GPL-3.0-only license_family: GPL - purls: [] size: 255870 timestamp: 1679532707590 - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda @@ -714,23 +727,20 @@ packages: - ncurses >=6.3,<7.0a0 license: GPL-3.0-only license_family: GPL - purls: [] size: 250351 timestamp: 1679532511311 -- conda: https://prefix.dev/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_0.conda - sha256: c009488fc07fd5557434c9c1ad32ab1dd50241d6a766e4b2b4125cd6498585a8 - md5: bcf8cc8924b5d20ead3d122130b8320b +- conda: https://prefix.dev/conda-forge/noarch/rich-13.9.4-pyhd8ed1ab_1.conda + sha256: 06a760c5ae572e72e865d5a87e9fe3cc171e1a9c996e63daf3db52ff1a0b4457 + md5: 7aed65d4ff222bfb7335997aa40b7da5 depends: - markdown-it-py >=2.2.0 - pygments >=2.13.0,<3.0.0 - - python >=3.8 + - python >=3.9 - typing_extensions >=4.0.0,<5.0.0 license: MIT license_family: MIT - purls: - - pkg:pypi/rich?source=hash-mapping - size: 185481 - timestamp: 1730592349978 + size: 185646 + timestamp: 1733342347277 - conda: . name: rich_example version: 0.1.0 @@ -740,9 +750,9 @@ packages: - rich >=13.9.4,<14 - python input: - hash: bfdfc32d8617e2c3448398649d982ae510f7c27fe6e90067aefb1f965d40df8a + hash: a0fa8e2205e41657fe6d9166741ec2d74c3c12776c2aa1fbdbb9236c21fbef90 globs: - - pyproject.toml + - pixi.toml - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e md5: d453b98d9c83e71da0741bb0ff4d76bc @@ -751,7 +761,6 @@ packages: - libzlib >=1.2.13,<2.0.0a0 license: TCL license_family: BSD - purls: [] size: 3318875 timestamp: 1699202167581 - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda @@ -761,7 +770,6 @@ packages: - libzlib >=1.2.13,<2.0.0a0 license: TCL license_family: BSD - purls: [] size: 3270220 timestamp: 1699202389792 - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda @@ -771,7 +779,6 @@ packages: - libzlib >=1.2.13,<2.0.0a0 license: TCL license_family: BSD - purls: [] size: 3145523 timestamp: 1699202432999 - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h5226925_1.conda @@ -783,7 +790,6 @@ packages: - vc14_runtime >=14.29.30139 license: TCL license_family: BSD - purls: [] size: 3503410 timestamp: 1699202577803 - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_1.conda @@ -793,15 +799,12 @@ packages: - python >=3.9 license: PSF-2.0 license_family: PSF - purls: - - pkg:pypi/typing-extensions?source=hash-mapping size: 39637 timestamp: 1733188758212 - conda: https://prefix.dev/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda sha256: 4fde5c3008bf5d2db82f2b50204464314cc3c91c1d953652f7bd01d9e52aefdf md5: 8ac3367aafb1cc0a068483c580af8015 license: LicenseRef-Public-Domain - purls: [] size: 122354 timestamp: 1728047496079 - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda @@ -810,7 +813,6 @@ packages: constrains: - vs2015_runtime >=14.29.30037 license: LicenseRef-MicrosoftWindowsSDK10 - purls: [] size: 559710 timestamp: 1728377334097 - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-ha32ba9b_23.conda @@ -822,7 +824,6 @@ packages: - vc14 license: BSD-3-Clause license_family: BSD - purls: [] size: 17479 timestamp: 1731710827215 - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.42.34433-he29a5d6_23.conda @@ -834,7 +835,6 @@ packages: - vs2015_runtime 14.42.34433.* *_23 license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime license_family: Proprietary - purls: [] size: 754247 timestamp: 1731710681163 - conda: https://prefix.dev/conda-forge/win-64/vs2015_runtime-14.42.34433-hdffcdeb_23.conda @@ -844,39 +844,5 @@ packages: - vc14_runtime >=14.42.34433 license: BSD-3-Clause license_family: BSD - purls: [] size: 17572 timestamp: 1731710685291 -- conda: https://prefix.dev/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - sha256: 03a6d28ded42af8a347345f82f3eebdd6807a08526d47899a42d62d319609162 - md5: 2161070d867d1b1204ea749c8eec4ef0 - depends: - - libgcc-ng >=12 - license: LGPL-2.1 and GPL-2.0 - purls: [] - size: 418368 - timestamp: 1660346797927 -- conda: https://prefix.dev/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 - sha256: eb09823f34cc2dd663c0ec4ab13f246f45dcd52e5b8c47b9864361de5204a1c8 - md5: a72f9d4ea13d55d745ff1ed594747f10 - license: LGPL-2.1 and GPL-2.0 - purls: [] - size: 238119 - timestamp: 1660346964847 -- conda: https://prefix.dev/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - sha256: 59d78af0c3e071021cfe82dc40134c19dab8cdf804324b62940f5c8cd71803ec - md5: 39c6b54e94014701dd157f4f576ed211 - license: LGPL-2.1 and GPL-2.0 - purls: [] - size: 235693 - timestamp: 1660346961024 -- conda: https://prefix.dev/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 - sha256: 54d9778f75a02723784dc63aff4126ff6e6749ba21d11a6d03c1f4775f269fe0 - md5: 515d77642eaa3639413c6b1bc3f94219 - depends: - - vc >=14.1,<15 - - vs2015_runtime >=14.16.27033 - license: LGPL-2.1 and GPL-2.0 - purls: [] - size: 217804 - timestamp: 1660346976440 diff --git a/docs/source_files/pixi_projects/pixi_build_python/pixi.toml b/docs/source_files/pixi_projects/pixi_build_python/pixi.toml new file mode 100644 index 000000000..5aeed3dba --- /dev/null +++ b/docs/source_files/pixi_projects/pixi_build_python/pixi.toml @@ -0,0 +1,27 @@ +[workspace] # (1)! +channels = ["https://prefix.dev/conda-forge"] +platforms = ["win-64", "linux-64", "osx-arm64", "osx-64"] +preview = ["pixi-build"] + +[dependencies] # (2)! +rich_example = { path = "." } + +[tasks] # (3)! +start = "rich-example-main" + +[package] # (4)! +name = "rich_example" +version = "0.1.0" + +[build-system] # (5)! +build-backend = { name = "pixi-build-python", version = "*" } +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] + +[host-dependencies] # (6)! +hatchling = "==1.26.3" + +[run-dependencies] # (7)! +rich = ">=13.9.4,<14" diff --git a/docs/source_files/pixi_projects/pixi_build_python/pyproject.toml b/docs/source_files/pixi_projects/pixi_build_python/pyproject.toml new file mode 100644 index 000000000..cf5e2985d --- /dev/null +++ b/docs/source_files/pixi_projects/pixi_build_python/pyproject.toml @@ -0,0 +1,10 @@ +[project] +dependencies = ["rich"] # (1)! +name = "rich_example" +requires-python = ">= 3.11" +scripts = { rich-example-main = "rich_example:main" } # (2)! +version = "0.1.0" + +[build-system] # (3)! +build-backend = "hatchling.build" +requires = ["hatchling"] diff --git a/examples/rich_example/src/rich_example/__init__.py b/docs/source_files/pixi_projects/pixi_build_python/src/rich_example/__init__.py similarity index 56% rename from examples/rich_example/src/rich_example/__init__.py rename to docs/source_files/pixi_projects/pixi_build_python/src/rich_example/__init__.py index be2121f01..a664c31cc 100644 --- a/examples/rich_example/src/rich_example/__init__.py +++ b/docs/source_files/pixi_projects/pixi_build_python/src/rich_example/__init__.py @@ -5,11 +5,11 @@ def main() -> None: console = Console() - table = Table(title="Simple Rich Example") + table = Table() - table.add_column("Name", justify="right", style="cyan", no_wrap=True) - table.add_column("Age", style="magenta") - table.add_column("City", justify="right", style="green") + table.add_column("Name") + table.add_column("Age") + table.add_column("City") table.add_row("John Doe", "30", "New York") table.add_row("Jane Smith", "25", "Los Angeles") diff --git a/examples/rich_example/pyproject.toml b/examples/rich_example/pyproject.toml deleted file mode 100644 index 8394e0119..000000000 --- a/examples/rich_example/pyproject.toml +++ /dev/null @@ -1,65 +0,0 @@ -[project] -authors = [{ name = "Julian Hofer", email = "julianhofer@gnome.org" }] -dependencies = ["rich"] -description = "A simple package showcasing a rich terminal interface and pixi-build-python" -name = "rich_example" -requires-python = ">= 3.11" -version = "0.1.0" - -[project.scripts] -rich_example = "rich_example:main" - -[build-system] -build-backend = "hatchling.build" -requires = ["hatchling"] - -[tool.pixi.workspace] -channels = ["https://prefix.dev/conda-forge"] -platforms = ["win-64", "linux-64", "osx-64", "osx-arm64"] -preview = ["pixi-build"] - -[tool.pixi.host-dependencies] -# To be able to install this pyproject we need to install the dependencies of -# the python build-system defined above. Note that different from the -# pyproject build-system this refers to a conda package instead of a pypi -# package. -hatchling = "==1.26.3" -# This way uv is used instead of pip -uv = "*" - -# This section marks the project as a pixi package. -# -# Normally a number of fields would be set here, like the name, version, etc. -# However, since all these fields are already defined in the [project] section -# at the top of this file they are not required. -[tool.pixi.package] - -# The build-system section defines the build system that will be used to turn -# the source code of this package into a conda package. Similarly to the above -# [build-system] section this section instructs pixi which build backend to -# use. The build-backend is an executable that is installed and invoked by -# pixi with the sole purpose to build the package. -[tool.pixi.build-system] -# The name of the build backend to use. This name refers both to the name of -# the package that provides the build backend and the name of the executable -# inside the package that is invoked. -# -# The `build-backend` key also functions as a dependency declaration. At least -# a version specifier must be added. -build-backend = { name = "pixi-build-python", version = "*" } -# These are the conda channels that are used to resolve the dependencies of the -# build backend package. -channels = [ - "https://prefix.dev/pixi-build-backends", - "https://prefix.dev/conda-forge", -] - - -[tool.pixi.tasks] -test = "rich_example" - -[tool.pixi.dependencies] -rich_example = { path = "." } - -[tool.pixi.run-dependencies] -rich = ">=13.9.4,<14" diff --git a/mkdocs.yml b/mkdocs.yml index 77d5b7d0e..8cc2b6af3 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -126,6 +126,7 @@ nav: - Building Packages: - Getting started: build/getting_started.md - Dependency Types: build/dependency_types.md + - Building a Python package: build/python.md - Advanced: - Authentication: advanced/authentication.md - Channel Logic: advanced/channel_priority.md diff --git a/tests/integration_python/conftest.py b/tests/integration_python/conftest.py index d3988f05c..9f57b0491 100644 --- a/tests/integration_python/conftest.py +++ b/tests/integration_python/conftest.py @@ -77,3 +77,8 @@ def non_self_expose_channel_1(channels: Path) -> str: @pytest.fixture def non_self_expose_channel_2(channels: Path) -> str: return channels.joinpath("non_self_expose_channel_2").as_uri() + + +@pytest.fixture +def doc_pixi_projects() -> Path: + return Path(__file__).parents[2].joinpath("docs", "source_files", "pixi_projects") diff --git a/tests/integration_python/pixi_build/test_build.py b/tests/integration_python/pixi_build/test_build.py index a0dcc63d1..f2cea328e 100644 --- a/tests/integration_python/pixi_build/test_build.py +++ b/tests/integration_python/pixi_build/test_build.py @@ -5,16 +5,17 @@ from ..common import verify_cli_command -def test_build_conda_package(pixi: Path, examples_dir: Path, tmp_pixi_workspace: Path) -> None: +def test_build_conda_package(pixi: Path, tmp_pixi_workspace: Path, doc_pixi_projects: Path) -> None: """ This one tries to build the rich example project """ - pyproject = examples_dir / "rich_example" - target_dir = tmp_pixi_workspace / "pyproject" - shutil.copytree(pyproject, target_dir) + + project = doc_pixi_projects / "pixi_build_python" + target_dir = tmp_pixi_workspace / "project" + shutil.copytree(project, target_dir) shutil.rmtree(target_dir.joinpath(".pixi"), ignore_errors=True) - manifest_path = target_dir / "pyproject.toml" + manifest_path = target_dir / "pixi.toml" # build it verify_cli_command( diff --git a/tests/integration_python/test_docs.py b/tests/integration_python/test_docs.py new file mode 100644 index 000000000..60bbd9129 --- /dev/null +++ b/tests/integration_python/test_docs.py @@ -0,0 +1,28 @@ +import pytest +from pathlib import Path +import shutil + +from .common import ExitCode, verify_cli_command +import sys + + +pytestmark = pytest.mark.skipif( + sys.platform.startswith("win"), + reason="Enable again as soon as pixi build supports windows builds with multiple platforms", +) + + +@pytest.mark.slow +def test_doc_pixi_projects(pixi: Path, tmp_pixi_workspace: Path, doc_pixi_projects: Path) -> None: + # TODO: Setting the cache dir shouldn't be necessary! + env = {"PIXI_CACHE_DIR": str(tmp_pixi_workspace.joinpath("pixi_cache"))} + target_dir = tmp_pixi_workspace.joinpath("pixi_projects") + shutil.copytree(doc_pixi_projects, target_dir) + + for pixi_project in target_dir.iterdir(): + shutil.rmtree(pixi_project.joinpath(".pixi"), ignore_errors=True) + manifest = pixi_project.joinpath("pixi.toml") + # Run the test command + verify_cli_command( + [pixi, "run", "--manifest-path", manifest, "start"], ExitCode.SUCCESS, env=env + )