diff --git a/.devcontainer.json b/.devcontainer.json index e76098216..e3c39242c 100644 --- a/.devcontainer.json +++ b/.devcontainer.json @@ -2,7 +2,7 @@ "customizations": { "vscode": { "extensions": [ - "bbenoist.Nix" + "jnoortheen.nix-ide" ] } }, diff --git a/.envrc b/.envrc index d0de725ed..648c747af 100755 --- a/.envrc +++ b/.envrc @@ -10,4 +10,4 @@ PATH_add "$devenv_bin/bin" # External users should use `source_url` to load this file source_env ./direnvrc -use devenv +use devenv \ No newline at end of file diff --git a/.github/workflows/buildtest.yml b/.github/workflows/buildtest.yml index fd6373aca..be32836b8 100644 --- a/.github/workflows/buildtest.yml +++ b/.github/workflows/buildtest.yml @@ -18,21 +18,16 @@ jobs: steps: - uses: actions/checkout@v4 - uses: cachix/install-nix-action@v25 - with: - extra_nix_config: | - access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} - uses: cachix/cachix-action@v14 with: name: devenv authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' - - run: | - nix profile remove '.*' - nix profile install --accept-flake-config . + - run: nix build - name: Run tests run: | - devenv ci - devenv shell devenv-run-tests - devenv search ncdu | grep "pkgs\.ncdu" + ./result/bin/devenv ci + ./result/bin/devenv shell devenv-run-tests + ./result/bin/devenv search ncdu | grep "pkgs\.ncdu" pin: needs: build if: startsWith(github.ref, 'refs/tags/v') @@ -51,7 +46,7 @@ jobs: echo "examples=$json" >> $GITHUB_OUTPUT examples: name: ${{ matrix.example }} (${{ join(matrix.os) }}) - needs: [generate-examples] + needs: [generate-examples, build] strategy: fail-fast: false matrix: @@ -69,16 +64,16 @@ jobs: with: name: devenv authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' - - run: | - nix profile remove '.*' - nix profile install --accept-flake-config . "nixpkgs#gawk" - name: Disable package aliases run: | mkdir -p ~/.config/nixpkgs echo '{ allowAliases = false; }' > ~/.config/nixpkgs/config.nix - - run: devenv shell devenv-test-example ${{ matrix.example }} + - run: | + nix build + ./result/bin/devenv test ${{ matrix.example }} direnv: name: direnv (${{ join(matrix.os) }}) + needs: build strategy: fail-fast: false matrix: @@ -95,15 +90,15 @@ jobs: authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' - run: | mv ./examples/simple/devenv.yaml ./examples/simple/devenv.yaml.orig - awk ' + nix run nixpkgs#gawk -- ' { print } /^inputs:$/ { print " devenv:"; - print " url: path:../../src/modules"; + print " url: path:../../?dir=src/modules"; } ' ./examples/simple/devenv.yaml.orig > ./examples/simple/devenv.yaml nix profile remove '.*' - nix profile install . 'nixpkgs#direnv' + nix profile install . 'nixpkgs#direnv' mkdir -p ~/.config/direnv/ cat > ~/.config/direnv/direnv.toml << 'EOF' [global] @@ -113,6 +108,7 @@ jobs: direnv exec ./examples/simple true fish-zsh: name: zsh/fish (${{ join(matrix.os) }}) + needs: build strategy: fail-fast: false matrix: @@ -127,9 +123,7 @@ jobs: with: name: devenv authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' + - run: nix build - run: | - nix profile remove '.*' - nix profile install --accept-flake-config . - - run: | - nix shell nixpkgs#zsh -c zsh -c "$(which devenv) version" - nix shell nixpkgs#fish -c fish -c "$(which devenv) version" + nix shell nixpkgs#zsh -c zsh -c "./result/bin/devenv version" + nix shell nixpkgs#fish -c fish -c "./result/bin/devenv version" diff --git a/.gitignore b/.gitignore index 420e5d62f..8de6048b7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,14 @@ +# Nix & devenv result .env .env.* .devenv* /.cache /.pre-commit-config.yaml -/bin -/include -/lib -pyvenv.cfg -/.direnv -/.venv + +# examples examples/rust/app/target + +# Python +/.venv +*.pyc diff --git a/build_cloudflare.sh b/build_cloudflare.sh index 2ab00ad26..4b6b8353c 100755 --- a/build_cloudflare.sh +++ b/build_cloudflare.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash set -xe -poetry install +poetry install --with docs poetry run -- mkdocs build diff --git a/devcontainer/nix-entrypoint.sh b/devcontainer/nix-entrypoint.sh index 63fd59c4e..7665b9e13 100644 --- a/devcontainer/nix-entrypoint.sh +++ b/devcontainer/nix-entrypoint.sh @@ -4,6 +4,7 @@ set +e if ! pidof nix-daemon > /dev/null 2>&1; then start_ok=false if [ "$(id -u)" = "0" ]; then + # shellcheck disable=SC1091 # shellcheck source=/dev/null ( . /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh; /nix/var/nix/profiles/default/bin/nix-daemon > /tmp/nix-daemon.log 2>&1 ) & # shellcheck disable=SC2181 diff --git a/devenv.lock b/devenv.lock index 025c4a7e8..182c4450a 100644 --- a/devenv.lock +++ b/devenv.lock @@ -14,11 +14,27 @@ "flake-compat": { "flake": false, "locked": { - "lastModified": 1673956053, - "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", + "lastModified": 1696426674, "owner": "edolstra", "repo": "flake-compat", - "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "treeHash": "2addb7b71a20a25ea74feeaf5c2f6a6b30898ecb", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_2": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "treeHash": "2addb7b71a20a25ea74feeaf5c2f6a6b30898ecb", "type": "github" }, "original": { @@ -32,11 +48,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1685518550, - "narHash": "sha256-o2d0KcvaXzTrPRIo0kOLV0/QXHhDQ5DTi+OxcjO8xqY=", + "lastModified": 1705309234, "owner": "numtide", "repo": "flake-utils", - "rev": "a1720a10a6cfe8234c0e93907ffe81be440f4cef", + "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", + "treeHash": "80a852cb0f5bf29497a20ca4f37ba97b0e85c721", "type": "github" }, "original": { @@ -53,11 +69,11 @@ ] }, "locked": { - "lastModified": 1660459072, - "narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=", + "lastModified": 1703887061, "owner": "hercules-ci", "repo": "gitignore.nix", - "rev": "a20de23b925fd8264fd7fad6454652e142fd7f73", + "rev": "43e1aa1308018f37118e34d3a9cb4f5e75dc11d5", + "treeHash": "2dd7f68f94467b298f778300ce0248117d6c500e", "type": "github" }, "original": { @@ -66,52 +82,36 @@ "type": "github" } }, - "lowdown-src": { - "flake": false, - "locked": { - "lastModified": 1633514407, - "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", - "owner": "kristapsdz", - "repo": "lowdown", - "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", - "type": "github" - }, - "original": { - "owner": "kristapsdz", - "repo": "lowdown", - "type": "github" - } - }, "nix": { "inputs": { - "lowdown-src": "lowdown-src", + "flake-compat": "flake-compat", "nixpkgs": [ "nixpkgs" ], "nixpkgs-regression": "nixpkgs-regression" }, "locked": { - "lastModified": 1676545802, - "narHash": "sha256-EK4rZ+Hd5hsvXnzSzk2ikhStJnD63odF7SzsQ8CuSPU=", + "lastModified": 1708370782, "owner": "domenkozar", "repo": "nix", - "rev": "7c91803598ffbcfe4a55c44ac6d49b2cf07a527f", + "rev": "3b944df09a1d3606f094bd4b32c56846efc99ddf", + "treeHash": "401993a9735c08297eff0a593f6ac5adac68c8b9", "type": "github" }, "original": { "owner": "domenkozar", - "ref": "relaxed-flakes", + "ref": "devenv-2.21", "repo": "nix", "type": "github" } }, "nixpkgs": { "locked": { - "lastModified": 1701693815, - "narHash": "sha256-7BkrXykVWfkn6+c1EhFA3ko4MLi3gVG0p9G96PNnKTM=", + "lastModified": 1708373374, "owner": "NixOS", "repo": "nixpkgs", - "rev": "09ec6a0881e1a36c29d67497693a67a16f4da573", + "rev": "93e1c2d08467d1117ebac45689469613a9fe8453", + "treeHash": "a71be29ec9a1d906373bc8e8feac400a1bc378bf", "type": "github" }, "original": { @@ -124,10 +124,10 @@ "nixpkgs-regression": { "locked": { "lastModified": 1643052045, - "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", "owner": "NixOS", "repo": "nixpkgs", "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "treeHash": "749c7b11668286627143f45b3f9078561a91980a", "type": "github" }, "original": { @@ -139,23 +139,23 @@ }, "nixpkgs-stable": { "locked": { - "lastModified": 1685801374, - "narHash": "sha256-otaSUoFEMM+LjBI1XL/xGB5ao6IwnZOXc47qhIgJe8U=", + "lastModified": 1708294118, "owner": "NixOS", "repo": "nixpkgs", - "rev": "c37ca420157f4abc31e26f436c1145f8951ff373", + "rev": "e0da498ad77ac8909a980f07eff060862417ccf7", + "treeHash": "6080d79e20d8f9fce719e518f10143595514df54", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixos-23.05", + "ref": "nixos-23.11", "repo": "nixpkgs", "type": "github" } }, "pre-commit-hooks": { "inputs": { - "flake-compat": "flake-compat", + "flake-compat": "flake-compat_2", "flake-utils": "flake-utils", "gitignore": "gitignore", "nixpkgs": [ @@ -164,11 +164,11 @@ "nixpkgs-stable": "nixpkgs-stable" }, "locked": { - "lastModified": 1700922917, - "narHash": "sha256-ej2fch/T584b5K9sk1UhmZF7W6wEfDHuoUYpFN8dtvM=", + "lastModified": 1708018599, "owner": "cachix", "repo": "pre-commit-hooks.nix", - "rev": "e5ee5c5f3844550c01d2131096c7271cec5e9b78", + "rev": "5df5a70ad7575f6601d91f0efec95dd9bc619431", + "treeHash": "6b6519c2b58ad1e106d9633f0d1b490a70fc6980", "type": "github" }, "original": { @@ -188,10 +188,10 @@ "systems": { "locked": { "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", "owner": "nix-systems", "repo": "default", "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "treeHash": "cce81f2a0f0743b2eb61bc2eb6c7adbe2f2c6beb", "type": "github" }, "original": { diff --git a/devenv.nix b/devenv.nix index a1886af84..eccd4a528 100644 --- a/devenv.nix +++ b/devenv.nix @@ -1,26 +1,29 @@ { inputs, pkgs, lib, config, ... }: { + env.DEVENV_NIX = inputs.nix.packages.${pkgs.stdenv.system}.nix; + packages = [ - (import ./src/devenv.nix { inherit pkgs; nix = inputs.nix; }) pkgs.cairo pkgs.xorg.libxcb pkgs.yaml2json + pkgs.tesh + pkgs.python3Packages.black ]; languages.nix.enable = true; languages.python.enable = true; - languages.python.venv.enable = true; languages.python.poetry.enable = true; + languages.python.poetry.install.installRootPackage = true; + languages.python.poetry.install.groups = [ "docs" ]; devcontainer.enable = true; - devcontainer.settings.customizations.vscode.extensions = [ "bbenoist.Nix" ]; + devcontainer.settings.customizations.vscode.extensions = [ "jnoortheen.nix-ide" ]; difftastic.enable = true; dotenv.enable = true; processes.docs.exec = "mkdocs serve"; - processes.build.exec = "${pkgs.watchexec}/bin/watchexec -e nix nix build"; scripts.devenv-bump-version.exec = '' # TODO: ask for the new version @@ -40,7 +43,11 @@ tmp="$(mktemp -d)" devenv init "$tmp" pushd "$tmp" + echo -e " devenv:\n url: path:${config.devenv.root}?dir=src/modules" >> devenv.yaml + cat devenv.yaml + devenv version devenv ci + devenv test popd rm -rf "$tmp" @@ -50,7 +57,7 @@ nix flake init --template ''${DEVENV_ROOT}#simple nix flake update \ --override-input devenv ''${DEVENV_ROOT} - nix develop --impure --command echo nix-develop started succesfully |& tee ./console + nix develop --accept-flake-config --impure --command echo nix-develop started succesfully |& tee ./console grep -F 'nix-develop started succesfully' <./console grep -F "$(${lib.getExe pkgs.hello})" <./console @@ -70,52 +77,16 @@ nix flake init --template ''${DEVENV_ROOT}#flake-parts nix flake update \ --override-input devenv ''${DEVENV_ROOT} - nix develop --impure --command echo nix-develop started succesfully |& tee ./console + nix develop --accept-flake-config --impure --command echo nix-develop started succesfully |& tee ./console grep -F 'nix-develop started succesfully' <./console grep -F "$(${lib.getExe pkgs.hello})" <./console # Test that a container can be built - nix build --impure .#container-processes + if $(uname) == "Linux" + then + nix build --impure --accept-flake-config --show-trace .#container-processes + fi popd rm -rf "$tmp" - - # TODO: test DIRENV_ACTIVE - ''; - scripts.devenv-test-all-examples.exec = '' - for dir in $(ls examples); do - devenv-test-example $dir - done - ''; - scripts.devenv-test-example.exec = '' - # execute all trap_ function on exit - trap 'eval $(declare -F | grep -o "trap_[^ ]*" | tr "\n" ";")' EXIT - - set -e - example="$PWD/examples/$1" - pushd $example - mv devenv.yaml devenv.yaml.orig - awk ' - { print } - /^inputs:$/ { - print " devenv:"; - print " url: path:../../src/modules"; - } - ' devenv.yaml.orig > devenv.yaml - trap_restore_yaml() { - mv "$example/devenv.yaml.orig" "$example/devenv.yaml" - } - devenv ci - if [ -f .test.sh ]; then - trap_restore_local() { - rm "$example/devenv.local.nix" - rm -rf "$example/.devenv" - } - # coreutils-full provides timeout on darwin - echo "{ pkgs, ... }: { packages = [ pkgs.coreutils-full ]; }" > devenv.local.nix - devenv shell ./.test.sh - else - devenv shell ls - fi - popd ''; scripts."devenv-generate-doc-options".exec = '' set -e @@ -151,6 +122,7 @@ pre-commit.hooks = { nixpkgs-fmt.enable = true; shellcheck.enable = true; + black.enable = true; #markdownlint.enable = true; }; pre-commit.settings.markdownlint.config = { @@ -160,4 +132,7 @@ MD033 = false; MD034 = false; }; + + tests = config.lib.mkTests ./examples + // config.lib.mkTests ./tests; } diff --git a/devenv.yaml b/devenv.yaml index d759fba2c..01be806ad 100644 --- a/devenv.yaml +++ b/devenv.yaml @@ -2,14 +2,14 @@ inputs: nixpkgs: url: github:NixOS/nixpkgs/nixpkgs-unstable nix: - url: github:domenkozar/nix/relaxed-flakes + url: github:domenkozar/nix/devenv-2.21 inputs: nixpkgs: - follows: "nixpkgs" + follows: nixpkgs devenv: url: path:./src/modules pre-commit-hooks: url: github:cachix/pre-commit-hooks.nix inputs: nixpkgs: - follows: "nixpkgs" \ No newline at end of file + follows: nixpkgs diff --git a/docs/binary-caching.md b/docs/binary-caching.md new file mode 100644 index 000000000..2189e01db --- /dev/null +++ b/docs/binary-caching.md @@ -0,0 +1,34 @@ +Typically [packages](./packages.md) come prebuilt with binaries provided by [the official binary cache](https://cache.nixos.org). + +If you're modifying a package or using a package that's not built upstream, +Nix will build it from source instead of downloading a binary. + +To prevent packages from being built more than once, there's seamless integration with +binary caches using [Cachix](https://cachix.org). + +## Setup + +If you'd like to push binaries to your own cache, you'll need [to create one](https://app.cachix.org/cache). + +After that you'll need to set `cachix authtoken XXX` with either [a personal auth token](https://app.cachix.org/personal-auth-tokens) or a cache token (that you can create in cache settings). + +## devenv.nix + +To specify `pre-commit-hooks` as a cache to pull from and `mycache` to pull from and push to: + +```nix title="devenv.nix" +{ + cachix.pull = [ "pre-commit-hooks" ]; + cachix.push = "mycache"; +} +``` + +# Pushing only in specific cases + +You'll likely not want every user to push to the cache. + +It's usually convenient to push [explicitly](./files-and-variables/#devenvlocalnix), for example as part of CI run: + +```shell-session +$ echo '{ cachix.push = "mycache"; }' > devenv.local.nix +``` \ No newline at end of file diff --git a/docs/community/contributing.md b/docs/community/contributing.md index 971fc75eb..ffe18bf4a 100644 --- a/docs/community/contributing.md +++ b/docs/community/contributing.md @@ -6,28 +6,23 @@ We have a rule that new features need to come with documentation and tests (`dev ## Preparing the `devenv` development environment -1. Follow the [installation instructions for Nix and Cachix](../../getting-started/#installation). +1. Follow the [installation instructions for Nix and Cachix](../../getting-started/#installation) and [install direnv](../../automatic-shell-activation/). 2. `git clone https://github.com/cachix/devenv.git` 3. `cd devenv` -4. To build the project, run `nix-build`. - -5. `./result/bin/devenv shell` - -6. Once you have made changes, run `./result/bin/devenv shell` again. - -To automate this workflow, [install and use direnv](../../automatic-shell-activation/). +4. To build the project, run `direnv allow .`. ## Repository structure -- The `devenv` CLI is in `src/devenv.nix`. -- The `flake.nix` auto-generation logic lies in `src/flake.nix`. +- The `devenv` CLI is in `src/devenv/cli.py`. +- The `flake.nix` auto-generation logic lies in `src/modules/flake.tmpl.nix`. - All modules related to `devenv.nix` are in `src/modules/`. -- Examples are automatically tested on CI and are the best way to work on developing new modules, see `examples/`. +- Examples are automatically tested on CI and are the best way to work on developing new modules, see `examples/` and `tests/` - Documentation is in `docs/`. - To run a development server, run `devenv up`. +- To run a test, run `devnenv test `. ## Contributing language improvements diff --git a/docs/reference/options.md b/docs/reference/options.md index 99a0d25c2..243f52b2e 100644 --- a/docs/reference/options.md +++ b/docs/reference/options.md @@ -182,6 +182,21 @@ signed integer +## containers.\.maxLayers + +The maximum number of layers created when the container is created. + +*Type:* +int + +*Default:* +` 1 ` + +*Declared by:* + - [https://github.com/cachix/devenv/blob/main/src/modules/containers.nix](https://github.com/cachix/devenv/blob/main/src/modules/containers.nix) + + + ## containers.\.name Name of the container. diff --git a/docs/reference/yaml-options.md b/docs/reference/yaml-options.md index 6be96dfdf..fae2e0059 100644 --- a/docs/reference/yaml-options.md +++ b/docs/reference/yaml-options.md @@ -2,6 +2,7 @@ | Key | Value | | ---------------------------- | ----------------------------------------------------------------------------- | | allowUnfree | Allow unfree packages. Defaults to `false`. | +| allowBroken | Allow packages marked as broken. Defaults to `false`. | | inputs | Defaults to `inputs.nixpkgs.url: github:NixOS/nixpkgs/nixpkgs-unstable`. | | inputs.<name> | Identifier name used when passing the input in your ``devenv.nix`` function. | | inputs.<name>.url | URI specification of the input, see below for possible values. | diff --git a/docs/tests.md b/docs/tests.md new file mode 100644 index 000000000..6c1f53ff7 --- /dev/null +++ b/docs/tests.md @@ -0,0 +1,55 @@ +To ease testing of your environments, +we provide a way to define the tests and to run them. + +## Writing devenv tests + +A simple test would look like: + +```nix title="devenv.nix" +{ pkgs, ... }: { + tests.basic = { + nix = '' + { pkgs, ... }: { + packages = [ pkgs.ncdu ]; + } + ''; + test = '' + ncdu --version | grep "ncdu 2.2" + ''; + }; +} +``` + +```shell-session +$ devenv test +✔ Gathering tests in 0.3s. +• Found 1 test(s), running 1: +• Testing basic ... +• Running $ devenv ci +• Running .test.sh. +✔ Running basic in 16.7s. +``` + +## Defining tests in a folder + +A simple test with a test script: + +```shell-session +$ ls tests/mytest/ +.test.sh devenv.nix devenv.yaml +``` + +Define tests: + +```nix title="devenv.nix" +{ config, ... }: { + tests = config.lib.mkTests ./tests; +} +``` + +Run tests: + +```shell-session +$ devenv test +... +``` \ No newline at end of file diff --git a/examples/clickhouse/.test.sh b/examples/clickhouse/.test.sh index 2591599e4..4fb1ced15 100755 --- a/examples/clickhouse/.test.sh +++ b/examples/clickhouse/.test.sh @@ -1,18 +1,6 @@ #!/usr/bin/env bash - -set -ex - -devenv up & -DEVENV_PID=$! -export DEVENV_PID - -devenv_stop() { - pkill -P "$DEVENV_PID" -} - -trap devenv_stop EXIT - +set -xe timeout 20 bash -c 'until echo > /dev/tcp/localhost/9000; do sleep 0.5; done' sleep 2 -clickhouse-client --query "SELECT 1" +clickhouse-client --query "SELECT 1" \ No newline at end of file diff --git a/examples/clickhouse/devenv.nix b/examples/clickhouse/devenv.nix index 1ff391f49..e464a3732 100644 --- a/examples/clickhouse/devenv.nix +++ b/examples/clickhouse/devenv.nix @@ -4,7 +4,7 @@ services.clickhouse = { enable = true; config = '' - http_port: 9050 + # http_port: 8123 ''; }; } diff --git a/examples/cockroachdb/devenv.yaml b/examples/cockroachdb/devenv.yaml index 89a8475be..41b52a524 100644 --- a/examples/cockroachdb/devenv.yaml +++ b/examples/cockroachdb/devenv.yaml @@ -1,4 +1,4 @@ -allowUnfree: true inputs: nixpkgs: url: github:NixOS/nixpkgs/nixpkgs-unstable +allowUnfree: true diff --git a/examples/dotenv/.test.sh b/examples/dotenv/.test.sh index d4cb543c4..e3b1bf477 100755 --- a/examples/dotenv/.test.sh +++ b/examples/dotenv/.test.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash - +set -ex env | grep FOO=1 env | grep BAR=1 env | grep BAZ=5 diff --git a/examples/elasticmq/.test.sh b/examples/elasticmq/.test.sh index b0a849392..8607368d1 100755 --- a/examples/elasticmq/.test.sh +++ b/examples/elasticmq/.test.sh @@ -1,16 +1,6 @@ #!/usr/bin/env bash set -ex -devenv up & -DEVENV_PID=$! -export DEVENV_PID - -function stop() { - pkill -P "$DEVENV_PID" -} - -trap stop EXIT - timeout 60 bash -c 'until echo > /dev/tcp/localhost/9325; do sleep 0.5; done' QUEUE_NAME=$(curl http://localhost:9325/statistics/queues -s | jq .[].name -r) @@ -18,4 +8,4 @@ QUEUE_NAME=$(curl http://localhost:9325/statistics/queues -s | jq .[].name -r) if [[ "$QUEUE_NAME" != "test-queue" ]]; then echo "The queue is not created" exit 1 -fi \ No newline at end of file +fi diff --git a/examples/fly.io/.test.sh b/examples/fly.io/.test.sh index db0f6a31c..b85301004 100755 --- a/examples/fly.io/.test.sh +++ b/examples/fly.io/.test.sh @@ -1,5 +1,4 @@ #!/usr/bin/env bash - if [ "$(uname -s)" == "Linux" ]; then devenv container shell devenv container processes diff --git a/examples/fly.io/hello.py b/examples/fly.io/hello.py index 05b62393b..924d3eb22 100644 --- a/examples/fly.io/hello.py +++ b/examples/fly.io/hello.py @@ -2,6 +2,7 @@ app = Flask(__name__) + @app.route("/") def hello_world(): return "

Hello, World!

" diff --git a/examples/imports/.test.sh b/examples/imports/.test.sh index 6f8d16c29..10cb4a879 100755 --- a/examples/imports/.test.sh +++ b/examples/imports/.test.sh @@ -1,4 +1,3 @@ #!/usr/bin/env bash - env | grep "FILE=1" env | grep "FOLDER=1" \ No newline at end of file diff --git a/examples/influxdb/.test.sh b/examples/influxdb/.test.sh index ce2c18335..270ec901e 100755 --- a/examples/influxdb/.test.sh +++ b/examples/influxdb/.test.sh @@ -1,16 +1,6 @@ #!/usr/bin/env bash set -ex -devenv up & -DEVENV_PID=$! -export DEVENV_PID - -function stop() { - pkill -P "$DEVENV_PID" -} - -trap stop EXIT - # We test for the none-default port, configured in the nix file timeout 60 bash -c 'until echo > /dev/tcp/localhost/8087; do sleep 0.5; done' @@ -20,4 +10,4 @@ DATABASES=$(influx --port 8087 --execute "SHOW DATABASES" | grep devenv) if [[ "$DATABASES" != "devenv" ]]; then echo "The influxdb database was not created" exit 1 -fi \ No newline at end of file +fi diff --git a/examples/javascript/package-lock.json b/examples/javascript/package-lock.json deleted file mode 100644 index 651a88c91..000000000 --- a/examples/javascript/package-lock.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "name": "javascript", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "javascript", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "axios": "^1.4.0" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/axios": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", - "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - } - } -} diff --git a/examples/mailpit/.test.sh b/examples/mailpit/.test.sh index 4ff1ba4ce..812751e5f 100755 --- a/examples/mailpit/.test.sh +++ b/examples/mailpit/.test.sh @@ -1,16 +1,6 @@ #!/usr/bin/env bash set -ex -devenv up & -DEVENV_PID=$! -export DEVENV_PID - -function stop() { - pkill -P "$DEVENV_PID" -} - -trap stop EXIT - timeout 20 bash -c 'until echo > /dev/tcp/localhost/1025; do sleep 0.5; done' sendmail john@example.com < /dev/tcp/localhost/9000; do sleep 0.5; done' - -mc admin info local +mc admin info local \ No newline at end of file diff --git a/examples/modern-c/devenv.nix b/examples/modern-c/devenv.nix index fb8ab98d0..b50201b2c 100644 --- a/examples/modern-c/devenv.nix +++ b/examples/modern-c/devenv.nix @@ -7,6 +7,7 @@ cmake --version ''; + pre-commit.excludes = [ ".devenv" ]; pre-commit.hooks = { clang-tidy.enable = true; }; diff --git a/examples/mysql/.test.sh b/examples/mysql/.test.sh index 5b42ae290..e16683de7 100755 --- a/examples/mysql/.test.sh +++ b/examples/mysql/.test.sh @@ -1,14 +1,4 @@ #!/usr/bin/env bash set -ex -devenv up & -DEVENV_PID=$! -export DEVENV_PID - -devenv_stop() { - pkill -P "$DEVENV_PID" -} - -trap devenv_stop EXIT - -timeout 60 bash -c 'until MYSQL_PWD="" mysql -u root test_database < /dev/null; do sleep 0.5; done' +timeout 60 bash -c 'until MYSQL_PWD="" mysql -u root test_database < /dev/null; do sleep 0.5; done' \ No newline at end of file diff --git a/examples/overlays/devenv.nix b/examples/overlays/devenv.nix index c27092e92..d7eae18cc 100644 --- a/examples/overlays/devenv.nix +++ b/examples/overlays/devenv.nix @@ -1,7 +1,11 @@ { pkgs, ... }: { - packages = [ pkgs.rust-bin.stable.latest.default ]; + packages = [ + # from the rust-overlay + pkgs.rust-bin.stable.latest.default - services.blackfire.enable = true; + # from subflake + pkgs.hello2 + ]; } diff --git a/examples/overlays/devenv.yaml b/examples/overlays/devenv.yaml index 205510e49..044462b43 100644 --- a/examples/overlays/devenv.yaml +++ b/examples/overlays/devenv.yaml @@ -2,6 +2,10 @@ allowUnfree: true inputs: nixpkgs: url: github:NixOS/nixpkgs/nixpkgs-unstable + subflake: + url: path:./subflake + overlays: + - default rust-overlay: url: github:oxalica/rust-overlay overlays: diff --git a/examples/overlays/subflake/flake.nix b/examples/overlays/subflake/flake.nix new file mode 100644 index 000000000..d3ebe7a83 --- /dev/null +++ b/examples/overlays/subflake/flake.nix @@ -0,0 +1,7 @@ +{ + outputs = { ... }: { + overlays.default = self: super: { + hello2 = self.hello; + }; + }; +} diff --git a/examples/phoenix/.test.sh b/examples/phoenix/.test.sh index b7bdb2f10..b687eac17 100755 --- a/examples/phoenix/.test.sh +++ b/examples/phoenix/.test.sh @@ -1,11 +1,13 @@ #!/usr/bin/env bash set -ex -mix local.hex --force -mix local.rebar --force -echo Y | mix archive.install hex phx_new -echo Y | mix phx.new hello -sed -i.bak -e "s/username: \"postgres\",/socket_dir: System.get_env(\"PGDATA\"),/" \ - ./hello/config/dev.exs && rm ./hello/config/dev.exs.bak -devenv up& -timeout 20 bash -c 'until echo > /dev/tcp/localhost/4000; do sleep 0.5; done' -curl -s http://localhost:4000/ | grep "Phoenix Framework" +# mix local.hex --force +# mix local.rebar --force +# echo Y | mix archive.install hex phx_new +# echo Y | mix phx.new hello +# sed -i.bak -e "s/username: \"postgres\",/socket_dir: System.get_env(\"PGDATA\"),/" \ +# ./hello/config/dev.exs && rm ./hello/config/dev.exs.bak +# devenv up& +# timeout 20 bash -c 'until echo > /dev/tcp/localhost/4000; do sleep 0.5; done' +# curl -s http://localhost:4000/ | grep "Phoenix Framework" +echo "this example is currently broken" +exit 2 diff --git a/examples/phoenix/devenv.nix b/examples/phoenix/devenv.nix index 62259e772..a5ce5f7b3 100644 --- a/examples/phoenix/devenv.nix +++ b/examples/phoenix/devenv.nix @@ -1,11 +1,13 @@ { pkgs, lib, ... }: { + # this example is currently broken + packages = lib.optionals pkgs.stdenv.isLinux [ pkgs.inotify-tools ]; languages.elixir.enable = true; services.postgres.enable = true; - processes.phoenix.exec = "cd hello && mix ecto.create && mix phx.server"; + processes.phoenix.exec = "mix ecto.create && mix phx.server"; } diff --git a/examples/postgres/.test.sh b/examples/postgres/.test.sh index 4f95fa994..36f49e3d8 100755 --- a/examples/postgres/.test.sh +++ b/examples/postgres/.test.sh @@ -1,6 +1,3 @@ #!/usr/bin/env bash set -ex - -devenv up & - timeout 20 bash -c 'until psql -h /tmp -c "SELECT 1" mydb 2>/dev/null; do sleep 0.5; done' diff --git a/examples/python-poetry/.test.sh b/examples/python-poetry/.test.sh index c40dc901d..3675ebf54 100755 --- a/examples/python-poetry/.test.sh +++ b/examples/python-poetry/.test.sh @@ -6,6 +6,8 @@ POETRY_VENV="$PWD/.venv" [ "$(command -v python)" = "$POETRY_VENV/bin/python" ] python --version poetry --version +poetry run python -c "import os; print(os.environ['LD_LIBRARY_PATH'])" +ls .devenv/profile/lib poetry run python -c 'import numpy' python -c 'import numpy' python -c 'import pjsua2' diff --git a/examples/python-poetry/devenv.nix b/examples/python-poetry/devenv.nix index e3dd29617..97fb33a07 100644 --- a/examples/python-poetry/devenv.nix +++ b/examples/python-poetry/devenv.nix @@ -1,13 +1,18 @@ -{ pkgs, config, ... }: +{ pkgs, lib, config, ... }: { packages = [ - # A native dependency of numpy - pkgs.zlib - # A python dependency outside of poetry. config.languages.python.package.pkgs.pjsua2 ]; + + # this envvar can be removed and the lib can be moved into + # languages.python.libraries when we start working against env-venv + env.LD_LIBRARY_PATH = lib.makeLibraryPath [ + # A native dependency of numpy + pkgs.zlib + ]; + languages.python = { enable = true; poetry.enable = true; diff --git a/examples/rubyonrails/.test.sh b/examples/rubyonrails/.test.sh index 4d5c9821a..2e03dd625 100755 --- a/examples/rubyonrails/.test.sh +++ b/examples/rubyonrails/.test.sh @@ -1,7 +1,11 @@ #!/usr/bin/env bash set -ex -rails new blog -d=postgresql -devenv up& -timeout 20 bash -c 'until echo > /dev/tcp/localhost/5100; do sleep 0.5; done' -(cd blog && rails db:create) -curl -s http://localhost:5100/ | grep "version" \ No newline at end of file + +pushd blog + timeout 20 bash -c 'until echo > /dev/tcp/localhost/5100; do sleep 0.5; done' + rails db:create + curl -s http://localhost:5100/ | grep "version" +popd + +# make sure puma was compiled with ssl +ruby -rpuma -e 'exit 1 unless Puma.ssl?' \ No newline at end of file diff --git a/examples/rubyonrails/Gemfile b/examples/rubyonrails/Gemfile deleted file mode 100644 index 3f9616659..000000000 --- a/examples/rubyonrails/Gemfile +++ /dev/null @@ -1,8 +0,0 @@ -# frozen_string_literal: true - -source "https://rubygems.org" - -ruby "3.2.2" - -gem "rails" -gem "puma" diff --git a/examples/rubyonrails/devenv.nix b/examples/rubyonrails/devenv.nix index 497bfa258..1273110ca 100644 --- a/examples/rubyonrails/devenv.nix +++ b/examples/rubyonrails/devenv.nix @@ -4,12 +4,23 @@ languages.ruby.enable = true; languages.ruby.version = "3.2.2"; + packages = [ + pkgs.openssl + pkgs.libyaml + ]; + services.postgres.enable = true; processes.rails.exec = "rails server"; enterShell = '' + if [ ! -d "blog" ]; then + gem install rails + rails new blog -d=postgresql + fi export PATH="$DEVENV_ROOT/blog/bin:$PATH" - bundle + pushd blog + bundle + popd ''; } diff --git a/examples/supported-languages/devenv.yaml b/examples/supported-languages/devenv.yaml index 89a8475be..41b52a524 100644 --- a/examples/supported-languages/devenv.yaml +++ b/examples/supported-languages/devenv.yaml @@ -1,4 +1,4 @@ -allowUnfree: true inputs: nixpkgs: url: github:NixOS/nixpkgs/nixpkgs-unstable +allowUnfree: true diff --git a/examples/temporal/.test.sh b/examples/temporal/.test.sh index 968345280..19395639c 100755 --- a/examples/temporal/.test.sh +++ b/examples/temporal/.test.sh @@ -1,27 +1,26 @@ -#!/usr/bin/env bash +#!/bin/sh set -x -echo "Starting temporal service..." -devenv up & -DEVENV_PID=$! -export DEVENV_PID - -devenv_stop() { - pkill -P "$DEVENV_PID" -} - -trap devenv_stop EXIT - export TEMPORAL_ADDRESS=127.0.0.1:17233 -timeout 20 bash -c 'until echo > /dev/tcp/localhost/17233; do sleep 0.5; done' - -sleep 1 +# temporal status and store its exit status +check_temporal_status() { + echo "Waiting for service to become available..." + TEMPORAL_OUTPUT=$(temporal operator cluster health) + TEMPORAL_EXIT_STATUS=$? +} -if ! temporal operator cluster health; then - echo "Temporal not started" - exit 1 -fi +# Continuously check temporal status until it returns successfully (up to a maximum of 20 times) +# shellcheck disable=SC2034 +for i in $(seq 1 20); do + check_temporal_status + if [ $TEMPORAL_EXIT_STATUS -eq 0 ]; then + echo "Service is up..." + break + else + sleep 1 + fi +done echo "Checking namespace..." temporal operator namespace describe mynamespace @@ -29,4 +28,7 @@ temporal operator namespace describe mynamespace # Print the captured output when temporal status succeeds echo "Startup complete..." temporal operator cluster system -echo "$TEMPORAL_OUTPUT" \ No newline at end of file +echo "$TEMPORAL_OUTPUT" + +# Exit the script +exit "$TEMPORAL_EXIT_STATUS" diff --git a/examples/varnish/.test.sh b/examples/varnish/.test.sh index 129fd523f..3c7e21296 100755 --- a/examples/varnish/.test.sh +++ b/examples/varnish/.test.sh @@ -1,16 +1,6 @@ #!/usr/bin/env bash set -ex -devenv up & -DEVENV_PID=$! -export DEVENV_PID - -devenv_stop() { - pkill -P "$DEVENV_PID" -} - -trap devenv_stop EXIT - timeout 20 bash -c 'until echo > /dev/tcp/localhost/6081; do sleep 0.5; done' caddy=$(curl http://localhost:8001) diff --git a/examples/vault/.test.sh b/examples/vault/.test.sh index 23bebe597..586bd6e5b 100755 --- a/examples/vault/.test.sh +++ b/examples/vault/.test.sh @@ -1,20 +1,29 @@ #!/usr/bin/env bash -set -ex +set -x -echo "Starting vault service..." -devenv up & -DEVENV_PID=$! -export DEVENV_PID - -# shellcheck disable=SC2317 # ShellCheck may incorrectly believe that code is unreachable if it's invoked by variable name or in a trap -devenv_stop() { - pkill -P "$DEVENV_PID" +# vault status and store its exit status +check_vault_status() { + echo "Waiting for service to become available..." + VAULT_OUTPUT=$(vault status 2>&1) + VAULT_EXIT_STATUS=$? } -trap devenv_stop EXIT - -timeout 20 bash -c 'until echo > /dev/tcp/localhost/8200; do sleep 0.5; done' +# Continuously check vault status until it returns successfully (up to a maximum of 100 times) +# shellcheck disable=SC2034 +for i in $(seq 1 20); do + check_vault_status + if [ $VAULT_EXIT_STATUS -eq 0 ]; then + echo "Service is up..." + break + else + sleep 1 + fi +done -timeout 5 bash -c 'until vault status; do sleep 0.5; done' +# Print the captured output when vault status succeeds +echo "Startup complete..." +vault version +echo "$VAULT_OUTPUT" -vault status \ No newline at end of file +# Exit the script +exit "$VAULT_EXIT_STATUS" diff --git a/examples/vault/devenv.yaml b/examples/vault/devenv.yaml index 5d2ccd397..41b52a524 100644 --- a/examples/vault/devenv.yaml +++ b/examples/vault/devenv.yaml @@ -1,4 +1,4 @@ inputs: nixpkgs: url: github:NixOS/nixpkgs/nixpkgs-unstable -allowUnfree: true \ No newline at end of file +allowUnfree: true diff --git a/flake.lock b/flake.lock index c0bc8dac4..1ac91e162 100644 --- a/flake.lock +++ b/flake.lock @@ -16,10 +16,44 @@ "type": "github" } }, + "flake-compat_2": { + "flake": false, + "locked": { + "lastModified": 1673956053, + "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, "flake-utils": { "inputs": { "systems": "systems" }, + "locked": { + "lastModified": 1689068808, + "narHash": "sha256-6ixXo3wt24N/melDWjq70UuHQLxGV8jZvooRanIHXw0=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "919d646de7be200f3bf08cb76ae1f09402b6f9b4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "inputs": { + "systems": "systems_2" + }, "locked": { "lastModified": 1685518550, "narHash": "sha256-o2d0KcvaXzTrPRIo0kOLV0/QXHhDQ5DTi+OxcjO8xqY=", @@ -55,52 +89,57 @@ "type": "github" } }, - "lowdown-src": { - "flake": false, - "locked": { - "lastModified": 1633514407, - "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", - "owner": "kristapsdz", - "repo": "lowdown", - "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", - "type": "github" - }, - "original": { - "owner": "kristapsdz", - "repo": "lowdown", - "type": "github" - } - }, "nix": { "inputs": { - "lowdown-src": "lowdown-src", + "flake-compat": "flake-compat_2", "nixpkgs": [ "nixpkgs" ], "nixpkgs-regression": "nixpkgs-regression" }, "locked": { - "lastModified": 1676545802, - "narHash": "sha256-EK4rZ+Hd5hsvXnzSzk2ikhStJnD63odF7SzsQ8CuSPU=", + "lastModified": 1708577783, + "narHash": "sha256-92xq7eXlxIT5zFNccLpjiP7sdQqQI30Gyui2p/PfKZM=", "owner": "domenkozar", "repo": "nix", - "rev": "7c91803598ffbcfe4a55c44ac6d49b2cf07a527f", + "rev": "ecd0af0c1f56de32cbad14daa1d82a132bf298f8", "type": "github" }, "original": { "owner": "domenkozar", - "ref": "relaxed-flakes", + "ref": "devenv-2.21", "repo": "nix", "type": "github" } }, + "nix-github-actions": { + "inputs": { + "nixpkgs": [ + "poetry2nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1688870561, + "narHash": "sha256-4UYkifnPEw1nAzqqPOTL2MvWtm3sNGw1UTYTalkTcGY=", + "owner": "nix-community", + "repo": "nix-github-actions", + "rev": "165b1650b753316aa7f1787f3005a8d2da0f5301", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nix-github-actions", + "type": "github" + } + }, "nixpkgs": { "locked": { - "lastModified": 1678875422, - "narHash": "sha256-T3o6NcQPwXjxJMn2shz86Chch4ljXgZn746c2caGxd8=", + "lastModified": 1692808169, + "narHash": "sha256-x9Opq06rIiwdwGeK2Ykj69dNc2IvUH1fY55Wm7atwrE=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "126f49a01de5b7e35a43fd43f891ecf6d3a51459", + "rev": "9201b5ff357e781bf014d0330d18555695df7ba8", "type": "github" }, "original": { @@ -142,12 +181,34 @@ "type": "github" } }, + "poetry2nix": { + "inputs": { + "flake-utils": "flake-utils", + "nix-github-actions": "nix-github-actions", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1692876271, + "narHash": "sha256-IXfZEkI0Mal5y1jr6IRWMqK8GW2/f28xJenZIPQqkY0=", + "owner": "nix-community", + "repo": "poetry2nix", + "rev": "d5006be9c2c2417dafb2e2e5034d83fabd207ee3", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "poetry2nix", + "type": "github" + } + }, "pre-commit-hooks": { "inputs": { "flake-compat": [ "flake-compat" ], - "flake-utils": "flake-utils", + "flake-utils": "flake-utils_2", "gitignore": "gitignore", "nixpkgs": [ "nixpkgs" @@ -155,11 +216,11 @@ "nixpkgs-stable": "nixpkgs-stable" }, "locked": { - "lastModified": 1704725188, - "narHash": "sha256-qq8NbkhRZF1vVYQFt1s8Mbgo8knj+83+QlL5LBnYGpI=", + "lastModified": 1692274144, + "narHash": "sha256-BxTQuRUANQ81u8DJznQyPmRsg63t4Yc+0kcyq6OLz8s=", "owner": "cachix", "repo": "pre-commit-hooks.nix", - "rev": "ea96f0c05924341c551a797aaba8126334c505d2", + "rev": "7e3517c03d46159fdbf8c0e5c97f82d5d4b0c8fa", "type": "github" }, "original": { @@ -173,6 +234,7 @@ "flake-compat": "flake-compat", "nix": "nix", "nixpkgs": "nixpkgs", + "poetry2nix": "poetry2nix", "pre-commit-hooks": "pre-commit-hooks" } }, @@ -190,6 +252,21 @@ "repo": "default", "type": "github" } + }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } } }, "root": "root", diff --git a/flake.nix b/flake.nix index e73f2eb20..b548f0091 100644 --- a/flake.nix +++ b/flake.nix @@ -19,7 +19,11 @@ flake = false; }; inputs.nix = { - url = "github:domenkozar/nix/relaxed-flakes"; + url = "github:domenkozar/nix/devenv-2.21"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + inputs.poetry2nix = { + url = "github:nix-community/poetry2nix"; inputs.nixpkgs.follows = "nixpkgs"; }; @@ -27,9 +31,7 @@ let systems = [ "x86_64-linux" "i686-linux" "x86_64-darwin" "aarch64-linux" "aarch64-darwin" ]; forAllSystems = f: builtins.listToAttrs (map (name: { inherit name; value = f name; }) systems); - mkPackage = pkgs: import ./src/devenv.nix { - inherit pkgs nix; - }; + mkPackage = pkgs: import ./package.nix { inherit pkgs inputs; }; mkDevShellPackage = config: pkgs: import ./src/devenv-devShell.nix { inherit config pkgs; }; mkDocOptions = pkgs: let diff --git a/mkdocs.yml b/mkdocs.yml index a116dcbbb..c0dc9b34d 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -40,7 +40,9 @@ nav: - Processes: processes.md - Services: services.md - Containers: containers.md + - Binary Caching: binary-caching.md - Pre-Commit Hooks: pre-commit-hooks.md + - Tests: tests.md - Common Patterns: common-patterns.md - Writing devenv.yaml: - Inputs: inputs.md diff --git a/package.nix b/package.nix new file mode 100644 index 000000000..61c4f7d5a --- /dev/null +++ b/package.nix @@ -0,0 +1,33 @@ +{ pkgs, inputs }: + +let + python_slim = pkgs.python311.override { + mimetypesSupport = false; + x11Support = false; + stripConfig = true; + stripIdlelib = true; + stripTests = true; + stripTkinter = true; + enableLTO = false; + rebuildBytecode = false; + stripBytecode = true; + includeSiteCustomize = false; + enableOptimizations = false; + bzip2 = null; + gdbm = null; + xz = null; + ncurses = null; + readline = null; + sqlite = null; + tzdata = null; + self = python_slim; + }; +in +(inputs.poetry2nix.legacyPackages.${pkgs.stdenv.system}.mkPoetryApplication { + projectDir = ./.; + python = python_slim; +}).overrideAttrs (old: { + makeWrapperArgs = [ + "--set DEVENV_NIX ${inputs.nix.packages.${pkgs.stdenv.system}.nix}" + ]; +}) diff --git a/poetry.lock b/poetry.lock index 9ab9e70d1..e2c5f21ed 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,25 +1,23 @@ -# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. [[package]] name = "babel" -version = "2.12.1" +version = "2.14.0" description = "Internationalization utilities" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, - {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, + {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"}, + {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"}, ] -[package.dependencies] -pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] [[package]] name = "bracex" version = "2.4" description = "Bash style brace expander." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -31,7 +29,6 @@ files = [ name = "cairocffi" version = "1.6.1" description = "cffi-based cairo bindings for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -51,7 +48,6 @@ xcb = ["xcffib (>=1.4.0)"] name = "cairosvg" version = "2.7.1" description = "A Simple SVG Converter based on Cairo" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -72,88 +68,74 @@ test = ["flake8", "isort", "pytest"] [[package]] name = "certifi" -version = "2023.7.22" +version = "2023.11.17" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, - {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, + {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, + {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, ] [[package]] name = "cffi" -version = "1.15.1" +version = "1.16.0" description = "Foreign Function Interface for Python calling C code." -category = "main" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, ] [package.dependencies] @@ -161,94 +143,107 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.2.0" +version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, - {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] [[package]] name = "click" version = "8.1.7" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -263,7 +258,6 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -275,7 +269,6 @@ files = [ name = "cssselect2" version = "0.7.0" description = "CSS selectors for Python ElementTree" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -295,7 +288,6 @@ test = ["flake8", "isort", "pytest"] name = "defusedxml" version = "0.7.1" description = "XML bomb protection for Python stdlib modules" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -303,11 +295,26 @@ files = [ {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, ] +[[package]] +name = "filelock" +version = "3.13.1" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, + {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +typing = ["typing-extensions (>=4.8)"] + [[package]] name = "ghp-import" version = "2.1.0" description = "Copy your docs directly to the gh-pages branch." -category = "main" optional = false python-versions = "*" files = [ @@ -323,14 +330,13 @@ dev = ["flake8", "markdown", "twine", "wheel"] [[package]] name = "gitdb" -version = "4.0.10" +version = "4.0.11" description = "Git Object Database" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7"}, - {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"}, + {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, + {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, ] [package.dependencies] @@ -338,64 +344,60 @@ smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.36" +version = "3.1.41" description = "GitPython is a Python library used to interact with Git repositories" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "GitPython-3.1.36-py3-none-any.whl", hash = "sha256:8d22b5cfefd17c79914226982bb7851d6ade47545b1735a9d010a2a4c26d8388"}, - {file = "GitPython-3.1.36.tar.gz", hash = "sha256:4bb0c2a6995e85064140d31a33289aa5dce80133a23d36fcd372d716c54d3ebf"}, + {file = "GitPython-3.1.41-py3-none-any.whl", hash = "sha256:c36b6634d069b3f719610175020a9aed919421c87552185b085e04fbbdb10b7c"}, + {file = "GitPython-3.1.41.tar.gz", hash = "sha256:ed66e624884f76df22c8e16066d567aaa5a37d5b5fa19db2c6df6f7156db9048"}, ] [package.dependencies] gitdb = ">=4.0.1,<5" [package.extras] -test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mypy", "pre-commit", "pytest", "pytest-cov", "pytest-sugar", "virtualenv"] +test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "sumtypes"] [[package]] name = "idna" -version = "3.4" +version = "3.6" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, ] [[package]] name = "importlib-metadata" -version = "6.8.0" +version = "7.0.1" description = "Read metadata from Python packages" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, - {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, + {file = "importlib_metadata-7.0.1-py3-none-any.whl", hash = "sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e"}, + {file = "importlib_metadata-7.0.1.tar.gz", hash = "sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] [[package]] name = "jinja2" -version = "3.1.2" +version = "3.1.3" description = "A very fast and expressive template engine." -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, + {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, + {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, ] [package.dependencies] @@ -406,98 +408,95 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "markdown" -version = "3.4.4" +version = "3.5.2" description = "Python implementation of John Gruber's Markdown." -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Markdown-3.4.4-py3-none-any.whl", hash = "sha256:a4c1b65c0957b4bd9e7d86ddc7b3c9868fb9670660f6f99f6d1bca8954d5a941"}, - {file = "Markdown-3.4.4.tar.gz", hash = "sha256:225c6123522495d4119a90b3a3ba31a1e87a70369e03f14799ea9c0d7183a3d6"}, + {file = "Markdown-3.5.2-py3-none-any.whl", hash = "sha256:d43323865d89fc0cb9b20c75fc8ad313af307cc087e84b657d9eec768eddeadd"}, + {file = "Markdown-3.5.2.tar.gz", hash = "sha256:e1ac7b3dc550ee80e602e71c1d168002f062e49f1b11e26a36264dafd4df2ef8"}, ] [package.dependencies] importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} [package.extras] -docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.0)", "mkdocs-nature (>=0.4)"] +docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] testing = ["coverage", "pyyaml"] [[package]] name = "markupsafe" -version = "2.1.3" +version = "2.1.4" description = "Safely add untrusted strings to HTML/XML markup." -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-win32.whl", hash = "sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-win32.whl", hash = "sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-win32.whl", hash = "sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-win32.whl", hash = "sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-win_amd64.whl", hash = "sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-win32.whl", hash = "sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-win_amd64.whl", hash = "sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-win32.whl", hash = "sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959"}, + {file = "MarkupSafe-2.1.4.tar.gz", hash = "sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f"}, ] [[package]] name = "mergedeep" version = "1.3.4" description = "A deep merge function for 🐍." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -509,7 +508,6 @@ files = [ name = "mkdocs" version = "1.5.3" description = "Project documentation with Markdown." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -539,17 +537,17 @@ min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-imp [[package]] name = "mkdocs-include-markdown-plugin" -version = "6.0.1" +version = "6.0.4" description = "Mkdocs Markdown includer plugin." -category = "main" optional = false -python-versions = "<3.13,>=3.8" +python-versions = ">=3.8" files = [ - {file = "mkdocs_include_markdown_plugin-6.0.1-py3-none-any.whl", hash = "sha256:cbb71f06bf6bd03312f0ff79e1aed198ad13c0ff4fcaf5bb7fe5da385fba4849"}, - {file = "mkdocs_include_markdown_plugin-6.0.1.tar.gz", hash = "sha256:eb8832b36a72c1c416baec666eeed057c2e613e8b07b353e86fa518157858b0a"}, + {file = "mkdocs_include_markdown_plugin-6.0.4-py3-none-any.whl", hash = "sha256:e7b8b5ecc41d6a3e16969cff3725ec3a391b68e9dfe1a4b4e36a8508becda835"}, + {file = "mkdocs_include_markdown_plugin-6.0.4.tar.gz", hash = "sha256:523c9c3a1d6a517386dc11bf60b0c0c564af1071bb6de8d213106d54f752dcc1"}, ] [package.dependencies] +mkdocs = ">=1.4" wcmatch = ">=8,<9" [package.extras] @@ -559,7 +557,6 @@ cache = ["platformdirs"] name = "mkdocs-markdownextradata-plugin" version = "0.2.5" description = "A MkDocs plugin that injects the mkdocs.yml extra variables into the markdown template" -category = "main" optional = false python-versions = ">=2.7.9,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" files = [ @@ -572,14 +569,13 @@ pyyaml = "*" [[package]] name = "mkdocs-material" -version = "9.4.0" +version = "9.5.4" description = "Documentation that simply works" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.4.0-py3-none-any.whl", hash = "sha256:b9f1bb8bf3377fa1b7edd34276b1923928c39b2d4a56543af0e811f0cfe59085"}, - {file = "mkdocs_material-9.4.0.tar.gz", hash = "sha256:492108aae369c12af21af2b14160f9bd5c0d6d7da28055877a74a554a704a671"}, + {file = "mkdocs_material-9.5.4-py3-none-any.whl", hash = "sha256:efd7cc8ae03296d728da9bd38f4db8b07ab61f9738a0cbd0dfaf2a15a50e7343"}, + {file = "mkdocs_material-9.5.4.tar.gz", hash = "sha256:3d196ee67fad16b2df1a458d650a8ac1890294eaae368d26cee71bc24ad41c40"}, ] [package.dependencies] @@ -587,12 +583,12 @@ babel = ">=2.10,<3.0" colorama = ">=0.4,<1.0" jinja2 = ">=3.0,<4.0" markdown = ">=3.2,<4.0" -mkdocs = ">=1.5.3,<2.0" -mkdocs-material-extensions = ">=1.2,<2.0" +mkdocs = ">=1.5.3,<1.6.0" +mkdocs-material-extensions = ">=1.3,<2.0" paginate = ">=0.5,<1.0" pygments = ">=2.16,<3.0" pymdown-extensions = ">=10.2,<11.0" -regex = ">=2022.4,<2023.0" +regex = ">=2022.4" requests = ">=2.26,<3.0" [package.extras] @@ -602,21 +598,19 @@ recommended = ["mkdocs-minify-plugin (>=0.7,<1.0)", "mkdocs-redirects (>=1.2,<2. [[package]] name = "mkdocs-material-extensions" -version = "1.2" +version = "1.3.1" description = "Extension pack for Python Markdown and MkDocs Material." -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "mkdocs_material_extensions-1.2-py3-none-any.whl", hash = "sha256:c767bd6d6305f6420a50f0b541b0c9966d52068839af97029be14443849fb8a1"}, - {file = "mkdocs_material_extensions-1.2.tar.gz", hash = "sha256:27e2d1ed2d031426a6e10d5ea06989d67e90bb02acd588bc5673106b5ee5eedf"}, + {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"}, + {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, ] [[package]] name = "mkdocs-rss-plugin" version = "1.5.0" description = "MkDocs plugin which generates a static RSS feed using git log and page.meta." -category = "main" optional = false python-versions = ">=3.7, <4" files = [] @@ -625,12 +619,11 @@ develop = false [package.dependencies] GitPython = ">=3.1,<3.2" mkdocs = ">=1.1,<2" -pytz = {version = ">=2022.0.0,<2023.0.0", markers = "python_version < \"3.9\""} -tzdata = {version = ">=2022.0.0,<2023.0.0", markers = "python_version >= \"3.9\" and sys_platform == \"win32\""} +tzdata = {version = "==2022.*", markers = "python_version >= \"3.9\" and sys_platform == \"win32\""} [package.extras] -dev = ["black", "feedparser (>=6.0,<6.1)", "flake8 (>=4,<5.1)", "pre-commit (>=2.10,<2.21)", "pytest-cov (>=4.0.0,<4.1.0)", "validator-collection (>=1.5,<1.6)"] -doc = ["mkdocs-bootswatch (>=1,<2)", "mkdocs-minify-plugin (>=0.5.0,<0.6.0)", "pygments (>=2.5,<3)", "pymdown-extensions (>=7,<10)"] +dev = ["black", "feedparser (>=6.0,<6.1)", "flake8 (>=4,<5.1)", "pre-commit (>=2.10,<2.21)", "pytest-cov (==4.0.*)", "validator-collection (>=1.5,<1.6)"] +doc = ["mkdocs-bootswatch (>=1,<2)", "mkdocs-minify-plugin (==0.5.*)", "pygments (>=2.5,<3)", "pymdown-extensions (>=7,<10)"] [package.source] type = "git" @@ -640,21 +633,19 @@ resolved_reference = "017bdb52095703c79e0632f219b5adf9f212873c" [[package]] name = "packaging" -version = "23.1" +version = "23.2" description = "Core utilities for Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, - {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] [[package]] name = "paginate" version = "0.5.6" description = "Divides large result sets into pages for easier browsing" -category = "main" optional = false python-versions = "*" files = [ @@ -663,78 +654,88 @@ files = [ [[package]] name = "pathspec" -version = "0.11.2" +version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, - {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] [[package]] name = "pillow" -version = "10.0.1" +version = "9.5.0" description = "Python Imaging Library (Fork)" -category = "main" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "Pillow-10.0.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:8f06be50669087250f319b706decf69ca71fdecd829091a37cc89398ca4dc17a"}, - {file = "Pillow-10.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50bd5f1ebafe9362ad622072a1d2f5850ecfa44303531ff14353a4059113b12d"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6a90167bcca1216606223a05e2cf991bb25b14695c518bc65639463d7db722d"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f11c9102c56ffb9ca87134bd025a43d2aba3f1155f508eff88f694b33a9c6d19"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:186f7e04248103482ea6354af6d5bcedb62941ee08f7f788a1c7707bc720c66f"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0462b1496505a3462d0f35dc1c4d7b54069747d65d00ef48e736acda2c8cbdff"}, - {file = "Pillow-10.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d889b53ae2f030f756e61a7bff13684dcd77e9af8b10c6048fb2c559d6ed6eaf"}, - {file = "Pillow-10.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:552912dbca585b74d75279a7570dd29fa43b6d93594abb494ebb31ac19ace6bd"}, - {file = "Pillow-10.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:787bb0169d2385a798888e1122c980c6eff26bf941a8ea79747d35d8f9210ca0"}, - {file = "Pillow-10.0.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:fd2a5403a75b54661182b75ec6132437a181209b901446ee5724b589af8edef1"}, - {file = "Pillow-10.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2d7e91b4379f7a76b31c2dda84ab9e20c6220488e50f7822e59dac36b0cd92b1"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19e9adb3f22d4c416e7cd79b01375b17159d6990003633ff1d8377e21b7f1b21"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93139acd8109edcdeffd85e3af8ae7d88b258b3a1e13a038f542b79b6d255c54"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:92a23b0431941a33242b1f0ce6c88a952e09feeea9af4e8be48236a68ffe2205"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cbe68deb8580462ca0d9eb56a81912f59eb4542e1ef8f987405e35a0179f4ea2"}, - {file = "Pillow-10.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:522ff4ac3aaf839242c6f4e5b406634bfea002469656ae8358644fc6c4856a3b"}, - {file = "Pillow-10.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:84efb46e8d881bb06b35d1d541aa87f574b58e87f781cbba8d200daa835b42e1"}, - {file = "Pillow-10.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:898f1d306298ff40dc1b9ca24824f0488f6f039bc0e25cfb549d3195ffa17088"}, - {file = "Pillow-10.0.1-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:bcf1207e2f2385a576832af02702de104be71301c2696d0012b1b93fe34aaa5b"}, - {file = "Pillow-10.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5d6c9049c6274c1bb565021367431ad04481ebb54872edecfcd6088d27edd6ed"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28444cb6ad49726127d6b340217f0627abc8732f1194fd5352dec5e6a0105635"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de596695a75496deb3b499c8c4f8e60376e0516e1a774e7bc046f0f48cd620ad"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:2872f2d7846cf39b3dbff64bc1104cc48c76145854256451d33c5faa55c04d1a"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4ce90f8a24e1c15465048959f1e94309dfef93af272633e8f37361b824532e91"}, - {file = "Pillow-10.0.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ee7810cf7c83fa227ba9125de6084e5e8b08c59038a7b2c9045ef4dde61663b4"}, - {file = "Pillow-10.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b1be1c872b9b5fcc229adeadbeb51422a9633abd847c0ff87dc4ef9bb184ae08"}, - {file = "Pillow-10.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:98533fd7fa764e5f85eebe56c8e4094db912ccbe6fbf3a58778d543cadd0db08"}, - {file = "Pillow-10.0.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:764d2c0daf9c4d40ad12fbc0abd5da3af7f8aa11daf87e4fa1b834000f4b6b0a"}, - {file = "Pillow-10.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fcb59711009b0168d6ee0bd8fb5eb259c4ab1717b2f538bbf36bacf207ef7a68"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:697a06bdcedd473b35e50a7e7506b1d8ceb832dc238a336bd6f4f5aa91a4b500"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f665d1e6474af9f9da5e86c2a3a2d2d6204e04d5af9c06b9d42afa6ebde3f21"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:2fa6dd2661838c66f1a5473f3b49ab610c98a128fc08afbe81b91a1f0bf8c51d"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:3a04359f308ebee571a3127fdb1bd01f88ba6f6fb6d087f8dd2e0d9bff43f2a7"}, - {file = "Pillow-10.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:723bd25051454cea9990203405fa6b74e043ea76d4968166dfd2569b0210886a"}, - {file = "Pillow-10.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:71671503e3015da1b50bd18951e2f9daf5b6ffe36d16f1eb2c45711a301521a7"}, - {file = "Pillow-10.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:44e7e4587392953e5e251190a964675f61e4dae88d1e6edbe9f36d6243547ff3"}, - {file = "Pillow-10.0.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:3855447d98cced8670aaa63683808df905e956f00348732448b5a6df67ee5849"}, - {file = "Pillow-10.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ed2d9c0704f2dc4fa980b99d565c0c9a543fe5101c25b3d60488b8ba80f0cce1"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5bb289bb835f9fe1a1e9300d011eef4d69661bb9b34d5e196e5e82c4cb09b37"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a0d3e54ab1df9df51b914b2233cf779a5a10dfd1ce339d0421748232cea9876"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:2cc6b86ece42a11f16f55fe8903595eff2b25e0358dec635d0a701ac9586588f"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:ca26ba5767888c84bf5a0c1a32f069e8204ce8c21d00a49c90dabeba00ce0145"}, - {file = "Pillow-10.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f0b4b06da13275bc02adfeb82643c4a6385bd08d26f03068c2796f60d125f6f2"}, - {file = "Pillow-10.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bc2e3069569ea9dbe88d6b8ea38f439a6aad8f6e7a6283a38edf61ddefb3a9bf"}, - {file = "Pillow-10.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:8b451d6ead6e3500b6ce5c7916a43d8d8d25ad74b9102a629baccc0808c54971"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:32bec7423cdf25c9038fef614a853c9d25c07590e1a870ed471f47fb80b244db"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cf63d2c6928b51d35dfdbda6f2c1fddbe51a6bc4a9d4ee6ea0e11670dd981e"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f6d3d4c905e26354e8f9d82548475c46d8e0889538cb0657aa9c6f0872a37aa4"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:847e8d1017c741c735d3cd1883fa7b03ded4f825a6e5fcb9378fd813edee995f"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:7f771e7219ff04b79e231d099c0a28ed83aa82af91fd5fa9fdb28f5b8d5addaf"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:459307cacdd4138edee3875bbe22a2492519e060660eaf378ba3b405d1c66317"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b059ac2c4c7a97daafa7dc850b43b2d3667def858a4f112d1aa082e5c3d6cf7d"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6caf3cd38449ec3cd8a68b375e0c6fe4b6fd04edb6c9766b55ef84a6e8ddf2d"}, - {file = "Pillow-10.0.1.tar.gz", hash = "sha256:d72967b06be9300fed5cfbc8b5bafceec48bf7cdc7dab66b1d2549035287191d"}, + {file = "Pillow-9.5.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16"}, + {file = "Pillow-9.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d"}, + {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903"}, + {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a"}, + {file = "Pillow-9.5.0-cp310-cp310-win32.whl", hash = "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44"}, + {file = "Pillow-9.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb"}, + {file = "Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32"}, + {file = "Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625"}, + {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579"}, + {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296"}, + {file = "Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec"}, + {file = "Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4"}, + {file = "Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089"}, + {file = "Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"}, + {file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"}, + {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47"}, + {file = "Pillow-9.5.0-cp37-cp37m-win32.whl", hash = "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7"}, + {file = "Pillow-9.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6"}, + {file = "Pillow-9.5.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597"}, + {file = "Pillow-9.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51"}, + {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96"}, + {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f"}, + {file = "Pillow-9.5.0-cp38-cp38-win32.whl", hash = "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc"}, + {file = "Pillow-9.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569"}, + {file = "Pillow-9.5.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66"}, + {file = "Pillow-9.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1"}, + {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a"}, + {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865"}, + {file = "Pillow-9.5.0-cp39-cp39-win32.whl", hash = "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964"}, + {file = "Pillow-9.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799"}, + {file = "Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"}, ] [package.extras] @@ -743,14 +744,13 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa [[package]] name = "platformdirs" -version = "3.10.0" +version = "4.1.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, - {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, + {file = "platformdirs-4.1.0-py3-none-any.whl", hash = "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380"}, + {file = "platformdirs-4.1.0.tar.gz", hash = "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420"}, ] [package.extras] @@ -761,7 +761,6 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-co name = "pycparser" version = "2.21" description = "C parser in Python" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -771,33 +770,32 @@ files = [ [[package]] name = "pygments" -version = "2.16.1" +version = "2.17.2" description = "Pygments is a syntax highlighting package written in Python." -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, - {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, ] [package.extras] plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pymdown-extensions" -version = "10.3" +version = "10.7" description = "Extension pack for Python Markdown." -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "pymdown_extensions-10.3-py3-none-any.whl", hash = "sha256:77a82c621c58a83efc49a389159181d570e370fff9f810d3a4766a75fc678b66"}, - {file = "pymdown_extensions-10.3.tar.gz", hash = "sha256:94a0d8a03246712b64698af223848fd80aaf1ae4c4be29c8c61939b0467b5722"}, + {file = "pymdown_extensions-10.7-py3-none-any.whl", hash = "sha256:6ca215bc57bc12bf32b414887a68b810637d039124ed9b2e5bd3325cbb2c050c"}, + {file = "pymdown_extensions-10.7.tar.gz", hash = "sha256:c0d64d5cf62566f59e6b2b690a4095c931107c250a8c8e1351c1de5f6b036deb"}, ] [package.dependencies] -markdown = ">=3.2" +markdown = ">=3.5" pyyaml = "*" [package.extras] @@ -807,7 +805,6 @@ extra = ["pygments (>=2.12)"] name = "python-dateutil" version = "2.8.2" description = "Extensions to the standard Python datetime module" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ @@ -818,23 +815,10 @@ files = [ [package.dependencies] six = ">=1.5" -[[package]] -name = "pytz" -version = "2022.7.1" -description = "World timezone definitions, modern and historical" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pytz-2022.7.1-py2.py3-none-any.whl", hash = "sha256:78f4f37d8198e0627c5f1143240bb0206b8691d8d7ac6d78fee88b78733f8c4a"}, - {file = "pytz-2022.7.1.tar.gz", hash = "sha256:01a0681c4b9684a28304615eba55d1ab31ae00bf68ec157ec3708a8182dbbcd0"}, -] - [[package]] name = "pyyaml" version = "6.0.1" description = "YAML parser and emitter for Python" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -856,6 +840,7 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -894,7 +879,6 @@ files = [ name = "pyyaml-env-tag" version = "0.1" description = "A custom YAML tag for referencing environment variables in YAML files. " -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -907,107 +891,110 @@ pyyaml = "*" [[package]] name = "regex" -version = "2022.10.31" +version = "2023.12.25" description = "Alternative regular expression module, to replace re." -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "regex-2022.10.31-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a8ff454ef0bb061e37df03557afda9d785c905dab15584860f982e88be73015f"}, - {file = "regex-2022.10.31-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1eba476b1b242620c266edf6325b443a2e22b633217a9835a52d8da2b5c051f9"}, - {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0e5af9a9effb88535a472e19169e09ce750c3d442fb222254a276d77808620b"}, - {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d03fe67b2325cb3f09be029fd5da8df9e6974f0cde2c2ac6a79d2634e791dd57"}, - {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9d0b68ac1743964755ae2d89772c7e6fb0118acd4d0b7464eaf3921c6b49dd4"}, - {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a45b6514861916c429e6059a55cf7db74670eaed2052a648e3e4d04f070e001"}, - {file = "regex-2022.10.31-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8b0886885f7323beea6f552c28bff62cbe0983b9fbb94126531693ea6c5ebb90"}, - {file = "regex-2022.10.31-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5aefb84a301327ad115e9d346c8e2760009131d9d4b4c6b213648d02e2abe144"}, - {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:702d8fc6f25bbf412ee706bd73019da5e44a8400861dfff7ff31eb5b4a1276dc"}, - {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a3c1ebd4ed8e76e886507c9eddb1a891673686c813adf889b864a17fafcf6d66"}, - {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:50921c140561d3db2ab9f5b11c5184846cde686bb5a9dc64cae442926e86f3af"}, - {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:7db345956ecce0c99b97b042b4ca7326feeec6b75facd8390af73b18e2650ffc"}, - {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:763b64853b0a8f4f9cfb41a76a4a85a9bcda7fdda5cb057016e7706fde928e66"}, - {file = "regex-2022.10.31-cp310-cp310-win32.whl", hash = "sha256:44136355e2f5e06bf6b23d337a75386371ba742ffa771440b85bed367c1318d1"}, - {file = "regex-2022.10.31-cp310-cp310-win_amd64.whl", hash = "sha256:bfff48c7bd23c6e2aec6454aaf6edc44444b229e94743b34bdcdda2e35126cf5"}, - {file = "regex-2022.10.31-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4b4b1fe58cd102d75ef0552cf17242705ce0759f9695334a56644ad2d83903fe"}, - {file = "regex-2022.10.31-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:542e3e306d1669b25936b64917285cdffcd4f5c6f0247636fec037187bd93542"}, - {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c27cc1e4b197092e50ddbf0118c788d9977f3f8f35bfbbd3e76c1846a3443df7"}, - {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8e38472739028e5f2c3a4aded0ab7eadc447f0d84f310c7a8bb697ec417229e"}, - {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:76c598ca73ec73a2f568e2a72ba46c3b6c8690ad9a07092b18e48ceb936e9f0c"}, - {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c28d3309ebd6d6b2cf82969b5179bed5fefe6142c70f354ece94324fa11bf6a1"}, - {file = "regex-2022.10.31-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9af69f6746120998cd9c355e9c3c6aec7dff70d47247188feb4f829502be8ab4"}, - {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a5f9505efd574d1e5b4a76ac9dd92a12acb2b309551e9aa874c13c11caefbe4f"}, - {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5ff525698de226c0ca743bfa71fc6b378cda2ddcf0d22d7c37b1cc925c9650a5"}, - {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:4fe7fda2fe7c8890d454f2cbc91d6c01baf206fbc96d89a80241a02985118c0c"}, - {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:2cdc55ca07b4e70dda898d2ab7150ecf17c990076d3acd7a5f3b25cb23a69f1c"}, - {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:44a6c2f6374e0033873e9ed577a54a3602b4f609867794c1a3ebba65e4c93ee7"}, - {file = "regex-2022.10.31-cp311-cp311-win32.whl", hash = "sha256:d8716f82502997b3d0895d1c64c3b834181b1eaca28f3f6336a71777e437c2af"}, - {file = "regex-2022.10.31-cp311-cp311-win_amd64.whl", hash = "sha256:61edbca89aa3f5ef7ecac8c23d975fe7261c12665f1d90a6b1af527bba86ce61"}, - {file = "regex-2022.10.31-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a069c8483466806ab94ea9068c34b200b8bfc66b6762f45a831c4baaa9e8cdd"}, - {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d26166acf62f731f50bdd885b04b38828436d74e8e362bfcb8df221d868b5d9b"}, - {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac741bf78b9bb432e2d314439275235f41656e189856b11fb4e774d9f7246d81"}, - {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75f591b2055523fc02a4bbe598aa867df9e953255f0b7f7715d2a36a9c30065c"}, - {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b30bddd61d2a3261f025ad0f9ee2586988c6a00c780a2fb0a92cea2aa702c54"}, - {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef4163770525257876f10e8ece1cf25b71468316f61451ded1a6f44273eedeb5"}, - {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7b280948d00bd3973c1998f92e22aa3ecb76682e3a4255f33e1020bd32adf443"}, - {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:d0213671691e341f6849bf33cd9fad21f7b1cb88b89e024f33370733fec58742"}, - {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:22e7ebc231d28393dfdc19b185d97e14a0f178bedd78e85aad660e93b646604e"}, - {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:8ad241da7fac963d7573cc67a064c57c58766b62a9a20c452ca1f21050868dfa"}, - {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:586b36ebda81e6c1a9c5a5d0bfdc236399ba6595e1397842fd4a45648c30f35e"}, - {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:0653d012b3bf45f194e5e6a41df9258811ac8fc395579fa82958a8b76286bea4"}, - {file = "regex-2022.10.31-cp36-cp36m-win32.whl", hash = "sha256:144486e029793a733e43b2e37df16a16df4ceb62102636ff3db6033994711066"}, - {file = "regex-2022.10.31-cp36-cp36m-win_amd64.whl", hash = "sha256:c14b63c9d7bab795d17392c7c1f9aaabbffd4cf4387725a0ac69109fb3b550c6"}, - {file = "regex-2022.10.31-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4cac3405d8dda8bc6ed499557625585544dd5cbf32072dcc72b5a176cb1271c8"}, - {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23cbb932cc53a86ebde0fb72e7e645f9a5eec1a5af7aa9ce333e46286caef783"}, - {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74bcab50a13960f2a610cdcd066e25f1fd59e23b69637c92ad470784a51b1347"}, - {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78d680ef3e4d405f36f0d6d1ea54e740366f061645930072d39bca16a10d8c93"}, - {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce6910b56b700bea7be82c54ddf2e0ed792a577dfaa4a76b9af07d550af435c6"}, - {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:659175b2144d199560d99a8d13b2228b85e6019b6e09e556209dfb8c37b78a11"}, - {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1ddf14031a3882f684b8642cb74eea3af93a2be68893901b2b387c5fd92a03ec"}, - {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b683e5fd7f74fb66e89a1ed16076dbab3f8e9f34c18b1979ded614fe10cdc4d9"}, - {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2bde29cc44fa81c0a0c8686992c3080b37c488df167a371500b2a43ce9f026d1"}, - {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4919899577ba37f505aaebdf6e7dc812d55e8f097331312db7f1aab18767cce8"}, - {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:9c94f7cc91ab16b36ba5ce476f1904c91d6c92441f01cd61a8e2729442d6fcf5"}, - {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ae1e96785696b543394a4e3f15f3f225d44f3c55dafe3f206493031419fedf95"}, - {file = "regex-2022.10.31-cp37-cp37m-win32.whl", hash = "sha256:c670f4773f2f6f1957ff8a3962c7dd12e4be54d05839b216cb7fd70b5a1df394"}, - {file = "regex-2022.10.31-cp37-cp37m-win_amd64.whl", hash = "sha256:8e0caeff18b96ea90fc0eb6e3bdb2b10ab5b01a95128dfeccb64a7238decf5f0"}, - {file = "regex-2022.10.31-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:131d4be09bea7ce2577f9623e415cab287a3c8e0624f778c1d955ec7c281bd4d"}, - {file = "regex-2022.10.31-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e613a98ead2005c4ce037c7b061f2409a1a4e45099edb0ef3200ee26ed2a69a8"}, - {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052b670fafbe30966bbe5d025e90b2a491f85dfe5b2583a163b5e60a85a321ad"}, - {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa62a07ac93b7cb6b7d0389d8ef57ffc321d78f60c037b19dfa78d6b17c928ee"}, - {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5352bea8a8f84b89d45ccc503f390a6be77917932b1c98c4cdc3565137acc714"}, - {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20f61c9944f0be2dc2b75689ba409938c14876c19d02f7585af4460b6a21403e"}, - {file = "regex-2022.10.31-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:29c04741b9ae13d1e94cf93fca257730b97ce6ea64cfe1eba11cf9ac4e85afb6"}, - {file = "regex-2022.10.31-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:543883e3496c8b6d58bd036c99486c3c8387c2fc01f7a342b760c1ea3158a318"}, - {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7a8b43ee64ca8f4befa2bea4083f7c52c92864d8518244bfa6e88c751fa8fff"}, - {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6a9a19bea8495bb419dc5d38c4519567781cd8d571c72efc6aa959473d10221a"}, - {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6ffd55b5aedc6f25fd8d9f905c9376ca44fcf768673ffb9d160dd6f409bfda73"}, - {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4bdd56ee719a8f751cf5a593476a441c4e56c9b64dc1f0f30902858c4ef8771d"}, - {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8ca88da1bd78990b536c4a7765f719803eb4f8f9971cc22d6ca965c10a7f2c4c"}, - {file = "regex-2022.10.31-cp38-cp38-win32.whl", hash = "sha256:5a260758454580f11dd8743fa98319bb046037dfab4f7828008909d0aa5292bc"}, - {file = "regex-2022.10.31-cp38-cp38-win_amd64.whl", hash = "sha256:5e6a5567078b3eaed93558842346c9d678e116ab0135e22eb72db8325e90b453"}, - {file = "regex-2022.10.31-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5217c25229b6a85049416a5c1e6451e9060a1edcf988641e309dbe3ab26d3e49"}, - {file = "regex-2022.10.31-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4bf41b8b0a80708f7e0384519795e80dcb44d7199a35d52c15cc674d10b3081b"}, - {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cf0da36a212978be2c2e2e2d04bdff46f850108fccc1851332bcae51c8907cc"}, - {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d403d781b0e06d2922435ce3b8d2376579f0c217ae491e273bab8d092727d244"}, - {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a37d51fa9a00d265cf73f3de3930fa9c41548177ba4f0faf76e61d512c774690"}, - {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4f781ffedd17b0b834c8731b75cce2639d5a8afe961c1e58ee7f1f20b3af185"}, - {file = "regex-2022.10.31-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d243b36fbf3d73c25e48014961e83c19c9cc92530516ce3c43050ea6276a2ab7"}, - {file = "regex-2022.10.31-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:370f6e97d02bf2dd20d7468ce4f38e173a124e769762d00beadec3bc2f4b3bc4"}, - {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:597f899f4ed42a38df7b0e46714880fb4e19a25c2f66e5c908805466721760f5"}, - {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7dbdce0c534bbf52274b94768b3498abdf675a691fec5f751b6057b3030f34c1"}, - {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:22960019a842777a9fa5134c2364efaed5fbf9610ddc5c904bd3a400973b0eb8"}, - {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7f5a3ffc731494f1a57bd91c47dc483a1e10048131ffb52d901bfe2beb6102e8"}, - {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7ef6b5942e6bfc5706301a18a62300c60db9af7f6368042227ccb7eeb22d0892"}, - {file = "regex-2022.10.31-cp39-cp39-win32.whl", hash = "sha256:395161bbdbd04a8333b9ff9763a05e9ceb4fe210e3c7690f5e68cedd3d65d8e1"}, - {file = "regex-2022.10.31-cp39-cp39-win_amd64.whl", hash = "sha256:957403a978e10fb3ca42572a23e6f7badff39aa1ce2f4ade68ee452dc6807692"}, - {file = "regex-2022.10.31.tar.gz", hash = "sha256:a3a98921da9a1bf8457aeee6a551948a83601689e5ecdd736894ea9bbec77e83"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f"}, + {file = "regex-2023.12.25-cp310-cp310-win32.whl", hash = "sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630"}, + {file = "regex-2023.12.25-cp310-cp310-win_amd64.whl", hash = "sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4"}, + {file = "regex-2023.12.25-cp311-cp311-win32.whl", hash = "sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87"}, + {file = "regex-2023.12.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d"}, + {file = "regex-2023.12.25-cp312-cp312-win32.whl", hash = "sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5"}, + {file = "regex-2023.12.25-cp312-cp312-win_amd64.whl", hash = "sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232"}, + {file = "regex-2023.12.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39"}, + {file = "regex-2023.12.25-cp37-cp37m-win32.whl", hash = "sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c"}, + {file = "regex-2023.12.25-cp37-cp37m-win_amd64.whl", hash = "sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2"}, + {file = "regex-2023.12.25-cp38-cp38-win32.whl", hash = "sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb"}, + {file = "regex-2023.12.25-cp38-cp38-win_amd64.whl", hash = "sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20"}, + {file = "regex-2023.12.25-cp39-cp39-win32.whl", hash = "sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9"}, + {file = "regex-2023.12.25-cp39-cp39-win_amd64.whl", hash = "sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91"}, + {file = "regex-2023.12.25.tar.gz", hash = "sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5"}, ] [[package]] name = "requests" version = "2.31.0" description = "Python HTTP for Humans." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1029,7 +1016,6 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -1041,7 +1027,6 @@ files = [ name = "smmap" version = "5.0.1" description = "A pure Python implementation of a sliding window memory map manager" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1049,11 +1034,35 @@ files = [ {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, ] +[[package]] +name = "strictyaml" +version = "1.7.3" +description = "Strict, typed YAML parser" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "strictyaml-1.7.3-py3-none-any.whl", hash = "sha256:fb5c8a4edb43bebb765959e420f9b3978d7f1af88c80606c03fb420888f5d1c7"}, + {file = "strictyaml-1.7.3.tar.gz", hash = "sha256:22f854a5fcab42b5ddba8030a0e4be51ca89af0267961c8d6cfa86395586c407"}, +] + +[package.dependencies] +python-dateutil = ">=2.6.0" + +[[package]] +name = "terminaltables" +version = "3.1.10" +description = "Generate simple tables in terminals from a nested list of strings." +optional = false +python-versions = ">=2.6" +files = [ + {file = "terminaltables-3.1.10-py2.py3-none-any.whl", hash = "sha256:e4fdc4179c9e4aab5f674d80f09d76fa436b96fdc698a8505e0a36bf0804a874"}, + {file = "terminaltables-3.1.10.tar.gz", hash = "sha256:ba6eca5cb5ba02bba4c9f4f985af80c54ec3dccf94cfcd190154386255e47543"}, +] + [[package]] name = "tinycss2" version = "1.2.1" description = "A tiny CSS parser" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1072,7 +1081,6 @@ test = ["flake8", "isort", "pytest"] name = "tzdata" version = "2022.7" description = "Provider of IANA time zone data" -category = "main" optional = false python-versions = ">=2" files = [ @@ -1082,19 +1090,17 @@ files = [ [[package]] name = "urllib3" -version = "2.0.5" +version = "2.1.0" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "urllib3-2.0.5-py3-none-any.whl", hash = "sha256:ef16afa8ba34a1f989db38e1dbbe0c302e4289a47856990d0682e374563ce35e"}, - {file = "urllib3-2.0.5.tar.gz", hash = "sha256:13abf37382ea2ce6fb744d4dad67838eec857c9f4f57009891805e0b5e123594"}, + {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, + {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] @@ -1102,7 +1108,6 @@ zstd = ["zstandard (>=0.18.0)"] name = "watchdog" version = "3.0.0" description = "Filesystem events monitoring" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1142,7 +1147,6 @@ watchmedo = ["PyYAML (>=3.10)"] name = "wcmatch" version = "8.5" description = "Wildcard/glob file name matcher." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1157,7 +1161,6 @@ bracex = ">=2.1.1" name = "webencodings" version = "0.5.1" description = "Character encoding aliases for legacy web content" -category = "main" optional = false python-versions = "*" files = [ @@ -1169,7 +1172,6 @@ files = [ name = "zipp" version = "3.17.0" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1183,5 +1185,5 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" -python-versions = ">=3.8,<3.12" -content-hash = "c95d6d277e491fdec58f5bf5c45e8395dc06ca2e02b876aac01b6bf9e50d45af" +python-versions = ">=3.9,<3.12" +content-hash = "8b3c5630efc528583af82f6d7aa9d3d28e5f892e7af717e2ceb72676f91f757d" diff --git a/pyproject.toml b/pyproject.toml index e52f2c80c..3f9931caf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,19 +1,38 @@ [tool.poetry] name = "devenv" -version = "0" -description = "" -authors = ["Domen Kožar "] +version = "1.0" +description = "Fast, Declarative, Reproducible, and Composable Developer Environments using Nix" +authors = ["Domen Kožar "] readme = "README.md" +repository = "https://github.com/cachix/devenv" +packages = [{include = "devenv", from = "src"}] +include = [ + { path = "src", format = ["sdist", "wheel"] }, + { path = "examples/simple", format = ["sdist", "wheel"] } +] [tool.poetry.dependencies] -python = ">=3.8,<3.12" -pillow = "^10.0.1" +python = ">=3.9,<3.12" +click = "^8.1.4" +strictyaml = "^1.7.3" +terminaltables = "^3.1.10" +filelock = "^3.12.0" +requests = "^2.31.0" + +[tool.poetry.group.docs] +optional = true + +[tool.poetry.group.docs.dependencies] +pillow = "^9.5.0" cairosvg = "^2.7.0" mkdocs-markdownextradata-plugin = "^0.2.5" mkdocs-include-markdown-plugin = "^6.0.1" mkdocs-material = "^9.4.0" mkdocs-rss-plugin = {git = "https://github.com/cachix/mkdocs-rss-plugin", rev = "no-git"} +[tool.poetry.scripts] +devenv = "devenv.cli:cli" + [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" diff --git a/runtime.txt b/runtime.txt deleted file mode 100644 index 2c0733315..000000000 --- a/runtime.txt +++ /dev/null @@ -1 +0,0 @@ -3.11 diff --git a/src/devenv-yaml.nix b/src/devenv-yaml.nix deleted file mode 100644 index 2f920495e..000000000 --- a/src/devenv-yaml.nix +++ /dev/null @@ -1,47 +0,0 @@ -{ pkgs }: - -pkgs.writers.writePython3Bin "devenv-yaml" { libraries = with pkgs.python3Packages; [ strictyaml path ]; } '' - from strictyaml import Map, MapPattern, Str, Seq - from strictyaml import load, Bool, Any, Optional, YAMLError - import json - import sys - import os - from path import Path - - inputsSchema = MapPattern(Str(), Map({ - "url": Str(), - Optional("flake", default=None): Bool(), - Optional("inputs", default=None): Any(), - Optional("overlays", default=None): Seq(Str()) - })) - - schema = Map({ - Optional("inputs", default=None): inputsSchema, - Optional("allowUnfree", default=False): Bool(), - Optional("imports", default=None): Seq(Str()), - Optional("permittedInsecurePackages", default=None): Seq(Str()) - }) - - filename = Path("devenv.yaml").bytes().decode('utf8') - try: - devenv = load(filename, schema, label="devenv.yaml").data - except YAMLError as error: - print("Error in `devenv.yaml`", error) - sys.exit(1) - - inputs = {} - for input, attrs in devenv.get('inputs', {}).items(): - inputs[input] = {k: attrs[k] for k in ('url', 'inputs', 'flake') - if k in attrs} - - devenv_dir = sys.argv[1] - - with open(os.path.join(devenv_dir, "flake.json"), 'w') as f: - f.write(json.dumps(inputs)) - - with open(os.path.join(devenv_dir, "devenv.json"), 'w') as f: - f.write(json.dumps(devenv)) - - with open(os.path.join(devenv_dir, "imports.txt"), 'w') as f: - f.write("\n".join(devenv.get('imports', []))) -'' diff --git a/src/devenv.nix b/src/devenv.nix deleted file mode 100644 index 2e307b836..000000000 --- a/src/devenv.nix +++ /dev/null @@ -1,302 +0,0 @@ -{ pkgs, ... } @ args: -let - examples = ../examples; - lib = pkgs.lib; - version = lib.fileContents ./modules/latest-version; - inherit (pkgs) - bash - coreutils - findutils - gnugrep - jq - docopts - util-linuxMinimal; - devenv-yaml = import ./devenv-yaml.nix { inherit pkgs; }; - nix = args.nix.packages.${pkgs.stdenv.system}.nix; -in -pkgs.writeScriptBin "devenv" '' - #!${bash}/bin/bash - - # we want subshells to fail the program - set -e - - NIX_FLAGS="--show-trace --extra-experimental-features nix-command --extra-experimental-features flakes --option warn-dirty false" - - # current hack to test if we have resolved all Nix annoyances - export FLAKE_FILE=.devenv.flake.nix - export FLAKE_LOCK=devenv.lock - - function assemble { - if [[ ! -f devenv.nix ]]; then - echo "File devenv.nix does not exist. To get started, run:" - echo - echo " $ devenv init" - exit 1 - fi - - export DEVENV_DIR="$(pwd)/.devenv" - export DEVENV_GC="$DEVENV_DIR/gc" - ${coreutils}/bin/mkdir -p "$DEVENV_GC" - if [[ -f devenv.yaml ]]; then - ${devenv-yaml}/bin/devenv-yaml "$DEVENV_DIR" - else - [[ -f "$DEVENV_DIR/devenv.json" ]] && ${coreutils}/bin/rm "$DEVENV_DIR/devenv.json" - [[ -f "$DEVENV_DIR/flake.json" ]] && ${coreutils}/bin/rm "$DEVENV_DIR/flake.json" - [[ -f "$DEVENV_DIR/imports.txt" ]] && ${coreutils}/bin/rm "$DEVENV_DIR/imports.txt" - fi - ${coreutils}/bin/cp -f ${import ./flake.nix { inherit pkgs version; }} "$FLAKE_FILE" - ${coreutils}/bin/chmod +w "$FLAKE_FILE" - } - - if [[ -z "$XDG_DATA_HOME" ]]; then - GC_ROOT="$HOME/.devenv/gc" - else - GC_ROOT="$XDG_DATA_HOME/devenv/gc" - fi - - ${coreutils}/bin/mkdir -p "$GC_ROOT" - GC_DIR="$GC_ROOT/$(${coreutils}/bin/date +%s%3N)" - - function add_gc { - name=$1 - storePath=$2 - - ${nix}/bin/nix-store --add-root "$DEVENV_GC/$name" -r $storePath >/dev/null - ${coreutils}/bin/ln -sf $storePath "$GC_DIR-$name" - } - - function shell { - assemble - echo "Building shell ..." 1>&2 - env=$(${nix}/bin/nix $NIX_FLAGS print-dev-env --impure --profile "$DEVENV_GC/shell") - ${nix}/bin/nix-env -p "$DEVENV_GC/shell" --delete-generations old 2>/dev/null - ${coreutils}/bin/ln -sf $(${coreutils}/bin/readlink -f "$DEVENV_GC/shell") "$GC_DIR-shell" - } - - command=$1 - if [[ ! -z $command ]]; then - shift - fi - - case $command in - up) - shell - eval "$env" - procfilescript=$(${nix}/bin/nix $NIX_FLAGS build --no-link --print-out-paths --impure '.#procfileScript') - if [ "$(${coreutils}/bin/cat $procfilescript|tail -n +2)" = "" ]; then - echo "No 'processes' option defined: https://devenv.sh/processes/" - exit 1 - else - add_gc procfilescript $procfilescript - $procfilescript - fi - ;; - assemble) - assemble - ;; - print-dev-env) - shell - echo "$env" - ;; - shell) - shell - if [ $# -eq 0 ]; then - echo "Entering shell ..." 1>&2 - echo "" 1>&2 - ${nix}/bin/nix $NIX_FLAGS develop "$DEVENV_GC/shell" - else - set -e - ${nix}/bin/nix $NIX_FLAGS develop "$DEVENV_GC/shell" -c "$@" - fi - ;; - container) - assemble - help=$(${coreutils}/bin/cat << 'EOF' - Usage: container [options] CONTAINER-NAME - - Options: - --registry= Registry to copy the container to. - --copy Copy the container to the registry. - --copy-args= Arguments passed to `skopeo copy`. - --docker-run Execute `docker run`. - EOF - ) - - eval "$(${docopts}/bin/docopts -A subcommand -h "$help" : "$@")" - - export DEVENV_CONTAINER=1 - container="''${subcommand[CONTAINER-NAME]}" - - # build container - spec=$(${nix}/bin/nix $NIX_FLAGS build --impure --print-out-paths --no-link ".#devenv.containers.\"$container\".derivation") - echo $spec - - # copy container - if [[ ''${subcommand[--copy]} != false || ''${subcommand[--docker-run]} != false ]]; then - copyScript=$(${nix}/bin/nix $NIX_FLAGS build --print-out-paths --no-link --impure ".#devenv.containers.\"$container\".copyScript") - - if [[ ''${subcommand[--docker-run]} == true ]]; then - registry=docker-daemon: - else - registry="''${subcommand[--registry]}" - fi - $copyScript $spec $registry ''${subcommand[--copy-args]} - fi - - # docker run - if [[ ''${subcommand[--docker-run]} != false ]]; then - $(${nix}/bin/nix $NIX_FLAGS build --print-out-paths --no-link --impure ".#devenv.containers.\"$container\".dockerRun") - fi - ;; - search) - name=$1 - shift - assemble - options=$(${nix}/bin/nix $NIX_FLAGS build --no-link --print-out-paths '.#optionsJSON' --impure) - results=$(${nix}/bin/nix $NIX_FLAGS search --json nixpkgs $name) - results_options=$(${coreutils}/bin/cat $options/share/doc/nixos/options.json | ${jq}/bin/jq "with_entries(select(.key | contains(\"$name\")))") - if [ "$results" = "{}" ]; then - echo "No packages found for '$name'." - else - ${jq}/bin/jq -r '[to_entries[] | {name: ("pkgs." + (.key | split(".") | del(.[0, 1]) | join("."))) } * (.value | { version, description})] | (.[0] |keys_unsorted | @tsv) , (["----", "-------", "-----------"] | @tsv), (.[] |map(.) |@tsv)' <<< "$results" | ${util-linuxMinimal}/bin/column -ts $'\t' - echo - fi - echo - if [ "$results_options" = "{}" ]; then - echo "No options found for '$name'." - else - ${jq}/bin/jq -r '["option","type","default", "description"], ["------", "----", "-------", "-----------"],(to_entries[] | [.key, .value.type, .value.default, .value.description[0:80]]) | @tsv' <<< "$results_options" | ${util-linuxMinimal}/bin/column -ts $'\t' - fi - echo - echo "Found $(${jq}/bin/jq 'length' <<< "$results") packages and $(${jq}/bin/jq 'length' <<< "$results_options") options for '$name'." - ;; - init) - if [ "$#" -eq "1" ] - then - target="$1" - ${coreutils}/bin/mkdir -p "$target" - cd "$target" - fi - - if [[ -f devenv.nix && -f devenv.yaml && -f .envrc ]]; then - echo "Aborting since devenv.nix, devenv.yaml and .envrc already exist." - exit 1 - fi - - # TODO: allow selecting which example and list them - example=simple - - if [[ ! -f .envrc ]]; then - echo "Creating .envrc" - ${coreutils}/bin/cat ${examples}/$example/.envrc > .envrc - fi - - if [[ ! -f devenv.nix ]]; then - echo "Creating devenv.nix" - ${coreutils}/bin/cat ${examples}/$example/devenv.nix > devenv.nix - fi - - if [[ ! -f devenv.yaml ]]; then - echo "Creating devenv.yaml" - ${coreutils}/bin/cat ${examples}/$example/devenv.yaml > devenv.yaml - fi - - if [[ ! -f .gitignore ]]; then - ${coreutils}/bin/touch .gitignore - fi - - if ! ${gnugrep}/bin/grep -q "devenv" .gitignore; then - echo "Appending defaults to .gitignore" - - echo "" >> .gitignore - echo "# Devenv" >> .gitignore - echo ".devenv*" >> .gitignore - echo "devenv.local.nix" >> .gitignore - echo "" >> .gitignore - echo "# direnv" >> .gitignore - echo ".direnv" >> .gitignore - echo "" >> .gitignore - echo "# pre-commit" >> .gitignore - echo ".pre-commit-config.yaml" >> .gitignore - echo "" >> .gitignore - fi - echo "Done." - - if command -v direnv &> /dev/null; then - echo "direnv is installed. Running direnv allow." - direnv allow - fi - ;; - info) - assemble - ${nix}/bin/nix $NIX_FLAGS flake metadata | ${gnugrep}/bin/grep Inputs -A10000 - echo - ${nix}/bin/nix $NIX_FLAGS eval --raw '.#info' --impure - ;; - update) - assemble - ${nix}/bin/nix $NIX_FLAGS flake update - ;; - version) - echo "devenv: ${version} ${pkgs.stdenv.system}" - ;; - ci) - assemble - ci=$(${nix}/bin/nix $NIX_FLAGS build --no-link --print-out-paths '.#ci' --impure) - add_gc ci $ci - ;; - gc) - SECONDS=0 - - for link in $(${findutils}/bin/find $GC_ROOT -type l); do - if [ ! -f $link ]; then - ${coreutils}/bin/unlink $link - fi - done - - echo "Counting old devenvs ..." - echo - candidates=$(${findutils}/bin/find $GC_ROOT -type l) - - before=$(${nix}/bin/nix $NIX_FLAGS path-info $candidates -r -S --json | ${jq}/bin/jq '[.[].closureSize | tonumber] | add') - - echo "Found $(echo $candidates | ${coreutils}/bin/wc -l) environments of sum size $(( $before / 1024 / 1024 )) MB." - echo - echo "Garbage collecting ..." - echo - echo "Note: If you'd like this command to run much faster, leave a thumbs up at https://github.com/NixOS/nix/issues/7239" - - ${nix}/bin/nix $NIX_FLAGS store delete --recursive $candidates - - # after GC delete links again - for link in $(${findutils}/bin/find $GC_ROOT -type l); do - if [ ! -f $link ]; then - ${coreutils}/bin/unlink $link - fi - done - - echo "Done in $SECONDS seconds." - ;; - *) - echo "https://devenv.sh (version ${version}): Fast, Declarative, Reproducible, and Composable Developer Environments" - echo - echo "Usage: devenv command [options] [arguments]" - echo - echo "Commands:" - echo - echo "init Scaffold devenv.yaml, devenv.nix, and .envrc inside the current directory." - echo "init TARGET Scaffold devenv.yaml, devenv.nix, and .envrc inside TARGET directory." - echo "search NAME Search packages matching NAME in nixpkgs input." - echo "shell Activate the developer environment." - echo "shell CMD [args] Run CMD with ARGS in the developer environment. Useful when scripting." - echo "container [options] NAME Generate a container for NAME. See devenv container --help and http://devenv.sh/containers" - echo "info Print information about the current developer environment." - echo "update Update devenv.lock from devenv.yaml inputs. See http://devenv.sh/inputs/#locking-and-updating-inputs" - echo "up Starts processes in foreground. See http://devenv.sh/processes" - echo "gc Removes old devenv generations. See http://devenv.sh/garbage-collection" - echo "ci Builds your developer environment and make sure all checks pass." - echo "version Display devenv version" - echo - exit 1 - esac -'' diff --git a/src/devenv/__init__.py b/src/devenv/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/devenv/cli.py b/src/devenv/cli.py new file mode 100644 index 000000000..a2a245dc9 --- /dev/null +++ b/src/devenv/cli.py @@ -0,0 +1,904 @@ +import functools +import os +import shlex +import shutil +import signal +import subprocess +import tempfile +import time +import re +import sys +import pkgutil +import json +from filelock import FileLock +from contextlib import suppress +from pathlib import Path + +import click +import terminaltables +import strictyaml +import requests + +from .yaml import validate_and_parse_yaml, read_yaml, write_yaml, schema +from .log import log, log_task, log_error, log_warning, log_info + + +NIX_FLAGS = [ + "--show-trace", + "--extra-experimental-features", + "nix-command", + "--extra-experimental-features", + "flakes", + # remove unnecessary warnings + "--option", + "warn-dirty", + "false", + # flake caching is too aggressive + "--option", + "eval-cache", + "false", +] +FILE = pkgutil.get_loader(__package__).load_module(__package__).__file__ +if "site-packages" in FILE: + SRC_DIR = Path(FILE, "..", "..", "src") +else: + SRC_DIR = Path(FILE, "..", "..") +DEVENV_DIR = Path(os.getcwd()) / ".devenv" +DEVENV_DIR.mkdir(parents=True, exist_ok=True) +MODULES_DIR = (SRC_DIR / "modules").resolve() +FLAKE_FILE_TEMPL = Path(MODULES_DIR) / "flake.tmpl.nix" +FLAKE_FILE = Path(os.getcwd()) / ".devenv.flake.nix" +FLAKE_LOCK = "devenv.lock" + +# home vars +if "XDG_DATA_HOME" not in os.environ: + DEVENV_HOME = Path(os.environ["HOME"]) / ".devenv" +else: + DEVENV_HOME = Path(os.environ["XDG_DATA_HOME"]) / ".devenv" +DEVENV_HOME_GC = DEVENV_HOME / "gc" +DEVENV_HOME_GC.mkdir(parents=True, exist_ok=True) +CACHIX_KNOWN_PUBKEYS = DEVENV_HOME / "cachix_pubkeys.json" + +# define system like x86_64-linux +SYSTEM = ( + os.uname().machine.lower().replace("arm", "aarch") + + "-" + + os.uname().sysname.lower() +) + + +def run_nix(command: str, **kwargs) -> str: + ctx = click.get_current_context() + nix_flags = ctx.obj["nix_flags"] + flags = " ".join(NIX_FLAGS) + " " + " ".join(nix_flags) + command_flags = " ".join(ctx.obj["command_flags"]) + return run_command(f"nix {flags} {command} {command_flags}", **kwargs) + + +def run_command( + command: str, + disable_stderr=False, + replace_shell=False, + use_cachix=False, + logging=True, + dont_exit=False, +) -> str: + nix = "" + if command.startswith("nix"): + if os.environ.get("DEVENV_NIX"): + nix = os.path.join(os.environ["DEVENV_NIX"], "bin") + command = f"{nix}/{command}" + else: + log( + "$DEVENV_NIX is not set, but required as devenv doesn't work without a few Nix patches.", + level="error", + ) + log( + "Please follow https://devenv.sh/getting-started/ to install devenv.", + level="error", + ) + exit(1) + if use_cachix: + caches, known_keys = get_cachix_caches(logging) + pull_caches = " ".join( + map(lambda cache: f"https://{cache}.cachix.org", caches.get("pull")) + ) + command = f"{command} --option extra-trusted-public-keys '{' '.join(known_keys.values())}'" + command = f"{command} --option extra-substituters '{pull_caches}'" + push_cache = caches.get("push") + if push_cache and os.environ.get("CACHIX_AUTH_TOKEN"): + if shutil.which("cachix") is None: + if logging: + log_warning( + "cachix is not installed, skipping pushing. Please follow https://devenv.sh/getting-started/#2-install-cachix to install cachix.", + level="error", + ) + else: + command = f"cachix watch-exec {push_cache} {command}" + + try: + if click.get_current_context().obj["verbose"]: + log(f"Running command: {command}", level="debug") + if replace_shell: + splitted_command = shlex.split(command.strip()) + os.execv(splitted_command[0], splitted_command) + else: + return subprocess.run( + command, + shell=True, + check=True, + env=os.environ.copy(), + stdout=subprocess.PIPE, + stdin=subprocess.PIPE, + stderr=None if not disable_stderr else subprocess.DEVNULL, + universal_newlines=True, + ).stdout.strip() + except subprocess.CalledProcessError as e: + if logging: + click.echo("\n", err=True) + log( + f"Following command exited with code {e.returncode}:\n\n {e.cmd}", + level="error", + ) + if dont_exit: + raise e + else: + exit(e.returncode) + + +CONTEXT_SETTINGS = dict(max_content_width=120) + + +@click.group(context_settings=CONTEXT_SETTINGS) +@click.option("--verbose", "-v", help="Enable verbose output.", is_flag=True) +@click.option( + "--nix-flags", + "-n", + help='Flags to pass to Nix. See `man nix.conf 5`. Example: --nix-flags "--option bash-prompt >"', + metavar="NIX-FLAGS", + multiple=True, +) +@click.option("--debugger", "-d", help="Enable Nix debugger.", is_flag=True) +@click.option("--system", "-s", help="Nix system to use.", default=SYSTEM) +@click.option("--offline", "-o", help="Disable network access.", is_flag=True) +@click.pass_context +def cli(ctx, offline, system, debugger, nix_flags, verbose): + """https://devenv.sh: Fast, Declarative, Reproducible, and Composable Developer Environments.""" + ctx.ensure_object(dict) + ctx.obj["system"] = system + ctx.obj["verbose"] = verbose + ctx.obj["command_flags"] = [] + ctx.obj["nix_flags"] = list(nix_flags) + ctx.obj["nix_flags"] += ["--system", system] + if offline: + ctx.obj["nix_flags"] += ["--offline"] + if debugger: + # ignore-try is needed to avoid catching unrelated errors + ctx.obj["command_flags"] += ["--debugger", "--ignore-try"] + + ctx.obj["gc_root"] = DEVENV_HOME_GC + ctx.obj["gc_project"] = DEVENV_HOME_GC / str(int(time.time() * 1000)) + + +@cli.group() +def processes(): + pass + + +os.environ["DEVENV_DIR"] = str(DEVENV_DIR) +DEVENV_GC = DEVENV_DIR / "gc" +os.environ["DEVENV_GC"] = str(DEVENV_GC) + +PROCESSES_PID = DEVENV_DIR / "processes.pid" +PROCESSES_LOG = DEVENV_DIR / "processes.log" + + +def add_gc(name, store_path): + """Register a GC root""" + ctx = click.get_current_context() + run_command( + f'nix-store --add-root "{os.environ["DEVENV_GC"]}/{name}" -r {store_path} >/dev/null' + ) + symlink_force(store_path, f'{ctx.obj["gc_project"]}-{name}') + + +@cli.command(hidden=True) +@click.pass_context +def assemble(ctx): + if not os.path.exists("devenv.nix"): + log("File devenv.nix does not exist. To get started, run:", level="error") + log(" $ devenv init", level="error") + exit(1) + + DEVENV_GC.mkdir(parents=True, exist_ok=True) + + if os.path.exists("devenv.yaml"): + validate_and_parse_yaml(DEVENV_DIR) + else: + for file in ["devenv.json", "flake.json", "imports.txt"]: + file_path = DEVENV_DIR / file + file_path.unlink(missing_ok=True) + + with open(FLAKE_FILE_TEMPL) as f: + flake = f.read() + system = ctx.obj["system"] + + with open(FLAKE_FILE, "w") as f: + devenv_vars = f""" + version = "{get_version()}"; + system = "{system}"; + devenv_root = "{os.getcwd()}"; + """ + # replace __DEVENV_VARS__ in flake using regex + flake = re.sub(r"__DEVENV_VARS__", devenv_vars, flake) + f.write(flake) + + +@cli.command( + help="Deletes previous devenv generations. See http://devenv.sh/garbage-collection", + short_help="Deletes previous devenv generations. See http://devenv.sh/garbage-collection", +) +@click.pass_context +def gc(ctx): + GC_ROOTS = ctx.obj["gc_root"] + start = time.time() + + # remove dangling symlinks + with log_task(f"Removing non-existings symlinks in {GC_ROOTS} ..."): + to_gc, removed_symlinks = cleanup_symlinks(GC_ROOTS) + + click.echo(f" Found {len(to_gc)} active symlinks.") + click.echo(f" Deleted {len(removed_symlinks)} dangling symlinks.") + click.echo() + + log( + "Running garbage collection (this process may take some time) ...", level="info" + ) + # TODO: ideally nix would report some statistics about the GC as JSON + run_nix(f'store delete --recursive {" ".join(to_gc)}') + + after_gc, removed_symlinks = cleanup_symlinks(GC_ROOTS) + end = time.time() + + click.echo() + log( + f"Done. Successfully removed {len(to_gc) - len(after_gc)} symlinks in {end - start:.0f} seconds.", + level="info", + ) + + +def cleanup_symlinks(folder): + to_gc = [] + removed_symlinks = [] + for root, dirs, files in os.walk(folder): + for name in files: + full_path = os.path.join(root, name) + if os.path.islink(full_path): + if not os.path.isfile(full_path): + os.unlink(full_path) + removed_symlinks.append(full_path) + else: + to_gc.append(full_path) + return to_gc, removed_symlinks + + +def get_dev_environment(ctx, json=False, logging=True): + ctx.invoke(assemble) + if logging: + action = log_task("Building shell") + else: + action = suppress() + with action: + gc_root = DEVENV_GC / "shell" + cmd = f"print-dev-env --profile '{gc_root}'" + if json: + cmd += " --json" + env = run_nix(cmd, logging=False, use_cachix=True) + run_command( + f"nix-env -p '{gc_root}' --delete-generations old", + logging=False, + disable_stderr=True, + ) + symlink_force(gc_root, Path(f'{ctx.obj["gc_project"]}-shell')) + return env, gc_root + + +@cli.command( + help="Activate the developer environment.", + short_help="Activate the developer environment.", + context_settings=dict( + ignore_unknown_options=True, + ), +) +@click.argument("cmd", required=False) +@click.argument("extra_args", nargs=-1, type=click.UNPROCESSED) +@click.pass_context +def shell(ctx, cmd, extra_args): + env, gc_root = get_dev_environment(ctx) + if cmd: + run_nix( + f"develop '{gc_root}' -c {cmd} {' '.join(extra_args)}", replace_shell=True + ) + else: + log("Entering shell", level="info") + run_nix(f"develop '{gc_root}'", replace_shell=True) + + +def symlink_force(src, dst): + src = Path(src) + dst = Path(dst) + # locking is needed until https://github.com/python/cpython/pull/14464 + with FileLock(f"{dst}.lock", timeout=10): + dst.unlink(missing_ok=True) + dst.symlink_to(src) + + +@cli.command( + help="Starts processes in foreground. See http://devenv.sh/processes", + short_help="Starts processes in foreground. See http://devenv.sh/processes", +) +@click.argument("process", required=False) +@click.option( + "--detach", "-d", is_flag=True, help="Starts processes in the background." +) +@click.pass_context +def up(ctx, process, detach): + with log_task("Building processes"): + ctx.invoke(assemble) + procfilescript = run_nix( + "build --no-link --print-out-paths '.#procfileScript'", use_cachix=True + ) + with open(procfilescript, "r") as file: + contents = file.read().strip() + if contents == "": + log( + "No 'processes' option defined: https://devenv.sh/processes/", level="error" + ) + exit(1) + else: + env, _ = get_dev_environment(ctx) + log("Starting processes ...", level="info") + add_gc("procfilescript", procfilescript) + processes_script = os.path.join(DEVENV_DIR, "processes") + with open(processes_script, "w") as f: + f.write( + f"""#!/usr/bin/env bash +{env} +exec {procfilescript} {process or ""} + """ + ) + os.chmod(processes_script, 0o755) + + if detach: + process = subprocess.Popen( + [processes_script], + stdout=open(PROCESSES_LOG, "w"), + stderr=subprocess.STDOUT, + ) + + with open(PROCESSES_PID, "w") as file: + file.write(str(process.pid)) + log(f" PID is {process.pid}.", level="info") + log(f" See logs: $ tail -f {PROCESSES_LOG}", level="info") + log(" Stop: $ devenv processes stop", level="info") + else: + os.execv(processes_script, [processes_script]) + + +processes.add_command(up) + + +@processes.command( + help="Stops processes started with 'devenv up'.", + short_help="Stops processes started with 'devenv up'.", +) +def stop(): + with log_task("Stopping processes", newline=False): + if not os.path.exists(PROCESSES_PID): + log("No processes running.", level="error") + exit(1) + + with open(PROCESSES_PID, "r") as file: + pid = int(file.read()) + + log(f"Stopping process with PID {pid} ...", level="info") + + try: + os.kill(pid, signal.SIGTERM) + except ProcessLookupError: + log(f"Process with PID {pid} not found.", level="error") + exit(1) + + os.remove(PROCESSES_PID) + + +@cli.command() +@click.argument("name") +@click.pass_context +def search(ctx, name): + """Search packages matching NAME in nixpkgs input.""" + ctx.invoke(assemble) + options = run_nix( + "build --no-link --print-out-paths '.#optionsJSON' ", use_cachix=True + ) + search = run_nix(f"search --json nixpkgs {name}") + + with open(Path(options) / "share" / "doc" / "nixos" / "options.json") as f: + options_results = [] + for key, value in json.load(f).items(): + if name in key: + options_results.append( + ( + key, + value["type"], + value.get("default", ""), + value["description"][:80], + ) + ) + results_options_count = len(options_results) + + search_results = [] + for key, value in json.loads(search).items(): + search_results.append( + ( + "pkgs." + (".".join(key.split(".")[2:])), + value["version"], + value["description"][:80], + ) + ) + search_results_count = len(search_results) + + if search_results: + click.echo( + terminaltables.AsciiTable( + [("Package", "Version", "Description")] + search_results + ).table + ) + + if options_results: + click.echo( + terminaltables.AsciiTable( + [("Option", "Type", "Default", "Description")] + options_results + ).table + ) + + log( + f"Found {search_results_count} packages and {results_options_count} options for '{name}'.", + level="info", + ) + + +@cli.command( + help="Build, copy and run a container. See http://devenv.sh/containers", + short_help="Build, copy and run a container. See http://devenv.sh/containers", +) +@click.option( + "--registry", + default=None, + help="Registry to copy the container to.", + metavar="REGISTRY", +) +@click.option("--copy", is_flag=True, help="Copy the container to the registry.") +@click.option( + "--copy-args", + default=None, + help="Arguments passed to `skopeo copy`.", + metavar="ARGS", +) +@click.option("--docker-run", is_flag=True, help="Execute `docker run`.") +@click.argument("container_name") +@click.pass_context +def container(ctx, registry, copy, copy_args, docker_run, container_name): + os.environ["DEVENV_CONTAINER"] = container_name + + with log_task(f"Building {container_name} container"): + ctx.invoke(assemble) + # NOTE: we need --impure here to read DEVENV_CONTAINER + spec = run_nix( + f'build --impure --print-out-paths --no-link .#devenv.containers."{container_name}".derivation', + use_cachix=True, + ) + click.echo(spec) + + # copy container + if copy or docker_run: + with log_task(f"Copying {container_name} container"): + # we need --impure here for DEVENV_CONTAINER + copy_script = run_nix( + f'build --print-out-paths --no-link \ + --impure .#devenv.containers."{container_name}".copyScript', + use_cachix=True, + ) + + if docker_run: + registry = "docker-daemon:" + + cp = f"{copy_script} {spec} {registry or 'false'} {copy_args or ''}" + + log(f"Running '{cp}'", level="info") + + subprocess.run( + cp, + shell=True, + check=True, + ) + + if docker_run: + log(f"Starting {container_name} container", level="info") + # we need --impure here for DEVENV_CONTAINER + docker_script = run_nix( + f'build --print-out-paths --no-link --impure \ + .#devenv.containers."{container_name}".dockerRun', + use_cachix=True, + ) + + subprocess.run(docker_script) + + +@cli.command( + help="Print information about this developer environment.", + short_help="Print information about this developer environment.", +) +@click.pass_context +def info(ctx): + ctx.invoke(assemble) + # TODO: use --json and reconstruct input metadata + metadata = run_nix("flake metadata") + matches = re.search(r"(Inputs:.+)$", metadata, re.DOTALL) + if matches: + inputs = matches.group(1) + else: + inputs = "" + info_ = run_nix("eval --raw '.#info'") + click.echo(f"{inputs}\n{info_}") + + +@cli.command() +@click.pass_context +def version(ctx): + """Display devenv version.""" + version = get_version() + click.echo(f"devenv {version} ({ctx.obj['system']})") + + +@cli.command( + help="Scaffold devenv.yaml, devenv.nix, and .envrc.", + short_help="Scaffold devenv.yaml, devenv.nix, and .envrc.", +) +@click.argument("target", default=".") +def init(target): + os.makedirs(target, exist_ok=True) + + required_files = ["devenv.nix", "devenv.yaml", ".envrc"] + for filename in required_files: + if os.path.exists(Path(target, filename)): + log(f"Aborting since {filename} already exist.", level="error") + exit(1) + return + + example = "simple" + examples_path = Path(MODULES_DIR / ".." / ".." / "examples").resolve() + + for filename in required_files: + full_filename = Path(target, filename) + if not os.path.exists(full_filename): + log(f"Creating {full_filename}", level="info") + shutil.copyfile( + os.path.join(examples_path, example, filename), full_filename + ) + + with open(".gitignore", "a+") as gitignore_file: + if "devenv" not in gitignore_file.read(): + log("Appending defaults to .gitignore", level="info") + gitignore_file.write("\n") + gitignore_file.write("# Devenv\n") + gitignore_file.write(".devenv*\n") + gitignore_file.write("devenv.local.nix\n") + gitignore_file.write("\n") + gitignore_file.write("# direnv\n") + gitignore_file.write(".direnv\n") + gitignore_file.write("\n") + gitignore_file.write("# pre-commit\n") + gitignore_file.write(".pre-commit-config.yaml\n") + gitignore_file.write("\n") + + log("Done.", level="info") + + # Check if direnv is installed + if shutil.which("direnv"): + log("direnv is installed. Running $ direnv allow .", level="info") + subprocess.run(["direnv", "allow"]) + + +@cli.command( + help="Update devenv.lock from devenv.yaml inputs. See http://devenv.sh/inputs/", + short_help="Update devenv.lock from devenv.yaml inputs. See http://devenv.sh/inputs/", +) +@click.argument("input_name", required=False) +@click.pass_context +def update(ctx, input_name): + ctx.invoke(assemble) + + if input_name: + run_nix(f"flake lock --update-input {input_name}") + else: + run_nix("flake update") + + +@cli.command() +@click.pass_context +def ci(ctx): + """Builds your developer environment and checks if everything builds.""" + ctx.invoke(assemble) + print("running ci") + print(run_command("cat ${FLAKE_FILE}")) + output_path = run_nix("build --no-link --print-out-paths .#ci", use_cachix=True) + add_gc("ci", output_path) + + +@cli.command(hidden=True) +@click.option("--json", is_flag=True) +@click.pass_context +def print_dev_env(ctx, json): + env, _ = get_dev_environment(ctx, json=json, logging=False) + click.echo(env) + + +def get_version(): + with open(Path(MODULES_DIR, "latest-version")) as f: + return f.read().strip() + + +@cli.group( + help="Manage inputs in devenv.yaml. See http://devenv.sh/inputs/", + short_help="Manage inputs in devenv.yaml. See http://devenv.sh/inputs/", +) +def inputs(): + pass + + +@inputs.command( + help="Add a new input to the developer environment.", + short_help="Add a new input to the developer environment.", +) +@click.argument("name") +@click.argument("url") +@click.option("--follows", "-f", multiple=True, help="Add a dependency to the input.") +@click.pass_context +def add(ctx, name, url, follows): + devenv = read_yaml() + attrs = {"url": url} + + inputs = {} + for follow in follows: + if follow not in devenv["inputs"]: + log( + f"Input {follow} does not exist so it can't be followed.", level="error" + ) + exit(1) + inputs[follow] = {"follows": follow} + + if inputs: + attrs["inputs"] = inputs + devenv["inputs"][name] = attrs + + write_yaml(devenv) + + +@cli.command( + help="Run tests. See http://devenv.sh/tests/", + short_help="Run tests. See http://devenv.sh/tests/", +) +@click.argument("names", nargs=-1) +@click.option("--debug", is_flag=True, help="Run tests in debug mode.") +@click.option("--keep-going", is_flag=True, help="Continue running tests if one fails.") +@click.option( + "--exclude", + multiple=True, + help="A test name to exclude, may be specified multiple times", +) +@click.pass_context +def test(ctx, debug, keep_going, exclude, names): + ctx.invoke(assemble) + with log_task("Gathering tests", newline=False): + tests = json.loads(run_nix("eval .#devenv.tests --json")) + + if not names: + names = ["local"] + + # group tests by tags + tags = {} + for name, test in tests.items(): + for tag in test["tags"]: + if tag not in tags: + tags[tag] = [] + tags[tag].append(name) + + selected_tests = [] + for name in names: + if name in tests: + selected_tests.append(name) + tag_tests = tags.get(name, {}) + for test in tag_tests: + if not test in exclude: + selected_tests.append(test) + + log(f"Found {len(tests)} test(s), running {len(selected_tests)}:", level="info") + + pwd = os.getcwd() + failed = [] + + for name in selected_tests: + with log_task(f" Testing {name}"): + with tempfile.TemporaryDirectory(prefix=name + "_") as tmpdir: + os.chdir(tmpdir) + test = tests[name] + + if test.get("src"): + shutil.copytree( + test["src"], ".", dirs_exist_ok=True, copy_function=shutil.copy + ) + run_command("find . -type d -exec chmod +wx {} \;") + else: + write_if_defined("devenv.nix", test.get("nix")) + write_if_defined("devenv.yaml", test.get("yaml")) + write_if_defined(".test.sh", test.get("test")) + if os.path.exists(".test.sh"): + os.chmod(".test.sh", 0o755) + + # predefined utilities + write_if_defined( + "devenv.local.nix", + """ +{ pkgs, ... }: { + packages = [ pkgs.coreutils-full ]; +} + """.strip() + + "\n", + ) + + # plug in devenv input if needed + if os.path.exists(os.path.join(pwd, "src/modules/latest-version")): + log( + " Detected devenv module. Using src/modules for tests.", + level="info", + ) + + if not os.path.exists("devenv.yaml"): + write_yaml( + strictyaml.as_document({"inputs": {}}, schema=schema) + ) + os.chmod("devenv.yaml", 0o644) + yaml = read_yaml() + inputs = yaml.get("inputs", {}) + inputs["devenv"] = {"url": f"path:{pwd}?dir=src/modules"} + yaml["inputs"] = inputs + write_yaml(yaml) + + devenv = sys.argv[0] + has_processes = False + try: + log(" Running $ devenv ci ...", level="info") + run_command(f"{devenv} ci") + + has_processes = os.path.exists( + ".devenv/gc/ci" + ) and "-devenv-up" in run_command("cat .devenv/gc/ci") + + if has_processes: + log(" Starting processes ...", level="info") + run_command(f"{devenv} up -d") + # stream logs + p = subprocess.Popen( + "tail -f .devenv/processes.log", + shell=True, + ) + else: + p = None + + try: + if os.path.exists(".test.sh"): + log(" Running .test.sh ...", level="info") + run_command(f"{devenv} shell bash ./.test.sh") + finally: + if has_processes and not debug: + run_command(f"{devenv} processes stop") + if p: + p.kill() + except KeyboardInterrupt: + raise + except BaseException as e: + log_error(f"Test {name} failed.") + if keep_going: + failed.append(name) + continue + if debug: + log( + "Entering shell because of the --debug flag:", + level="warning", + ) + log(f" - devenv: {devenv}", level="warning") + log(f" - cwd: {tmpdir}", level="warning") + if has_processes: + log(" - up logs: .devenv/processes.log:", level="warning") + os.execv("/bin/sh", ["/bin/sh"]) + else: + log_warning("Pass --debug flag to enter shell.") + raise e + if keep_going and failed: + log_error(f"Failed: {', '.join(failed)}") + sys.exit(2) + + +def write_if_defined(file, content): + if content: + with open(file, "w") as f: + f.write(content) + + +@functools.cache +def get_cachix_caches(logging=True): + """Get the full list of cachix caches we need and their public keys. + + This is cached because it's expensive to run. + """ + try: + caches_raw = run_nix( + "eval .#devenv.cachix --json", + dont_exit=True, + disable_stderr=True, + logging=False, + ) + except subprocess.CalledProcessError: + return {"pull": [], "push": None}, {} + + caches = json.loads(caches_raw) + + if CACHIX_KNOWN_PUBKEYS.exists(): + known_keys = json.loads(CACHIX_KNOWN_PUBKEYS.read_text()) + else: + known_keys = {} + new_known_keys = {} + for name in caches.get("pull", []): + if name not in known_keys: + resp = requests.get(f"https://cachix.org/api/v1/cache/{name}") + if resp.status_code in [401, 404]: + log_error( + f"Cache {name} does not exist or you don't have a CACHIX_AUTH_TOKEN configured." + ) + # TODO: instruct how to best configure netrc + # log_error("To configure a token, run `cachix authtoken `.") + log_error("To create a cache, go to https://app.cachix.org/.") + exit(1) + else: + resp.raise_for_status() + pubkey = resp.json()["publicSigningKeys"][0] + new_known_keys[name] = pubkey + + if caches.get("pull"): + if logging: + log_info(f"Using Cachix: {', '.join(caches.get('pull', []))} ") + if new_known_keys: + for name, pubkey in new_known_keys.items(): + if logging: + log_info( + f" Trusting {name}.cachix.org on first use with the public key {pubkey}" + ) + known_keys.update(new_known_keys) + CACHIX_KNOWN_PUBKEYS.write_text(json.dumps(known_keys)) + return caches, known_keys + + +@cli.command() +@click.argument("attrs", nargs=-1, required=True) +@click.pass_context +def build(ctx, attrs): + """Build attributes in your devenv.nix.""" + ctx.invoke(assemble) + attrs = " ".join(map(lambda attr: f".#devenv.{attr}", attrs)) + output = run_nix( + f"build --print-out-paths --print-build-logs --no-link {attrs}", use_cachix=True + ) + log("Built:", level="info") + for path in output.splitlines(): + log(path, level="info") diff --git a/src/devenv/log.py b/src/devenv/log.py new file mode 100644 index 000000000..0b56f3b69 --- /dev/null +++ b/src/devenv/log.py @@ -0,0 +1,56 @@ +from typing import Literal +import time + +import click + + +class log_task: + """Context manager for logging progress of a task.""" + + def __init__(self, message, newline=True): + self.message = message + self.newline = newline + + def __enter__(self): + prefix = click.style("•", fg="blue") + self.start = time.time() + click.echo(f"{prefix} {self.message} ...", nl=self.newline) + + def __exit__(self, exc, *args): + end = time.time() + if exc: + prefix = click.style("✖", fg="red") + else: + prefix = click.style("✔", fg="green") + click.echo(f"\r{prefix} {self.message} in {end - self.start:.1f}s.") + + +LogLevel = Literal["info", "warning", "error", "debug"] + + +def log(message, level: LogLevel): + match level: + case "info": + click.echo(click.style("• ", fg="green") + message) + case "warning": + click.echo(click.style("• ", fg="yellow") + message, err=True) + case "error": + click.echo(click.style("✖ ", fg="red") + message, err=True) + case "debug": + click.echo(click.style("• ", fg="magenta") + message, err=True) + + +def log_error(message): + log(message, "error") + + +def log_warning(message): + log(message, "warning") + + +def log_info(message): + log(message, "info") + + +def log_debug(message): + log(message, "debug") diff --git a/src/devenv/yaml.py b/src/devenv/yaml.py new file mode 100644 index 000000000..634a20e1d --- /dev/null +++ b/src/devenv/yaml.py @@ -0,0 +1,63 @@ +import json +import sys +import os +from pathlib import Path + +from strictyaml import Map, MapPattern, Str, Seq +from strictyaml import load, Bool, Any, Optional, YAMLError, EmptyDict + + +inputsSchema = EmptyDict() | MapPattern( + Str(), + Map( + { + "url": Str(), + Optional("flake", default=None): Bool(), + Optional("inputs", default=None): Any(), + Optional("overlays", default=None): Seq(Str()), + } + ), +) + +schema = Map( + { + Optional("inputs", default=None): inputsSchema, + Optional("allowUnfree", default=False): Bool(), + Optional("allowBroken", default=False): Bool(), + Optional("imports", default=None): Seq(Str()), + Optional("permittedInsecurePackages", default=None): Seq(Str()), + } +) + +YAML_FILE = Path("devenv.yaml") + + +def read_yaml(): + try: + with open(YAML_FILE) as f: + return load(f.read(), schema, label="devenv.yaml") + except YAMLError as error: + print("Validation error in `devenv.yaml`", error) + sys.exit(1) + + +def write_yaml(yaml): + with open(YAML_FILE, "w") as f: + f.write(yaml.as_yaml()) + + +def validate_and_parse_yaml(dot_devenv_root): + devenv = read_yaml().data + + inputs = {} + for input, attrs in devenv.get("inputs", {}).items(): + inputs[input] = {k: attrs[k] for k in ("url", "inputs", "flake") if k in attrs} + + with open(os.path.join(dot_devenv_root, "flake.json"), "w") as f: + f.write(json.dumps(inputs)) + + with open(os.path.join(dot_devenv_root, "devenv.json"), "w") as f: + f.write(json.dumps(devenv)) + + with open(os.path.join(dot_devenv_root, "imports.txt"), "w") as f: + f.write("\n".join(devenv.get("imports", []))) diff --git a/src/flake.nix b/src/flake.nix deleted file mode 100644 index 970585903..000000000 --- a/src/flake.nix +++ /dev/null @@ -1,85 +0,0 @@ -{ pkgs, version }: pkgs.writeText "devenv-flake" '' - { - inputs = { - pre-commit-hooks.url = "github:cachix/pre-commit-hooks.nix"; - pre-commit-hooks.inputs.nixpkgs.follows = "nixpkgs"; - nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; - devenv.url = "github:cachix/devenv?dir=src/modules"; - } // (if builtins.pathExists ./.devenv/flake.json - then builtins.fromJSON (builtins.readFile ./.devenv/flake.json) - else {}); - - outputs = { nixpkgs, ... }@inputs: - let - devenv = if builtins.pathExists ./.devenv/devenv.json - then builtins.fromJSON (builtins.readFile ./.devenv/devenv.json) - else {}; - getOverlays = inputName: inputAttrs: - map (overlay: let - input = inputs.''${inputName} or (throw "No such input `''${inputName}` while trying to configure overlays."); - in input.overlays.''${overlay} or (throw "Input `''${inputName}` has no overlay called `''${overlay}`. Supported overlays: ''${nixpkgs.lib.concatStringsSep ", " (builtins.attrNames input.overlays)}")) - inputAttrs.overlays or []; - overlays = nixpkgs.lib.flatten (nixpkgs.lib.mapAttrsToList getOverlays (devenv.inputs or {})); - pkgs = import nixpkgs { - system = "${pkgs.stdenv.system}"; - config = { - allowUnfree = devenv.allowUnfree or false; - permittedInsecurePackages = devenv.permittedInsecurePackages or []; - }; - inherit overlays; - }; - lib = pkgs.lib; - importModule = path: - if lib.hasPrefix "./" path - then if lib.hasSuffix ".nix" path - then ./. + (builtins.substring 1 255 path) - else ./. + (builtins.substring 1 255 path) + "/devenv.nix" - else if lib.hasPrefix "../" path - then throw "devenv: ../ is not supported for imports" - else let - paths = lib.splitString "/" path; - name = builtins.head paths; - input = inputs.''${name} or (throw "Unknown input ''${name}"); - subpath = "/''${lib.concatStringsSep "/" (builtins.tail paths)}"; - devenvpath = "''${input}" + subpath + "/devenv.nix"; - in if builtins.pathExists devenvpath - then devenvpath - else throw (devenvpath + " file does not exist for input ''${name}."); - project = pkgs.lib.evalModules { - specialArgs = inputs // { inherit inputs pkgs; }; - modules = [ - (inputs.devenv.modules + /top-level.nix) - { devenv.cliVersion = "${version}"; } - ] ++ (map importModule (devenv.imports or [])) ++ [ - ./devenv.nix - (devenv.devenv or {}) - (if builtins.pathExists ./devenv.local.nix then ./devenv.local.nix else {}) - ]; - }; - config = project.config; - - options = pkgs.nixosOptionsDoc { - options = builtins.removeAttrs project.options [ "_module" ]; - # Unpack Nix types, e.g. literalExpression, mDoc. - transformOptions = - let isDocType = v: builtins.elem v [ "literalDocBook" "literalExpression" "literalMD" "mdDoc" ]; - in lib.attrsets.mapAttrs (_: v: - if v ? _type && isDocType v._type then - v.text - else if v ? _type && v._type == "derivation" then - v.name - else - v - ); - }; - in { - packages."${pkgs.stdenv.system}" = { - optionsJSON = options.optionsJSON; - inherit (config) info procfileScript procfileEnv procfile; - ci = config.ciDerivation; - }; - devenv.containers = config.containers; - devShell."${pkgs.stdenv.system}" = config.shell; - }; - } -'' diff --git a/src/modules/cachix.nix b/src/modules/cachix.nix new file mode 100644 index 000000000..e5413f450 --- /dev/null +++ b/src/modules/cachix.nix @@ -0,0 +1,30 @@ +{ lib, config, ... }: +let + cfg = config.cachix; +in +{ + options.cachix = { + pull = lib.mkOption { + type = lib.types.listOf lib.types.str; + description = "What caches to pull from."; + }; + + push = lib.mkOption { + type = lib.types.nullOr lib.types.str; + description = "What cache to push to. Automatically also adds it to the list of caches to pull from."; + default = null; + }; + }; + + config = { + cachix.pull = [ "devenv" ] + ++ (lib.optionals (cfg.push != null) [ config.cachix.push ]); + + warnings = lib.optionals (!config.devenv.flakesIntegration && lib.versionOlder config.devenv.cliVersion "1.0") [ + '' + For cachix.push and cachix.pull attributes to have an effect, + upgrade to devenv 1.0 or later. + '' + ]; + }; +} diff --git a/src/modules/containers.nix b/src/modules/containers.nix index 6273993a9..b98bd42c5 100644 --- a/src/modules/containers.nix +++ b/src/modules/containers.nix @@ -1,72 +1,159 @@ -{ pkgs, config, lib, inputs, self, ... }: +{ pkgs, config, lib, self, ... }: let projectName = name: if config.name == null then throw ''You need to set `name = "myproject";` or `containers.${name}.name = "mycontainer"; to be able to generate a container.'' else config.name; - setup = '' - inputs: - nix2container: - url: github:nlewo/nix2container - inputs: - nixpkgs: - follows: nixpkgs - mk-shell-bin: - url: github:rrbutani/nix-mk-shell-bin - ''; types = lib.types; envContainerName = builtins.getEnv "DEVENV_CONTAINER"; - nix2containerInput = inputs.nix2container or (throw "To build the container, you need to add the following to your devenv.yaml:\n\n${setup}"); + + nix2containerInput = config.lib.getInput { + name = "nix2container"; + url = "github:nlewo/nix2container"; + attribute = "containers"; + follows = [ "nixpkgs" ]; + }; nix2container = nix2containerInput.packages.${pkgs.stdenv.system}; - mk-shell-bin = inputs.mk-shell-bin or (throw "To build the container, you need to add the following to your devenv.yaml:\n\n${setup}"); + mk-shell-bin = config.lib.getInput { + name = "mk-shell-bin"; + url = "github:rrbutani/nix-mk-shell-bin"; + attribute = "containers"; + }; shell = mk-shell-bin.lib.mkShellBin { drv = config.shell; nixpkgs = pkgs; }; + bash = "${pkgs.bashInteractive}/bin/bash"; mkEntrypoint = cfg: pkgs.writeScript "entrypoint" '' - #!${pkgs.bash}/bin/bash + #!${bash} export PATH=/bin source ${shell.envScript} - exec "$@" + # expand any envvars before exec + cmd="`echo "$@"|${pkgs.envsubst}/bin/envsubst`" + + ${bash} -c "$cmd" ''; + user = "user"; + group = "user"; + uid = "1000"; + gid = "1000"; + homeDir = "/env"; + + mkHome = path: (pkgs.runCommand "devenv-container-home" { } '' + mkdir -p $out${homeDir} + cp -R ${path}/* $out${homeDir}/ + ''); + + mkMultiHome = paths: map mkHome paths; + + homeRoots = cfg: ( + if (builtins.typeOf cfg.copyToRoot == "list") + then cfg.copyToRoot + else [ cfg.copyToRoot ] + ); + + mkTmp = (pkgs.runCommand "devenv-container-tmp" { } '' + mkdir -p $out/tmp + ''); + + mkEtc = (pkgs.runCommand "devenv-container-etc" { } '' + mkdir -p $out/etc/pam.d + + echo "root:x:0:0:System administrator:/root:${bash}" > \ + $out/etc/passwd + echo "${user}:x:${uid}:${gid}::${homeDir}:${bash}" >> \ + $out/etc/passwd + + echo "root:!x:::::::" > $out/etc/shadow + echo "${user}:!x:::::::" >> $out/etc/shadow + + echo "root:x:0:" > $out/etc/group + echo "${group}:x:${gid}:" >> $out/etc/group + + cat > $out/etc/pam.d/other < + # mkCopyScript = cfg: pkgs.writeScript "copy-container" '' container=$1 shift - - if [[ "$1" == "" ]]; then + if [[ "$1" == false ]]; then registry=${cfg.registry} else registry="$1" @@ -138,6 +225,12 @@ let default = "docker://"; }; + maxLayers = lib.mkOption { + type = types.nullOr types.int; + description = "Maximum number of container layers created."; + default = 1; + }; + isBuilding = lib.mkOption { type = types.bool; default = false; @@ -160,18 +253,11 @@ let type = types.package; internal = true; default = pkgs.writeScript "docker-run" '' - #!${pkgs.bash}/bin/bash + #!${bash} docker run -it ${config.name}:${config.version} "$@" ''; }; - - maxLayers = lib.mkOption { - type = types.int; - description = "the maximum number of layers to create."; - defaultText = lib.literalExpression "1"; - default = 1; - }; }; }); in @@ -198,7 +284,7 @@ in containers.shell = { name = lib.mkDefault "shell"; - startupCommand = lib.mkDefault "bash"; + startupCommand = lib.mkDefault bash; }; containers.processes = { @@ -210,7 +296,7 @@ in containers.${envContainerName}.isBuilding = true; }) (lib.mkIf config.container.isBuilding { - devenv.root = lib.mkForce "/"; + devenv.root = lib.mkForce "${homeDir}"; }) ]; } diff --git a/src/modules/flake.tmpl.nix b/src/modules/flake.tmpl.nix new file mode 100644 index 000000000..61c9b0a75 --- /dev/null +++ b/src/modules/flake.tmpl.nix @@ -0,0 +1,95 @@ +{ + inputs = { + pre-commit-hooks.url = "github:cachix/pre-commit-hooks.nix"; + pre-commit-hooks.inputs.nixpkgs.follows = "nixpkgs"; + nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + devenv.url = "github:cachix/devenv?dir=src/modules"; + } // (if builtins.pathExists ./.devenv/flake.json + then builtins.fromJSON (builtins.readFile ./.devenv/flake.json) + else { }); + + outputs = { nixpkgs, ... }@inputs: + let + __DEVENV_VARS__ + devenv = + if builtins.pathExists ./.devenv/devenv.json + then builtins.fromJSON (builtins.readFile ./.devenv/devenv.json) + else { }; + getOverlays = inputName: inputAttrs: + map + (overlay: + let + input = inputs.${inputName} or (throw "No such input `${inputName}` while trying to configure overlays."); + in + input.overlays.${overlay} or (throw "Input `${inputName}` has no overlay called `${overlay}`. Supported overlays: ${nixpkgs.lib.concatStringsSep ", " (builtins.attrNames input.overlays)}")) + inputAttrs.overlays or [ ]; + overlays = nixpkgs.lib.flatten (nixpkgs.lib.mapAttrsToList getOverlays (devenv.inputs or { })); + pkgs = import nixpkgs { + inherit system; + config = { + allowUnfree = devenv.allowUnfree or false; + allowBroken = devenv.allowBroken or false; + permittedInsecurePackages = devenv.permittedInsecurePackages or [ ]; + }; + inherit overlays; + }; + lib = pkgs.lib; + importModule = path: + if lib.hasPrefix "./" path + then if lib.hasSuffix ".nix" path + then ./. + (builtins.substring 1 255 path) + else ./. + (builtins.substring 1 255 path) + "/devenv.nix" + else if lib.hasPrefix "../" path + then throw "devenv: ../ is not supported for imports" + else + let + paths = lib.splitString "/" path; + name = builtins.head paths; + input = inputs.${name} or (throw "Unknown input ${name}"); + subpath = "/${lib.concatStringsSep "/" (builtins.tail paths)}"; + devenvpath = "${input}" + subpath + "/devenv.nix"; + in + if builtins.pathExists devenvpath + then devenvpath + else throw (devenvpath + " file does not exist for input ${name}."); + project = pkgs.lib.evalModules { + specialArgs = inputs // { inherit inputs pkgs; }; + modules = [ + (inputs.devenv.modules + /top-level.nix) + { + devenv.cliVersion = "${version}"; + devenv.root = devenv_root; + } + ] ++ (map importModule (devenv.imports or [ ])) ++ [ + ./devenv.nix + (devenv.devenv or { }) + (if builtins.pathExists ./devenv.local.nix then ./devenv.local.nix else { }) + ]; + }; + config = project.config; + + options = pkgs.nixosOptionsDoc { + options = builtins.removeAttrs project.options [ "_module" ]; + # Unpack Nix types, e.g. literalExpression, mDoc. + transformOptions = + let isDocType = v: builtins.elem v [ "literalDocBook" "literalExpression" "literalMD" "mdDoc" ]; + in lib.attrsets.mapAttrs (_: v: + if v ? _type && isDocType v._type then + v.text + else if v ? _type && v._type == "derivation" then + v.name + else + v + ); + }; + in + { + packages."${system}" = { + optionsJSON = options.optionsJSON; + inherit (config) info procfileScript procfileEnv procfile; + ci = config.ciDerivation; + }; + devenv = config; + devShell."${system}" = config.shell; + }; +} diff --git a/src/modules/integrations/pre-commit.nix b/src/modules/integrations/pre-commit.nix index c2b9bb8f5..3dcbbae06 100644 --- a/src/modules/integrations/pre-commit.nix +++ b/src/modules/integrations/pre-commit.nix @@ -9,7 +9,6 @@ rootSrc = self; package = pkgs.pre-commit; tools = import (pre-commit-hooks + "/nix/call-tools.nix") pkgs; - excludes = [ ".devenv.flake.nix" ]; } ]; specialArgs = { inherit pkgs; }; diff --git a/src/modules/languages/gleam.nix b/src/modules/languages/gleam.nix index d96f8446c..ae8f14217 100644 --- a/src/modules/languages/gleam.nix +++ b/src/modules/languages/gleam.nix @@ -1,35 +1,7 @@ -{ pkgs, config, lib, inputs, ... }: +{ pkgs, config, lib, ... }: let cfg = config.languages.gleam; - - setup = '' - To use gleam, you need to add the following to your devenv.yaml: - - inputs: - gleam-nix: - url: github:vic/gleam-nix - overlays: - - default - - - Optionally, if you want a specific gleam branch or version, do - the following: - - inputs: - gleam: - url: github:gleam-lang/gleam/main # or any other branch - flake: false - gleam-nix: - url: github:vic/gleam-nix - overlays: - - default - inputs: - gleam = "gleam" - ''; - - gleamPkg = pkgs.gleam or (throw setup); - in { options.languages.gleam = { @@ -37,7 +9,7 @@ in package = lib.mkOption { type = lib.types.package; - default = gleamPkg; + default = pkgs.gleam; description = "The Gleam package to use."; defaultText = lib.literalExpression "pkgs.gleam"; }; diff --git a/src/modules/languages/php.nix b/src/modules/languages/php.nix index fbac9d530..f8303fea3 100644 --- a/src/modules/languages/php.nix +++ b/src/modules/languages/php.nix @@ -1,22 +1,18 @@ -{ pkgs, config, lib, inputs, ... }: +{ pkgs, config, lib, ... }: with lib; let - inherit (lib.attrsets) attrValues genAttrs; + inherit (lib.attrsets) attrValues; cfg = config.languages.php; - setup = '' - inputs: - phps: - url: github:fossar/nix-phps - inputs: - nixpkgs: - follows: nixpkgs - ''; - - phps = inputs.phps or (throw "To use languages.php.version, you need to add the following to your devenv.yaml:\n\n${setup}"); + phps = config.lib.getInput { + name = "phps"; + url = "github:fossar/nix-phps"; + attribute = "languages.php.version"; + follows = [ "nixpkgs" ]; + }; filterDefaultExtensions = ext: builtins.length (builtins.filter (inner: inner == ext.extensionName) cfg.disableExtensions) == 0; diff --git a/src/modules/languages/python.nix b/src/modules/languages/python.nix index 10a8e9792..e391d195b 100644 --- a/src/modules/languages/python.nix +++ b/src/modules/languages/python.nix @@ -1,7 +1,30 @@ -{ pkgs, config, lib, inputs, ... }: +{ pkgs, config, lib, ... }: let cfg = config.languages.python; + libraries = lib.makeLibraryPath ( + cfg.libraries + ++ (lib.optional cfg.manylinux.enable pkgs.pythonManylinuxPackages.manylinux2014Package) + # see https://matrix.to/#/!kjdutkOsheZdjqYmqp:nixos.org/$XJ5CO4bKMevYzZq_rrNo64YycknVFJIJTy6hVCJjRlA?via=nixos.org&via=matrix.org&via=nixos.dev + ++ [ pkgs.stdenv.cc.cc.lib ] + ); + + readlink = "${pkgs.coreutils}/bin/readlink -f "; + package = pkgs.callPackage "${pkgs.path}/pkgs/development/interpreters/python/wrapper.nix" { + python = cfg.package; + requiredPythonModules = cfg.package.pkgs.requiredPythonModules; + makeWrapperArgs = [ + "--prefix" + "LD_LIBRARY_PATH" + ":" + libraries + ] ++ lib.optionals pkgs.stdenv.isDarwin [ + "--prefix" + "DYLD_LIBRARY_PATH" + ":" + libraries + ]; + }; requirements = pkgs.writeText "requirements.txt" ( if lib.isPath cfg.venv.requirements @@ -9,13 +32,11 @@ let else cfg.venv.requirements ); - nixpkgs-python = inputs.nixpkgs-python or (throw '' - To use languages.python.version, you need to add the following to your devenv.yaml: - - inputs: - nixpkgs-python: - url: github:cachix/nixpkgs-python - ''); + nixpkgs-python = config.lib.getInput { + name = "nixpkgs-python"; + url = "github:cachix/nixpkgs-python"; + attribute = "languages.python.version"; + }; initVenvScript = pkgs.writeShellScript "init-venv.sh" '' # Make sure any tools are not attempting to use the python interpreter from any @@ -24,46 +45,58 @@ let VENV_PATH="${config.env.DEVENV_STATE}/venv" - if [ ! -L "$VENV_PATH"/devenv-profile ] \ - || [ "$(${pkgs.coreutils}/bin/readlink "$VENV_PATH"/devenv-profile)" != "${config.devenv.profile}" ] + profile_python="$(${readlink} ${package.interpreter})" + devenv_interpreter_path="$(${pkgs.coreutils}/bin/cat "$VENV_PATH/.devenv_interpreter" 2> /dev/null|| false )" + venv_python="$(${readlink} "$devenv_interpreter_path")" + requirements="${lib.optionalString (cfg.venv.requirements != null) ''${requirements}''}" + + # recreate venv if necessary + if [ -z $venv_python ] || [ $profile_python != $venv_python ] then - if [ -d "$VENV_PATH" ] - then - echo "Rebuilding Python venv..." - ${pkgs.coreutils}/bin/rm -rf "$VENV_PATH" - fi + echo "Python interpreter changed, rebuilding Python venv..." + ${pkgs.coreutils}/bin/rm -rf "$VENV_PATH" ${lib.optionalString cfg.poetry.enable '' [ -f "${config.env.DEVENV_STATE}/poetry.lock.checksum" ] && rm ${config.env.DEVENV_STATE}/poetry.lock.checksum ''} - ${cfg.package.interpreter} -m venv "$VENV_PATH" - ${pkgs.coreutils}/bin/ln -sf ${config.devenv.profile} "$VENV_PATH"/devenv-profile + echo ${package.interpreter} -m venv --upgrade-deps "$VENV_PATH" + ${package.interpreter} -m venv --upgrade-deps "$VENV_PATH" + echo "${package.interpreter}" > "$VENV_PATH/.devenv_interpreter" fi + source "$VENV_PATH"/bin/activate - ${lib.optionalString (cfg.venv.requirements != null) '' - "$VENV_PATH"/bin/pip install -r ${requirements} ${lib.optionalString cfg.venv.quiet '' - --quiet - ''} - ''} + + # reinstall requirements if necessary + if [ -n "$requirements" ] + then + devenv_requirements_path="$(${pkgs.coreutils}/bin/cat "$VENV_PATH/.devenv_requirements" 2> /dev/null|| false )" + devenv_requirements="$(${readlink} "$devenv_requirements_path")" + if [ -z $devenv_requirements ] || [ $devenv_requirements != $requirements ] + then + echo "${requirements}" > "$VENV_PATH/.devenv_requirements" + echo "Requirements changed, running pip install -r ${requirements}..." + "$VENV_PATH"/bin/pip install -r ${requirements} + fi + fi ''; initPoetryScript = pkgs.writeShellScript "init-poetry.sh" '' - function _devenv-init-poetry-venv() + function _devenv_init_poetry_venv { # Make sure any tools are not attempting to use the python interpreter from any # existing virtual environment. For instance if devenv was started within an venv. unset VIRTUAL_ENV # Make sure poetry's venv uses the configured python executable. - ${cfg.poetry.package}/bin/poetry env use --no-interaction --quiet ${cfg.package.interpreter} + ${cfg.poetry.package}/bin/poetry env use --no-interaction --quiet ${package.interpreter} } - function _devenv-poetry-install() + function _devenv_poetry_install { local POETRY_INSTALL_COMMAND=(${cfg.poetry.package}/bin/poetry install --no-interaction ${lib.concatStringsSep " " cfg.poetry.install.arguments}) # Avoid running "poetry install" for every shell. # Only run it when the "poetry.lock" file or python interpreter has changed. # We do this by storing the interpreter path and a hash of "poetry.lock" in venv. - local ACTUAL_POETRY_CHECKSUM="${cfg.package.interpreter}:$(${pkgs.nix}/bin/nix-hash --type sha256 pyproject.toml):$(${pkgs.nix}/bin/nix-hash --type sha256 poetry.lock):''${POETRY_INSTALL_COMMAND[@]}" + local ACTUAL_POETRY_CHECKSUM="${package.interpreter}:$(${pkgs.nix}/bin/nix-hash --type sha256 pyproject.toml):$(${pkgs.nix}/bin/nix-hash --type sha256 poetry.lock):''${POETRY_INSTALL_COMMAND[@]}" local POETRY_CHECKSUM_FILE="$DEVENV_ROOT"/.venv/poetry.lock.checksum if [ -f "$POETRY_CHECKSUM_FILE" ] then @@ -87,9 +120,9 @@ let then echo "No pyproject.toml found. Run 'poetry init' to create one." >&2 else - _devenv-init-poetry-venv + _devenv_init_poetry_venv ${lib.optionalString cfg.poetry.install.enable '' - _devenv-poetry-install + _devenv_poetry_install ''} ${lib.optionalString cfg.poetry.activate.enable '' source "$DEVENV_ROOT"/.venv/bin/activate @@ -108,6 +141,28 @@ in description = "The Python package to use."; }; + manylinux.enable = lib.mkOption { + type = lib.types.bool; + default = pkgs.stdenv.isLinux; + description = '' + Whether to install manylinux2014 libraries. + + Enabled by default on linux; + + This is useful when you want to use Python wheels that depend on manylinux2014 libraries. + ''; + }; + + libraries = lib.mkOption { + type = lib.types.listOf lib.types.path; + default = [ "${config.devenv.dotfile}/profile" ]; + description = '' + Additional libraries to make available to the Python interpreter. + + This is useful when you want to use Python wheels that depend on native libraries. + ''; + }; + version = lib.mkOption { type = lib.types.nullOr lib.types.str; default = null; @@ -194,11 +249,14 @@ in languages.python.poetry.activate.enable = lib.mkIf cfg.poetry.enable (lib.mkDefault true); languages.python.package = lib.mkMerge [ - (lib.mkIf (cfg.version != null) (nixpkgs-python.packages.${pkgs.stdenv.system}.${cfg.version} or (throw "Unsupported Python version, see https://github.com/cachix/nixpkgs-python#supported-python-versions"))) + (lib.mkIf (cfg.version != null) + (nixpkgs-python.packages.${pkgs.stdenv.system}.${cfg.version} or (throw "Unsupported Python version, see https://github.com/cachix/nixpkgs-python#supported-python-versions"))) ]; + cachix.pull = lib.mkIf (cfg.version != null) [ "nixpkgs-python" ]; + packages = [ - cfg.package + package ] ++ (lib.optional cfg.poetry.enable cfg.poetry.package); env = lib.optionalAttrs cfg.poetry.enable { @@ -212,7 +270,7 @@ in enterShell = lib.concatStringsSep "\n" ([ '' - export PYTHONPATH="$DEVENV_PROFILE/${cfg.package.sitePackages}''${PYTHONPATH:+:$PYTHONPATH}" + export PYTHONPATH="$DEVENV_PROFILE/${package.sitePackages}''${PYTHONPATH:+:$PYTHONPATH}" '' ] ++ (lib.optional cfg.venv.enable '' diff --git a/src/modules/languages/ruby.nix b/src/modules/languages/ruby.nix index 9e745f858..9425e3f99 100644 --- a/src/modules/languages/ruby.nix +++ b/src/modules/languages/ruby.nix @@ -1,18 +1,14 @@ -{ pkgs, config, lib, inputs, ... }: +{ pkgs, config, lib, ... }: let cfg = config.languages.ruby; - nixpkgs-ruby = inputs.nixpkgs-ruby or (throw '' - To use languages.ruby.version or languages.ruby.versionFile, you need to add the following to your devenv.yaml: - - inputs: - nixpkgs-ruby: - url: github:bobvanderlinden/nixpkgs-ruby - inputs: - nixpkgs: - follows: nixpkgs - ''); + nixpkgs-ruby = config.lib.getInput { + name = "nixpkgs-ruby"; + url = "github:bobvanderlinden/nixpkgs-ruby"; + attribute = "languages.ruby.version or languages.ruby.versionFile"; + follows = [ "nixpkgs" ]; + }; in { options.languages.ruby = { diff --git a/src/modules/languages/rust.nix b/src/modules/languages/rust.nix index d778e534d..df35616dd 100644 --- a/src/modules/languages/rust.nix +++ b/src/modules/languages/rust.nix @@ -1,17 +1,14 @@ -{ pkgs, config, lib, inputs, ... }: +{ pkgs, config, lib, ... }: let cfg = config.languages.rust; - setup = '' - inputs: - fenix: - url: github:nix-community/fenix - inputs: - nixpkgs: - follows: nixpkgs - ''; - error = dbg: "To use languages.rust.${dbg}, you need to add the following to your devenv.yaml:\n\n${setup}"; + fenix = config.lib.getInput { + name = "fenix"; + url = "github:nix-community/fenix"; + attribute = "languages.rust.version"; + follows = [ "nixpkgs" ]; + }; in { imports = [ @@ -79,7 +76,7 @@ in export PATH="$PATH:$CARGO_INSTALL_ROOT/bin" ''; - packages = (builtins.map (c: cfg.toolchain.${c} or (throw (error "toolchain.${c}"))) cfg.components) + packages = (builtins.map (c: cfg.toolchain.${c} or (throw "toolchain.${c}")) cfg.components) ++ lib.optional pkgs.stdenv.isDarwin pkgs.libiconv; # enable compiler tooling by default to expose things like cc @@ -104,9 +101,7 @@ in }) (lib.mkIf (cfg.channel != "nixpkgs") ( let - err = error "channel"; - fenix = inputs.fenix or (throw err); - rustPackages = fenix.packages.${pkgs.stdenv.system} or (throw err); + rustPackages = fenix.packages.${pkgs.stdenv.system}; in { languages.rust.toolchain = diff --git a/src/modules/latest-version b/src/modules/latest-version index 844f6a91a..d3827e75a 100644 --- a/src/modules/latest-version +++ b/src/modules/latest-version @@ -1 +1 @@ -0.6.3 +1.0 diff --git a/src/modules/lib.nix b/src/modules/lib.nix new file mode 100644 index 000000000..f9e2752a3 --- /dev/null +++ b/src/modules/lib.nix @@ -0,0 +1,53 @@ +{ lib, config, inputs, ... }: + +{ + # freestyle + options.lib = lib.mkOption { + type = lib.types.attrsOf lib.types.anything; + internal = true; + }; + + config.lib = { + getInput = { name, url, attribute, follows ? [ ] }: + let + flags = lib.concatStringsSep " " (map (i: "--follows ${i}") follows); + yaml_follows = lib.concatStringsSep "\n " (map (i: "${i}:\n follows: ${i}") follows); + command = + if config.devenv.flakesIntegration + then '' + Add the following to flake.nix: + + inputs.${name}.url = "${url}"; + ${if follows != [] + then "inputs.${name}.inputs = { ${lib.concatStringsSep "; " (map (i: "${i}.follows = \"${i}\";") follows)}; };" + else ""} + '' + else if lib.versionAtLeast config.devenv.cliVersion "1.0" + then '' + run the following command: + + $ devenv inputs add ${name} ${url} ${flags} + '' + else '' + add the following to your devenv.yaml: + + ✨ devenv 1.0 made this easier: https://devenv.sh/getting-started/#installation ✨ + + inputs: + ${name}: + url: ${url} + ${if follows != [] then "inputs:\n ${yaml_follows}" else ""} + ''; + in + inputs.${name} or (throw "To use '${attribute}', ${command}\n\n"); + + mkTests = folder: + let + mk = dir: { + tags = [ "local" ]; + src = "${folder}/${dir}"; + }; + in + lib.genAttrs (builtins.attrNames (builtins.readDir folder)) mk; + }; +} diff --git a/src/modules/mkNakedShell.nix b/src/modules/mkNakedShell.nix deleted file mode 100644 index f7c320f92..000000000 --- a/src/modules/mkNakedShell.nix +++ /dev/null @@ -1,140 +0,0 @@ -# using copied code from https://github.com/numtide/devshell -# -# MIT License - -# Copyright (c) 2021 Numtide and contributors - -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. - -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -{ bashInteractive -, coreutils -, stdenv -, writeTextFile -, pkgs -, lib -}: -let - bashPath = "${bashInteractive}/bin/bash"; - stdenv = writeTextFile { - name = "naked-stdenv"; - destination = "/setup"; - text = '' - # Fix for `nix develop` - : ''${outputs:=out} - - runHook() { - eval "$shellHook" - unset runHook - } - ''; - }; -in -{ name -, # A path to a buildEnv that will be loaded by the shell. - # We assume that the buildEnv contains an ./env.bash script. - profile -, env ? { } -, shellHook ? "" -, meta ? { } -, passthru ? { } -, debug ? false -}: -let - # simpler version of https://github.com/numtide/devshell/blob/20d50fc6adf77fd8a652fc824c6e282d7737b85d/modules/env.nix#L41 - envToBash = name: value: "export ${name}=${lib.escapeShellArg (toString value)}"; - startupEnv = lib.concatStringsSep "\n" (lib.mapAttrsToList envToBash env); - derivationArg = { - inherit name; - inherit (stdenv) system; - - # `nix develop` actually checks and uses builder. And it must be bash. - builder = bashPath; - - # Bring in the dependencies on `nix-build` - args = [ "-ec" "${coreutils}/bin/ln -s ${profile} $out; exit 0" ]; - - # $stdenv/setup is loaded by nix-shell during startup. - # https://github.com/nixos/nix/blob/377345e26f1ac4bbc87bb21debcc52a1d03230aa/src/nix-build/nix-build.cc#L429-L432 - stdenv = stdenv; - - # The shellHook is loaded directly by `nix develop`. But nix-shell - # requires that other trampoline. - shellHook = '' - ${lib.optionalString debug "set -x"} - # Remove all the unnecessary noise that is set by the build env - unset NIX_BUILD_TOP NIX_BUILD_CORES NIX_STORE - unset TEMP TEMPDIR TMP ${lib.optionalString (!pkgs.stdenv.isDarwin) "TMPDIR"} - # $name variable is preserved to keep it compatible with pure shell https://github.com/sindresorhus/pure/blob/47c0c881f0e7cfdb5eaccd335f52ad17b897c060/pure.zsh#L235 - unset builder out shellHook stdenv system - # Flakes stuff - unset dontAddDisableDepTrack outputs - - # For `nix develop`. We get /noshell on Linux and /sbin/nologin on macOS. - if [[ "$SHELL" == "/noshell" || "$SHELL" == "/sbin/nologin" ]]; then - export SHELL=${bashPath} - fi - - # https://github.com/numtide/devshell/issues/158 - PATH=''${PATH#/path-not-set:} - - export DEVENV_PROFILE=${profile} - - # add installed packages to PATH - export PATH="$DEVENV_PROFILE/bin:$PATH" - - # prepend common compilation lookup paths - export PKG_CONFIG_PATH="$DEVENV_PROFILE/lib/pkgconfig:''${PKG_CONFIG_PATH-}" - export LD_LIBRARY_PATH="$DEVENV_PROFILE/lib:''${LD_LIBRARY_PATH-}" - export LIBRARY_PATH="$DEVENV_PROFILE/lib:''${LIBRARY_PATH-}" - export C_INCLUDE_PATH="$DEVENV_PROFILE/include:''${C_INCLUDE_PATH-}" - - # these provide shell completions / default config options - export XDG_DATA_DIRS="$DEVENV_PROFILE/share:''${XDG_DATA_DIRS-}" - export XDG_CONFIG_DIRS="$DEVENV_PROFILE/etc/xdg:''${XDG_CONFIG_DIRS-}" - - ${startupEnv} - - ${shellHook} - ''; - }; -in -(derivation derivationArg) // { - inherit meta passthru; - - # https://github.com/NixOS/nixpkgs/blob/41f7e338216fd7f5e57817c4f8e148d42fb88b24/pkgs/stdenv/generic/make-derivation.nix#L486-L504 - inputDerivation = derivation (derivationArg // { - # Add a name in case the original drv didn't have one - name = derivationArg.name or "inputDerivation"; - # This always only has one output - outputs = [ "out" ]; - - # Propagate the original builder and arguments, since we override - # them and they might contain references to build inputs - _derivation_original_builder = derivationArg.builder; - _derivation_original_args = derivationArg.args; - - builder = bashPath; - # The bash builtin `export` dumps all current environment variables, - # which is where all build input references end up (e.g. $PATH for - # binaries). By writing this to $out, Nix can find and register - # them as runtime dependencies (since Nix greps for store paths - # through $out to find them) - args = [ "-c" "export > $out" ]; - }); -} // passthru diff --git a/src/modules/tests.nix b/src/modules/tests.nix new file mode 100644 index 000000000..5eba38745 --- /dev/null +++ b/src/modules/tests.nix @@ -0,0 +1,60 @@ +{ config, lib, ... }: + +let + testType = lib.types.submodule ({ config, ... }: { + options = { + tags = lib.mkOption { + type = lib.types.listOf lib.types.str; + default = [ "local" ]; + description = "Tags for this test."; + }; + + nix = lib.mkOption { + type = lib.types.nullOr lib.types.str; + default = null; + example = "{ pkgs, ... }: {}"; + description = "devenv.nix code."; + }; + + yaml = lib.mkOption { + type = lib.types.nullOr lib.types.str; + default = null; + example = '' + inputs: + nixpkgs: + url: github:NixOS/nixpkgs/nixpkgs-unstable + ''; + description = "devenv.yaml code."; + }; + + test = lib.mkOption { + type = lib.types.nullOr lib.types.str; + description = "Bash to be executed."; + default = null; + }; + + src = lib.mkOption { + type = lib.types.nullOr lib.types.path; + default = null; + description = "Source code with all the files."; + }; + }; + }); +in +{ + options.tests = lib.mkOption { + type = lib.types.attrsOf testType; + default = { }; + description = "Tests for this module."; + }; + + config.assertions = + let + mk = name: cfg: + { + assertion = cfg.nix != null || cfg.src != null; + message = "Either tests.${name}.nix or tests.${name}.src needs to be defined."; + }; + in + lib.mapAttrsToList mk config.tests; +} diff --git a/src/modules/top-level.nix b/src/modules/top-level.nix index f884a504b..aa1ef0caa 100644 --- a/src/modules/top-level.nix +++ b/src/modules/top-level.nix @@ -1,7 +1,6 @@ { config, pkgs, lib, ... }: let types = lib.types; - mkNakedShell = pkgs.callPackage ./mkNakedShell.nix { }; # Returns a list of all the entries in a folder listEntries = path: map (name: path + "/${name}") (builtins.attrNames (builtins.readDir path)); @@ -67,6 +66,42 @@ in default = [ ]; }; + unsetEnvVars = lib.mkOption { + type = types.listOf types.str; + description = "Remove these list of env vars from being exported to keep the shell/direnv more lean."; + # manually determined with knowledge from https://nixos.wiki/wiki/C + default = [ + "HOST_PATH" + "NIX_BUILD_CORES" + "__structuredAttrs" + "buildInputs" + "buildPhase" + "builder" + "depsBuildBuild" + "depsBuildBuildPropagated" + "depsBuildTarget" + "depsBuildTargetPropagated" + "depsHostHost" + "depsHostHostPropagated" + "depsTargetTarget" + "depsTargetTargetPropagated" + "doCheck" + "doInstallCheck" + "nativeBuildInputs" + "out" + "outputs" + "patches" + "phases" + "preferLocalBuild" + "propagatedBuildInputs" + "propagatedNativeBuildInputs" + "shell" + "shellHook" + "stdenv" + "strictDeps" + ]; + }; + shell = lib.mkOption { type = types.package; internal = true; @@ -100,7 +135,7 @@ in default = [ ]; example = [ "you should fix this or that" ]; description = '' - This option allows modules to express warnings about theV + This option allows modules to express warnings about the configuration. For example, `lib.mkRenamedOptionModule` uses this to display a warning message when a renamed option is used. ''; @@ -110,6 +145,7 @@ in root = lib.mkOption { type = types.str; internal = true; + default = builtins.getEnv "PWD"; }; dotfile = lib.mkOption { @@ -137,6 +173,9 @@ in ./update-check.nix ./containers.nix ./debug.nix + ./lib.nix + ./tests.nix + ./cachix.nix ] ++ (listEntries ./languages) ++ (listEntries ./services) @@ -145,22 +184,19 @@ in ; config = { - # TODO: figure out how to get relative path without impure mode - devenv.root = lib.mkDefault ( - let - pwd = builtins.getEnv "PWD"; - in - if pwd == "" then - throw '' + assertions = [ + { + assertion = config.devenv.root != ""; + message = '' devenv was not able to determine the current directory. - Make sure Nix runs with the `--impure` flag. - See https://devenv.sh/guides/using-with-flakes/ - '' - else pwd - ); - devenv.dotfile = config.devenv.root + "/.devenv"; - devenv.state = config.devenv.dotfile + "/state"; + See https://devenv.sh/guides/using-with-flakes/ how to use it with flakes. + ''; + } + ]; + # use builtins.toPath to normalize path if root is "/" (container) + devenv.dotfile = builtins.toPath (config.devenv.root + "/.devenv"); + devenv.state = builtins.toPath (config.devenv.dotfile + "/state"); devenv.profile = profile; env.DEVENV_PROFILE = config.devenv.profile; @@ -168,6 +204,11 @@ in env.DEVENV_DOTFILE = config.devenv.dotfile; env.DEVENV_ROOT = config.devenv.root; + packages = [ + # needed to make sure we can load libs + pkgs.pkg-config + ]; + enterShell = '' export PS1="\[\e[0;34m\](devenv)\[\e[0m\] ''${PS1-}" @@ -190,24 +231,28 @@ in fi mkdir -p .devenv - rm -f .devenv/profile - ln -s ${profile} .devenv/profile + if [ ! -L .devenv/profile ] || [ "$(${pkgs.coreutils}/bin/readlink .devenv/profile)" != "${profile}" ] + then + ln -nsf ${profile} .devenv/profile + fi + unset ${lib.concatStringsSep " " config.unsetEnvVars} ''; shell = performAssertions ( - mkNakedShell { + pkgs.mkShell ({ name = "devenv-shell"; - env = config.env; - profile = profile; - shellHook = config.enterShell; - debug = config.devenv.debug; - } + packages = config.packages; + shellHook = '' + ${lib.optionalString config.devenv.debug "set -x"} + ${config.enterShell} + ''; + } // config.env) ); infoSections."env" = lib.mapAttrsToList (name: value: "${name}: ${toString value}") config.env; infoSections."packages" = builtins.map (package: package.name) (builtins.filter (package: !(builtins.elem package.name (builtins.attrNames config.scripts))) config.packages); - ci = [ config.shell.inputDerivation ]; - ciDerivation = pkgs.runCommand "ci" { } ("ls " + toString config.ci + " && touch $out"); + ci = [ config.shell ]; + ciDerivation = pkgs.runCommand "ci" { } "echo ${toString config.ci} > $out"; }; } diff --git a/tests/cli/.test.sh b/tests/cli/.test.sh new file mode 100755 index 000000000..769fea488 --- /dev/null +++ b/tests/cli/.test.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -xe +devenv build languages.python.package +devenv shell ls -la \ No newline at end of file diff --git a/tests/cli/devenv.nix b/tests/cli/devenv.nix new file mode 100644 index 000000000..ecce39d5a --- /dev/null +++ b/tests/cli/devenv.nix @@ -0,0 +1,3 @@ +{ ... }: { + languages.python.enable = true; +} diff --git a/tests/python-native-libs/.test.sh b/tests/python-native-libs/.test.sh new file mode 100755 index 000000000..119fd2259 --- /dev/null +++ b/tests/python-native-libs/.test.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +set -ex + +python -c "from PIL import Image" +python -c "import grpc_tools.protoc" +python -c "import transformers" +python -c "import torch" + +# TODO: invoke a subprocess with an old glibc and assert it doesn't crash \ No newline at end of file diff --git a/tests/python-native-libs/devenv.nix b/tests/python-native-libs/devenv.nix new file mode 100644 index 000000000..5d7bd5a29 --- /dev/null +++ b/tests/python-native-libs/devenv.nix @@ -0,0 +1,21 @@ +{ pkgs, lib, ... }: { + packages = [ pkgs.cairo ]; + + # we must set LD_LIBRARY_PATH by hand without use of the env-venv + # version of nixpkgs, this can be removed when we switch to one + env.LD_LIBRARY_PATH = lib.makeLibraryPath [ + pkgs.pythonManylinuxPackages.manylinux2014Package + pkgs.zlib + ]; + + languages.python = { + enable = true; + venv.enable = true; + venv.requirements = '' + pillow + grpcio-tools + transformers + torch + ''; + }; +} diff --git a/tests/python-native-libs/devenv.yaml b/tests/python-native-libs/devenv.yaml new file mode 100644 index 000000000..25b947129 --- /dev/null +++ b/tests/python-native-libs/devenv.yaml @@ -0,0 +1,5 @@ +inputs: + devenv: + url: path:./../../src/modules + nixpkgs: + url: github:NixOS/nixpkgs/nixpkgs-unstable