diff --git a/.github/workflows/mkdoc-gh-pages.yaml b/.github/workflows/mkdoc-gh-pages.yaml index e41e5a0..249057a 100644 --- a/.github/workflows/mkdoc-gh-pages.yaml +++ b/.github/workflows/mkdoc-gh-pages.yaml @@ -9,23 +9,14 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Set up Python 3.8 - uses: actions/setup-python@v4 + - name: Set up Python 3.11 + uses: actions/setup-python@v5 with: - python-version: 3.8 + python-version: 3.11 - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r docs/requirements.txt - - name: Package - run: | - make build - - name: Validate package - run: | - ls dist - PACKAGE=`ls dist/jsf-*.tar.gz` - pip3 install $PACKAGE\[cli\] - jsf --help - name: Deploy docs run: | mkdocs gh-deploy --force \ No newline at end of file diff --git a/.github/workflows/python-package.yaml b/.github/workflows/python-package.yaml index 45ceaa0..3c93054 100644 --- a/.github/workflows/python-package.yaml +++ b/.github/workflows/python-package.yaml @@ -14,11 +14,11 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.8", "3.9"] + python-version: ["3.8", "3.9", "3.10", "3.11"] steps: - uses: actions/checkout@v4 - - uses: actions/cache@v3 + - uses: actions/cache@v4 id: cache with: path: | @@ -27,14 +27,32 @@ jobs: ~/.cache/pants/named_caches key: ${{ runner.os }}- - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - - name: Bootstrap Pants - run: | - ./pants --version + - uses: pantsbuild/actions/init-pants@v5-scie-pants + # This action bootstraps pants and manages 2-3 GHA caches. + # See: github.com/pantsbuild/actions/tree/main/init-pants/ + with: + # v0 makes it easy to bust the cache if needed + # just increase the integer to start with a fresh cache + gha-cache-key: v0 + # The Python backend uses named_caches for Pip/PEX state, + # so it is appropriate to invalidate on lockfile changes. + named-caches-hash: ${{ hashFiles('python-default.lock') }} + # If you're not using a fine-grained remote caching service (see https://www.pantsbuild.org/docs/remote-caching), + # then you may also want to preserve the local Pants cache (lmdb_store). However this must invalidate for + # changes to any file that can affect the build, so may not be practical in larger repos. + # A remote cache service integrates with Pants's fine-grained invalidation and avoids these problems. + cache-lmdb-store: 'true' # defaults to 'false' + # Note that named_caches and lmdb_store falls back to partial restore keys which + # may give a useful partial result that will save time over completely clean state, + # but will cause the cache entry to grow without bound over time. + # See https://pants.readme.io/docs/using-pants-in-ci for tips on how to periodically clean it up. + # Alternatively you change gha-cache-key to ignore old caches. - name: Check BUILD files - run: ./pants tailor --check update-build-files --check + run: | + pants tailor --check update-build-files --check :: - name: Lint run: | make lint @@ -64,8 +82,8 @@ jobs: with: files: ./dist/coverage/python/coverage.xml - name: Upload pants log - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: - name: pants-log + name: pants-log-${{ matrix.os }}-${{ matrix.python-version }} path: .pants.d/pants.log if: always() # We want the log even on failures. \ No newline at end of file diff --git a/.github/workflows/python-publish.yaml b/.github/workflows/python-publish.yaml index 323c0f2..ee039fc 100644 --- a/.github/workflows/python-publish.yaml +++ b/.github/workflows/python-publish.yaml @@ -14,7 +14,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: "3.9" - name: Install dependencies diff --git a/.gitignore b/.gitignore index 578be14..2510a5c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ # Application *.json +!examples/**/*.json +!.vscode/settings.json !jsf/tests/data/*.json TODO.md diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..2e0addc --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "python.defaultInterpreterPath": "./dist/export/python/virtualenvs/python-default/3.8.18" +} \ No newline at end of file diff --git a/Makefile b/Makefile index 442e818..c75ab48 100644 --- a/Makefile +++ b/Makefile @@ -1,19 +1,19 @@ .PHONY: build test: - @./pants test :: + @pants test :: lint: - @./pants lint :: + @pants lint :: fmt: - @./pants fmt :: + @pants fmt :: build: - @./pants package :: + @pants package :: check: - @./pants check :: + @pants check :: clean: @rm -rf dist/ .pids/ .pants.d/ \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml index 3f9b3bb..15999dd 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -7,5 +7,6 @@ services: ports: - "8000:8000" volumes: - - .:/docs + - ./docs:/docs + - ./mkdocs.yml:/mkdocs.yml entrypoint: mkdocs serve --dev-addr 0.0.0.0:8000 diff --git a/docs/BUILD b/docs/BUILD new file mode 100644 index 0000000..b8519ce --- /dev/null +++ b/docs/BUILD @@ -0,0 +1,3 @@ +python_requirements( + name="reqs", +) diff --git a/docs/Dockerfile b/docs/Dockerfile index f7178ea..3d97b37 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -1,3 +1,3 @@ -FROM squidfunk/mkdocs-material +FROM python:3.11 ADD requirements.txt . RUN pip install -r requirements.txt \ No newline at end of file diff --git a/docs/about/about.md b/docs/about/about.md new file mode 100644 index 0000000..c60240e --- /dev/null +++ b/docs/about/about.md @@ -0,0 +1 @@ +About JSF, its design, inspiration and more. 🤓 \ No newline at end of file diff --git a/docs/alternatives.md b/docs/about/alternatives.md similarity index 100% rename from docs/alternatives.md rename to docs/about/alternatives.md diff --git a/docs/code-of-conduct.md b/docs/about/code-of-conduct.md similarity index 100% rename from docs/code-of-conduct.md rename to docs/about/code-of-conduct.md diff --git a/docs/assets/css/styles.css b/docs/assets/css/styles.css index cfc345d..309bd4e 100644 --- a/docs/assets/css/styles.css +++ b/docs/assets/css/styles.css @@ -45,136 +45,6 @@ td p { fill: var(--md-primary-bg-color); } -[data-md-color-scheme="capgemini"] { - --md-primary-fg-color: rgba(0, 112, 173); - --md-primary-fg-color--light: rgba(18, 171, 219); - --md-primary-fg-color--dark: rgba(43, 10, 61); - - /* // Code color shades */ - --md-code-fg-color: hsla(200, 18%, 26%, 1); - --md-code-bg-color: hsla(0, 0%, 96%, 1); - - /* // Code highlighting color shades */ - --md-code-hl-color: hsla(#{hex2hsl($clr-yellow-a200)}, 0.5); - --md-code-hl-number-color: hsla(0, 67%, 50%, 1); - --md-code-hl-special-color: hsla(340, 83%, 47%, 1); - --md-code-hl-function-color: hsla(291, 45%, 50%, 1); - --md-code-hl-constant-color: hsla(250, 63%, 60%, 1); - --md-code-hl-keyword-color: hsla(219, 54%, 51%, 1); - --md-code-hl-string-color: hsla(150, 63%, 30%, 1); - --md-code-hl-name-color: var(--md-code-fg-color); - --md-code-hl-operator-color: var(--md-default-fg-color--light); - --md-code-hl-punctuation-color: var(--md-default-fg-color--light); - --md-code-hl-comment-color: var(--md-default-fg-color--light); - --md-code-hl-generic-color: var(--md-default-fg-color--light); - --md-code-hl-variable-color: var(--md-default-fg-color--light); - - /* // Typeset color shades */ - --md-typeset-color: var(--md-default-fg-color); - --md-typeset-a-color: var(--md-primary-fg-color); - - /* // Typeset `mark` color shades */ - --md-typeset-mark-color: hsla(#{hex2hsl($clr-yellow-a200)}, 0.5); - - /* // Typeset `del` and `ins` color shades */ - --md-typeset-del-color: hsla(6, 90%, 60%, 0.15); - --md-typeset-ins-color: hsla(150, 90%, 44%, 0.15); - - /* // Typeset `kbd` color shades */ - --md-typeset-kbd-color: hsla(0, 0%, 98%, 1); - --md-typeset-kbd-accent-color: hsla(0, 100%, 100%, 1); - --md-typeset-kbd-border-color: hsla(0, 0%, 72%, 1); - - /* // Admonition color shades */ - --md-admonition-fg-color: var(--md-default-fg-color); - --md-admonition-bg-color: var(--md-default-bg-color); - - /* // Footer color shades */ - --md-footer-fg-color: hsla(0, 0%, 100%, 1); - --md-footer-fg-color--light: hsla(0, 0%, 100%, 0.7); - --md-footer-fg-color--lighter: hsla(0, 0%, 100%, 0.3); - --md-footer-bg-color: hsla(0, 0%, 0%, 0.87); - --md-footer-bg-color--dark: hsla(0, 0%, 0%, 0.32); -} - -/* //// - /// Copyright (c) 2016-2020 Martin Donath - /// - /// 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 NON-INFRINGEMENT. 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 - //// - - // ---------------------------------------------------------------------------- - // Rules - // ---------------------------------------------------------------------------- - - // Slate theme, i.e. dark mode */ -[data-md-color-scheme="slate"] { - /* // Slate's hue in the range [0,360] - change this variable to alter the tone - // of the theme, e.g. to make it more redish or greenish. This is a slate- - // specific variable, but the same approach may be adapted to custom themes. */ - --md-hue: 232; - --md-primary-fg-color: rgba(0, 112, 173); - --md-primary-fg-color--light: rgba(18, 171, 219); - --md-primary-fg-color--dark: rgba(43, 10, 61); - - /* // Default color shades */ - --md-default-fg-color: hsla(var(--md-hue), 75%, 95%, 1); - --md-default-fg-color--light: hsla(var(--md-hue), 75%, 90%, 0.62); - --md-default-fg-color--lighter: hsla(var(--md-hue), 75%, 90%, 0.32); - --md-default-fg-color--lightest: hsla(var(--md-hue), 75%, 90%, 0.12); - --md-default-bg-color: hsla(var(--md-hue), 15%, 21%, 1); - --md-default-bg-color--light: hsla(var(--md-hue), 15%, 21%, 0.54); - --md-default-bg-color--lighter: hsla(var(--md-hue), 15%, 21%, 0.26); - --md-default-bg-color--lightest: hsla(var(--md-hue), 15%, 21%, 0.07); - - /* // Code color shades */ - --md-code-fg-color: hsla(var(--md-hue), 18%, 86%, 1); - --md-code-bg-color: hsla(var(--md-hue), 15%, 15%, 1); - - /* // Code highlighting color shades */ - --md-code-hl-color: hsla(#{hex2hsl($clr-blue-a200)}, 0.15); - --md-code-hl-number-color: hsla(6, 74%, 63%, 1); - --md-code-hl-special-color: hsla(340, 83%, 66%, 1); - --md-code-hl-function-color: hsla(291, 57%, 65%, 1); - --md-code-hl-constant-color: hsla(250, 62%, 70%, 1); - --md-code-hl-keyword-color: hsla(219, 66%, 64%, 1); - --md-code-hl-string-color: hsla(150, 58%, 44%, 1); - - /* // Typeset color shades */ - --md-typeset-a-color: var(--md-primary-fg-color--light); - - /* // Typeset `mark` color shades */ - --md-typeset-mark-color: hsla(#{hex2hsl($clr-blue-a200)}, 0.3); - - /* // Typeset `kbd` color shades */ - --md-typeset-kbd-color: hsla(var(--md-hue), 15%, 94%, 0.12); - --md-typeset-kbd-accent-color: hsla(var(--md-hue), 15%, 94%, 0.2); - --md-typeset-kbd-border-color: hsla(var(--md-hue), 15%, 14%, 1); - - /* // Admonition color shades */ - --md-admonition-bg-color: hsla(var(--md-hue), 0%, 100%, 0.025); - - /* // Footer color shades */ - --md-footer-bg-color: hsla(var(--md-hue), 15%, 12%, 0.87); - --md-footer-bg-color--dark: hsla(var(--md-hue), 15%, 10%, 1); -} - .md-header-nav__button.md-logo img, .md-header-nav__button.md-logo svg { width: unset; diff --git a/docs/assets/js/theme.js b/docs/assets/js/theme.js deleted file mode 100644 index 6bcf64b..0000000 --- a/docs/assets/js/theme.js +++ /dev/null @@ -1,32 +0,0 @@ -var buttons = document.querySelectorAll("button[data-md-color-scheme]"); - -toggleThemeButton = function () { - var attr = this.getAttribute("data-md-color-scheme"); - document.body.setAttribute("data-md-color-scheme", attr); - - buttons.forEach(function (button) { - var state = button.getAttribute("data-md-state"); - switch (state) { - case "hidden": - button.setAttribute("data-md-state", "visible"); - button.style.visibility = "visible"; - button.style.display = "block"; - break; - - case "visible": - button.setAttribute("data-md-state", "hidden"); - button.style.visibility = "hidden"; - button.style.display = "none"; - break; - } - }); -}; - -buttons.forEach(function (button) { - button.addEventListener("click", toggleThemeButton); - button.style.visibility = button.getAttribute("data-md-state"); - if (button.getAttribute("data-md-state") === "hidden") { - var attr = button.getAttribute("data-md-color-scheme"); - document.body.setAttribute("data-md-color-scheme", attr); - } -}); diff --git a/docs/features.md b/docs/features.md index 6c7329f..019301c 100644 --- a/docs/features.md +++ b/docs/features.md @@ -1 +1,24 @@ -## Coming soon ... \ No newline at end of file +--- +hide: + - navigation +--- + +# jsf Features + +**jsf** gives you the following: + +## Based on open standards + +- Provides out of the box data generation from any [JSON schema](https://json-schema.org/) 📦 +- In memory conversion from [JSON Schema](https://json-schema.org/) to [Pydantic](https://docs.pydantic.dev/latest/) Models with generated examples 🤯 +- Inbuilt validation of fake JSON produced against the [JSON schema](https://json-schema.org/) ✅ + +## Ability to extend the standard to maximize realness of the fake data + +- Extendable custom data providers using any lambda functions 🔗 +- Multi level state for dependant data (eg multiple objects sharing value, such as children with same surname) 🤓 + +## Plug and play + +- Seamless integration with [FastAPI](https://fastapi.tiangolo.com/), check out the [demo code](https://github.com/ghandic/jsf/tree/main/examples/fastapi) 🚀 +- Standardize on JSON schema and output to any file format, check out the [demo code](https://github.com/ghandic/jsf/tree/main/examples/flatfile) 📦 diff --git a/docs/contributing.md b/docs/help/contributing.md similarity index 77% rename from docs/contributing.md rename to docs/help/contributing.md index 307c5b7..ae2218e 100644 --- a/docs/contributing.md +++ b/docs/help/contributing.md @@ -7,11 +7,14 @@ Every little bit helps, and credit will always be given. Nothing easier! -Fork and clone the repository, then: +Fork and clone the repository, then install [`pants`](https://www.pantsbuild.org/2.18/docs/getting-started/installing-pants) ```bash -docker build . -t challisa/jsf -docker run -it challisa/jsf bash +# Install `pants` on macos +brew install pantsbuild/tap/pants + +# Export the virtual environment for IDE +pants export --py-resolve-format=symlinked_immutable_virtualenv --resolve=python-default ``` That's it! @@ -27,7 +30,7 @@ As usual: **Before committing:** -1. Ensure to run `isort -rc .` followed by `black . --line-length=120` from the root directory +1. Ensure to run `pants fmt ::` from the root directory to format all of the code in the repo before PR submission. 2. Follow our [commit message convention](#commit-message-convention) If you are unsure about how to fix or ignore a warning, diff --git a/docs/help-us.md b/docs/help/get-help.md similarity index 100% rename from docs/help-us.md rename to docs/help/get-help.md diff --git a/docs/help/index.md b/docs/help/index.md new file mode 100644 index 0000000..9c11ea4 --- /dev/null +++ b/docs/help/index.md @@ -0,0 +1 @@ +Help and get help, contribute, get involved. 🤝 diff --git a/docs/index.md b/docs/index.md index cc7fe1c..03b63e8 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,15 +1,22 @@ +--- +hide: + - navigation +--- + +# Getting Started + ## Installation + ```bash -pip install jsf +$ pip install jsf +---> 100% +Installed ``` ## Usage -### As a program - -* pip install jsf -* In your code where you need to you will be using jsf you can refer to below script as reference: +### From your Python program ```python from jsf import JSF @@ -18,9 +25,20 @@ faker = JSF.from_json("demo-schema.json") fake_json = faker.generate() ``` -### From the commandline +### From the command line -#### Raw install +#### System installation + +First, you'll need to install `jsf[cli]` as it has the additional dependencies for the command line tools. + + +```bash +$ pip install jsf[cli] +---> 100% +Installed +``` + +Now the cli is installed, all you will need to do is supply the JSON schema and the file path you wish to save the output to. ```bash jsf --schema jsf/tests/data/custom.json --instance wow.json @@ -28,6 +46,8 @@ jsf --schema jsf/tests/data/custom.json --instance wow.json #### Docker +For convenience, you can also make use of the Docker image that is provided so there is no need to rely on package management. + ```bash docker build . -t challisa/jsf docker run -v $PWD:/data challisa/jsf jsf --schema /data/jsf/tests/data/custom.json --instance /data/wow.json diff --git a/docs/overrides/partials/header.html b/docs/overrides/partials/header.html deleted file mode 100644 index 3e98feb..0000000 --- a/docs/overrides/partials/header.html +++ /dev/null @@ -1,57 +0,0 @@ -
- -
diff --git a/docs/overrides/partials/toc.html b/docs/overrides/partials/toc.html deleted file mode 100644 index 428c82a..0000000 --- a/docs/overrides/partials/toc.html +++ /dev/null @@ -1,45 +0,0 @@ - - -{% import "partials/language.html" as lang with context %} {% if not page.meta.hide_toc %} - - -{% endif %} diff --git a/docs/release-notes.md b/docs/release-notes.md index c1f13e8..b7c298a 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -1,12 +1,8 @@ -# Changelog +--- +hide: + - navigation +--- -All notable changes to this project will be documented in this file. +# Release Notes -The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) -and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). - -## [v0.1.0](https://github.com/ghandic/jsf/releases/tag/v0.1.0) - - -Initial commit of code, includes: - -* ... +## Latest Changes diff --git a/docs/requirements.txt b/docs/requirements.txt index 968c124..5da9306 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,4 +1,9 @@ -mkdocstrings==0.13.1 -mkdocs-material==5.5.12 -mkdocs==1.1.2 -jinja2==3.0.3 +mkdocstrings[python]==0.23.0 +mkdocs-material==9.4.7 +# For Material for MkDocs, Chinese search +jieba==0.42.1 +# For image processing by Material for MkDocs +pillow==10.1.0 +# For image processing by Material for MkDocs +cairosvg==2.7.0 +termynal==0.11.1 \ No newline at end of file diff --git a/docs/user-guide/intro.md b/docs/user-guide/advanced.md similarity index 100% rename from docs/user-guide/intro.md rename to docs/user-guide/advanced.md diff --git a/examples/fastapi/BUILD b/examples/fastapi/BUILD index db46e8d..8f515a7 100644 --- a/examples/fastapi/BUILD +++ b/examples/fastapi/BUILD @@ -1 +1,5 @@ python_sources() + +python_requirements( + name="reqs", +) diff --git a/examples/flatfile/BUILD b/examples/flatfile/BUILD new file mode 100644 index 0000000..a5191a7 --- /dev/null +++ b/examples/flatfile/BUILD @@ -0,0 +1,5 @@ +python_sources(interpreter_constraints=["CPython>=3.10,<4"]) + +python_requirements( + name="reqs", +) diff --git a/examples/flatfile/README.md b/examples/flatfile/README.md new file mode 100644 index 0000000..9660f1d --- /dev/null +++ b/examples/flatfile/README.md @@ -0,0 +1,17 @@ +# Flat file example + +## Dependencies + +* Typer +* pandas +* openpyxl +* PyArrow +* jsonlines + +## Usage + +Using `main.py` in current example folder + +```bash +python main.py --schema schema.json --records 5 --output-format parquet --output output.parquet +``` diff --git a/examples/flatfile/main.py b/examples/flatfile/main.py new file mode 100644 index 0000000..7c9e056 --- /dev/null +++ b/examples/flatfile/main.py @@ -0,0 +1,68 @@ +import json +from enum import Enum +from pathlib import Path + +import jsonlines +import pandas as pd +import typer +from typing_extensions import Annotated + +from jsf import JSF + + +class OutputFormat(str, Enum): + csv = "csv" + excel = "excel" + parquet = "parquet" + json = "json" + jsonl = "jsonl" + + +def main( + schema: Annotated[ + Path, + typer.Option( + exists=True, + file_okay=True, + dir_okay=False, + writable=False, + readable=True, + resolve_path=True, + help="Path to the JSON schema used to produce the fake data.", + ), + ], + records: Annotated[int, typer.Option(min=0, help="Number of records you wish to produce.")], + output_format: Annotated[OutputFormat, typer.Option(help="Fake data output format.")], + output: Annotated[Path, typer.Option(help="Output file path")], +): + faker = JSF.from_json(schema) + fake_data = faker.generate(records) + match output_format: + case OutputFormat.csv: + pd.DataFrame.from_records(fake_data).to_csv(output, index=False) + case OutputFormat.excel: + more_fake_data = faker.generate(records) + custom_header = [ + v.get("title") or k for k, v in faker.root_schema["properties"].items() + ] + with pd.ExcelWriter(output) as excel_writer: + pd.DataFrame.from_records(fake_data).to_excel( + excel_writer, sheet_name="Fake Data", index=False, header=custom_header + ) + pd.DataFrame.from_records(more_fake_data).to_excel( + excel_writer, sheet_name="More Fake Data", index=False, header=custom_header + ) + case OutputFormat.json: + with open(output, "w") as f: + json.dump(fake_data, f) + case OutputFormat.jsonl: + with jsonlines.open(output, mode="w") as writer: + writer.write_all(fake_data) + case OutputFormat.parquet: + pd.DataFrame.from_records(fake_data).to_parquet(output, index=False) + case _: + raise NotImplementedError("Unable to produce in this file format yet") + + +if __name__ == "__main__": + typer.run(main) diff --git a/examples/flatfile/output.csv b/examples/flatfile/output.csv new file mode 100644 index 0000000..730f90c --- /dev/null +++ b/examples/flatfile/output.csv @@ -0,0 +1,6 @@ +name,email +Jessica Bennett,eric90@example.org +Christine Sanchez,epeterson@example.net +Emily Ayala,wreed@example.org +Julia Dickerson,dwaynehoward@example.com +Justin Miller,emiller@example.com diff --git a/examples/flatfile/output.json b/examples/flatfile/output.json new file mode 100644 index 0000000..4632c55 --- /dev/null +++ b/examples/flatfile/output.json @@ -0,0 +1 @@ +[{"name": "Melissa Jackson", "email": "reneebullock@example.net"}, {"name": "Miss Tina Morales", "email": "alexandergeorge@example.net"}, {"name": "Jake Vazquez", "email": "jeffreyreeves@example.com"}, {"name": "Terri Taylor", "email": "nperez@example.net"}, {"name": "Kayla Williams", "email": "davidprice@example.org"}] \ No newline at end of file diff --git a/examples/flatfile/output.jsonl b/examples/flatfile/output.jsonl new file mode 100644 index 0000000..2adc0e9 --- /dev/null +++ b/examples/flatfile/output.jsonl @@ -0,0 +1,5 @@ +{"name": "Judith Lara", "email": "rhowe@example.com"} +{"name": "Joseph Warren", "email": "carrollandrew@example.net"} +{"name": "Marilyn Thompson", "email": "tyler22@example.net"} +{"name": "Teresa Brown", "email": "tharris@example.net"} +{"name": "Derek Singleton", "email": "lindsay66@example.org"} diff --git a/examples/flatfile/output.parquet b/examples/flatfile/output.parquet new file mode 100644 index 0000000..86d2488 Binary files /dev/null and b/examples/flatfile/output.parquet differ diff --git a/examples/flatfile/output.xlsx b/examples/flatfile/output.xlsx new file mode 100644 index 0000000..666ca20 Binary files /dev/null and b/examples/flatfile/output.xlsx differ diff --git a/examples/flatfile/requirements.txt b/examples/flatfile/requirements.txt new file mode 100644 index 0000000..a3c1d84 --- /dev/null +++ b/examples/flatfile/requirements.txt @@ -0,0 +1,5 @@ +jsf +pandas +openpyxl +PyArrow +jsonlines \ No newline at end of file diff --git a/examples/flatfile/schema.json b/examples/flatfile/schema.json new file mode 100644 index 0000000..657d69c --- /dev/null +++ b/examples/flatfile/schema.json @@ -0,0 +1,8 @@ +{ + "type": "object", + "properties": { + "name": {"type": "string", "$provider": "faker.name", "title": "Full Name"}, + "email": {"type": "string", "$provider": "faker.email", "title": "Email"} + }, + "required": ["name", "email"] +} \ No newline at end of file diff --git a/jsf/3rdparty/python/BUILD b/jsf/3rdparty/python/BUILD new file mode 100644 index 0000000..3a87868 --- /dev/null +++ b/jsf/3rdparty/python/BUILD @@ -0,0 +1,13 @@ +python_requirements(name="reqs") + +python_requirements( + name="pytest", + source="pytest-requirements.txt", + resolve="pytest", +) + +python_requirements( + name="mypy", + source="mypy-requirements.txt", + resolve="mypy", +) \ No newline at end of file diff --git a/jsf/3rdparty/python/mypy-requirements.txt b/jsf/3rdparty/python/mypy-requirements.txt new file mode 100644 index 0000000..b5453ae --- /dev/null +++ b/jsf/3rdparty/python/mypy-requirements.txt @@ -0,0 +1,4 @@ +mypy==1.1.1 +mypy-typing-asserts +types-requests +types-jsonschema \ No newline at end of file diff --git a/jsf/3rdparty/python/mypy.lock b/jsf/3rdparty/python/mypy.lock new file mode 100644 index 0000000..6b946db --- /dev/null +++ b/jsf/3rdparty/python/mypy.lock @@ -0,0 +1,815 @@ +// This lockfile was autogenerated by Pants. To regenerate, run: +// +// pants generate-lockfiles --resolve=mypy +// +// --- BEGIN PANTS LOCKFILE METADATA: DO NOT EDIT OR REMOVE --- +// { +// "version": 3, +// "valid_for_interpreter_constraints": [ +// "CPython<4,>=3.8" +// ], +// "generated_with_requirements": [ +// "mypy-typing-asserts", +// "mypy==1.1.1", +// "types-jsonschema", +// "types-requests" +// ], +// "manylinux": "manylinux2014", +// "requirement_constraints": [], +// "only_binary": [], +// "no_binary": [] +// } +// --- END PANTS LOCKFILE METADATA --- + +{ + "allow_builds": true, + "allow_prereleases": false, + "allow_wheels": true, + "build_isolation": true, + "constraints": [], + "locked_resolves": [ + { + "locked_requirements": [ + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1", + "url": "https://files.pythonhosted.org/packages/e0/44/827b2a91a5816512fcaf3cc4ebc465ccd5d598c45cefa6703fcf4a79018f/attrs-23.2.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", + "url": "https://files.pythonhosted.org/packages/e3/fc/f800d51204003fa8ae392c4e8278f256206e7a919b708eef054f5f4b650d/attrs-23.2.0.tar.gz" + } + ], + "project_name": "attrs", + "requires_dists": [ + "attrs[tests-mypy]; extra == \"tests-no-zope\"", + "attrs[tests-no-zope]; extra == \"tests\"", + "attrs[tests]; extra == \"cov\"", + "attrs[tests]; extra == \"dev\"", + "cloudpickle; platform_python_implementation == \"CPython\" and extra == \"tests-no-zope\"", + "coverage[toml]>=5.3; extra == \"cov\"", + "furo; extra == \"docs\"", + "hypothesis; extra == \"tests-no-zope\"", + "importlib-metadata; python_version < \"3.8\"", + "mypy>=1.6; (platform_python_implementation == \"CPython\" and python_version >= \"3.8\") and extra == \"tests-mypy\"", + "myst-parser; extra == \"docs\"", + "pre-commit; extra == \"dev\"", + "pympler; extra == \"tests-no-zope\"", + "pytest-mypy-plugins; (platform_python_implementation == \"CPython\" and python_version >= \"3.8\") and extra == \"tests-mypy\"", + "pytest-xdist[psutil]; extra == \"tests-no-zope\"", + "pytest>=4.3.0; extra == \"tests-no-zope\"", + "sphinx-notfound-page; extra == \"docs\"", + "sphinx; extra == \"docs\"", + "sphinxcontrib-towncrier; extra == \"docs\"", + "towncrier; extra == \"docs\"", + "zope-interface; extra == \"docs\"", + "zope-interface; extra == \"tests\"" + ], + "requires_python": ">=3.7", + "version": "23.2.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "4e4e8b362cdf99ba00c2b218036002bdcdf1e0de085cdb296a49df03fb31dfc4", + "url": "https://files.pythonhosted.org/packages/a4/0b/3a30f50287e42a4230320fa2eac25eb3017d38a7c31f083d407ab627607c/mypy-1.1.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "ce61663faf7a8e5ec6f456857bfbcec2901fbdb3ad958b778403f63b9e606a1b", + "url": "https://files.pythonhosted.org/packages/2a/28/8485aad67750b3374443d28bad3eed947737cf425a640ea4be4ac70a7827/mypy-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "9401e33814cec6aec8c03a9548e9385e0e228fc1b8b0a37b9ea21038e64cdd8a", + "url": "https://files.pythonhosted.org/packages/30/da/808ceaf2bcf23a9e90156c7b11b41add8dd5a009ee48159ec820d04d97bd/mypy-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "39c7119335be05630611ee798cc982623b9e8f0cff04a0b48dfc26100e0b97af", + "url": "https://files.pythonhosted.org/packages/44/9d/d23fa5d12bacbe7beea5fb6315b3325beabbe438e7e14d38c82b71609818/mypy-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "59bbd71e5c58eed2e992ce6523180e03c221dcd92b52f0e792f291d67b15a71c", + "url": "https://files.pythonhosted.org/packages/47/9f/34f6a2254f7d39b8c4349b8ac480c233d37c377faf2c67c6ef925b3af0ab/mypy-1.1.1-cp39-cp39-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "dbb19c9f662e41e474e0cff502b7064a7edc6764f5262b6cd91d698163196799", + "url": "https://files.pythonhosted.org/packages/61/99/4a844dcacbc4990a8312236bf74a55910ee9a05db69dee7d6fb7a7ffe6c2/mypy-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "ae9ceae0f5b9059f33dbc62dea087e942c0ccab4b7a003719cb70f9b8abfa32f", + "url": "https://files.pythonhosted.org/packages/62/54/be80f8d01f5cf72f774a77f9f750527a6fa733f09f78b1da30e8fa3914e6/mypy-1.1.1.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "d809f88734f44a0d44959d795b1e6f64b2bbe0ea4d9cc4776aa588bb4229fc1c", + "url": "https://files.pythonhosted.org/packages/64/63/6a04ca7a8b7f34811cada43ed6119736a7f4a07c5e1cbd8eec0e0f4962d5/mypy-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "61bf08362e93b6b12fad3eab68c4ea903a077b87c90ac06c11e3d7a09b56b9c1", + "url": "https://files.pythonhosted.org/packages/8a/fd/b610256224e01da4c4f315d11f62d39d815e97439a58d49d60aa4f55a60b/mypy-1.1.1-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "d64c28e03ce40d5303450f547e07418c64c241669ab20610f273c9e6290b4b0b", + "url": "https://files.pythonhosted.org/packages/b8/06/3d72d1b316ceec347874c4285fad8bf17e3fb21bb7848c1a942df239e44a/mypy-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "19ba15f9627a5723e522d007fe708007bae52b93faab00f95d72f03e1afa9598", + "url": "https://files.pythonhosted.org/packages/b8/72/385f3aeaaf262325454ac7f569eb81ac623464871df23d9778c864d04c6c/mypy-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "5b5f81b40d94c785f288948c16e1f2da37203c6006546c5d947aab6f90aefef2", + "url": "https://files.pythonhosted.org/packages/b9/e5/71eef5239219ee2f4d85e2ca6368d736705a3b874023b57f7237b977839c/mypy-1.1.1-cp311-cp311-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "4b398d8b1f4fba0e3c6463e02f8ad3346f71956b92287af22c9b12c3ec965a9f", + "url": "https://files.pythonhosted.org/packages/be/d5/5588a2ee0d77189626a57b555b6b006dda6d5b0083f16c6be0c2d761cd7b/mypy-1.1.1-cp39-cp39-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "21b437be1c02712a605591e1ed1d858aba681757a1e55fe678a15c2244cd68a5", + "url": "https://files.pythonhosted.org/packages/bf/2d/45a526f248719ee32ecf1261564247a2e717a9c6167de5eb67d53599c4df/mypy-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "315ac73cc1cce4771c27d426b7ea558fb4e2836f89cb0296cbe056894e3a1f78", + "url": "https://files.pythonhosted.org/packages/c0/d6/17ba6f8749722b8f61c6ab680769658f0bc63c293556149e2bf400b1f1a2/mypy-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "26cdd6a22b9b40b2fd71881a8a4f34b4d7914c679f154f43385ca878a8297389", + "url": "https://files.pythonhosted.org/packages/d9/ab/d6d3884c3f432898458e2ade712988a7d1da562c1a363f2003b31677acd8/mypy-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "64cc3afb3e9e71a79d06e3ed24bb508a6d66f782aff7e56f628bf35ba2e0ba51", + "url": "https://files.pythonhosted.org/packages/e1/a6/331cff5f7476904a2ebe6ed7cee2310b6be583ff6d45609ea0e0d67fd39d/mypy-1.1.1-cp38-cp38-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "2b0c373d071593deefbcdd87ec8db91ea13bd8f1328d44947e88beae21e8d5e9", + "url": "https://files.pythonhosted.org/packages/f6/57/93e676773f91141127329a56e2238eac506a78f6fb0ae0650a53fcc1355d/mypy-1.1.1-cp38-cp38-musllinux_1_1_x86_64.whl" + } + ], + "project_name": "mypy", + "requires_dists": [ + "lxml; extra == \"reports\"", + "mypy-extensions>=1.0.0", + "pip; extra == \"install-types\"", + "psutil>=4.0; extra == \"dmypy\"", + "tomli>=1.1.0; python_version < \"3.11\"", + "typed-ast<2,>=1.4.0; extra == \"python2\"", + "typed-ast<2,>=1.4.0; python_version < \"3.8\"", + "typing-extensions>=3.10" + ], + "requires_python": ">=3.7", + "version": "1.1.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", + "url": "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", + "url": "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz" + } + ], + "project_name": "mypy-extensions", + "requires_dists": [], + "requires_python": ">=3.5", + "version": "1.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "917da6d572f187f72d6dfb4b1108c50a3d8edd8e5ccd1a0f0c576fe0a4819cda", + "url": "https://files.pythonhosted.org/packages/e0/0e/f6f705299002e014d73036ab2f6cac4063203af28e9adcdcf60c03a7219f/mypy_typing_asserts-0.1.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "a93087a4242b660ae567463f93cab2673304bd0820172268f488248bf3b0fa40", + "url": "https://files.pythonhosted.org/packages/a9/22/09ad7d73a546eee818b671f990d3d63ff18cc17b3c343dca9d4963eb228f/mypy_typing_asserts-0.1.1.tar.gz" + } + ], + "project_name": "mypy-typing-asserts", + "requires_dists": [], + "requires_python": "<4.0,>=3.7", + "version": "0.1.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "39240f2ecc770258f28b642dd47fd74bc8b02484de54e1882b74b35ebd779bd5", + "url": "https://files.pythonhosted.org/packages/90/10/1c92edb0a0a14b67ff825bc338e74bc49ab27d3f3bae3f9a02838cba546f/referencing-0.33.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "c775fedf74bc0f9189c2a3be1c12fd03e8c23f4d371dce795df44e06c5b412f7", + "url": "https://files.pythonhosted.org/packages/21/c5/b99dd501aa72b30a5a87d488d7aa76ec05bdf0e2c7439bc82deb9448dd9a/referencing-0.33.0.tar.gz" + } + ], + "project_name": "referencing", + "requires_dists": [ + "attrs>=22.2.0", + "rpds-py>=0.7.0" + ], + "requires_python": ">=3.8", + "version": "0.33.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "0387ce69ba06e43df54e43968090f3626e231e4bc9150e4c3246947567695f68", + "url": "https://files.pythonhosted.org/packages/cc/ba/57aaaed3eca5364b62f589226a951385a262e1ca43b2001230e651140b82/rpds_py-0.17.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "1a746a6d49665058a5896000e8d9d2f1a6acba8a03b389c1e4c06e11e0b7f40d", + "url": "https://files.pythonhosted.org/packages/00/3d/c9f14bd0fe218cab78bd9492a98452b976fdd81d3455cac712fd5391de66/rpds_py-0.17.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "4341bd7579611cf50e7b20bb8c2e23512a3dc79de987a1f411cb458ab670eb90", + "url": "https://files.pythonhosted.org/packages/01/22/97251b0cad75f095515bc5a4b29d90d3d832db8e1f52b2d152a4acfa4ff9/rpds_py-0.17.1-cp38-cp38-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "1db228102ab9d1ff4c64148c96320d0be7044fa28bd865a9ce628ce98da5973d", + "url": "https://files.pythonhosted.org/packages/03/56/40fcb8fd0b47a6d18c89c7a703f4dc5f9d7a4010f3ce89c0898c8b5b7ce3/rpds_py-0.17.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "dbc56680ecf585a384fbd93cd42bc82668b77cb525343170a2d86dafaed2a84b", + "url": "https://files.pythonhosted.org/packages/04/72/60da2fe91ba80df82f9d915853caf85ba752969386d4a9f940222785ba38/rpds_py-0.17.1-cp39-cp39-musllinux_1_2_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "93432e747fb07fa567ad9cc7aaadd6e29710e515aabf939dfbed8046041346c6", + "url": "https://files.pythonhosted.org/packages/05/65/cb09320f4370558fd4def77c7b2ef4598f33f8c5a25f8c398433d380b327/rpds_py-0.17.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "81038ff87a4e04c22e1d81f947c6ac46f122e0c80460b9006e6517c4d842a6ec", + "url": "https://files.pythonhosted.org/packages/05/70/5359707d52036b6a505bcad4715cc4b4b6cec993bb60b5fbf58a5e4caf52/rpds_py-0.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "1d36b2b59e8cc6e576f8f7b671e32f2ff43153f0ad6d0201250a7c07f25d570e", + "url": "https://files.pythonhosted.org/packages/07/98/a41783e68a2ac040e073b0b461e0a2a11957cc4c81f00e870ba65b5fa61c/rpds_py-0.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "be22ae34d68544df293152b7e50895ba70d2a833ad9566932d750d3625918b82", + "url": "https://files.pythonhosted.org/packages/11/b4/87b4dbde5b736fbb183723995b659550fe1f01312d3efd11bed700c21442/rpds_py-0.17.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "1701fc54460ae2e5efc1dd6350eafd7a760f516df8dbe51d4a1c79d69472fbd4", + "url": "https://files.pythonhosted.org/packages/18/d9/2e2d2f8940e2c083d0824c1ef02bffa4153b90f642915af975b59c06570a/rpds_py-0.17.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "99f567dae93e10be2daaa896e07513dd4bf9c2ecf0576e0533ac36ba3b1d5394", + "url": "https://files.pythonhosted.org/packages/19/31/dfebe878e523467815cdb90dcd7a336ad82d89b95f270120f7c86b109359/rpds_py-0.17.1-cp310-cp310-musllinux_1_2_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "5e7d63ec01fe7c76c2dbb7e972fece45acbb8836e72682bde138e7e039906e2c", + "url": "https://files.pythonhosted.org/packages/19/91/f9c5b190dfb6b15748be3daac8e6aaf79238a2ef5f024e419ce14a706783/rpds_py-0.17.1-cp39-cp39-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "25f071737dae674ca8937a73d0f43f5a52e92c2d178330b4c0bb6ab05586ffa6", + "url": "https://files.pythonhosted.org/packages/1d/e6/65960425f06551e691c63008bc347131dd26faa49cce835eb02747961b67/rpds_py-0.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "8587fd64c2a91c33cdc39d0cebdaf30e79491cc029a37fcd458ba863f8815383", + "url": "https://files.pythonhosted.org/packages/23/7d/eb1ef72452698bac1922d7cd45684462c8878bc62430433c55f4e56e9a94/rpds_py-0.17.1-cp311-cp311-musllinux_1_2_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "24e4900a6643f87058a27320f81336d527ccfe503984528edde4bb660c8c8d59", + "url": "https://files.pythonhosted.org/packages/26/15/23c842b858e55e6c6a90584aaedeaa0babb51be43374a071c5b2a02a1364/rpds_py-0.17.1-cp310-cp310-musllinux_1_2_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "b9412abdf0ba70faa6e2ee6c0cc62a8defb772e78860cef419865917d86c7342", + "url": "https://files.pythonhosted.org/packages/28/31/18a86a7d6541a9ac56d8894355e89fb7c4f9d335e70f53886849e38879a7/rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "fad059a4bd14c45776600d223ec194e77db6c20255578bb5bcdd7c18fd169361", + "url": "https://files.pythonhosted.org/packages/34/70/70c6e645b018e8eeda96729a55207796c3d35a2cd96ccdf80537c7ae5ec1/rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "071bc28c589b86bc6351a339114fb7a029f5cddbaca34103aa573eba7b482382", + "url": "https://files.pythonhosted.org/packages/35/6a/7fc90ac9839d3ca8fd9a70e03aedaf801c47066c821a4858ef872c61f693/rpds_py-0.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "9737bdaa0ad33d34c0efc718741abaafce62fadae72c8b251df9b0c823c63b22", + "url": "https://files.pythonhosted.org/packages/3a/f5/b8b0e144d72cf3a8cae1a78a7531e9f65335a07bf05ac540c4d687ad5769/rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "01f58a7306b64e0a4fe042047dd2b7d411ee82e54240284bab63e325762c1147", + "url": "https://files.pythonhosted.org/packages/3d/87/739721933efd9c30f11afdada39e3c7369e12a150fe24b91bdebbed40bb2/rpds_py-0.17.1-cp311-cp311-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "d65e6b4f1443048eb7e833c2accb4fa7ee67cc7d54f31b4f0555b474758bee55", + "url": "https://files.pythonhosted.org/packages/44/ad/a6239f13ea36818dc8b35366bfb34daf1f81e7873a732aa8e105861ba3b6/rpds_py-0.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "10162fe3f5f47c37ebf6d8ff5a2368508fe22007e3077bf25b9c7d803454d921", + "url": "https://files.pythonhosted.org/packages/48/e9/55408800f3e894a2b7146b8b677bfa0e2592bd9321e1b198f310d94a176b/rpds_py-0.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "b686f25377f9c006acbac63f61614416a6317133ab7fafe5de5f7dc8a06d42eb", + "url": "https://files.pythonhosted.org/packages/49/7e/acb4fdab48d02d10e3f9e15d6aef5e828cd8b1c87a982eebc7780855caac/rpds_py-0.17.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl" + }, + { + "algorithm": "sha256", + "hash": "02866e060219514940342a1f84303a1ef7a1dad0ac311792fbbe19b521b489d2", + "url": "https://files.pythonhosted.org/packages/4b/5d/200e08402ccfd0bbdae89385fc606f496ae9d78a7ce65dbf8d542587f00e/rpds_py-0.17.1-cp312-cp312-musllinux_1_2_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "4128980a14ed805e1b91a7ed551250282a8ddf8201a4e9f8f5b7e6225f54170d", + "url": "https://files.pythonhosted.org/packages/4b/c4/20eb92aaf7ba5e22076c2f7bc9f7fea23766c025b584f1bd9ec1f9a40b5a/rpds_py-0.17.1-cp310-cp310-macosx_10_12_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "149c5cd24f729e3567b56e1795f74577aa3126c14c11e457bec1b1c90d212e38", + "url": "https://files.pythonhosted.org/packages/4e/47/2eb405f92c22050127faf0eddcde1d77e60f13aab2232de3807243555483/rpds_py-0.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "2528ff96d09f12e638695f3a2e0c609c7b84c6df7c5ae9bfeb9252b6fa686253", + "url": "https://files.pythonhosted.org/packages/4e/7e/f2874d5544f63943551560cdae6beb721d69e037e1031502d6b165b49957/rpds_py-0.17.1-cp312-cp312-musllinux_1_2_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "9584f8f52010295a4a417221861df9bea4c72d9632562b6e59b3c7b87a1522b7", + "url": "https://files.pythonhosted.org/packages/4e/ea/bd34895a0414e122f13aa728eb303e89f3e7a21819244970bde342601a8e/rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "698ea95a60c8b16b58be9d854c9f993c639f5c214cf9ba782eca53a8789d6b19", + "url": "https://files.pythonhosted.org/packages/4f/4b/4abf2aab6622f99bc40e61c63cb5479221f9aa0910c5b8a69d94d26960c3/rpds_py-0.17.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "3664d126d3388a887db44c2e293f87d500c4184ec43d5d14d2d2babdb4c64cad", + "url": "https://files.pythonhosted.org/packages/57/0c/282f542441f77d5576bbbb6fb9157c384540ae0137a78584abd0ff52922a/rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "60e820ee1004327609b28db8307acc27f5f2e9a0b185b2064c5f23e815f248f8", + "url": "https://files.pythonhosted.org/packages/59/cf/63db812a31e09f37c9ff9704c13f599d5f4ffd0611e05621e5aecd142176/rpds_py-0.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "1957a2ab607f9added64478a6982742eb29f109d89d065fa44e01691a20fc20a", + "url": "https://files.pythonhosted.org/packages/5d/dd/319673ee3a4bb9d2d457f97f7ef7935aaf03f26809a221acd8b905ea55d6/rpds_py-0.17.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "70fcc6c2906cfa5c6a552ba7ae2ce64b6c32f437d8f3f8eea49925b278a61453", + "url": "https://files.pythonhosted.org/packages/65/35/8c8d782fc0a6ffd399082218a8a95c778bc54caddd6a4798e4aac853c165/rpds_py-0.17.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "b760a56e080a826c2e5af09002c1a037382ed21d03134eb6294812dda268c811", + "url": "https://files.pythonhosted.org/packages/6a/43/8310f9ee3ed0b797f5c03b42a50c3602d1ff3c8b66932d74ca20e6918add/rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "516fb8c77805159e97a689e2f1c80655c7658f5af601c34ffdb916605598cda2", + "url": "https://files.pythonhosted.org/packages/6d/70/770443ab1cf2161fc5b2902fa599f2a6bda870c4f9631322f5e7180b2800/rpds_py-0.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "f0b8bf5b8db49d8fd40f54772a1dcf262e8be0ad2ab0206b5a2ec109c176c0a4", + "url": "https://files.pythonhosted.org/packages/6e/59/9a69b44699f9c04008ba785e1207d42a5a8ba54f8b1537ab50b41be7cf6f/rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "efa767c220d94aa4ac3a6dd3aeb986e9f229eaf5bce92d8b1b3018d06bed3772", + "url": "https://files.pythonhosted.org/packages/70/40/ed790a153853be7e38164dc8226fbb75e27bb1df49ff393aa457f862cebf/rpds_py-0.17.1-cp39-cp39-musllinux_1_2_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "ff1dcb8e8bc2261a088821b2595ef031c91d499a0c1b031c152d43fe0a6ecec8", + "url": "https://files.pythonhosted.org/packages/73/58/c557424dbeac270b2855095725576e5e58f9917a86ff2fb1424222b17f85/rpds_py-0.17.1-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "060f412230d5f19fc8c8b75f315931b408d8ebf56aec33ef4168d1b9e54200b1", + "url": "https://files.pythonhosted.org/packages/75/e5/578843811ebea706e559b560791a862d8c7661980d264e9480c9853142ca/rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "aa5bfb13f1e89151ade0eb812f7b0d7a4d643406caaad65ce1cbabe0a66d695f", + "url": "https://files.pythonhosted.org/packages/7a/00/cabd74dbdc0136e3fb3ce184db3c82c70f22e24313dd3ca81eeca6249290/rpds_py-0.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "a967dd6afda7715d911c25a6ba1517975acd8d1092b2f326718725461a3d33f9", + "url": "https://files.pythonhosted.org/packages/7a/5a/626831fdfb80d925c652beb6e756dec6df2e92a4ee52bac59b94d2f9d7d4/rpds_py-0.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "a3264e3e858de4fc601741498215835ff324ff2482fd4e4af61b46512dd7fc83", + "url": "https://files.pythonhosted.org/packages/7a/9c/073a7f31c18625ff59cc59a2a25ce1f526c7151857492c450df423390c78/rpds_py-0.17.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "810685321f4a304b2b55577c915bece4c4a06dfe38f6e62d9cc1d6ca8ee86b99", + "url": "https://files.pythonhosted.org/packages/7f/38/4f16f61dbd9f44a9c5c75214fbcf5beaca296839ec37988009c0d5404fa9/rpds_py-0.17.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl" + }, + { + "algorithm": "sha256", + "hash": "7b7d9ca34542099b4e185b3c2a2b2eda2e318a7dbde0b0d83357a6d4421b5296", + "url": "https://files.pythonhosted.org/packages/7f/ca/d699d6218598cae408600f933856dd5b39459f1e95a9bcc6aa3cba421eab/rpds_py-0.17.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "3677fcca7fb728c86a78660c7fb1b07b69b281964673f486ae72860e13f512ad", + "url": "https://files.pythonhosted.org/packages/81/b0/74b33b84af9ee49ef4f11f6a2c7aa7713209604b4d7aae259ac153cc19a8/rpds_py-0.17.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl" + }, + { + "algorithm": "sha256", + "hash": "1f3c3461ebb4c4f1bbc70b15d20b565759f97a5aaf13af811fcefc892e9197ba", + "url": "https://files.pythonhosted.org/packages/82/2c/4868c0049d22cef3af9469bf7ac26a75681d24302c747fa893a7652068c5/rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "c64602e8be701c6cfe42064b71c84ce62ce66ddc6422c15463fd8127db3d8066", + "url": "https://files.pythonhosted.org/packages/84/8d/03cbd505e8e6741de8cd4b08a76b31454969dc2fc6029a547034a026de32/rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl" + }, + { + "algorithm": "sha256", + "hash": "b86b21b348f7e5485fae740d845c65a880f5d1eda1e063bc59bef92d1f7d0c55", + "url": "https://files.pythonhosted.org/packages/85/e2/4c30bc7407eb81e56937f4fe8cb70569a458fe7b9db23f5dc82a4678535e/rpds_py-0.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "5d0e8a6434a3fbf77d11448c9c25b2f25244226cfbec1a5159947cac5b8c5fa4", + "url": "https://files.pythonhosted.org/packages/89/11/9a7e60514ee1a579231756d0dce10f5bf016a91f02c2eed4f7c3e6098c82/rpds_py-0.17.1-cp39-cp39-musllinux_1_2_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "720215373a280f78a1814becb1312d4e4d1077b1202a56d2b0815e95ccb99ce9", + "url": "https://files.pythonhosted.org/packages/8c/f1/09bee4d70305e79ecad4f3ccee583f0185c06a5f58befdc3544cf8b18536/rpds_py-0.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "637b802f3f069a64436d432117a7e58fab414b4e27a7e81049817ae94de45d8d", + "url": "https://files.pythonhosted.org/packages/90/9c/90d239dd9c41a30c55147f9ba3adcf02f6a42d49dbbe6e45978fc71ea72a/rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "df3b6f45ba4515632c5064e35ca7f31d51d13d1479673185ba8f9fefbbed58b9", + "url": "https://files.pythonhosted.org/packages/91/de/ca7978f9e4deb9a9b19469a412857dbf9faa0b9a059167927e76713842ec/rpds_py-0.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "f2f3b28b40fddcb6c1f1f6c88c6f3769cd933fa493ceb79da45968a21dccc920", + "url": "https://files.pythonhosted.org/packages/92/72/381d513f8a7d7eba523924fec395bde36bad1caf5918ef76a9d1913b8958/rpds_py-0.17.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "ae35e8e6801c5ab071b992cb2da958eee76340e6926ec693b5ff7d6381441745", + "url": "https://files.pythonhosted.org/packages/93/75/5f18ed35fa2a4fb3a5ea9b82eff1fc6e94439f10125bfb85021aff2a4aaa/rpds_py-0.17.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl" + }, + { + "algorithm": "sha256", + "hash": "5a024fa96d541fd7edaa0e9d904601c6445e95a729a2900c5aec6555fe921ed6", + "url": "https://files.pythonhosted.org/packages/94/20/4b8e1a364deebbf8961739c54725842bd07a5a2d506571ff68801d27b78a/rpds_py-0.17.1-cp38-cp38-musllinux_1_2_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "f175e95a197f6a4059b50757a3dca33b32b61691bdbd22c29e8a8d21d3914cae", + "url": "https://files.pythonhosted.org/packages/97/f1/37d7d4ea8af857eeebd4ae7783cdaa661ea714f27a9b2f1054cc3452eda2/rpds_py-0.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "1e626b365293a2142a62b9a614e1f8e331b28f3ca57b9f05ebbf4cf2a0f0bdc5", + "url": "https://files.pythonhosted.org/packages/9c/32/7cad18b3caec48c38b5eee91f4344d27bfe3038fbf24e4a5068ac8255c2b/rpds_py-0.17.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "2953937f83820376b5979318840f3ee47477d94c17b940fe31d9458d79ae7eea", + "url": "https://files.pythonhosted.org/packages/9f/05/83adc3ad25a7009a4118a1e934a1e30405fe8213668b8e0dd096ebeafa4f/rpds_py-0.17.1-cp311-cp311-musllinux_1_2_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "9bdf1303df671179eaf2cb41e8515a07fc78d9d00f111eadbe3e14262f59c3d0", + "url": "https://files.pythonhosted.org/packages/9f/54/ce2f4d6d84c2df09120d04d527e902f1fc842c86d9fa4d140823820feba0/rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "a71169d505af63bb4d20d23a8fbd4c6ce272e7bce6cc31f617152aa784436f29", + "url": "https://files.pythonhosted.org/packages/a1/ce/6378632d508ca2ffab6d20d0179af80eb4919dc40887cd984f81ce74ac9a/rpds_py-0.17.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl" + }, + { + "algorithm": "sha256", + "hash": "65dcf105c1943cba45d19207ef51b8bc46d232a381e94dd38719d52d3980015b", + "url": "https://files.pythonhosted.org/packages/a3/42/bf5c6075cbcc22e782809b7149b1d1cb1aac3066126c25b3c70127cacc72/rpds_py-0.17.1-cp311-cp311-macosx_10_12_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "ffee088ea9b593cc6160518ba9bd319b5475e5f3e578e4552d63818773c6f56a", + "url": "https://files.pythonhosted.org/packages/a6/41/7322226884709e931dc25c4e9a4f6479cbccd7354146986ec040f4a2fe6a/rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "91e5a8200e65aaac342a791272c564dffcf1281abd635d304d6c4e6b495f29dc", + "url": "https://files.pythonhosted.org/packages/a9/02/dc7aee95a685c49506120142f4d790d78db31b8433d70af67bb985f29037/rpds_py-0.17.1-cp310-cp310-musllinux_1_2_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "5576ee2f3a309d2bb403ec292d5958ce03953b0e57a11d224c1f134feaf8c40f", + "url": "https://files.pythonhosted.org/packages/aa/8a/6a5f809d7425c96cc4787d361fd3c5e9e6a99b57f2ed030bd0c480e127b4/rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl" + }, + { + "algorithm": "sha256", + "hash": "82ada4a8ed9e82e443fcef87e22a3eed3654dd3adf6e3b3a0deb70f03e86142a", + "url": "https://files.pythonhosted.org/packages/ac/fb/df413d319151b272b967de1edcbe5cf94a94c8a6f397ad9685c2ab8237e9/rpds_py-0.17.1-cp312-cp312-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "e796051f2070f47230c745d0a77a91088fbee2cc0502e9b796b9c6471983718c", + "url": "https://files.pythonhosted.org/packages/b4/d2/f0d4c9e703544605a208c11a50aefe2e947c394ce1e28e783036252ccdda/rpds_py-0.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "938eab7323a736533f015e6069a7d53ef2dcc841e4e533b782c2bfb9fb12d84b", + "url": "https://files.pythonhosted.org/packages/b5/93/ae7f6854223ad5495d8e316d326e0456dc86805fd1f7bcee350264776ae1/rpds_py-0.17.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "0210b2668f24c078307260bf88bdac9d6f1093635df5123789bfee4d8d7fc8e7", + "url": "https://files.pythonhosted.org/packages/b7/0a/e3bdcc977e6db3bf32a3f42172f583adfa7c3604091a03d512333e0161fe/rpds_py-0.17.1.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "436474f17733c7dca0fbf096d36ae65277e8645039df12a0fa52445ca494729d", + "url": "https://files.pythonhosted.org/packages/b9/c3/bc96d2fdc470b371834ccb88e42396b999480cb251db4a4e649e25d67b77/rpds_py-0.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "dfe07308b311a8293a0d5ef4e61411c5c20f682db6b5e73de6c7c8824272c256", + "url": "https://files.pythonhosted.org/packages/c2/e9/190521d63b504c12bdcffb27ea6aaac1dbb2521be983c3a2a0ab4a938b8c/rpds_py-0.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "f7f4cb1f173385e8a39c29510dd11a78bf44e360fb75610594973f5ea141028b", + "url": "https://files.pythonhosted.org/packages/c2/f6/10bc5700db7e87119ec46a2a3f54dcbf1ca06e797c01fcc5129bab61280f/rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl" + }, + { + "algorithm": "sha256", + "hash": "bf046179d011e6114daf12a534d874958b039342b347348a78b7cdf0dd9d6041", + "url": "https://files.pythonhosted.org/packages/c3/de/453a8cfd81b0e4acbdeb0fa53dd131096ed444abc04f5055a0d79f8e0340/rpds_py-0.17.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "4e21b76075c01d65d0f0f34302b5a7457d95721d5e0667aea65e5bb3ab415c25", + "url": "https://files.pythonhosted.org/packages/c9/f6/38e6f84289afdf21d7381ec5d1acdfbc449d5dd864c63254583009681e1e/rpds_py-0.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "4dc889a9d8a34758d0fcc9ac86adb97bab3fb7f0c4d29794357eb147536483fd", + "url": "https://files.pythonhosted.org/packages/cc/bd/7cedb55b2c2cca135fa51108c7b76e45fdb595042300e48425ad3008df1c/rpds_py-0.17.1-cp311-cp311-musllinux_1_2_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "bd345a13ce06e94c753dab52f8e71e5252aec1e4f8022d24d56decd31e1b9b23", + "url": "https://files.pythonhosted.org/packages/d5/c8/b625150080495ba5a3850ecac8c087734ea25eae1cd2559f8c345287b39a/rpds_py-0.17.1-cp312-cp312-musllinux_1_2_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "f6c43b6f97209e370124baf2bf40bb1e8edc25311a158867eb1c3a5d449ebc7a", + "url": "https://files.pythonhosted.org/packages/d6/ed/98be10c544a38e3ac69803838adbfddfe5d08c7b0db9bd2a06b91480da35/rpds_py-0.17.1-cp39-cp39-macosx_10_12_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "3ac732390d529d8469b831949c78085b034bff67f584559340008d0f6041a049", + "url": "https://files.pythonhosted.org/packages/d8/f4/15e8b8c8c7874e5f0f5e95a77fdbe5d53a65c262b876a8acad9c51f35c23/rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "9051e3d2af8f55b42061603e29e744724cb5f65b128a491446cc029b3e2ea896", + "url": "https://files.pythonhosted.org/packages/d9/45/2fbe6a881ec1c2776be63c3a01c0364f462a5e61a3be7a4198f04dca7c24/rpds_py-0.17.1-cp38-cp38-musllinux_1_2_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "7450dbd659fed6dd41d1a7d47ed767e893ba402af8ae664c157c255ec6067fde", + "url": "https://files.pythonhosted.org/packages/db/4d/883e705b209e6d61c850239c5ac51f550e812eafbf39dfe8f454f08b8fb6/rpds_py-0.17.1-cp38-cp38-musllinux_1_2_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "d8bbd8e56f3ba25a7d0cf980fc42b34028848a53a0e36c9918550e0280b9d0b6", + "url": "https://files.pythonhosted.org/packages/dd/26/f1b95db937d9186c36158a130ec0205dd1821c1f512e883a853d53608cc9/rpds_py-0.17.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "9f0e4dc0f17dcea4ab9d13ac5c666b6b5337042b4d8f27e01b70fae41dd65c57", + "url": "https://files.pythonhosted.org/packages/de/cd/821d5d1c4bde92de43911e548ca04ba26d0141423c9434d5ca8b5569567b/rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "1dc29db3900cb1bb40353772417800f29c3d078dbc8024fd64655a04ee3c4bdf", + "url": "https://files.pythonhosted.org/packages/e2/53/aa31622ce16dd52dbec5cff38c66e094410d7b6fac6704c0d7c39ef4a940/rpds_py-0.17.1-cp312-cp312-macosx_10_12_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "2f4eb548daf4836e3b2c662033bfbfc551db58d30fd8fe660314f86bf8510b93", + "url": "https://files.pythonhosted.org/packages/e4/82/c3b6e98f31b46d9803890a9c703d9af1647a8069358155a7e329e6ba38e3/rpds_py-0.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "c3d2010656999b63e628a3c694f23020322b4178c450dc478558a2b6ef3cb9bb", + "url": "https://files.pythonhosted.org/packages/ea/14/276b74099992d1e520cd3434f83624f1e2687de634ecd2c1b55c066a96cd/rpds_py-0.17.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "380e0df2e9d5d5d339803cfc6d183a5442ad7ab3c63c2a0982e8c824566c5ccc", + "url": "https://files.pythonhosted.org/packages/eb/f1/4f58ff3a0f3f5672dfcdad8485fc04458171e21cc89475770caf70fc9f34/rpds_py-0.17.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "8ffe53e1d8ef2520ebcf0c9fec15bb721da59e8ef283b6ff3079613b1e30513d", + "url": "https://files.pythonhosted.org/packages/ed/b4/0bcfcea3ee957c418c805949f320b11caebfca499f22f63a768fda843619/rpds_py-0.17.1-cp38-cp38-macosx_10_12_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "a000133a90eea274a6f28adc3084643263b1e7c1a5a66eb0a0a7a36aa757ed74", + "url": "https://files.pythonhosted.org/packages/f4/0e/1d8b50d00a6400deec873600b563807e570132c88344ed2055c7b4ae461e/rpds_py-0.17.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "dbbb95e6fc91ea3102505d111b327004d1c4ce98d56a4a02e82cd451f9f57140", + "url": "https://files.pythonhosted.org/packages/f4/25/69998601cc3e81f2bd583e107ad0999537f65820693f7e5ce9aabdbfb2fa/rpds_py-0.17.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "7fbd70cb8b54fe745301921b0816c08b6d917593429dfc437fd024b5ba713c58", + "url": "https://files.pythonhosted.org/packages/f8/50/e68d0816c51421fcabfd53bd5c7e3e2a1ce41c98e8fcc94ab7a7e94cdc90/rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + } + ], + "project_name": "rpds-py", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "0.17.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "url": "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f", + "url": "https://files.pythonhosted.org/packages/c0/3f/d7af728f075fb08564c5949a9c95e44352e23dee646869fa104a3b2060a3/tomli-2.0.1.tar.gz" + } + ], + "project_name": "tomli", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "2.0.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "77a4ac36b0be4f24274d5b9bf0b66208ee771c05f80e34c4641de7d63e8a872d", + "url": "https://files.pythonhosted.org/packages/c5/ab/ebe7a6e06738584a7cb6366ee83cf1962eddea203ef6e002d71ddb5845b5/types_jsonschema-4.21.0.20240118-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "31aae1b5adc0176c1155c2d4f58348b22d92ae64315e9cc83bd6902168839232", + "url": "https://files.pythonhosted.org/packages/da/d9/3183e7439899f0646690c27f18a0773cb944a8dad3bf6938aa489b52a919/types-jsonschema-4.21.0.20240118.tar.gz" + } + ], + "project_name": "types-jsonschema", + "requires_dists": [ + "referencing" + ], + "requires_python": ">=3.8", + "version": "4.21.0.20240118" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "9592a9a4cb92d6d75d9b491a41477272b710e021011a2a3061157e2fb1f1a5d1", + "url": "https://files.pythonhosted.org/packages/ae/29/3290a0d17865b9ec3d54fbb17faa265d9de7e856b6a3b52dfdf3507efd7c/types_requests-2.31.0.20240125-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "03a28ce1d7cd54199148e043b2079cdded22d6795d19a2c2a6791a4b2b5e2eb5", + "url": "https://files.pythonhosted.org/packages/d9/7f/fb937e67e242dc191716860f6f16c6b57d2b20896e98a15ca5c298bd18b4/types-requests-2.31.0.20240125.tar.gz" + } + ], + "project_name": "types-requests", + "requires_dists": [ + "urllib3>=2" + ], + "requires_python": ">=3.8", + "version": "2.31.0.20240125" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd", + "url": "https://files.pythonhosted.org/packages/b7/f4/6a90020cd2d93349b442bfcb657d0dc91eee65491600b2cb1d388bc98e6b/typing_extensions-4.9.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", + "url": "https://files.pythonhosted.org/packages/0c/1d/eb26f5e75100d531d7399ae800814b069bc2ed2a7410834d57374d010d96/typing_extensions-4.9.0.tar.gz" + } + ], + "project_name": "typing-extensions", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "4.9.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3", + "url": "https://files.pythonhosted.org/packages/96/94/c31f58c7a7f470d5665935262ebd7455c7e4c7782eb525658d3dbf4b9403/urllib3-2.1.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54", + "url": "https://files.pythonhosted.org/packages/36/dd/a6b232f449e1bc71802a5b7950dc3675d32c6dbc2a1bd6d71f065551adb6/urllib3-2.1.0.tar.gz" + } + ], + "project_name": "urllib3", + "requires_dists": [ + "brotli>=1.0.9; platform_python_implementation == \"CPython\" and extra == \"brotli\"", + "brotlicffi>=0.8.0; platform_python_implementation != \"CPython\" and extra == \"brotli\"", + "pysocks!=1.5.7,<2.0,>=1.5.6; extra == \"socks\"", + "zstandard>=0.18.0; extra == \"zstd\"" + ], + "requires_python": ">=3.8", + "version": "2.1.0" + } + ], + "platform_tag": null + } + ], + "path_mappings": {}, + "pex_version": "2.1.137", + "pip_version": "23.1.2", + "prefer_older_binary": false, + "requirements": [ + "mypy-typing-asserts", + "mypy==1.1.1", + "types-jsonschema", + "types-requests" + ], + "requires_python": [ + "<4,>=3.8" + ], + "resolver_version": "pip-2020-resolver", + "style": "universal", + "target_systems": [ + "linux", + "mac" + ], + "transitive": true, + "use_pep517": null +} diff --git a/jsf/3rdparty/python/pytest-requirements.txt b/jsf/3rdparty/python/pytest-requirements.txt new file mode 100644 index 0000000..d566b36 --- /dev/null +++ b/jsf/3rdparty/python/pytest-requirements.txt @@ -0,0 +1,3 @@ +typer>=0.7.0 +pyjwt +pytest-cov diff --git a/jsf/3rdparty/python/pytest.lock b/jsf/3rdparty/python/pytest.lock new file mode 100644 index 0000000..8af36c0 --- /dev/null +++ b/jsf/3rdparty/python/pytest.lock @@ -0,0 +1,548 @@ +// This lockfile was autogenerated by Pants. To regenerate, run: +// +// pants generate-lockfiles --resolve=pytest +// +// --- BEGIN PANTS LOCKFILE METADATA: DO NOT EDIT OR REMOVE --- +// { +// "version": 3, +// "valid_for_interpreter_constraints": [ +// "CPython<4,>=3.8" +// ], +// "generated_with_requirements": [ +// "pyjwt", +// "pytest-cov", +// "typer>=0.7.0" +// ], +// "manylinux": "manylinux2014", +// "requirement_constraints": [], +// "only_binary": [], +// "no_binary": [] +// } +// --- END PANTS LOCKFILE METADATA --- + +{ + "allow_builds": true, + "allow_prereleases": false, + "allow_wheels": true, + "build_isolation": true, + "constraints": [], + "locked_resolves": [ + { + "locked_requirements": [ + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", + "url": "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de", + "url": "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz" + } + ], + "project_name": "click", + "requires_dists": [ + "colorama; platform_system == \"Windows\"", + "importlib-metadata; python_version < \"3.8\"" + ], + "requires_python": ">=3.7", + "version": "8.1.7" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "32a8d985462e37cfdab611a6f95b09d7c091d07668fdc26e47a725ee575fe166", + "url": "https://files.pythonhosted.org/packages/65/b7/0c855c523d0e979ae43480cee806cae09ee0dbbd0b7c6fed9f9d50318b18/coverage-7.4.1-pp38.pp39.pp310-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "8dfc5e195bbef80aabd81596ef52a1277ee7143fe419efc3c4d8ba2754671756", + "url": "https://files.pythonhosted.org/packages/05/37/799839832bddad161a42eab64e3f42282c75ce0206b2e1c1fc4654e4a995/coverage-7.4.1-cp39-cp39-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "3468cc8720402af37b6c6e7e2a9cdb9f6c16c728638a2ebc768ba1ef6f26c3a1", + "url": "https://files.pythonhosted.org/packages/07/c8/a0f6a2fe09bcada89661eca3c79ee71ad33acfa2ee141b4e300a7281563d/coverage-7.4.1-cp312-cp312-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "b8ffb498a83d7e0305968289441914154fb0ef5d8b3157df02a90c6695978295", + "url": "https://files.pythonhosted.org/packages/0b/bd/008f9dad615d67e47221a983cd46cb5e87002e569dec60daa84d1b422859/coverage-7.4.1-cp311-cp311-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "3e3424c554391dc9ef4a92ad28665756566a28fecf47308f91841f6c49288e66", + "url": "https://files.pythonhosted.org/packages/10/97/ca7dec2d9a1262bc0dbfb757989444fec8cde908083b15fb3339210aa7b8/coverage-7.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "6b00e21f86598b6330f0019b40fb397e705135040dbedc2ca9a93c7441178e74", + "url": "https://files.pythonhosted.org/packages/10/b5/17ee4cc87f4415c28cd3b77df2dd58ce548d5033545faea2bc1a9b3e6b50/coverage-7.4.1-cp311-cp311-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "3cacfaefe6089d477264001f90f55b7881ba615953414999c46cc9713ff93c8c", + "url": "https://files.pythonhosted.org/packages/12/8d/e078f0ccc4e91aa44f7754f0bac18bd6c62780a029b5d30f6242c6e06b23/coverage-7.4.1-cp311-cp311-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "918440dea04521f499721c039863ef95433314b1db00ff826a02580c1f503e45", + "url": "https://files.pythonhosted.org/packages/13/4e/66a3821f6fc8a28d07740d9115fdacffb7e7d61431b9ae112bacde846327/coverage-7.4.1-cp38-cp38-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "1a78b656a4d12b0490ca72651fe4d9f5e07e3c6461063a9b6265ee45eb2bdd35", + "url": "https://files.pythonhosted.org/packages/16/ec/f8899be71d5c0964e4f34ccfe8ecef3e9cff25daa6728a8915c72004b1d5/coverage-7.4.1-cp39-cp39-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "0491275c3b9971cdbd28a4595c2cb5838f08036bca31765bad5e17edf900b2c7", + "url": "https://files.pythonhosted.org/packages/18/e3/eb7689641819f6c415aa7d88593e2d0d322e3adf364a0dd4f4d1eba00eeb/coverage-7.4.1-cp39-cp39-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "077d366e724f24fc02dbfe9d946534357fda71af9764ff99d73c3c596001bbd7", + "url": "https://files.pythonhosted.org/packages/26/1f/430384b8e428c87950583e775fee97bc83bcfd93a2ecc00b5e55a5a052a5/coverage-7.4.1-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "379d4c7abad5afbe9d88cc31ea8ca262296480a86af945b08214eb1a556a3e4d", + "url": "https://files.pythonhosted.org/packages/2a/12/89d5f08eb9be53910e3b9b2d02dd932f9b50bac10281272cdbaf8dee58d9/coverage-7.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "18e961aa13b6d47f758cc5879383d27b5b3f3dcd9ce8cdbfdc2571fe86feb4dd", + "url": "https://files.pythonhosted.org/packages/2b/cc/bf2bfaf953a47d9771383cb87ce2985ec3d4aad445fb88143c24d9839079/coverage-7.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "f68ef3660677e6624c8cace943e4765545f8191313a07288a53d3da188bd8581", + "url": "https://files.pythonhosted.org/packages/37/34/2089e0b24759a207184b41a4e4b4af7004282a5b3a93bb408c2fa19b9b16/coverage-7.4.1-cp312-cp312-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "8bdb0285a0202888d19ec6b6d23d5990410decb932b709f2b0dfe216d031d218", + "url": "https://files.pythonhosted.org/packages/3c/75/a4abb6a0d1d4814fbcf8d9e552fd08b579236d8f5c5bb4cfd8a566c43612/coverage-7.4.1-cp38-cp38-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "b094116f0b6155e36a304ff912f89bbb5067157aff5f94060ff20bbabdc8da06", + "url": "https://files.pythonhosted.org/packages/46/4d/9d6a7081c31d1388bff379250ab3ab0c873330c8139c07e8f4b6df61fe65/coverage-7.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "6dceb61d40cbfcf45f51e59933c784a50846dc03211054bd76b421a713dcdf19", + "url": "https://files.pythonhosted.org/packages/49/d5/9d66fd984979b58927588efb0398953acbdb4c45eb7cfcd74fa9b8d51d12/coverage-7.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "10e88e7f41e6197ea0429ae18f21ff521d4f4490aa33048f6c6f94c6045a6a75", + "url": "https://files.pythonhosted.org/packages/54/4c/e2d59855d36921e3025380f75e110e672bb8500a5e5832af59b65a218ee4/coverage-7.4.1-cp38-cp38-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "6008adeca04a445ea6ef31b2cbaf1d01d02986047606f7da266629afee982630", + "url": "https://files.pythonhosted.org/packages/64/98/2f02659fdd92467a78e35fcf756b373f2a374bb68a42a16546ad3005bb18/coverage-7.4.1-cp310-cp310-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "a4a3907011d39dbc3e37bdc5df0a8c93853c369039b59efa33a7b6669de04c60", + "url": "https://files.pythonhosted.org/packages/72/31/a8d0a018aceecf8b2728f924c0a2d1c07c36be611301db1843538315dca8/coverage-7.4.1-cp38-cp38-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "9641e21670c68c7e57d2053ddf6c443e4f0a6e18e547e86af3fad0795414a628", + "url": "https://files.pythonhosted.org/packages/86/25/6b70cb21b6e62158aab40a0e930361d4397f4ef4cbd2a04d3d01b6e4c5cf/coverage-7.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "5d6850e6e36e332d5511a48a251790ddc545e16e8beaf046c03985c69ccb2676", + "url": "https://files.pythonhosted.org/packages/87/71/0d90c4cda220c1f20f0eeaa997633eb1ec0bcaf5d8250c299d0f27a5885d/coverage-7.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "7ac8f8eb153724f84885a1374999b7e45734bf93a87d8df1e7ce2146860edef6", + "url": "https://files.pythonhosted.org/packages/8e/d5/af7155aa1a6d8496c4436b45c9330dc7b26d962a154054359e2cf6055ed6/coverage-7.4.1-cp311-cp311-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "d17bbc946f52ca67adf72a5ee783cd7cd3477f8f8796f59b4974a9b59cacc9ee", + "url": "https://files.pythonhosted.org/packages/8f/bf/9b1e104690d4976b17d515ee49b648c26d7244e148d1c845708d58b8f4fe/coverage-7.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "8e738a492b6221f8dcf281b67129510835461132b03024830ac0e554311a5c54", + "url": "https://files.pythonhosted.org/packages/9f/ae/0d439dc9adc0111ffbed38149d73ddf34f7a8768e377020181e624cf2634/coverage-7.4.1-cp39-cp39-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "a3277f5fa7483c927fe3a7b017b39351610265308f5267ac6d4c2b64cc1d8d25", + "url": "https://files.pythonhosted.org/packages/a3/6a/02369bde2559d7c511d62eaca5668d6e15d2b741da87bc6a7e9c8999777d/coverage-7.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "02f2edb575d62172aa28fe00efe821ae31f25dc3d589055b3fb64d51e52e4ab1", + "url": "https://files.pythonhosted.org/packages/a9/59/fd1a59a55e6b99b72e77e20933185bacaf3cd35a3729cba8465af1e1cdbe/coverage-7.4.1-cp312-cp312-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "f2f5968608b1fe2a1d00d01ad1017ee27efd99b3437e08b83ded9b7af3f6f766", + "url": "https://files.pythonhosted.org/packages/b3/b9/49b1028a69b1e9476db7508705fc67a1218ece54af07b87339eac1b5600a/coverage-7.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "6d224f0c4c9c98290a6990259073f496fcec1b5cc613eecbd22786d398ded3ad", + "url": "https://files.pythonhosted.org/packages/b5/e3/87ee5c1250934d42038680c41c04bac813025913c460c761859b04dcbff7/coverage-7.4.1-cp38-cp38-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "c61f66d93d712f6e03369b6a7769233bfda880b12f417eefdd4f16d1deb2fc4c", + "url": "https://files.pythonhosted.org/packages/ba/77/c12e72e82324914d4b36d89535a18dc57de06829597b345080acbf4083d0/coverage-7.4.1-cp310-cp310-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "fe558371c1bdf3b8fa03e097c523fb9645b8730399c14fe7721ee9c9e2a545d3", + "url": "https://files.pythonhosted.org/packages/c3/92/f2d89715c3397e76fe365b1ecbb861d1279ff8d47d23635040a358bc75dc/coverage-7.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "1ed4b95480952b1a26d863e546fa5094564aa0065e1e5f0d4d0041f293251d04", + "url": "https://files.pythonhosted.org/packages/ca/41/e2ba20f090d0d16b73ad1f6fc542eb31b0db20662576583fb4f02554891f/coverage-7.4.1.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "536d609c6963c50055bab766d9951b6c394759190d03311f3e9fcf194ca909e1", + "url": "https://files.pythonhosted.org/packages/cb/0f/93a0ffe448b16e713f50b968733cfc590adb70878b14290718e6471ae6fa/coverage-7.4.1-cp311-cp311-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "46342fed0fff72efcda77040b14728049200cbba1279e0bf1188f1f2078c1d70", + "url": "https://files.pythonhosted.org/packages/ce/e1/df16e7e353c2ba5a5b3e02a6bad7dbf1bc62d5b9cfe5c06ed0e31fc64122/coverage-7.4.1-cp39-cp39-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "b9bb62fac84d5f2ff523304e59e5c439955fb3b7f44e3d7b2085184db74d733b", + "url": "https://files.pythonhosted.org/packages/d3/e9/4dd7343cfb4458e3279da877cdd73e006624f6b24fd5c6675e4f973724c0/coverage-7.4.1-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "dfd1e1b9f0898817babf840b77ce9fe655ecbe8b1b327983df485b30df8cc011", + "url": "https://files.pythonhosted.org/packages/d5/a7/36bd1c439fab5d450c69b7cdf4be4291d56885ae8be11ebed9ec240b919f/coverage-7.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "e0860a348bf7004c812c8368d1fc7f77fe8e4c095d661a579196a9533778e156", + "url": "https://files.pythonhosted.org/packages/d7/95/5f7e7f7d46d671d1b81e36ef6439798645ed042c1ffd116ded89897b254d/coverage-7.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "23b27b8a698e749b61809fb637eb98ebf0e505710ec46a8aa6f1be7dc0dc43a6", + "url": "https://files.pythonhosted.org/packages/de/37/4f3eb8e6f4be39eeca4318e3c2ef10e954e86871a68b0e71f004835d6a30/coverage-7.4.1-cp312-cp312-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "0193657651f5399d433c92f8ae264aff31fc1d066deee4b831549526433f3f61", + "url": "https://files.pythonhosted.org/packages/ed/2d/db83db65d0c3d457f993830b97271a80f11bdc051d86dd44405c436db147/coverage-7.4.1-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "ca6e61dc52f601d1d224526360cdeab0d0712ec104a2ce6cc5ccef6ed9a233bc", + "url": "https://files.pythonhosted.org/packages/f1/a3/77220a6212f874ccb0b32e36de5803b379a7a3ee95c2b3cded1e1c78c683/coverage-7.4.1-cp312-cp312-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "aeb2c2688ed93b027eb0d26aa188ada34acb22dceea256d76390eea135083950", + "url": "https://files.pythonhosted.org/packages/fc/cc/c4da6426501cdbad3b37edbeca7b485137f74a6030d5a974060d8369f898/coverage-7.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "d12c923757de24e4e2110cf8832d83a886a4cf215c6e61ed506006872b43a6d1", + "url": "https://files.pythonhosted.org/packages/ff/e3/351477165426da841458f2c1b732360dd42da140920e3cd4b70676e5b77f/coverage-7.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + } + ], + "project_name": "coverage", + "requires_dists": [ + "tomli; python_full_version <= \"3.11.0a6\" and extra == \"toml\"" + ], + "requires_python": ">=3.8", + "version": "7.4.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14", + "url": "https://files.pythonhosted.org/packages/b8/9a/5028fd52db10e600f1c4674441b968cf2ea4959085bfb5b99fb1250e5f68/exceptiongroup-1.2.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68", + "url": "https://files.pythonhosted.org/packages/8e/1c/beef724eaf5b01bb44b6338c8c3494eff7cab376fab4904cfbbc3585dc79/exceptiongroup-1.2.0.tar.gz" + } + ], + "project_name": "exceptiongroup", + "requires_dists": [ + "pytest>=6; extra == \"test\"" + ], + "requires_python": ">=3.7", + "version": "1.2.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", + "url": "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", + "url": "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz" + } + ], + "project_name": "iniconfig", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "2.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7", + "url": "https://files.pythonhosted.org/packages/ec/1a/610693ac4ee14fcdf2d9bf3c493370e4f2ef7ae2e19217d7a237ff42367d/packaging-23.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", + "url": "https://files.pythonhosted.org/packages/fb/2b/9b9c33ffed44ee921d0967086d653047286054117d584f1b1a7c22ceaf7b/packaging-23.2.tar.gz" + } + ], + "project_name": "packaging", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "23.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981", + "url": "https://files.pythonhosted.org/packages/a5/5b/0cc789b59e8cc1bf288b38111d002d8c5917123194d45b29dcdac64723cc/pluggy-1.4.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be", + "url": "https://files.pythonhosted.org/packages/54/c6/43f9d44d92aed815e781ca25ba8c174257e27253a94630d21be8725a2b59/pluggy-1.4.0.tar.gz" + } + ], + "project_name": "pluggy", + "requires_dists": [ + "pre-commit; extra == \"dev\"", + "pytest-benchmark; extra == \"testing\"", + "pytest; extra == \"testing\"", + "tox; extra == \"dev\"" + ], + "requires_python": ">=3.8", + "version": "1.4.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320", + "url": "https://files.pythonhosted.org/packages/2b/4f/e04a8067c7c96c364cef7ef73906504e2f40d690811c021e1a1901473a19/PyJWT-2.8.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de", + "url": "https://files.pythonhosted.org/packages/30/72/8259b2bccfe4673330cea843ab23f86858a419d8f1493f66d413a76c7e3b/PyJWT-2.8.0.tar.gz" + } + ], + "project_name": "pyjwt", + "requires_dists": [ + "coverage[toml]==5.0.4; extra == \"dev\"", + "coverage[toml]==5.0.4; extra == \"tests\"", + "cryptography>=3.4.0; extra == \"crypto\"", + "cryptography>=3.4.0; extra == \"dev\"", + "pre-commit; extra == \"dev\"", + "pytest<7.0.0,>=6.0.0; extra == \"dev\"", + "pytest<7.0.0,>=6.0.0; extra == \"tests\"", + "sphinx-rtd-theme; extra == \"dev\"", + "sphinx-rtd-theme; extra == \"docs\"", + "sphinx<5.0.0,>=4.5.0; extra == \"dev\"", + "sphinx<5.0.0,>=4.5.0; extra == \"docs\"", + "typing-extensions; python_version <= \"3.7\"", + "zope.interface; extra == \"dev\"", + "zope.interface; extra == \"docs\"" + ], + "requires_python": ">=3.7", + "version": "2.8.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "50fb9cbe836c3f20f0dfa99c565201fb75dc54c8d76373cd1bde06b06657bdb6", + "url": "https://files.pythonhosted.org/packages/c7/10/727155d44c5e04bb08e880668e53079547282e4f950535234e5a80690564/pytest-8.0.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "249b1b0864530ba251b7438274c4d251c58d868edaaec8762893ad4a0d71c36c", + "url": "https://files.pythonhosted.org/packages/50/fd/af2d835eed57448960c4e7e9ab76ee42f24bcdd521e967191bc26fa2dece/pytest-8.0.0.tar.gz" + } + ], + "project_name": "pytest", + "requires_dists": [ + "argcomplete; extra == \"testing\"", + "attrs>=19.2.0; extra == \"testing\"", + "colorama; sys_platform == \"win32\"", + "exceptiongroup>=1.0.0rc8; python_version < \"3.11\"", + "hypothesis>=3.56; extra == \"testing\"", + "iniconfig", + "mock; extra == \"testing\"", + "nose; extra == \"testing\"", + "packaging", + "pluggy<2.0,>=1.3.0", + "pygments>=2.7.2; extra == \"testing\"", + "requests; extra == \"testing\"", + "setuptools; extra == \"testing\"", + "tomli>=1.0.0; python_version < \"3.11\"", + "xmlschema; extra == \"testing\"" + ], + "requires_python": ">=3.8", + "version": "8.0.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a", + "url": "https://files.pythonhosted.org/packages/a7/4b/8b78d126e275efa2379b1c2e09dc52cf70df16fc3b90613ef82531499d73/pytest_cov-4.1.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6", + "url": "https://files.pythonhosted.org/packages/7a/15/da3df99fd551507694a9b01f512a2f6cf1254f33601605843c3775f39460/pytest-cov-4.1.0.tar.gz" + } + ], + "project_name": "pytest-cov", + "requires_dists": [ + "coverage[toml]>=5.2.1", + "fields; extra == \"testing\"", + "hunter; extra == \"testing\"", + "process-tests; extra == \"testing\"", + "pytest-xdist; extra == \"testing\"", + "pytest>=4.6", + "six; extra == \"testing\"", + "virtualenv; extra == \"testing\"" + ], + "requires_python": ">=3.7", + "version": "4.1.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "url": "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f", + "url": "https://files.pythonhosted.org/packages/c0/3f/d7af728f075fb08564c5949a9c95e44352e23dee646869fa104a3b2060a3/tomli-2.0.1.tar.gz" + } + ], + "project_name": "tomli", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "2.0.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "5d96d986a21493606a358cae4461bd8cdf83cbf33a5aa950ae629ca3b51467ee", + "url": "https://files.pythonhosted.org/packages/bf/0e/c68adf10adda05f28a6ed7b9f4cd7b8e07f641b44af88ba72d9c89e4de7a/typer-0.9.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "50922fd79aea2f4751a8e0408ff10d2662bd0c8bbfa84755a699f3bada2978b2", + "url": "https://files.pythonhosted.org/packages/5b/49/39f10d0f75886439ab3dac889f14f8ad511982a754e382c9b6ca895b29e9/typer-0.9.0.tar.gz" + } + ], + "project_name": "typer", + "requires_dists": [ + "autoflake<2.0.0,>=1.3.1; extra == \"dev\"", + "black<23.0.0,>=22.3.0; extra == \"test\"", + "cairosvg<3.0.0,>=2.5.2; extra == \"doc\"", + "click<9.0.0,>=7.1.1", + "colorama<0.5.0,>=0.4.3; extra == \"all\"", + "coverage<7.0,>=6.2; extra == \"test\"", + "flake8<4.0.0,>=3.8.3; extra == \"dev\"", + "isort<6.0.0,>=5.0.6; extra == \"test\"", + "mdx-include<2.0.0,>=1.4.1; extra == \"doc\"", + "mkdocs-material<9.0.0,>=8.1.4; extra == \"doc\"", + "mkdocs<2.0.0,>=1.1.2; extra == \"doc\"", + "mypy==0.910; extra == \"test\"", + "pillow<10.0.0,>=9.3.0; extra == \"doc\"", + "pre-commit<3.0.0,>=2.17.0; extra == \"dev\"", + "pytest-cov<5.0.0,>=2.10.0; extra == \"test\"", + "pytest-sugar<0.10.0,>=0.9.4; extra == \"test\"", + "pytest-xdist<4.0.0,>=1.32.0; extra == \"test\"", + "pytest<8.0.0,>=4.4.0; extra == \"test\"", + "rich<14.0.0,>=10.11.0; extra == \"all\"", + "rich<14.0.0,>=10.11.0; extra == \"test\"", + "shellingham<2.0.0,>=1.3.0; extra == \"all\"", + "shellingham<2.0.0,>=1.3.0; extra == \"test\"", + "typing-extensions>=3.7.4.3" + ], + "requires_python": ">=3.6", + "version": "0.9.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd", + "url": "https://files.pythonhosted.org/packages/b7/f4/6a90020cd2d93349b442bfcb657d0dc91eee65491600b2cb1d388bc98e6b/typing_extensions-4.9.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", + "url": "https://files.pythonhosted.org/packages/0c/1d/eb26f5e75100d531d7399ae800814b069bc2ed2a7410834d57374d010d96/typing_extensions-4.9.0.tar.gz" + } + ], + "project_name": "typing-extensions", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "4.9.0" + } + ], + "platform_tag": null + } + ], + "path_mappings": {}, + "pex_version": "2.1.137", + "pip_version": "23.1.2", + "prefer_older_binary": false, + "requirements": [ + "pyjwt", + "pytest-cov", + "typer>=0.7.0" + ], + "requires_python": [ + "<4,>=3.8" + ], + "resolver_version": "pip-2020-resolver", + "style": "universal", + "target_systems": [ + "linux", + "mac" + ], + "transitive": true, + "use_pep517": null +} diff --git a/jsf/requirements.txt b/jsf/3rdparty/python/requirements.txt similarity index 77% rename from jsf/requirements.txt rename to jsf/3rdparty/python/requirements.txt index 9611571..344fdc0 100644 --- a/jsf/requirements.txt +++ b/jsf/3rdparty/python/requirements.txt @@ -3,4 +3,4 @@ jsonschema>=4.17.3 pydantic >= 2.0.0 rstr>=3.2.0 smart-open[http]>=6.3.0 - +typing-extensions>=4.9.0 diff --git a/jsf/3rdparty/python/user_reqs.lock b/jsf/3rdparty/python/user_reqs.lock new file mode 100644 index 0000000..e1f18d0 --- /dev/null +++ b/jsf/3rdparty/python/user_reqs.lock @@ -0,0 +1,1709 @@ +// This lockfile was autogenerated by Pants. To regenerate, run: +// +// pants generate-lockfiles --resolve=python-default +// +// --- BEGIN PANTS LOCKFILE METADATA: DO NOT EDIT OR REMOVE --- +// { +// "version": 3, +// "valid_for_interpreter_constraints": [ +// "CPython<4,>=3.8" +// ], +// "generated_with_requirements": [ +// "faker>=15.3.4", +// "jsonschema>=4.17.3", +// "pydantic>=2.0.0", +// "rstr>=3.2.0", +// "smart-open[http]>=6.3.0" +// ], +// "manylinux": "manylinux2014", +// "requirement_constraints": [], +// "only_binary": [], +// "no_binary": [] +// } +// --- END PANTS LOCKFILE METADATA --- + +{ + "allow_builds": true, + "allow_prereleases": false, + "allow_wheels": true, + "build_isolation": true, + "constraints": [], + "locked_resolves": [ + { + "locked_requirements": [ + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43", + "url": "https://files.pythonhosted.org/packages/28/78/d31230046e58c207284c6b2c4e8d96e6d3cb4e52354721b944d3e1ee4aa5/annotated_types-0.6.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d", + "url": "https://files.pythonhosted.org/packages/67/fe/8c7b275824c6d2cd17c93ee85d0ee81c090285b6d52f4876ccc47cf9c3c4/annotated_types-0.6.0.tar.gz" + } + ], + "project_name": "annotated-types", + "requires_dists": [ + "typing-extensions>=4.0.0; python_version < \"3.9\"" + ], + "requires_python": ">=3.8", + "version": "0.6.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1", + "url": "https://files.pythonhosted.org/packages/e0/44/827b2a91a5816512fcaf3cc4ebc465ccd5d598c45cefa6703fcf4a79018f/attrs-23.2.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", + "url": "https://files.pythonhosted.org/packages/e3/fc/f800d51204003fa8ae392c4e8278f256206e7a919b708eef054f5f4b650d/attrs-23.2.0.tar.gz" + } + ], + "project_name": "attrs", + "requires_dists": [ + "attrs[tests-mypy]; extra == \"tests-no-zope\"", + "attrs[tests-no-zope]; extra == \"tests\"", + "attrs[tests]; extra == \"cov\"", + "attrs[tests]; extra == \"dev\"", + "cloudpickle; platform_python_implementation == \"CPython\" and extra == \"tests-no-zope\"", + "coverage[toml]>=5.3; extra == \"cov\"", + "furo; extra == \"docs\"", + "hypothesis; extra == \"tests-no-zope\"", + "importlib-metadata; python_version < \"3.8\"", + "mypy>=1.6; (platform_python_implementation == \"CPython\" and python_version >= \"3.8\") and extra == \"tests-mypy\"", + "myst-parser; extra == \"docs\"", + "pre-commit; extra == \"dev\"", + "pympler; extra == \"tests-no-zope\"", + "pytest-mypy-plugins; (platform_python_implementation == \"CPython\" and python_version >= \"3.8\") and extra == \"tests-mypy\"", + "pytest-xdist[psutil]; extra == \"tests-no-zope\"", + "pytest>=4.3.0; extra == \"tests-no-zope\"", + "sphinx-notfound-page; extra == \"docs\"", + "sphinx; extra == \"docs\"", + "sphinxcontrib-towncrier; extra == \"docs\"", + "towncrier; extra == \"docs\"", + "zope-interface; extra == \"docs\"", + "zope-interface; extra == \"tests\"" + ], + "requires_python": ">=3.7", + "version": "23.2.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474", + "url": "https://files.pythonhosted.org/packages/64/62/428ef076be88fa93716b576e4a01f919d25968913e817077a386fcbe4f42/certifi-2023.11.17-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1", + "url": "https://files.pythonhosted.org/packages/d4/91/c89518dd4fe1f3a4e3f6ab7ff23cb00ef2e8c9adf99dacc618ad5e068e28/certifi-2023.11.17.tar.gz" + } + ], + "project_name": "certifi", + "requires_dists": [], + "requires_python": ">=3.6", + "version": "2023.11.17" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", + "url": "https://files.pythonhosted.org/packages/28/76/e6222113b83e3622caa4bb41032d0b1bf785250607392e1b778aca0b8a7d/charset_normalizer-3.3.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", + "url": "https://files.pythonhosted.org/packages/05/31/e1f51c76db7be1d4aef220d29fbfa5dbb4a99165d9833dcbf166753b6dc0/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", + "url": "https://files.pythonhosted.org/packages/05/8c/eb854996d5fef5e4f33ad56927ad053d04dc820e4a3d39023f35cad72617/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", + "url": "https://files.pythonhosted.org/packages/07/07/7e554f2bbce3295e191f7e653ff15d55309a9ca40d0362fcdab36f01063c/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", + "url": "https://files.pythonhosted.org/packages/13/82/83c188028b6f38d39538442dd127dc794c602ae6d45d66c469f4063a4c30/charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", + "url": "https://files.pythonhosted.org/packages/16/ea/a9e284aa38cccea06b7056d4cbc7adf37670b1f8a668a312864abf1ff7c6/charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", + "url": "https://files.pythonhosted.org/packages/19/28/573147271fd041d351b438a5665be8223f1dd92f273713cb882ddafe214c/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", + "url": "https://files.pythonhosted.org/packages/1e/49/7ab74d4ac537ece3bc3334ee08645e231f39f7d6df6347b29a74b0537103/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", + "url": "https://files.pythonhosted.org/packages/1f/8d/33c860a7032da5b93382cbe2873261f81467e7b37f4ed91e25fed62fd49b/charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", + "url": "https://files.pythonhosted.org/packages/24/9d/2e3ef673dfd5be0154b20363c5cdcc5606f35666544381bee15af3778239/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", + "url": "https://files.pythonhosted.org/packages/2a/9d/a6d15bd1e3e2914af5955c8eb15f4071997e7078419328fee93dfd497eb7/charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", + "url": "https://files.pythonhosted.org/packages/2b/61/095a0aa1a84d1481998b534177c8566fdc50bb1233ea9a0478cd3cc075bd/charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", + "url": "https://files.pythonhosted.org/packages/2d/dc/9dacba68c9ac0ae781d40e1a0c0058e26302ea0660e574ddf6797a0347f7/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", + "url": "https://files.pythonhosted.org/packages/2e/7d/2259318c202f3d17f3fe6438149b3b9e706d1070fe3fcbb28049730bb25c/charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", + "url": "https://files.pythonhosted.org/packages/33/95/ef68482e4a6adf781fae8d183fb48d6f2be8facb414f49c90ba6a5149cd1/charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", + "url": "https://files.pythonhosted.org/packages/33/c3/3b96a435c5109dd5b6adc8a59ba1d678b302a97938f032e3770cc84cd354/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", + "url": "https://files.pythonhosted.org/packages/34/2a/f392457d45e24a0c9bfc012887ed4f3c54bf5d4d05a5deb970ffec4b7fc0/charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", + "url": "https://files.pythonhosted.org/packages/3a/52/9f9d17c3b54dc238de384c4cb5a2ef0e27985b42a0e5cc8e8a31d918d48d/charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", + "url": "https://files.pythonhosted.org/packages/3d/09/d82fe4a34c5f0585f9ea1df090e2a71eb9bb1e469723053e1ee9f57c16f3/charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", + "url": "https://files.pythonhosted.org/packages/3d/85/5b7416b349609d20611a64718bed383b9251b5a601044550f0c8983b8900/charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", + "url": "https://files.pythonhosted.org/packages/3e/33/21a875a61057165e92227466e54ee076b73af1e21fe1b31f1e292251aa1e/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", + "url": "https://files.pythonhosted.org/packages/3f/ba/3f5e7be00b215fa10e13d64b1f6237eb6ebea66676a41b2bcdd09fe74323/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", + "url": "https://files.pythonhosted.org/packages/40/26/f35951c45070edc957ba40a5b1db3cf60a9dbb1b350c2d5bef03e01e61de/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", + "url": "https://files.pythonhosted.org/packages/43/05/3bf613e719efe68fb3a77f9c536a389f35b95d75424b96b426a47a45ef1d/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", + "url": "https://files.pythonhosted.org/packages/44/80/b339237b4ce635b4af1c73742459eee5f97201bd92b2371c53e11958392e/charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", + "url": "https://files.pythonhosted.org/packages/45/59/3d27019d3b447a88fe7e7d004a1e04be220227760264cc41b405e863891b/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", + "url": "https://files.pythonhosted.org/packages/46/6a/d5c26c41c49b546860cc1acabdddf48b0b3fb2685f4f5617ac59261b44ae/charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", + "url": "https://files.pythonhosted.org/packages/51/fd/0ee5b1c2860bb3c60236d05b6e4ac240cf702b67471138571dad91bcfed8/charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", + "url": "https://files.pythonhosted.org/packages/53/cd/aa4b8a4d82eeceb872f83237b2d27e43e637cac9ffaef19a1321c3bafb67/charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561", + "url": "https://files.pythonhosted.org/packages/54/7f/cad0b328759630814fcf9d804bfabaf47776816ad4ef2e9938b7e1123d04/charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", + "url": "https://files.pythonhosted.org/packages/58/78/a0bc646900994df12e07b4ae5c713f2b3e5998f58b9d3720cce2aa45652f/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", + "url": "https://files.pythonhosted.org/packages/5b/ae/ce2c12fcac59cb3860b2e2d76dc405253a4475436b1861d95fe75bdea520/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", + "url": "https://files.pythonhosted.org/packages/63/09/c1bc53dab74b1816a00d8d030de5bf98f724c52c1635e07681d312f20be8/charset-normalizer-3.3.2.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", + "url": "https://files.pythonhosted.org/packages/66/fe/c7d3da40a66a6bf2920cce0f436fa1f62ee28aaf92f412f0bf3b84c8ad6c/charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", + "url": "https://files.pythonhosted.org/packages/68/77/02839016f6fbbf808e8b38601df6e0e66c17bbab76dff4613f7511413597/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", + "url": "https://files.pythonhosted.org/packages/72/1a/641d5c9f59e6af4c7b53da463d07600a695b9824e20849cb6eea8a627761/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", + "url": "https://files.pythonhosted.org/packages/74/f1/0d9fe69ac441467b737ba7f48c68241487df2f4522dd7246d9426e7c690e/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", + "url": "https://files.pythonhosted.org/packages/79/66/8946baa705c588521afe10b2d7967300e49380ded089a62d38537264aece/charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", + "url": "https://files.pythonhosted.org/packages/7b/ef/5eb105530b4da8ae37d506ccfa25057961b7b63d581def6f99165ea89c7e/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", + "url": "https://files.pythonhosted.org/packages/81/b2/160893421adfa3c45554fb418e321ed342bb10c0a4549e855b2b2a3699cb/charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", + "url": "https://files.pythonhosted.org/packages/91/33/749df346e93d7a30cdcb90cbfdd41a06026317bfbfb62cd68307c1a3c543/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", + "url": "https://files.pythonhosted.org/packages/98/69/5d8751b4b670d623aa7a47bef061d69c279e9f922f6705147983aa76c3ce/charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", + "url": "https://files.pythonhosted.org/packages/99/b0/9c365f6d79a9f0f3c379ddb40a256a67aa69c59609608fe7feb6235896e1/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", + "url": "https://files.pythonhosted.org/packages/9e/ef/cd47a63d3200b232792e361cd67530173a09eb011813478b1c0fb8aa7226/charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", + "url": "https://files.pythonhosted.org/packages/a2/51/e5023f937d7f307c948ed3e5c29c4b7a3e42ed2ee0b8cdf8f3a706089bf0/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", + "url": "https://files.pythonhosted.org/packages/a8/31/47d018ef89f95b8aded95c589a77c072c55e94b50a41aa99c0a2008a45a4/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", + "url": "https://files.pythonhosted.org/packages/a8/6f/4ff299b97da2ed6358154b6eb3a2db67da2ae204e53d205aacb18a7e4f34/charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", + "url": "https://files.pythonhosted.org/packages/b3/c1/ebca8e87c714a6a561cfee063f0655f742e54b8ae6e78151f60ba8708b3a/charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", + "url": "https://files.pythonhosted.org/packages/b8/60/e2f67915a51be59d4539ed189eb0a2b0d292bf79270410746becb32bc2c3/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", + "url": "https://files.pythonhosted.org/packages/bd/28/7ea29e73eea52c7e15b4b9108d0743fc9e4cc2cdb00d275af1df3d46d360/charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", + "url": "https://files.pythonhosted.org/packages/be/4d/9e370f8281cec2fcc9452c4d1ac513324c32957c5f70c73dd2fa8442a21a/charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", + "url": "https://files.pythonhosted.org/packages/c2/65/52aaf47b3dd616c11a19b1052ce7fa6321250a7a0b975f48d8c366733b9f/charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", + "url": "https://files.pythonhosted.org/packages/cc/94/f7cf5e5134175de79ad2059edf2adce18e0685ebdb9227ff0139975d0e93/charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", + "url": "https://files.pythonhosted.org/packages/cf/7c/f3b682fa053cc21373c9a839e6beba7705857075686a05c72e0f8c4980ca/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", + "url": "https://files.pythonhosted.org/packages/d1/2f/0d1efd07c74c52b6886c32a3b906fb8afd2fecf448650e73ecb90a5a27f1/charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", + "url": "https://files.pythonhosted.org/packages/d1/b2/fcedc8255ec42afee97f9e6f0145c734bbe104aac28300214593eb326f1d/charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", + "url": "https://files.pythonhosted.org/packages/d8/b5/eb705c313100defa57da79277d9207dc8d8e45931035862fa64b625bfead/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", + "url": "https://files.pythonhosted.org/packages/da/f1/3702ba2a7470666a62fd81c58a4c40be00670e5006a67f4d626e57f013ae/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", + "url": "https://files.pythonhosted.org/packages/dd/51/68b61b90b24ca35495956b718f35a9756ef7d3dd4b3c1508056fa98d1a1b/charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", + "url": "https://files.pythonhosted.org/packages/df/3e/a06b18788ca2eb6695c9b22325b6fde7dde0f1d1838b1792a0076f58fe9d/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", + "url": "https://files.pythonhosted.org/packages/e1/9c/60729bf15dc82e3aaf5f71e81686e42e50715a1399770bcde1a9e43d09db/charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", + "url": "https://files.pythonhosted.org/packages/e4/a6/7ee57823d46331ddc37dd00749c95b0edec2c79b15fc0d6e6efb532e89ac/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", + "url": "https://files.pythonhosted.org/packages/eb/5c/97d97248af4920bc68687d9c3b3c0f47c910e21a8ff80af4565a576bd2f0/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", + "url": "https://files.pythonhosted.org/packages/ee/fb/14d30eb4956408ee3ae09ad34299131fb383c47df355ddb428a7331cfa1e/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", + "url": "https://files.pythonhosted.org/packages/ef/d4/a1d72a8f6aa754fdebe91b848912025d30ab7dced61e9ed8aabbf791ed65/charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl" + }, + { + "algorithm": "sha256", + "hash": "cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", + "url": "https://files.pythonhosted.org/packages/f6/93/bb6cbeec3bf9da9b2eba458c15966658d1daa8b982c642f81c93ad9b40e1/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", + "url": "https://files.pythonhosted.org/packages/f7/9d/bcf4a449a438ed6f19790eee543a86a740c77508fbc5ddab210ab3ba3a9a/charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl" + } + ], + "project_name": "charset-normalizer", + "requires_dists": [], + "requires_python": ">=3.7.0", + "version": "3.3.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "4e7bb19c1955bb978bf1d4cb0cf25930e37de0e7dfbc6abd768fd4784d9a9653", + "url": "https://files.pythonhosted.org/packages/af/e8/b3acdb518ef1b95bd3b573e4bde32002fcaef7ddfa8cc3f2444edb4468cc/Faker-22.5.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "79cbe3be786789efa05b8c75d7e0ec4efa6ecb786b8fe90eae49c2f8f9cbe31a", + "url": "https://files.pythonhosted.org/packages/09/45/97d49ee2e379fa30151cd971135315ebc6c7e0fabea84af1df034d69fa67/Faker-22.5.1.tar.gz" + } + ], + "project_name": "faker", + "requires_dists": [ + "python-dateutil>=2.4", + "typing-extensions>=3.10.0.1; python_version <= \"3.8\"" + ], + "requires_python": ">=3.8", + "version": "22.5.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f", + "url": "https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", + "url": "https://files.pythonhosted.org/packages/bf/3f/ea4b9117521a1e9c50344b909be7886dd00a519552724809bb1f486986c2/idna-3.6.tar.gz" + } + ], + "project_name": "idna", + "requires_dists": [], + "requires_python": ">=3.5", + "version": "3.6" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6", + "url": "https://files.pythonhosted.org/packages/93/e8/facde510585869b5ec694e8e0363ffe4eba067cb357a8398a55f6a1f8023/importlib_resources-6.1.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a", + "url": "https://files.pythonhosted.org/packages/d4/06/402fb5efbe634881341ff30220798c4c5e448ca57c068108c4582c692160/importlib_resources-6.1.1.tar.gz" + } + ], + "project_name": "importlib-resources", + "requires_dists": [ + "furo; extra == \"docs\"", + "jaraco.packaging>=9.3; extra == \"docs\"", + "jaraco.tidelift>=1.4; extra == \"docs\"", + "pytest-black>=0.3.7; platform_python_implementation != \"PyPy\" and extra == \"testing\"", + "pytest-checkdocs>=2.4; extra == \"testing\"", + "pytest-cov; extra == \"testing\"", + "pytest-enabler>=2.2; extra == \"testing\"", + "pytest-mypy>=0.9.1; platform_python_implementation != \"PyPy\" and extra == \"testing\"", + "pytest-ruff; extra == \"testing\"", + "pytest>=6; extra == \"testing\"", + "rst.linker>=1.9; extra == \"docs\"", + "sphinx-lint; extra == \"docs\"", + "sphinx<7.2.5; extra == \"docs\"", + "sphinx>=3.5; extra == \"docs\"", + "zipp>=3.1.0; python_version < \"3.10\"", + "zipp>=3.17; extra == \"testing\"" + ], + "requires_python": ">=3.8", + "version": "6.1.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f", + "url": "https://files.pythonhosted.org/packages/39/9d/b035d024c62c85f2e2d4806a59ca7b8520307f34e0932fbc8cc75fe7b2d9/jsonschema-4.21.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5", + "url": "https://files.pythonhosted.org/packages/4d/c5/3f6165d3df419ea7b0990b3abed4ff348946a826caf0e7c990b65ff7b9be/jsonschema-4.21.1.tar.gz" + } + ], + "project_name": "jsonschema", + "requires_dists": [ + "attrs>=22.2.0", + "fqdn; extra == \"format\"", + "fqdn; extra == \"format-nongpl\"", + "idna; extra == \"format\"", + "idna; extra == \"format-nongpl\"", + "importlib-resources>=1.4.0; python_version < \"3.9\"", + "isoduration; extra == \"format\"", + "isoduration; extra == \"format-nongpl\"", + "jsonpointer>1.13; extra == \"format\"", + "jsonpointer>1.13; extra == \"format-nongpl\"", + "jsonschema-specifications>=2023.03.6", + "pkgutil-resolve-name>=1.3.10; python_version < \"3.9\"", + "referencing>=0.28.4", + "rfc3339-validator; extra == \"format\"", + "rfc3339-validator; extra == \"format-nongpl\"", + "rfc3986-validator>0.1.0; extra == \"format-nongpl\"", + "rfc3987; extra == \"format\"", + "rpds-py>=0.7.1", + "uri-template; extra == \"format\"", + "uri-template; extra == \"format-nongpl\"", + "webcolors>=1.11; extra == \"format\"", + "webcolors>=1.11; extra == \"format-nongpl\"" + ], + "requires_python": ">=3.8", + "version": "4.21.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c", + "url": "https://files.pythonhosted.org/packages/ee/07/44bd408781594c4d0a027666ef27fab1e441b109dc3b76b4f836f8fd04fe/jsonschema_specifications-2023.12.1-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc", + "url": "https://files.pythonhosted.org/packages/f8/b9/cc0cc592e7c195fb8a650c1d5990b10175cf13b4c97465c72ec841de9e4b/jsonschema_specifications-2023.12.1.tar.gz" + } + ], + "project_name": "jsonschema-specifications", + "requires_dists": [ + "importlib-resources>=1.4.0; python_version < \"3.9\"", + "referencing>=0.31.0" + ], + "requires_python": ">=3.8", + "version": "2023.12.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e", + "url": "https://files.pythonhosted.org/packages/c9/5c/3d4882ba113fd55bdba9326c1e4c62a15e674a2501de4869e6bd6301f87e/pkgutil_resolve_name-1.3.10-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "357d6c9e6a755653cfd78893817c0853af365dd51ec97f3d358a819373bbd174", + "url": "https://files.pythonhosted.org/packages/70/f2/f2891a9dc37398696ddd945012b90ef8d0a034f0012e3f83c3f7a70b0f79/pkgutil_resolve_name-1.3.10.tar.gz" + } + ], + "project_name": "pkgutil-resolve-name", + "requires_dists": [], + "requires_python": ">=3.6", + "version": "1.3.10" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "d0caf5954bee831b6bfe7e338c32b9e30c85dfe080c843680783ac2b631673b4", + "url": "https://files.pythonhosted.org/packages/dd/b7/9aea7ee6c01fe3f3c03b8ca3c7797c866df5fecece9d6cb27caa138db2e2/pydantic-2.5.3-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "b3ef57c62535b0941697cce638c08900d87fcb67e29cfa99e8a68f747f393f7a", + "url": "https://files.pythonhosted.org/packages/aa/3f/56142232152145ecbee663d70a19a45d078180633321efb3847d2562b490/pydantic-2.5.3.tar.gz" + } + ], + "project_name": "pydantic", + "requires_dists": [ + "annotated-types>=0.4.0", + "email-validator>=2.0.0; extra == \"email\"", + "importlib-metadata; python_version == \"3.7\"", + "pydantic-core==2.14.6", + "typing-extensions>=4.6.1" + ], + "requires_python": ">=3.7", + "version": "2.5.3" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "23598acb8ccaa3d1d875ef3b35cb6376535095e9405d91a3d57a8c7db5d29341", + "url": "https://files.pythonhosted.org/packages/e9/b8/5baba04b116546302bc0a07ba0989326a167aeec29fd6f5cadc7deb758b1/pydantic_core-2.14.6-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "a983cca5ed1dd9a35e9e42ebf9f278d344603bfcb174ff99a5815f953925140a", + "url": "https://files.pythonhosted.org/packages/0b/d0/adf341fb8ed080bf5abb91c42752ffa099d8439e45d3fa40a21f259f724c/pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "6c8edaea3089bf908dd27da8f5d9e395c5b4dc092dbcce9b65e7156099b4b937", + "url": "https://files.pythonhosted.org/packages/0d/18/7c17d33b2c8dea2189b2547bafcb70a69a3e537eec12429cc0abfedab683/pydantic_core-2.14.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "b89f4477d915ea43b4ceea6756f63f0288941b6443a2b28c69004fe07fde0d0d", + "url": "https://files.pythonhosted.org/packages/13/33/9f761908fde3a6bb10ac865459a6931e53a2cde622782d243365e70981b7/pydantic_core-2.14.6-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "1b027c86c66b8627eb90e57aee1f526df77dc6d8b354ec498be9a757d513b92b", + "url": "https://files.pythonhosted.org/packages/14/53/7844d20be3a334ea46cdcde8a480cf47e31026d4117d7415a0144d7379c9/pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "75ec284328b60a4e91010c1acade0c30584f28a1f345bc8f72fe8b9e46ec6a96", + "url": "https://files.pythonhosted.org/packages/24/1d/601f861c0d76154217ea6b066e39f04159a761b9c3a7ca56b0dd0267ce3a/pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "36026d8f99c58d7044413e1b819a67ca0e0b8ebe0f25e775e6c3d1fabb3c38fb", + "url": "https://files.pythonhosted.org/packages/26/4b/da4ed701ee2ff392916f19149f8fb6d705282d96971cbf256142d0c11594/pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "d5c28525c19f5bb1e09511669bb57353d22b94cf8b65f3a8d141c389a55dec95", + "url": "https://files.pythonhosted.org/packages/28/1e/04ede6259a552777a859d2d5828aedd540ca0db967641d61be864a49671a/pydantic_core-2.14.6-pp310-pypy310_pp73-macosx_10_7_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "72f9a942d739f09cd42fffe5dc759928217649f070056f03c70df14f5770acf9", + "url": "https://files.pythonhosted.org/packages/28/fc/bfb0da2b2d5b44e49c4c0ce99b07bbfd9f1a4dc92fd3e328a5cf1144467e/pydantic_core-2.14.6-cp310-cp310-macosx_10_7_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "f85f3843bdb1fe80e8c206fe6eed7a1caeae897e496542cee499c374a85c6e08", + "url": "https://files.pythonhosted.org/packages/29/5c/63eb74c7a97daf0ee45dc876f0b0d9cdea9c5c9d64e92508a765cb802e14/pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "b6ca36c12a5120bad343eef193cc0122928c5c7466121da7c20f41160ba00ba2", + "url": "https://files.pythonhosted.org/packages/2a/09/c39be628d6068952f30b381576a4392af2024505747572cd70b19f6d9bde/pydantic_core-2.14.6-cp311-cp311-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "a3dde6cac75e0b0902778978d3b1646ca9f438654395a362cb21d9ad34b24acf", + "url": "https://files.pythonhosted.org/packages/31/76/ee3c136138fbda5f58c3c49371503b42f3a9c678ef284a0b39be17253d78/pydantic_core-2.14.6-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "8ed1af8692bd8d2a29d702f1a2e6065416d76897d726e45a1775b1444f5928a7", + "url": "https://files.pythonhosted.org/packages/39/10/dc849eb0c1890c99958d3ae2cfacb502e4d0ab0360c63c7a20231ea04b32/pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl" + }, + { + "algorithm": "sha256", + "hash": "4f86f1f318e56f5cbb282fe61eb84767aee743ebe32c7c0834690ebea50c0a6b", + "url": "https://files.pythonhosted.org/packages/3d/cf/d2e97b2bfd0bff7c4e9086fab03956003e906557c9c52941c15fed75152d/pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl" + }, + { + "algorithm": "sha256", + "hash": "3860c62057acd95cc84044e758e47b18dcd8871a328ebc8ccdefd18b0d26a21b", + "url": "https://files.pythonhosted.org/packages/43/39/cf14a183949bf162ab13a327b2f3a0f757e610f9c378a850e195d71bcfa0/pydantic_core-2.14.6-cp38-cp38-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "399ac0891c284fa8eb998bcfa323f2234858f5d2efca3950ae58c8f88830f145", + "url": "https://files.pythonhosted.org/packages/48/64/de5432d19c42adbb26c4513866e2639c37c9081687c670bf8dc16cedfb6f/pydantic_core-2.14.6-pp38-pypy38_pp73-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "9c6a5c79b28003543db3ba67d1df336f253a87d3112dac3a51b94f7d48e4c0e1", + "url": "https://files.pythonhosted.org/packages/51/47/9f996e867123189f0b12364b00057887b61193d3d004a4391450e980512f/pydantic_core-2.14.6-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "eedf97be7bc3dbc8addcef4142f4b4164066df0c6f36397ae4aaed3eb187d8ab", + "url": "https://files.pythonhosted.org/packages/55/0f/45626f8bf7f7973320531bb384ac302eb9b05a70885b9db2bf1db4cf447b/pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "7f5025db12fc6de7bc1104d826d5aee1d172f9ba6ca936bf6474c2148ac336c1", + "url": "https://files.pythonhosted.org/packages/55/d1/a291cef89adaa3d82b89055a010bd60560a7bda798e2e729d3dfeb875236/pydantic_core-2.14.6-cp38-cp38-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "86c963186ca5e50d5c8287b1d1c9d3f8f024cbe343d048c5bd282aec2d8641f2", + "url": "https://files.pythonhosted.org/packages/59/f6/1e7193769d24b32b19139fb875693d7a351af17f10354e7583a0f7b61a49/pydantic_core-2.14.6-pp39-pypy39_pp73-macosx_10_7_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "00646784f6cd993b1e1c0e7b0fdcbccc375d539db95555477771c27555e3c556", + "url": "https://files.pythonhosted.org/packages/5c/7a/ceb3c9228ad9ff009ee70fd09ffb9160a45a8adaac5c9a90bc9496a1020e/pydantic_core-2.14.6-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "3dcf1978be02153c6a31692d4fbcc2a3f1db9da36039ead23173bc256ee3b91b", + "url": "https://files.pythonhosted.org/packages/5d/ca/e8fe62da4eb4b538c380900372021c560c3514514677d6d328ac5b95da7c/pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "cb92f9061657287eded380d7dc455bbf115430b3aa4741bdc662d02977e7d0af", + "url": "https://files.pythonhosted.org/packages/5e/58/7cac843607f3b2d0af1768fae90ef219413db163a7cfb7557344edfeed2f/pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "9862bf828112e19685b76ca499b379338fd4c5c269d897e218b2ae8fcb80139d", + "url": "https://files.pythonhosted.org/packages/5f/0c/3aeafa496aaf656be3682cbcacbfe3b4a4b366aaddac0ea74fb2c7c276a2/pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "26a92ae76f75d1915806b77cf459811e772d8f71fd1e4339c99750f0e7f6324f", + "url": "https://files.pythonhosted.org/packages/69/ed/6a318d3846ac45e4e8d7c81a4c4f9cad341f4715521cc2cc7baecd6be9c0/pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl" + }, + { + "algorithm": "sha256", + "hash": "0348b1dc6b76041516e8a854ff95b21c55f5a411c3297d2ca52f5528e49d8411", + "url": "https://files.pythonhosted.org/packages/79/ae/ec8eaa6d9a1305100321d7b9c3c87e015ae61da02a877cfd16b0366b18ff/pydantic_core-2.14.6-cp39-cp39-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "6a31d98c0d69776c2576dda4b77b8e0c69ad08e8b539c25c7d0ca0dc19a50d6c", + "url": "https://files.pythonhosted.org/packages/7d/3a/46913f3134aff44d11edd7bdbba88efe6081f963014e6eaccf83fd8de2d7/pydantic_core-2.14.6-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "dea7fcd62915fb150cdc373212141a30037e11b761fbced340e9db3379b892d4", + "url": "https://files.pythonhosted.org/packages/7d/77/cbfa02b5f46c5ec6be131d97ae93eef883e25d61b4f4d0a058c792b7e3a2/pydantic_core-2.14.6-cp311-cp311-macosx_10_7_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "27e524624eace5c59af499cd97dc18bb201dc6a7a2da24bfc66ef151c69a5f2a", + "url": "https://files.pythonhosted.org/packages/7f/3d/91a26a7004a57f374d85d837b4b06dde818045ddba34bc19909e04e2a14d/pydantic_core-2.14.6-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "4ce8299b481bcb68e5c82002b96e411796b844d72b3e92a3fbedfe8e19813eab", + "url": "https://files.pythonhosted.org/packages/80/8c/d40937f7f7ccfe9776d1e32b36cebe606da9f11624927bd26722c43ea9cb/pydantic_core-2.14.6-cp39-cp39-macosx_10_7_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "172de779e2a153d36ee690dbc49c6db568d7b33b18dc56b69a7514aecbcf380d", + "url": "https://files.pythonhosted.org/packages/84/e4/da29895abb136eea169944eb81f866d783255c4a6fd581c667c15743b171/pydantic_core-2.14.6-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "8b93785eadaef932e4fe9c6e12ba67beb1b3f1e5495631419c784ab87e975670", + "url": "https://files.pythonhosted.org/packages/88/bb/58bd737b1f4a3b567410fd7a55f2e0ed4ba3209bb1a7a35856714a322a04/pydantic_core-2.14.6-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "5aa90562bc079c6c290f0512b21768967f9968e4cfea84ea4ff5af5d917016e4", + "url": "https://files.pythonhosted.org/packages/8f/2d/919d3642da44bc9d9c60a2e7bbda04633fc3ffbd6768c355ac0d7e2424d7/pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "036137b5ad0cb0004c75b579445a1efccd072387a36c7f217bb8efd1afbe5245", + "url": "https://files.pythonhosted.org/packages/90/28/3c6843e6b203999be2660d3f114be196f2182dcac533dc764ad320c9184d/pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "db453f2da3f59a348f514cfbfeb042393b68720787bbef2b4c6068ea362c8149", + "url": "https://files.pythonhosted.org/packages/92/2a/8cff567680c0d5e03ef4da218656a61286add825b4733476e6ba13ffeee9/pydantic_core-2.14.6-cp38-cp38-macosx_10_7_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "86ce5fcfc3accf3a07a729779d0b86c5d0309a4764c897d86c11089be61da160", + "url": "https://files.pythonhosted.org/packages/93/57/9a77cc69f05f725a2b492a18209a43ba4e8b9ee179d3c27a8b6b3ab2f921/pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "599c87d79cab2a6a2a9df4aefe0455e61e7d2aeede2f8577c1b7c0aec643ee8e", + "url": "https://files.pythonhosted.org/packages/97/9e/f42db0e2931cd67bf990d22215ec50444e31aa6e80e63b8531ab1a5f3ffb/pydantic_core-2.14.6-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "370ffecb5316ed23b667d99ce4debe53ea664b99cc37bfa2af47bc769056d534", + "url": "https://files.pythonhosted.org/packages/9b/cd/a2db754b0124e64ad7912160d9c9db310cbd52a990841ef121b53453992d/pydantic_core-2.14.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl" + }, + { + "algorithm": "sha256", + "hash": "dfcebb950aa7e667ec226a442722134539e77c575f6cfaa423f24371bb8d2e94", + "url": "https://files.pythonhosted.org/packages/9d/21/32afbed9bfedf916dff87846e10ecd8711ba63c88cd6c9bcfc3297ef22ca/pydantic_core-2.14.6-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "cf10b7d58ae4a1f07fccbf4a0a956d705356fea05fb4c70608bb6fa81d103cda", + "url": "https://files.pythonhosted.org/packages/9e/0a/c56318f1668de782f31b6e9798217e2e5a99d4cce7a8eddffb60bebe3c09/pydantic_core-2.14.6-pp38-pypy38_pp73-macosx_10_7_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "e8a5ac97ea521d7bde7621d86c30e86b798cdecd985723c4ed737a2aa9e77d0c", + "url": "https://files.pythonhosted.org/packages/9f/7a/2e906fc1a5e4ca45e730118f0afb4878a39a1d505d895835d8cc5452446c/pydantic_core-2.14.6-cp312-cp312-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "71d72ca5eaaa8d38c8df16b7deb1a2da4f650c41b58bb142f3fb75d5ad4a611f", + "url": "https://files.pythonhosted.org/packages/a2/7e/4af14122c7ea67ad5582fddae56f7827044f6b43cca6c7e7421686cca3de/pydantic_core-2.14.6-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "2f6ffc6701a0eb28648c845f4945a194dc7ab3c651f535b81793251e1185ac3d", + "url": "https://files.pythonhosted.org/packages/a5/5c/289261738045fa6b97e75d8c2ee110fab5c2d1025f7d345816f0f56f1c1e/pydantic_core-2.14.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "cdee837710ef6b56ebd20245b83799fce40b265b3b406e51e8ccc5b85b9099b7", + "url": "https://files.pythonhosted.org/packages/a5/f8/07a2563f40b863ba97f3db648697f3f1d7b7edf1bd679f210064cb556e74/pydantic_core-2.14.6-cp312-cp312-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "982487f8931067a32e72d40ab6b47b1628a9c5d344be7f1a4e668fb462d2da42", + "url": "https://files.pythonhosted.org/packages/ab/3d/f4739255d8676debf398116e8ded523cf9bc9289a14734b3dc10645da67d/pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "43e166ad47ba900f2542a80d83f9fc65fe99eb63ceec4debec160ae729824052", + "url": "https://files.pythonhosted.org/packages/ae/91/b5d718de2fc191a1937470e79b53535cf0c3a87b2f21ee927710f4dd4570/pydantic_core-2.14.6-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "fd9e98b408384989ea4ab60206b8e100d8687da18b5c813c11e92fd8212a98e0", + "url": "https://files.pythonhosted.org/packages/b1/1c/ab01fa05c9fc885a73357116c494feafe1207035f13848e4a772fc9d6154/pydantic_core-2.14.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "667aa2eac9cd0700af1ddb38b7b1ef246d8cf94c85637cbb03d7757ca4c3fdec", + "url": "https://files.pythonhosted.org/packages/b1/26/4bd7ac215215322a693c178a022993450ebf7b1e91b26941f72407e1e9a1/pydantic_core-2.14.6-cp312-cp312-macosx_10_7_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "747265448cb57a9f37572a488a57d873fd96bf51e5bb7edb52cfb37124516da4", + "url": "https://files.pythonhosted.org/packages/b2/4a/3be721510f2fea9ce56b25812e6d6ecea9833c06fa8ae479cd41beb404f5/pydantic_core-2.14.6-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "1fd0c1d395372843fba13a51c28e3bb9d59bd7aebfeb17358ffaaa1e4dbbe948", + "url": "https://files.pythonhosted.org/packages/b2/7d/8304d8471cfe4288f95a3065ebda56f9790d087edc356ad5bd83c89e2d79/pydantic_core-2.14.6.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "36099c69f6b14fc2c49d7996cbf4f87ec4f0e66d1c74aa05228583225a07b590", + "url": "https://files.pythonhosted.org/packages/b3/c5/2accf5bbc145b890454d4eaf8dcd6423d406fc9f64147fd9020618363866/pydantic_core-2.14.6-cp310-cp310-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "7e90d6cc4aad2cc1f5e16ed56e46cebf4877c62403a311af20459c15da76fd91", + "url": "https://files.pythonhosted.org/packages/b7/53/101aac1d63a743284cdae804ceb6f561879c385f355caf20d2d87da6d36d/pydantic_core-2.14.6-cp312-cp312-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "8a14c192c1d724c3acbfb3f10a958c55a2638391319ce8078cb36c02283959b9", + "url": "https://files.pythonhosted.org/packages/ba/09/8078e77e73dda7df0d5cca8541d1fb731a52bc00188806676c3635c344a9/pydantic_core-2.14.6-cp39-cp39-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "2c5bcf3414367e29f83fd66f7de64509a8fd2368b1edf4351e862910727d3e51", + "url": "https://files.pythonhosted.org/packages/ba/98/fb42628ed811643c364e05353d3a015c74859402994420aeba8e3e34a54c/pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "0c08de15d50fa190d577e8591f0329a643eeaed696d7771760295998aca6bc66", + "url": "https://files.pythonhosted.org/packages/bb/32/a2f381c8ae08a9682d4e7943ba1f5b518e6f2bdd8261c23721691b332966/pydantic_core-2.14.6-cp310-cp310-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "a874f21f87c485310944b2b2734cd6d318765bcbb7515eead33af9641816506e", + "url": "https://files.pythonhosted.org/packages/bc/7f/20ddc4eb15708cc6832c0cc2e398d0fa642aaf28d6ebcbcfb2d284ec6824/pydantic_core-2.14.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "478e9e7b360dfec451daafe286998d4a1eeaecf6d69c427b834ae771cad4b622", + "url": "https://files.pythonhosted.org/packages/c1/7b/a1cfe9d3fdedf2b33d41960500c17ccba025b483720c79965b73d607687f/pydantic_core-2.14.6-cp311-cp311-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "d5f916acf8afbcab6bacbb376ba7dc61f845367901ecd5e328fc4d4aef2fcab0", + "url": "https://files.pythonhosted.org/packages/ce/95/d0bc7df3de0eaad08de467c50d1dc423839864f32e78da1cf57af3bbb2cc/pydantic_core-2.14.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "ef633add81832f4b56d3b4c9408b43d530dfca29e68fb1b797dcb861a2c734cd", + "url": "https://files.pythonhosted.org/packages/d0/21/7ca5edf46bc6706152d459b560d669cfd72afe0dda24292408f1be8008d6/pydantic_core-2.14.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "dab03ed811ed1c71d700ed08bde8431cf429bbe59e423394f0f4055f1ca0ea60", + "url": "https://files.pythonhosted.org/packages/d7/8a/d2c7668e15d3be9157e8328712db22568770640fdcc3a13f4ff0cdd87ee9/pydantic_core-2.14.6-cp38-cp38-musllinux_1_1_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "2dbe357bc4ddda078f79d2a36fc1dd0494a7f2fad83a0a684465b6f24b46fe80", + "url": "https://files.pythonhosted.org/packages/dd/3d/1a5936fc5558521e8aae22dfb7f0ae6b649040b5fcef7f25be1371d02752/pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "314ccc4264ce7d854941231cf71b592e30d8d368a71e50197c905874feacc8a8", + "url": "https://files.pythonhosted.org/packages/df/ea/435b1ad6890eec709e49dbcc5c0a72ca62ff8c6e62cfc45b7386e5e4cecc/pydantic_core-2.14.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "3a0b5db001b98e1c649dd55afa928e75aa4087e587b9524a4992316fa23c9fba", + "url": "https://files.pythonhosted.org/packages/e2/6d/789f2495c66c99a98b7a09a96145d5f3408941f839de7751995d9a5a8428/pydantic_core-2.14.6-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "b2602177668f89b38b9f84b7b3435d0a72511ddef45dc14446811759b82235a1", + "url": "https://files.pythonhosted.org/packages/e7/84/2dc88180fc6f0d13aab2a47a53b89c2dbc239e2a87d0a58e31077e111e82/pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "7e1f4744eea1501404b20b0ac059ff7e3f96a97d3e3f48ce27a139e053bb370b", + "url": "https://files.pythonhosted.org/packages/e8/5e/a30d56bb6b19e84bcde76cba2d6df45779f127ec73fa2e6d91f0ad3d4bc2/pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "00b1087dabcee0b0ffd104f9f53d7d3eaddfaa314cdd6726143af6bc713aa27e", + "url": "https://files.pythonhosted.org/packages/f1/7b/0fd3444362f31c5f42b655c1ed734480433aa9f8bde97daa19cee0bc2844/pydantic_core-2.14.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl" + }, + { + "algorithm": "sha256", + "hash": "e4ace1e220b078c8e48e82c081e35002038657e4b37d403ce940fa679e57113b", + "url": "https://files.pythonhosted.org/packages/f3/62/076e6c43735950e911d80c6edf215314a8cf9b8adefe9613b72b09ccb1ee/pydantic_core-2.14.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "92879bce89f91f4b2416eba4429c7b5ca22c45ef4a499c39f0c5c69257522c7c", + "url": "https://files.pythonhosted.org/packages/f3/7e/f1c1cf229bd404f5daf972345030f0c205424a326e67ae888c4a5a9066bd/pydantic_core-2.14.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "b9a9d92f10772d2a181b5ca339dee066ab7d1c9a34ae2421b2a52556e719756f", + "url": "https://files.pythonhosted.org/packages/f4/cd/252101e88458f4e7c4d2c44400050f92a0b13960ed3c489b513c97aaa7a6/pydantic_core-2.14.6-cp39-cp39-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "78d0768ee59baa3de0f4adac9e3748b4b1fffc52143caebddfd5ea2961595277", + "url": "https://files.pythonhosted.org/packages/f9/84/c53d351f926630753b8dcf37ec2edf8b55a5a1724b3edc5104e06d3e54f1/pydantic_core-2.14.6-pp310-pypy310_pp73-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "ffff855100bc066ff2cd3aa4a60bc9534661816b110f0243e59503ec2df38421", + "url": "https://files.pythonhosted.org/packages/fb/17/3e4908cf8cb5a1d189f9dfa7cb5698d945e9a4db6b9138e3fef3c32c1f68/pydantic_core-2.14.6-cp311-cp311-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "e0641b506486f0b4cd1500a2a65740243e8670a2549bb02bc4556a83af84ae03", + "url": "https://files.pythonhosted.org/packages/fb/ff/812893fd262a98f0291f6afd87a530eb87c75ddc92034b938b8d15aa5ff4/pydantic_core-2.14.6-pp39-pypy39_pp73-macosx_11_0_arm64.whl" + } + ], + "project_name": "pydantic-core", + "requires_dists": [ + "typing-extensions!=4.7.0,>=4.6.0" + ], + "requires_python": ">=3.7", + "version": "2.14.6" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9", + "url": "https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", + "url": "https://files.pythonhosted.org/packages/4c/c4/13b4776ea2d76c115c1d1b84579f3764ee6d57204f6be27119f13a61d0a9/python-dateutil-2.8.2.tar.gz" + } + ], + "project_name": "python-dateutil", + "requires_dists": [ + "six>=1.5" + ], + "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7", + "version": "2.8.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "39240f2ecc770258f28b642dd47fd74bc8b02484de54e1882b74b35ebd779bd5", + "url": "https://files.pythonhosted.org/packages/90/10/1c92edb0a0a14b67ff825bc338e74bc49ab27d3f3bae3f9a02838cba546f/referencing-0.33.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "c775fedf74bc0f9189c2a3be1c12fd03e8c23f4d371dce795df44e06c5b412f7", + "url": "https://files.pythonhosted.org/packages/21/c5/b99dd501aa72b30a5a87d488d7aa76ec05bdf0e2c7439bc82deb9448dd9a/referencing-0.33.0.tar.gz" + } + ], + "project_name": "referencing", + "requires_dists": [ + "attrs>=22.2.0", + "rpds-py>=0.7.0" + ], + "requires_python": ">=3.8", + "version": "0.33.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", + "url": "https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1", + "url": "https://files.pythonhosted.org/packages/9d/be/10918a2eac4ae9f02f6cfe6414b7a155ccd8f7f9d4380d62fd5b955065c3/requests-2.31.0.tar.gz" + } + ], + "project_name": "requests", + "requires_dists": [ + "PySocks!=1.5.7,>=1.5.6; extra == \"socks\"", + "certifi>=2017.4.17", + "chardet<6,>=3.0.2; extra == \"use_chardet_on_py3\"", + "charset-normalizer<4,>=2", + "idna<4,>=2.5", + "urllib3<3,>=1.21.1" + ], + "requires_python": ">=3.7", + "version": "2.31.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "0387ce69ba06e43df54e43968090f3626e231e4bc9150e4c3246947567695f68", + "url": "https://files.pythonhosted.org/packages/cc/ba/57aaaed3eca5364b62f589226a951385a262e1ca43b2001230e651140b82/rpds_py-0.17.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "1a746a6d49665058a5896000e8d9d2f1a6acba8a03b389c1e4c06e11e0b7f40d", + "url": "https://files.pythonhosted.org/packages/00/3d/c9f14bd0fe218cab78bd9492a98452b976fdd81d3455cac712fd5391de66/rpds_py-0.17.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "4341bd7579611cf50e7b20bb8c2e23512a3dc79de987a1f411cb458ab670eb90", + "url": "https://files.pythonhosted.org/packages/01/22/97251b0cad75f095515bc5a4b29d90d3d832db8e1f52b2d152a4acfa4ff9/rpds_py-0.17.1-cp38-cp38-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "1db228102ab9d1ff4c64148c96320d0be7044fa28bd865a9ce628ce98da5973d", + "url": "https://files.pythonhosted.org/packages/03/56/40fcb8fd0b47a6d18c89c7a703f4dc5f9d7a4010f3ce89c0898c8b5b7ce3/rpds_py-0.17.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "dbc56680ecf585a384fbd93cd42bc82668b77cb525343170a2d86dafaed2a84b", + "url": "https://files.pythonhosted.org/packages/04/72/60da2fe91ba80df82f9d915853caf85ba752969386d4a9f940222785ba38/rpds_py-0.17.1-cp39-cp39-musllinux_1_2_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "93432e747fb07fa567ad9cc7aaadd6e29710e515aabf939dfbed8046041346c6", + "url": "https://files.pythonhosted.org/packages/05/65/cb09320f4370558fd4def77c7b2ef4598f33f8c5a25f8c398433d380b327/rpds_py-0.17.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "81038ff87a4e04c22e1d81f947c6ac46f122e0c80460b9006e6517c4d842a6ec", + "url": "https://files.pythonhosted.org/packages/05/70/5359707d52036b6a505bcad4715cc4b4b6cec993bb60b5fbf58a5e4caf52/rpds_py-0.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "1d36b2b59e8cc6e576f8f7b671e32f2ff43153f0ad6d0201250a7c07f25d570e", + "url": "https://files.pythonhosted.org/packages/07/98/a41783e68a2ac040e073b0b461e0a2a11957cc4c81f00e870ba65b5fa61c/rpds_py-0.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "be22ae34d68544df293152b7e50895ba70d2a833ad9566932d750d3625918b82", + "url": "https://files.pythonhosted.org/packages/11/b4/87b4dbde5b736fbb183723995b659550fe1f01312d3efd11bed700c21442/rpds_py-0.17.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "1701fc54460ae2e5efc1dd6350eafd7a760f516df8dbe51d4a1c79d69472fbd4", + "url": "https://files.pythonhosted.org/packages/18/d9/2e2d2f8940e2c083d0824c1ef02bffa4153b90f642915af975b59c06570a/rpds_py-0.17.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "99f567dae93e10be2daaa896e07513dd4bf9c2ecf0576e0533ac36ba3b1d5394", + "url": "https://files.pythonhosted.org/packages/19/31/dfebe878e523467815cdb90dcd7a336ad82d89b95f270120f7c86b109359/rpds_py-0.17.1-cp310-cp310-musllinux_1_2_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "5e7d63ec01fe7c76c2dbb7e972fece45acbb8836e72682bde138e7e039906e2c", + "url": "https://files.pythonhosted.org/packages/19/91/f9c5b190dfb6b15748be3daac8e6aaf79238a2ef5f024e419ce14a706783/rpds_py-0.17.1-cp39-cp39-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "25f071737dae674ca8937a73d0f43f5a52e92c2d178330b4c0bb6ab05586ffa6", + "url": "https://files.pythonhosted.org/packages/1d/e6/65960425f06551e691c63008bc347131dd26faa49cce835eb02747961b67/rpds_py-0.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "8587fd64c2a91c33cdc39d0cebdaf30e79491cc029a37fcd458ba863f8815383", + "url": "https://files.pythonhosted.org/packages/23/7d/eb1ef72452698bac1922d7cd45684462c8878bc62430433c55f4e56e9a94/rpds_py-0.17.1-cp311-cp311-musllinux_1_2_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "24e4900a6643f87058a27320f81336d527ccfe503984528edde4bb660c8c8d59", + "url": "https://files.pythonhosted.org/packages/26/15/23c842b858e55e6c6a90584aaedeaa0babb51be43374a071c5b2a02a1364/rpds_py-0.17.1-cp310-cp310-musllinux_1_2_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "b9412abdf0ba70faa6e2ee6c0cc62a8defb772e78860cef419865917d86c7342", + "url": "https://files.pythonhosted.org/packages/28/31/18a86a7d6541a9ac56d8894355e89fb7c4f9d335e70f53886849e38879a7/rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "fad059a4bd14c45776600d223ec194e77db6c20255578bb5bcdd7c18fd169361", + "url": "https://files.pythonhosted.org/packages/34/70/70c6e645b018e8eeda96729a55207796c3d35a2cd96ccdf80537c7ae5ec1/rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "071bc28c589b86bc6351a339114fb7a029f5cddbaca34103aa573eba7b482382", + "url": "https://files.pythonhosted.org/packages/35/6a/7fc90ac9839d3ca8fd9a70e03aedaf801c47066c821a4858ef872c61f693/rpds_py-0.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "9737bdaa0ad33d34c0efc718741abaafce62fadae72c8b251df9b0c823c63b22", + "url": "https://files.pythonhosted.org/packages/3a/f5/b8b0e144d72cf3a8cae1a78a7531e9f65335a07bf05ac540c4d687ad5769/rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "01f58a7306b64e0a4fe042047dd2b7d411ee82e54240284bab63e325762c1147", + "url": "https://files.pythonhosted.org/packages/3d/87/739721933efd9c30f11afdada39e3c7369e12a150fe24b91bdebbed40bb2/rpds_py-0.17.1-cp311-cp311-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "d65e6b4f1443048eb7e833c2accb4fa7ee67cc7d54f31b4f0555b474758bee55", + "url": "https://files.pythonhosted.org/packages/44/ad/a6239f13ea36818dc8b35366bfb34daf1f81e7873a732aa8e105861ba3b6/rpds_py-0.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "10162fe3f5f47c37ebf6d8ff5a2368508fe22007e3077bf25b9c7d803454d921", + "url": "https://files.pythonhosted.org/packages/48/e9/55408800f3e894a2b7146b8b677bfa0e2592bd9321e1b198f310d94a176b/rpds_py-0.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "b686f25377f9c006acbac63f61614416a6317133ab7fafe5de5f7dc8a06d42eb", + "url": "https://files.pythonhosted.org/packages/49/7e/acb4fdab48d02d10e3f9e15d6aef5e828cd8b1c87a982eebc7780855caac/rpds_py-0.17.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl" + }, + { + "algorithm": "sha256", + "hash": "02866e060219514940342a1f84303a1ef7a1dad0ac311792fbbe19b521b489d2", + "url": "https://files.pythonhosted.org/packages/4b/5d/200e08402ccfd0bbdae89385fc606f496ae9d78a7ce65dbf8d542587f00e/rpds_py-0.17.1-cp312-cp312-musllinux_1_2_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "4128980a14ed805e1b91a7ed551250282a8ddf8201a4e9f8f5b7e6225f54170d", + "url": "https://files.pythonhosted.org/packages/4b/c4/20eb92aaf7ba5e22076c2f7bc9f7fea23766c025b584f1bd9ec1f9a40b5a/rpds_py-0.17.1-cp310-cp310-macosx_10_12_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "149c5cd24f729e3567b56e1795f74577aa3126c14c11e457bec1b1c90d212e38", + "url": "https://files.pythonhosted.org/packages/4e/47/2eb405f92c22050127faf0eddcde1d77e60f13aab2232de3807243555483/rpds_py-0.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "2528ff96d09f12e638695f3a2e0c609c7b84c6df7c5ae9bfeb9252b6fa686253", + "url": "https://files.pythonhosted.org/packages/4e/7e/f2874d5544f63943551560cdae6beb721d69e037e1031502d6b165b49957/rpds_py-0.17.1-cp312-cp312-musllinux_1_2_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "9584f8f52010295a4a417221861df9bea4c72d9632562b6e59b3c7b87a1522b7", + "url": "https://files.pythonhosted.org/packages/4e/ea/bd34895a0414e122f13aa728eb303e89f3e7a21819244970bde342601a8e/rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "698ea95a60c8b16b58be9d854c9f993c639f5c214cf9ba782eca53a8789d6b19", + "url": "https://files.pythonhosted.org/packages/4f/4b/4abf2aab6622f99bc40e61c63cb5479221f9aa0910c5b8a69d94d26960c3/rpds_py-0.17.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "3664d126d3388a887db44c2e293f87d500c4184ec43d5d14d2d2babdb4c64cad", + "url": "https://files.pythonhosted.org/packages/57/0c/282f542441f77d5576bbbb6fb9157c384540ae0137a78584abd0ff52922a/rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "60e820ee1004327609b28db8307acc27f5f2e9a0b185b2064c5f23e815f248f8", + "url": "https://files.pythonhosted.org/packages/59/cf/63db812a31e09f37c9ff9704c13f599d5f4ffd0611e05621e5aecd142176/rpds_py-0.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "1957a2ab607f9added64478a6982742eb29f109d89d065fa44e01691a20fc20a", + "url": "https://files.pythonhosted.org/packages/5d/dd/319673ee3a4bb9d2d457f97f7ef7935aaf03f26809a221acd8b905ea55d6/rpds_py-0.17.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "70fcc6c2906cfa5c6a552ba7ae2ce64b6c32f437d8f3f8eea49925b278a61453", + "url": "https://files.pythonhosted.org/packages/65/35/8c8d782fc0a6ffd399082218a8a95c778bc54caddd6a4798e4aac853c165/rpds_py-0.17.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "b760a56e080a826c2e5af09002c1a037382ed21d03134eb6294812dda268c811", + "url": "https://files.pythonhosted.org/packages/6a/43/8310f9ee3ed0b797f5c03b42a50c3602d1ff3c8b66932d74ca20e6918add/rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "516fb8c77805159e97a689e2f1c80655c7658f5af601c34ffdb916605598cda2", + "url": "https://files.pythonhosted.org/packages/6d/70/770443ab1cf2161fc5b2902fa599f2a6bda870c4f9631322f5e7180b2800/rpds_py-0.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "f0b8bf5b8db49d8fd40f54772a1dcf262e8be0ad2ab0206b5a2ec109c176c0a4", + "url": "https://files.pythonhosted.org/packages/6e/59/9a69b44699f9c04008ba785e1207d42a5a8ba54f8b1537ab50b41be7cf6f/rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "efa767c220d94aa4ac3a6dd3aeb986e9f229eaf5bce92d8b1b3018d06bed3772", + "url": "https://files.pythonhosted.org/packages/70/40/ed790a153853be7e38164dc8226fbb75e27bb1df49ff393aa457f862cebf/rpds_py-0.17.1-cp39-cp39-musllinux_1_2_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "ff1dcb8e8bc2261a088821b2595ef031c91d499a0c1b031c152d43fe0a6ecec8", + "url": "https://files.pythonhosted.org/packages/73/58/c557424dbeac270b2855095725576e5e58f9917a86ff2fb1424222b17f85/rpds_py-0.17.1-cp310-cp310-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "060f412230d5f19fc8c8b75f315931b408d8ebf56aec33ef4168d1b9e54200b1", + "url": "https://files.pythonhosted.org/packages/75/e5/578843811ebea706e559b560791a862d8c7661980d264e9480c9853142ca/rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "aa5bfb13f1e89151ade0eb812f7b0d7a4d643406caaad65ce1cbabe0a66d695f", + "url": "https://files.pythonhosted.org/packages/7a/00/cabd74dbdc0136e3fb3ce184db3c82c70f22e24313dd3ca81eeca6249290/rpds_py-0.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "a967dd6afda7715d911c25a6ba1517975acd8d1092b2f326718725461a3d33f9", + "url": "https://files.pythonhosted.org/packages/7a/5a/626831fdfb80d925c652beb6e756dec6df2e92a4ee52bac59b94d2f9d7d4/rpds_py-0.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "a3264e3e858de4fc601741498215835ff324ff2482fd4e4af61b46512dd7fc83", + "url": "https://files.pythonhosted.org/packages/7a/9c/073a7f31c18625ff59cc59a2a25ce1f526c7151857492c450df423390c78/rpds_py-0.17.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "810685321f4a304b2b55577c915bece4c4a06dfe38f6e62d9cc1d6ca8ee86b99", + "url": "https://files.pythonhosted.org/packages/7f/38/4f16f61dbd9f44a9c5c75214fbcf5beaca296839ec37988009c0d5404fa9/rpds_py-0.17.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl" + }, + { + "algorithm": "sha256", + "hash": "7b7d9ca34542099b4e185b3c2a2b2eda2e318a7dbde0b0d83357a6d4421b5296", + "url": "https://files.pythonhosted.org/packages/7f/ca/d699d6218598cae408600f933856dd5b39459f1e95a9bcc6aa3cba421eab/rpds_py-0.17.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "3677fcca7fb728c86a78660c7fb1b07b69b281964673f486ae72860e13f512ad", + "url": "https://files.pythonhosted.org/packages/81/b0/74b33b84af9ee49ef4f11f6a2c7aa7713209604b4d7aae259ac153cc19a8/rpds_py-0.17.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl" + }, + { + "algorithm": "sha256", + "hash": "1f3c3461ebb4c4f1bbc70b15d20b565759f97a5aaf13af811fcefc892e9197ba", + "url": "https://files.pythonhosted.org/packages/82/2c/4868c0049d22cef3af9469bf7ac26a75681d24302c747fa893a7652068c5/rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "c64602e8be701c6cfe42064b71c84ce62ce66ddc6422c15463fd8127db3d8066", + "url": "https://files.pythonhosted.org/packages/84/8d/03cbd505e8e6741de8cd4b08a76b31454969dc2fc6029a547034a026de32/rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl" + }, + { + "algorithm": "sha256", + "hash": "b86b21b348f7e5485fae740d845c65a880f5d1eda1e063bc59bef92d1f7d0c55", + "url": "https://files.pythonhosted.org/packages/85/e2/4c30bc7407eb81e56937f4fe8cb70569a458fe7b9db23f5dc82a4678535e/rpds_py-0.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "5d0e8a6434a3fbf77d11448c9c25b2f25244226cfbec1a5159947cac5b8c5fa4", + "url": "https://files.pythonhosted.org/packages/89/11/9a7e60514ee1a579231756d0dce10f5bf016a91f02c2eed4f7c3e6098c82/rpds_py-0.17.1-cp39-cp39-musllinux_1_2_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "720215373a280f78a1814becb1312d4e4d1077b1202a56d2b0815e95ccb99ce9", + "url": "https://files.pythonhosted.org/packages/8c/f1/09bee4d70305e79ecad4f3ccee583f0185c06a5f58befdc3544cf8b18536/rpds_py-0.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "637b802f3f069a64436d432117a7e58fab414b4e27a7e81049817ae94de45d8d", + "url": "https://files.pythonhosted.org/packages/90/9c/90d239dd9c41a30c55147f9ba3adcf02f6a42d49dbbe6e45978fc71ea72a/rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "df3b6f45ba4515632c5064e35ca7f31d51d13d1479673185ba8f9fefbbed58b9", + "url": "https://files.pythonhosted.org/packages/91/de/ca7978f9e4deb9a9b19469a412857dbf9faa0b9a059167927e76713842ec/rpds_py-0.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "f2f3b28b40fddcb6c1f1f6c88c6f3769cd933fa493ceb79da45968a21dccc920", + "url": "https://files.pythonhosted.org/packages/92/72/381d513f8a7d7eba523924fec395bde36bad1caf5918ef76a9d1913b8958/rpds_py-0.17.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "ae35e8e6801c5ab071b992cb2da958eee76340e6926ec693b5ff7d6381441745", + "url": "https://files.pythonhosted.org/packages/93/75/5f18ed35fa2a4fb3a5ea9b82eff1fc6e94439f10125bfb85021aff2a4aaa/rpds_py-0.17.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl" + }, + { + "algorithm": "sha256", + "hash": "5a024fa96d541fd7edaa0e9d904601c6445e95a729a2900c5aec6555fe921ed6", + "url": "https://files.pythonhosted.org/packages/94/20/4b8e1a364deebbf8961739c54725842bd07a5a2d506571ff68801d27b78a/rpds_py-0.17.1-cp38-cp38-musllinux_1_2_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "f175e95a197f6a4059b50757a3dca33b32b61691bdbd22c29e8a8d21d3914cae", + "url": "https://files.pythonhosted.org/packages/97/f1/37d7d4ea8af857eeebd4ae7783cdaa661ea714f27a9b2f1054cc3452eda2/rpds_py-0.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "1e626b365293a2142a62b9a614e1f8e331b28f3ca57b9f05ebbf4cf2a0f0bdc5", + "url": "https://files.pythonhosted.org/packages/9c/32/7cad18b3caec48c38b5eee91f4344d27bfe3038fbf24e4a5068ac8255c2b/rpds_py-0.17.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "2953937f83820376b5979318840f3ee47477d94c17b940fe31d9458d79ae7eea", + "url": "https://files.pythonhosted.org/packages/9f/05/83adc3ad25a7009a4118a1e934a1e30405fe8213668b8e0dd096ebeafa4f/rpds_py-0.17.1-cp311-cp311-musllinux_1_2_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "9bdf1303df671179eaf2cb41e8515a07fc78d9d00f111eadbe3e14262f59c3d0", + "url": "https://files.pythonhosted.org/packages/9f/54/ce2f4d6d84c2df09120d04d527e902f1fc842c86d9fa4d140823820feba0/rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "a71169d505af63bb4d20d23a8fbd4c6ce272e7bce6cc31f617152aa784436f29", + "url": "https://files.pythonhosted.org/packages/a1/ce/6378632d508ca2ffab6d20d0179af80eb4919dc40887cd984f81ce74ac9a/rpds_py-0.17.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl" + }, + { + "algorithm": "sha256", + "hash": "65dcf105c1943cba45d19207ef51b8bc46d232a381e94dd38719d52d3980015b", + "url": "https://files.pythonhosted.org/packages/a3/42/bf5c6075cbcc22e782809b7149b1d1cb1aac3066126c25b3c70127cacc72/rpds_py-0.17.1-cp311-cp311-macosx_10_12_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "ffee088ea9b593cc6160518ba9bd319b5475e5f3e578e4552d63818773c6f56a", + "url": "https://files.pythonhosted.org/packages/a6/41/7322226884709e931dc25c4e9a4f6479cbccd7354146986ec040f4a2fe6a/rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "91e5a8200e65aaac342a791272c564dffcf1281abd635d304d6c4e6b495f29dc", + "url": "https://files.pythonhosted.org/packages/a9/02/dc7aee95a685c49506120142f4d790d78db31b8433d70af67bb985f29037/rpds_py-0.17.1-cp310-cp310-musllinux_1_2_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "5576ee2f3a309d2bb403ec292d5958ce03953b0e57a11d224c1f134feaf8c40f", + "url": "https://files.pythonhosted.org/packages/aa/8a/6a5f809d7425c96cc4787d361fd3c5e9e6a99b57f2ed030bd0c480e127b4/rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl" + }, + { + "algorithm": "sha256", + "hash": "82ada4a8ed9e82e443fcef87e22a3eed3654dd3adf6e3b3a0deb70f03e86142a", + "url": "https://files.pythonhosted.org/packages/ac/fb/df413d319151b272b967de1edcbe5cf94a94c8a6f397ad9685c2ab8237e9/rpds_py-0.17.1-cp312-cp312-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "e796051f2070f47230c745d0a77a91088fbee2cc0502e9b796b9c6471983718c", + "url": "https://files.pythonhosted.org/packages/b4/d2/f0d4c9e703544605a208c11a50aefe2e947c394ce1e28e783036252ccdda/rpds_py-0.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl" + }, + { + "algorithm": "sha256", + "hash": "938eab7323a736533f015e6069a7d53ef2dcc841e4e533b782c2bfb9fb12d84b", + "url": "https://files.pythonhosted.org/packages/b5/93/ae7f6854223ad5495d8e316d326e0456dc86805fd1f7bcee350264776ae1/rpds_py-0.17.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "0210b2668f24c078307260bf88bdac9d6f1093635df5123789bfee4d8d7fc8e7", + "url": "https://files.pythonhosted.org/packages/b7/0a/e3bdcc977e6db3bf32a3f42172f583adfa7c3604091a03d512333e0161fe/rpds_py-0.17.1.tar.gz" + }, + { + "algorithm": "sha256", + "hash": "436474f17733c7dca0fbf096d36ae65277e8645039df12a0fa52445ca494729d", + "url": "https://files.pythonhosted.org/packages/b9/c3/bc96d2fdc470b371834ccb88e42396b999480cb251db4a4e649e25d67b77/rpds_py-0.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "dfe07308b311a8293a0d5ef4e61411c5c20f682db6b5e73de6c7c8824272c256", + "url": "https://files.pythonhosted.org/packages/c2/e9/190521d63b504c12bdcffb27ea6aaac1dbb2521be983c3a2a0ab4a938b8c/rpds_py-0.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "f7f4cb1f173385e8a39c29510dd11a78bf44e360fb75610594973f5ea141028b", + "url": "https://files.pythonhosted.org/packages/c2/f6/10bc5700db7e87119ec46a2a3f54dcbf1ca06e797c01fcc5129bab61280f/rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl" + }, + { + "algorithm": "sha256", + "hash": "bf046179d011e6114daf12a534d874958b039342b347348a78b7cdf0dd9d6041", + "url": "https://files.pythonhosted.org/packages/c3/de/453a8cfd81b0e4acbdeb0fa53dd131096ed444abc04f5055a0d79f8e0340/rpds_py-0.17.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "4e21b76075c01d65d0f0f34302b5a7457d95721d5e0667aea65e5bb3ab415c25", + "url": "https://files.pythonhosted.org/packages/c9/f6/38e6f84289afdf21d7381ec5d1acdfbc449d5dd864c63254583009681e1e/rpds_py-0.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + }, + { + "algorithm": "sha256", + "hash": "4dc889a9d8a34758d0fcc9ac86adb97bab3fb7f0c4d29794357eb147536483fd", + "url": "https://files.pythonhosted.org/packages/cc/bd/7cedb55b2c2cca135fa51108c7b76e45fdb595042300e48425ad3008df1c/rpds_py-0.17.1-cp311-cp311-musllinux_1_2_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "bd345a13ce06e94c753dab52f8e71e5252aec1e4f8022d24d56decd31e1b9b23", + "url": "https://files.pythonhosted.org/packages/d5/c8/b625150080495ba5a3850ecac8c087734ea25eae1cd2559f8c345287b39a/rpds_py-0.17.1-cp312-cp312-musllinux_1_2_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "f6c43b6f97209e370124baf2bf40bb1e8edc25311a158867eb1c3a5d449ebc7a", + "url": "https://files.pythonhosted.org/packages/d6/ed/98be10c544a38e3ac69803838adbfddfe5d08c7b0db9bd2a06b91480da35/rpds_py-0.17.1-cp39-cp39-macosx_10_12_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "3ac732390d529d8469b831949c78085b034bff67f584559340008d0f6041a049", + "url": "https://files.pythonhosted.org/packages/d8/f4/15e8b8c8c7874e5f0f5e95a77fdbe5d53a65c262b876a8acad9c51f35c23/rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "9051e3d2af8f55b42061603e29e744724cb5f65b128a491446cc029b3e2ea896", + "url": "https://files.pythonhosted.org/packages/d9/45/2fbe6a881ec1c2776be63c3a01c0364f462a5e61a3be7a4198f04dca7c24/rpds_py-0.17.1-cp38-cp38-musllinux_1_2_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "7450dbd659fed6dd41d1a7d47ed767e893ba402af8ae664c157c255ec6067fde", + "url": "https://files.pythonhosted.org/packages/db/4d/883e705b209e6d61c850239c5ac51f550e812eafbf39dfe8f454f08b8fb6/rpds_py-0.17.1-cp38-cp38-musllinux_1_2_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "d8bbd8e56f3ba25a7d0cf980fc42b34028848a53a0e36c9918550e0280b9d0b6", + "url": "https://files.pythonhosted.org/packages/dd/26/f1b95db937d9186c36158a130ec0205dd1821c1f512e883a853d53608cc9/rpds_py-0.17.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "9f0e4dc0f17dcea4ab9d13ac5c666b6b5337042b4d8f27e01b70fae41dd65c57", + "url": "https://files.pythonhosted.org/packages/de/cd/821d5d1c4bde92de43911e548ca04ba26d0141423c9434d5ca8b5569567b/rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "1dc29db3900cb1bb40353772417800f29c3d078dbc8024fd64655a04ee3c4bdf", + "url": "https://files.pythonhosted.org/packages/e2/53/aa31622ce16dd52dbec5cff38c66e094410d7b6fac6704c0d7c39ef4a940/rpds_py-0.17.1-cp312-cp312-macosx_10_12_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "2f4eb548daf4836e3b2c662033bfbfc551db58d30fd8fe660314f86bf8510b93", + "url": "https://files.pythonhosted.org/packages/e4/82/c3b6e98f31b46d9803890a9c703d9af1647a8069358155a7e329e6ba38e3/rpds_py-0.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + }, + { + "algorithm": "sha256", + "hash": "c3d2010656999b63e628a3c694f23020322b4178c450dc478558a2b6ef3cb9bb", + "url": "https://files.pythonhosted.org/packages/ea/14/276b74099992d1e520cd3434f83624f1e2687de634ecd2c1b55c066a96cd/rpds_py-0.17.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "380e0df2e9d5d5d339803cfc6d183a5442ad7ab3c63c2a0982e8c824566c5ccc", + "url": "https://files.pythonhosted.org/packages/eb/f1/4f58ff3a0f3f5672dfcdad8485fc04458171e21cc89475770caf70fc9f34/rpds_py-0.17.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl" + }, + { + "algorithm": "sha256", + "hash": "8ffe53e1d8ef2520ebcf0c9fec15bb721da59e8ef283b6ff3079613b1e30513d", + "url": "https://files.pythonhosted.org/packages/ed/b4/0bcfcea3ee957c418c805949f320b11caebfca499f22f63a768fda843619/rpds_py-0.17.1-cp38-cp38-macosx_10_12_x86_64.whl" + }, + { + "algorithm": "sha256", + "hash": "a000133a90eea274a6f28adc3084643263b1e7c1a5a66eb0a0a7a36aa757ed74", + "url": "https://files.pythonhosted.org/packages/f4/0e/1d8b50d00a6400deec873600b563807e570132c88344ed2055c7b4ae461e/rpds_py-0.17.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "dbbb95e6fc91ea3102505d111b327004d1c4ce98d56a4a02e82cd451f9f57140", + "url": "https://files.pythonhosted.org/packages/f4/25/69998601cc3e81f2bd583e107ad0999537f65820693f7e5ce9aabdbfb2fa/rpds_py-0.17.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl" + }, + { + "algorithm": "sha256", + "hash": "7fbd70cb8b54fe745301921b0816c08b6d917593429dfc437fd024b5ba713c58", + "url": "https://files.pythonhosted.org/packages/f8/50/e68d0816c51421fcabfd53bd5c7e3e2a1ce41c98e8fcc94ab7a7e94cdc90/rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + } + ], + "project_name": "rpds-py", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "0.17.1" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "f39195d38da1748331eeec52f1276e71eb6295e7949beea91a5e9af2340d7b3b", + "url": "https://files.pythonhosted.org/packages/c8/8c/a0f14f2fcdd846839c478048032b2fc93293deaa936ff6751f27dcf50995/rstr-3.2.2-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "c4a564d4dfb4472d931d145c43d1cf1ad78c24592142e7755b8866179eeac012", + "url": "https://files.pythonhosted.org/packages/9f/80/d7449656d45a776b7a443ce3af4eb97c4debe416a1a80f60311c7cfd02ff/rstr-3.2.2.tar.gz" + } + ], + "project_name": "rstr", + "requires_dists": [], + "requires_python": ">=3.7", + "version": "3.2.2" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254", + "url": "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "url": "https://files.pythonhosted.org/packages/71/39/171f1c67cd00715f190ba0b100d606d440a28c93c7714febeca8b79af85e/six-1.16.0.tar.gz" + } + ], + "project_name": "six", + "requires_dists": [], + "requires_python": "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7", + "version": "1.16.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "8d3ef7e6997e8e42dd55c74166ed21e6ac70664caa32dd940b26d54a8f6b4142", + "url": "https://files.pythonhosted.org/packages/fc/d9/d97f1db64b09278aba64e8c81b5d322d436132df5741c518f3823824fae0/smart_open-6.4.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "be3c92c246fbe80ebce8fbacb180494a481a77fcdcb7c1aadb2ea5b9c2bee8b9", + "url": "https://files.pythonhosted.org/packages/ac/69/bf2e8a00fbf9bf9f27734c4f3f2030fb422c4d8b1594bb9fc763561a4ec2/smart_open-6.4.0.tar.gz" + } + ], + "project_name": "smart-open", + "requires_dists": [ + "azure-common; extra == \"all\"", + "azure-common; extra == \"azure\"", + "azure-common; extra == \"test\"", + "azure-core; extra == \"all\"", + "azure-core; extra == \"azure\"", + "azure-core; extra == \"test\"", + "azure-storage-blob; extra == \"all\"", + "azure-storage-blob; extra == \"azure\"", + "azure-storage-blob; extra == \"test\"", + "boto3; extra == \"all\"", + "boto3; extra == \"s3\"", + "boto3; extra == \"test\"", + "google-cloud-storage>=2.6.0; extra == \"all\"", + "google-cloud-storage>=2.6.0; extra == \"gcs\"", + "google-cloud-storage>=2.6.0; extra == \"test\"", + "moto[server]; extra == \"test\"", + "paramiko; extra == \"all\"", + "paramiko; extra == \"ssh\"", + "paramiko; extra == \"test\"", + "pytest-rerunfailures; extra == \"test\"", + "pytest; extra == \"test\"", + "requests; extra == \"all\"", + "requests; extra == \"http\"", + "requests; extra == \"test\"", + "requests; extra == \"webhdfs\"", + "responses; extra == \"test\"" + ], + "requires_python": "<4.0,>=3.6", + "version": "6.4.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd", + "url": "https://files.pythonhosted.org/packages/b7/f4/6a90020cd2d93349b442bfcb657d0dc91eee65491600b2cb1d388bc98e6b/typing_extensions-4.9.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", + "url": "https://files.pythonhosted.org/packages/0c/1d/eb26f5e75100d531d7399ae800814b069bc2ed2a7410834d57374d010d96/typing_extensions-4.9.0.tar.gz" + } + ], + "project_name": "typing-extensions", + "requires_dists": [], + "requires_python": ">=3.8", + "version": "4.9.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3", + "url": "https://files.pythonhosted.org/packages/96/94/c31f58c7a7f470d5665935262ebd7455c7e4c7782eb525658d3dbf4b9403/urllib3-2.1.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54", + "url": "https://files.pythonhosted.org/packages/36/dd/a6b232f449e1bc71802a5b7950dc3675d32c6dbc2a1bd6d71f065551adb6/urllib3-2.1.0.tar.gz" + } + ], + "project_name": "urllib3", + "requires_dists": [ + "brotli>=1.0.9; platform_python_implementation == \"CPython\" and extra == \"brotli\"", + "brotlicffi>=0.8.0; platform_python_implementation != \"CPython\" and extra == \"brotli\"", + "pysocks!=1.5.7,<2.0,>=1.5.6; extra == \"socks\"", + "zstandard>=0.18.0; extra == \"zstd\"" + ], + "requires_python": ">=3.8", + "version": "2.1.0" + }, + { + "artifacts": [ + { + "algorithm": "sha256", + "hash": "0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31", + "url": "https://files.pythonhosted.org/packages/d9/66/48866fc6b158c81cc2bfecc04c480f105c6040e8b077bc54c634b4a67926/zipp-3.17.0-py3-none-any.whl" + }, + { + "algorithm": "sha256", + "hash": "84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0", + "url": "https://files.pythonhosted.org/packages/58/03/dd5ccf4e06dec9537ecba8fcc67bbd4ea48a2791773e469e73f94c3ba9a6/zipp-3.17.0.tar.gz" + } + ], + "project_name": "zipp", + "requires_dists": [ + "big-O; extra == \"testing\"", + "furo; extra == \"docs\"", + "jaraco.functools; extra == \"testing\"", + "jaraco.itertools; extra == \"testing\"", + "jaraco.packaging>=9.3; extra == \"docs\"", + "jaraco.tidelift>=1.4; extra == \"docs\"", + "more-itertools; extra == \"testing\"", + "pytest-black>=0.3.7; platform_python_implementation != \"PyPy\" and extra == \"testing\"", + "pytest-checkdocs>=2.4; extra == \"testing\"", + "pytest-cov; extra == \"testing\"", + "pytest-enabler>=2.2; extra == \"testing\"", + "pytest-ignore-flaky; extra == \"testing\"", + "pytest-mypy>=0.9.1; platform_python_implementation != \"PyPy\" and extra == \"testing\"", + "pytest-ruff; extra == \"testing\"", + "pytest>=6; extra == \"testing\"", + "rst.linker>=1.9; extra == \"docs\"", + "sphinx-lint; extra == \"docs\"", + "sphinx<7.2.5; extra == \"docs\"", + "sphinx>=3.5; extra == \"docs\"" + ], + "requires_python": ">=3.8", + "version": "3.17.0" + } + ], + "platform_tag": null + } + ], + "path_mappings": {}, + "pex_version": "2.1.137", + "pip_version": "23.1.2", + "prefer_older_binary": false, + "requirements": [ + "faker>=15.3.4", + "jsonschema>=4.17.3", + "pydantic>=2.0.0", + "rstr>=3.2.0", + "smart-open[http]>=6.3.0" + ], + "requires_python": [ + "<4,>=3.8" + ], + "resolver_version": "pip-2020-resolver", + "style": "universal", + "target_systems": [ + "linux", + "mac" + ], + "transitive": true, + "use_pep517": null +} diff --git a/jsf/BUILD b/jsf/BUILD index 88c78bb..607bdd5 100644 --- a/jsf/BUILD +++ b/jsf/BUILD @@ -1,7 +1,5 @@ python_sources(name="src") -python_requirements(name="reqs") - resources( name="build_resources", sources=["README.md", "LICENSE"], @@ -10,19 +8,17 @@ resources( python_distribution( name="jsf-dist", entry_points={ - "console_scripts": { - "jsf": "jsf.cli:app" - }, + "console_scripts": {"jsf": "jsf.cli:app"}, }, dependencies=[ - ":src", - ":build_resources", + ":src", + ":build_resources", "./tests:tests", ], long_description_path="README.md", provides=python_artifact( name="jsf", - version="0.10.0", + version="0.10.1", author="ghandic", description="Creates fake JSON files from a JSON schema", url="https://github.com/ghandic/jsf", @@ -45,12 +41,6 @@ python_distribution( ], zip_safe=True, python_requires=">=3.8", - extras_require={"cli": ["typer>=0.7.0"]} + extras_require={"cli": ["typer>=0.7.0"]}, ), ) - - - - - - \ No newline at end of file diff --git a/jsf/README.md b/jsf/README.md index 8dbb642..e202f9b 100644 --- a/jsf/README.md +++ b/jsf/README.md @@ -26,8 +26,7 @@ Use **jsf** along with fake data generators to provide consistent and meaningful ## Main Features - Provides out of the box data generation from any JSON schema 📦 - -* Extendable custom data providers using any lambda functions 🔗 +- Extendable custom data providers using any lambda functions 🔗 - Multi level state for dependant data (eg multiple objects sharing value, such as children with same surname) 🤓 - Inbuilt validation of fake JSON produced ✅ - In memory conversion from JSON Schema to Pydantic Models with generated examples 🤯 diff --git a/jsf/parser.py b/jsf/parser.py index 1d49ec2..c9859b9 100644 --- a/jsf/parser.py +++ b/jsf/parser.py @@ -5,11 +5,13 @@ from copy import deepcopy from datetime import datetime from itertools import count +from pathlib import Path from types import MappingProxyType from typing import Any, Dict, List, Optional, Tuple, Union from faker import Faker from jsonschema import validate +from pydantic import confloat from smart_open import open as s_open from jsf.schema_types import ( @@ -30,6 +32,14 @@ class JSF: + """The JSF class generates fake data based on a provided JSON Schema. + + Attributes: + root_schema (Dict[str, Any]): The JSON schema based on which the fake data is generated. + definitions (Dict): A dictionary to store definitions used in the JSON schema. + base_state (Dict[str, Any]): A dictionary that represents the state of the parser. It includes a counter, a list of all JSON paths, and the provided initial state. + """ + def __init__( self, schema: Dict[str, Any], @@ -42,8 +52,17 @@ def __init__( } ), initial_state: Dict[str, Any] = MappingProxyType({}), - allow_none_optionals: float = 0.5, + allow_none_optionals: confloat(ge=0.0, le=1.0) = 0.5, ): + """Initializes the JSF generator with the provided schema and + configuration options. + + Args: + schema (Dict[str, Any]): The JSON schema based on which the fake data is generated. + context (Dict[str, Any], optional): A dictionary that provides additional utilities for handling the schema, such as a faker for generating fake data, a random number generator, and datetime utilities. It also includes an internal dictionary for handling List, Union, and Tuple types. Defaults to a dictionary with "faker", "random", "datetime", and "__internal__" keys. + initial_state (Dict[str, Any], optional): A dictionary that represents the initial state of the parser. If you wish to extend the state so it can be accesses by your schema you can add any references in here. Defaults to an empty dictionary. + allow_none_optionals (confloat, optional): A parameter that determines the probability of optional fields being set to None. Defaults to 0.5. + """ self.root_schema = schema self.definitions = {} self.base_state = { @@ -57,6 +76,32 @@ def __init__( self.root = None self._parse(schema) + @staticmethod + def from_json( + path: Path, + context: Dict[str, Any] = MappingProxyType( + { + "faker": faker, + "random": random, + "datetime": datetime, + "__internal__": {"List": List, "Union": Union, "Tuple": Tuple}, + } + ), + initial_state: Dict[str, Any] = MappingProxyType({}), + allow_none_optionals: confloat(ge=0.0, le=1.0) = 0.5, + ) -> "JSF": + """Initializes the JSF generator with the provided schema at the given + path and configuration options. + + Args: + path (Path): The path to the JSON schema based on which the fake data is generated. + context (Dict[str, Any], optional): A dictionary that provides additional utilities for handling the schema, such as a faker for generating fake data, a random number generator, and datetime utilities. It also includes an internal dictionary for handling List, Union, and Tuple types. Defaults to a dictionary with "faker", "random", "datetime", and "__internal__" keys. + initial_state (Dict[str, Any], optional): A dictionary that represents the initial state of the parser. If you wish to extend the state so it can be accesses by your schema you can add any references in here. Defaults to an empty dictionary. + allow_none_optionals (confloat, optional): A parameter that determines the probability of optional fields being set to None. Defaults to 0.5. + """ + with open(path) as f: + return JSF(json.load(f), context, initial_state, allow_none_optionals) + def __parse_primitive(self, name: str, path: str, schema: Dict[str, Any]) -> PrimitiveTypes: item_type, is_nullable = self.__is_field_nullable(schema) cls = Primitives.get(item_type) @@ -247,22 +292,29 @@ def context(self): return {**self.base_context, "state": deepcopy(self.base_state)} def generate(self, n: Optional[int] = None) -> Any: + """Generates a fake object from the provided schema, and returns the + output. + + If n is provided, it returns a list of n objects. If n is 1 then + it returns a single object. + """ if n is None or n == 1: return self.root.generate(context=self.context) return [self.root.generate(context=self.context) for _ in range(n)] def pydantic(self): + """Generates a fake object from the provided schema and provides the + output as a Pydantic model.""" return self.root.model(context=self.context)[0] def generate_and_validate(self) -> None: + """Generates a fake object from the provided schema and performs + validation on the result.""" fake = self.root.generate(context=self.context) validate(instance=fake, schema=self.root_schema) - def to_json(self, path: str) -> None: + def to_json(self, path: Path, **kwargs) -> None: + """Generates a fake object from the provided schema and saves the + output to the given path.""" with open(path, "w") as f: - json.dump(self.generate(), f, indent=2) - - @staticmethod - def from_json(path: str) -> "JSF": - with open(path, "r") as f: - return JSF(json.load(f)) + json.dump(self.generate(), f, **kwargs) diff --git a/jsf/schema_types/_tuple.py b/jsf/schema_types/_tuple.py index 87b369b..27fc643 100644 --- a/jsf/schema_types/_tuple.py +++ b/jsf/schema_types/_tuple.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, List, Optional, Tuple, Union +from typing import Any, Dict, List, Optional, Tuple, Type, Union from pydantic import Field @@ -16,17 +16,17 @@ class JSFTuple(BaseSchema): fixed: Optional[Union[int, str]] = Field(None, alias="$fixed") @classmethod - def from_dict(cls, d: Dict): + def from_dict(cls, d: Dict[str, Any]) -> "JSFTuple": return JSFTuple(**d) def generate(self, context: Dict[str, Any]) -> Optional[List[Tuple]]: - # TODO: Random drop out "It’s ok to not provide all of the items" + # TODO: Random drop out "It's ok to not provide all of the items" try: return super().generate(context) except ProviderNotSetException: return tuple(item.generate(context) for item in self.items) - def model(self, context: Dict[str, Any]): + def model(self, context: Dict[str, Any]) -> Tuple[Type, Any]: _type = eval( f"Tuple[{','.join([item.model(context)[0].__name__ for item in self.items])}]", context["__internal__"], diff --git a/jsf/schema_types/allof.py b/jsf/schema_types/allof.py index 7053ca3..78cfe71 100644 --- a/jsf/schema_types/allof.py +++ b/jsf/schema_types/allof.py @@ -7,7 +7,7 @@ class AllOf(BaseSchema): combined_schema: BaseSchema = None @classmethod - def from_dict(cls, d: Dict): + def from_dict(cls, d: Dict[str, Any]) -> "AllOf": return AllOf(**d) def generate(self, context: Dict[str, Any]) -> Optional[Any]: @@ -16,5 +16,5 @@ def generate(self, context: Dict[str, Any]) -> Optional[Any]: except ProviderNotSetException: return self.combined_schema.generate(context) - def model(self, context: Dict[str, Any]): + def model(self, context: Dict[str, Any]) -> None: pass diff --git a/jsf/schema_types/anyof.py b/jsf/schema_types/anyof.py index 2ebda9a..34043af 100644 --- a/jsf/schema_types/anyof.py +++ b/jsf/schema_types/anyof.py @@ -8,7 +8,7 @@ class AnyOf(BaseSchema): schemas: List[BaseSchema] = None @classmethod - def from_dict(cls, d: Dict): + def from_dict(cls, d: Dict[str, Any]) -> "AnyOf": return AnyOf(**d) def generate(self, context: Dict[str, Any]) -> Optional[Any]: @@ -17,5 +17,5 @@ def generate(self, context: Dict[str, Any]) -> Optional[Any]: except ProviderNotSetException: return random.choice(self.schemas).generate(context) - def model(self, context: Dict[str, Any]): + def model(self, context: Dict[str, Any]) -> None: pass diff --git a/jsf/schema_types/array.py b/jsf/schema_types/array.py index bb047a1..9e18f19 100644 --- a/jsf/schema_types/array.py +++ b/jsf/schema_types/array.py @@ -1,5 +1,5 @@ import random -from typing import Any, Dict, List, Optional, Union +from typing import Any, Dict, List, Optional, Tuple, Type, Union from pydantic import Field @@ -15,7 +15,7 @@ class Array(BaseSchema): fixed: Optional[Union[int, str]] = Field(None, alias="$fixed") @classmethod - def from_dict(cls, d: Dict): + def from_dict(cls, d: Dict[str, Any]) -> "Array": return Array(**d) def generate(self, context: Dict[str, Any]) -> Optional[List[Any]]: @@ -43,7 +43,7 @@ def generate(self, context: Dict[str, Any]) -> Optional[List[Any]]: output = list(output) return output - def model(self, context: Dict[str, Any]): + def model(self, context: Dict[str, Any]) -> Tuple[Type, Any]: _type = eval( f"List[Union[{','.join([self.items.model(context)[0].__name__])}]]", context["__internal__"], diff --git a/jsf/schema_types/base.py b/jsf/schema_types/base.py index fd7acc1..9e1d09e 100644 --- a/jsf/schema_types/base.py +++ b/jsf/schema_types/base.py @@ -1,9 +1,10 @@ import logging import random import uuid -from typing import Any, Dict, List, Optional, Union +from typing import Any, Dict, List, Optional, Tuple, Type, Union from pydantic import BaseModel, Field +from typing_extensions import Self logger = logging.getLogger() @@ -15,16 +16,16 @@ class ProviderNotSetException(Exception): class BaseSchema(BaseModel): # The type keyword is fundamental to JSON Schema. It specifies the data type for a schema. type: Optional[Union[str, List[str]]] = None - # The title and description keywords must be strings. A “title” will preferably be short, whereas a “description” will provide a more lengthy explanation about the purpose of the data described by the schema. + # The title and description keywords must be strings. A "title" will preferably be short, whereas a "description" will provide a more lengthy explanation about the purpose of the data described by the schema. title: Optional[str] = None description: Optional[str] = None - # The default keyword specifies a default value for an item. JSON processing tools may use this information to provide a default value for a missing key/value pair, though many JSON schema validators simply ignore the default keyword. It should validate against the schema in which it resides, but that isn’t required. + # The default keyword specifies a default value for an item. JSON processing tools may use this information to provide a default value for a missing key/value pair, though many JSON schema validators simply ignore the default keyword. It should validate against the schema in which it resides, but that isn't required. default: Optional[Any] = None - # The examples keyword is a place to provide an array of examples that validate against the schema. This isn’t used for validation, but may help with explaining the effect and purpose of the schema to a reader. Each entry should validate against the schema in which is resides, but that isn’t strictly required. There is no need to duplicate the default value in the examples array, since default will be treated as another example. + # The examples keyword is a place to provide an array of examples that validate against the schema. This isn't used for validation, but may help with explaining the effect and purpose of the schema to a reader. Each entry should validate against the schema in which is resides, but that isn't strictly required. There is no need to duplicate the default value in the examples array, since default will be treated as another example. examples: Optional[List[Any]] = None # The $schema keyword is used to declare that a JSON fragment is actually a piece of JSON Schema. It also declares which version of the JSON Schema standard that the schema was written against. schema_: Optional[str] = Field(None, alias="$schema") - # The $comment keyword is strictly intended for adding comments to the JSON schema source. Its value must always be a string. Unlike the annotations title, description and examples, JSON schema implementations aren’t allowed to attach any meaning or behavior to it whatsoever, and may even strip them at any time. Therefore, they are useful for leaving notes to future editors of a JSON schema, (which is quite likely your future self), but should not be used to communicate to users of the schema. + # The $comment keyword is strictly intended for adding comments to the JSON schema source. Its value must always be a string. Unlike the annotations title, description and examples, JSON schema implementations aren't allowed to attach any meaning or behavior to it whatsoever, and may even strip them at any time. Therefore, they are useful for leaving notes to future editors of a JSON schema, (which is quite likely your future self), but should not be used to communicate to users of the schema. comments: Optional[str] = Field(None, alias="$comments") # JSF Custom fields @@ -36,7 +37,7 @@ class BaseSchema(BaseModel): allow_none_optionals: float = Field(0.5, ge=0.0, le=1.0) @classmethod - def from_dict(cls, d: Dict): + def from_dict(cls, d: Dict[str, Any]) -> Self: raise NotImplementedError # pragma: no cover def generate(self, context: Dict[str, Any]) -> Any: @@ -49,15 +50,15 @@ def generate(self, context: Dict[str, Any]) -> Any: return eval(self.provider, context)() raise ProviderNotSetException() - def model(self, context: Dict[str, Any]) -> Any: + def model(self, context: Dict[str, Any]) -> Optional[Tuple[Type, Field]]: raise NotImplementedError # pragma: no cover - def _get_unique_name(self, context): + def _get_unique_name(self, context: Dict[str, Any]) -> str: if context["__internal__"].get(self.name.capitalize()) is None: return self.name.capitalize() return self.name.capitalize() + str(uuid.uuid4().hex) - def to_pydantic(self, context, _type): + def to_pydantic(self, context: Dict[str, Any], _type: Type) -> Tuple[Type, Field]: example = self.generate(context) if self.is_nullable: return ( diff --git a/jsf/schema_types/boolean.py b/jsf/schema_types/boolean.py index 29ed855..ba111b5 100644 --- a/jsf/schema_types/boolean.py +++ b/jsf/schema_types/boolean.py @@ -1,5 +1,5 @@ import random -from typing import Any, Dict, Optional +from typing import Any, Dict, Optional, Tuple, Type from jsf.schema_types.base import BaseSchema, ProviderNotSetException @@ -11,9 +11,9 @@ def generate(self, context: Dict[str, Any]) -> Optional[bool]: except ProviderNotSetException: return random.choice([True, False]) - def model(self, context: Dict[str, Any]): + def model(self, context: Dict[str, Any]) -> Tuple[Type, Any]: return self.to_pydantic(context, bool) @classmethod - def from_dict(cls, d: Dict): + def from_dict(cls, d: Dict[str, Any]) -> "Boolean": return Boolean(**d) diff --git a/jsf/schema_types/enum.py b/jsf/schema_types/enum.py index c0c1569..f7bf1e2 100644 --- a/jsf/schema_types/enum.py +++ b/jsf/schema_types/enum.py @@ -1,7 +1,7 @@ import logging import random from enum import Enum -from typing import Any, Dict, List, Optional, Union +from typing import Any, Dict, List, Optional, Tuple, Type, Union from pydantic import ConfigDict @@ -13,6 +13,7 @@ class JSFEnum(BaseSchema): enum: Optional[List[Union[str, int, float, None]]] = [] + model_config = ConfigDict() def generate(self, context: Dict[str, Any]) -> Optional[Union[str, int, float]]: try: @@ -21,10 +22,10 @@ def generate(self, context: Dict[str, Any]) -> Optional[Union[str, int, float]]: return random.choice(self.enum) @classmethod - def from_dict(cls, d: Dict): + def from_dict(cls, d: Dict[str, Any]) -> "JSFEnum": return JSFEnum(**d) - def model(self, context: Dict[str, Any]): + def model(self, context: Dict[str, Any]) -> Tuple[Type, Any]: base = _types.get(self.type, str) _type = Enum( value=self._get_unique_name(context), @@ -33,5 +34,3 @@ def model(self, context: Dict[str, Any]): ) context["__internal__"][_type.__name__] = _type return self.to_pydantic(context, _type) - - model_config = ConfigDict() diff --git a/jsf/schema_types/null.py b/jsf/schema_types/null.py index 069aab2..566af31 100644 --- a/jsf/schema_types/null.py +++ b/jsf/schema_types/null.py @@ -1,4 +1,4 @@ -from typing import Any, Dict +from typing import Any, Dict, Tuple, Type from jsf.schema_types.base import BaseSchema, ProviderNotSetException @@ -10,9 +10,9 @@ def generate(self, context: Dict[str, Any]) -> None: except ProviderNotSetException: return None - def model(self, context: Dict[str, Any]): + def model(self, context: Dict[str, Any]) -> Tuple[Type, Any]: return self.to_pydantic(context, type(None)) @classmethod - def from_dict(cls, d: Dict): + def from_dict(cls, d: Dict[str, Any]) -> "Null": return Null(**d) diff --git a/jsf/schema_types/number.py b/jsf/schema_types/number.py index 38cd63d..a1c7eee 100644 --- a/jsf/schema_types/number.py +++ b/jsf/schema_types/number.py @@ -1,6 +1,6 @@ import math import random -from typing import Any, Dict, Optional, Union +from typing import Any, Dict, Optional, Tuple, Type, Union from jsf.schema_types.base import BaseSchema, ProviderNotSetException @@ -37,11 +37,11 @@ def generate(self, context: Dict[str, Any]) -> Optional[float]: step * random.randint(math.ceil(float(_min) / step), math.floor(float(_max) / step)) ) - def model(self, context: Dict[str, Any]): + def model(self, context: Dict[str, Any]) -> Tuple[Type, Any]: return self.to_pydantic(context, float) @classmethod - def from_dict(cls, d: Dict): + def from_dict(cls, d: Dict[str, Any]) -> "Number": return Number(**d) @@ -50,9 +50,9 @@ def generate(self, context: Dict[str, Any]) -> Optional[int]: n = super().generate(context) return int(n) if n is not None else n - def model(self, context: Dict[str, Any]): + def model(self, context: Dict[str, Any]) -> Tuple[Type, Any]: return self.to_pydantic(context, int) @classmethod - def from_dict(cls, d: Dict): + def from_dict(cls, d: Dict[str, Any]) -> "Integer": return Integer(**d) diff --git a/jsf/schema_types/object.py b/jsf/schema_types/object.py index f9ff747..a77a988 100644 --- a/jsf/schema_types/object.py +++ b/jsf/schema_types/object.py @@ -1,6 +1,6 @@ import logging import random -from typing import Any, Dict, List, Optional, Union +from typing import Any, Dict, List, Optional, Tuple, Type, Union import rstr from pydantic import BaseModel, create_model @@ -29,7 +29,7 @@ class Object(BaseSchema): patternProperties: Optional[Dict[str, BaseSchema]] = None @classmethod - def from_dict(cls, d: dict): + def from_dict(cls, d: Dict[str, Any]) -> "Object": return Object(**d) def should_keep(self, property_name: str) -> bool: @@ -52,7 +52,7 @@ def generate(self, context: Dict[str, Any]) -> Optional[Dict[str, Any]]: pattern_props[rstr.xeger(o.name)] = o.generate(context) return {**pattern_props, **explicit_properties} - def model(self, context: Dict[str, Any]): + def model(self, context: Dict[str, Any]) -> Tuple[Type, Any]: self.generate(context) name = self._get_unique_name(context) _type = create_model(name, **{o.name: o.model(context) for o in self.properties}) diff --git a/jsf/schema_types/oneof.py b/jsf/schema_types/oneof.py index 99cfda9..7fea1af 100644 --- a/jsf/schema_types/oneof.py +++ b/jsf/schema_types/oneof.py @@ -8,7 +8,7 @@ class OneOf(BaseSchema): schemas: List[BaseSchema] = None @classmethod - def from_dict(cls, d: Dict): + def from_dict(cls, d: Dict[str, Any]) -> "OneOf": return OneOf(**d) def generate(self, context: Dict[str, Any]) -> Optional[List[Any]]: @@ -17,5 +17,5 @@ def generate(self, context: Dict[str, Any]) -> Optional[List[Any]]: except ProviderNotSetException: return random.choice(self.schemas).generate(context) - def model(self, context: Dict[str, Any]): + def model(self, context: Dict[str, Any]) -> None: pass diff --git a/jsf/schema_types/string.py b/jsf/schema_types/string.py index 5611881..3e79840 100644 --- a/jsf/schema_types/string.py +++ b/jsf/schema_types/string.py @@ -2,7 +2,7 @@ import random import re from datetime import timezone -from typing import Any, Callable, Dict, Optional +from typing import Any, Callable, Dict, Optional, Tuple, Type import rstr from faker import Faker @@ -71,7 +71,7 @@ def mostly_zero_randint(_min: int, _max: int) -> int: return 0 if random.random() > 0.8 else random.randint(int(_min), int(_max)) -def fake_duration(): +def fake_duration() -> str: generic_max = 1000 return temporal_duration( positive=random.random() > 0.5, @@ -148,9 +148,9 @@ def generate(self, context: Dict[str, Any]) -> Optional[str]: random_fixed_length_sentence(self.minLength, self.maxLength), self.contentEncoding ) - def model(self, context: Dict[str, Any]): + def model(self, context: Dict[str, Any]) -> Tuple[Type, Any]: return self.to_pydantic(context, str) @classmethod - def from_dict(cls, d: Dict): + def from_dict(cls, d: Dict[str, Any]) -> "String": return String(**d) diff --git a/jsf/schema_types/string_utils/content_type/application__jwt.py b/jsf/schema_types/string_utils/content_type/application__jwt.py index 858a94d..3cef61f 100644 --- a/jsf/schema_types/string_utils/content_type/application__jwt.py +++ b/jsf/schema_types/string_utils/content_type/application__jwt.py @@ -10,11 +10,11 @@ faker = Faker() -def base64url_encode(input: bytes): +def base64url_encode(input: bytes) -> str: return base64.urlsafe_b64encode(input).decode("utf-8").replace("=", "") -def jwt(api_key, expiry, api_sec): +def jwt(api_key: str, expiry: int, api_sec: str) -> str: segments = [] header = {"typ": "JWT", "alg": "HS256"} @@ -37,7 +37,7 @@ def jwt(api_key, expiry, api_sec): return encoded_string -def create_random_jwt(*args, **kwargs): +def create_random_jwt(*args, **kwargs) -> str: api_key = secrets.token_urlsafe(16) api_sec = secrets.token_urlsafe(16) diff --git a/jsf/tests/BUILD b/jsf/tests/BUILD index 7f0e474..db96609 100644 --- a/jsf/tests/BUILD +++ b/jsf/tests/BUILD @@ -2,10 +2,7 @@ python_test_utils( name="test_utils", ) -files( - name="tests", - sources=["data/*.json", "*.py"] -) +files(name="tests", sources=["data/*.json", "*.py"]) python_tests( name="pytest", diff --git a/jsf/tests/test_cli.py b/jsf/tests/test_cli.py index df425c1..bbdaf0d 100644 --- a/jsf/tests/test_cli.py +++ b/jsf/tests/test_cli.py @@ -16,9 +16,9 @@ def test_app(TestData): ) assert result.exit_code == 0 assert file.exists() - with open(file, "r") as f: + with open(file) as f: instance = json.load(f) - with open(TestData / "custom.json", "r") as f: + with open(TestData / "custom.json") as f: schema = json.load(f) validate(instance, schema) finally: diff --git a/jsf/tests/test_default_fake.py b/jsf/tests/test_default_fake.py index 7c3cc94..8771c6e 100644 --- a/jsf/tests/test_default_fake.py +++ b/jsf/tests/test_default_fake.py @@ -7,7 +7,7 @@ def test_fake_object_no_properties(TestData): - with open(TestData / "object_no_properties.json", "r") as file: + with open(TestData / "object_no_properties.json") as file: schema = json.load(file) p = JSF(schema) @@ -15,7 +15,7 @@ def test_fake_object_no_properties(TestData): def test_fake_anyof(TestData): - with open(TestData / "anyof.json", "r") as file: + with open(TestData / "anyof.json") as file: schema = json.load(file) p = JSF(schema) @@ -25,7 +25,7 @@ def test_fake_anyof(TestData): def test_fake_allof(TestData): - with open(TestData / "allof.json", "r") as file: + with open(TestData / "allof.json") as file: schema = json.load(file) p = JSF(schema) @@ -35,7 +35,7 @@ def test_fake_allof(TestData): def test_fake_allof_complex(TestData): - with open(TestData / "allof-complex.json", "r") as file: + with open(TestData / "allof-complex.json") as file: schema = json.load(file) p = JSF(schema) @@ -49,7 +49,7 @@ def test_fake_allof_complex(TestData): def test_fake_anyof_object(TestData): - with open(TestData / "anyof_object.json", "r") as file: + with open(TestData / "anyof_object.json") as file: schema = json.load(file) p = JSF(schema) @@ -60,7 +60,7 @@ def test_fake_anyof_object(TestData): def test_fake_oneof(TestData): - with open(TestData / "oneof.json", "r") as file: + with open(TestData / "oneof.json") as file: schema = json.load(file) p = JSF(schema) @@ -70,7 +70,7 @@ def test_fake_oneof(TestData): def test_fake_oneof_allof(TestData): - with open(TestData / "oneof_allof.json", "r") as file: + with open(TestData / "oneof_allof.json") as file: schema = json.load(file) p = JSF(schema) @@ -80,7 +80,7 @@ def test_fake_oneof_allof(TestData): def test_fake_oneof_object(TestData): - with open(TestData / "oneof_object.json", "r") as file: + with open(TestData / "oneof_object.json") as file: schema = json.load(file) p = JSF(schema) @@ -91,7 +91,7 @@ def test_fake_oneof_object(TestData): def test_fake_boolean(TestData): - with open(TestData / "boolean.json", "r") as file: + with open(TestData / "boolean.json") as file: schema = json.load(file) p = JSF(schema) @@ -102,7 +102,7 @@ def test_fake_boolean(TestData): def test_fake_string(TestData): - with open(TestData / "string.json", "r") as file: + with open(TestData / "string.json") as file: schema = json.load(file) p = JSF(schema) assert isinstance(p.generate(), str) @@ -111,7 +111,7 @@ def test_fake_string(TestData): def test_fake_string_max_min_length(TestData): - with open(TestData / "string-max-min-length.json", "r") as file: + with open(TestData / "string-max-min-length.json") as file: schema = json.load(file) p = JSF(schema) assert isinstance(p.generate(), str) @@ -120,7 +120,7 @@ def test_fake_string_max_min_length(TestData): def test_fake_string_content_encoding(TestData): - with open(TestData / "string-content-encoding.json", "r") as file: + with open(TestData / "string-content-encoding.json") as file: schema = json.load(file) p = JSF(schema) assert isinstance(p.generate(), dict) @@ -131,7 +131,7 @@ def test_fake_string_content_encoding(TestData): def test_fake_string_content_type(TestData): - with open(TestData / "string-content-type.json", "r") as file: + with open(TestData / "string-content-type.json") as file: schema = json.load(file) p = JSF(schema) assert isinstance(p.generate(), dict) @@ -146,7 +146,7 @@ def test_fake_string_content_type(TestData): def test_fake_null(TestData): - with open(TestData / "null.json", "r") as file: + with open(TestData / "null.json") as file: schema = json.load(file) p = JSF(schema) @@ -156,7 +156,7 @@ def test_fake_null(TestData): def test_fake_enum(TestData): - with open(TestData / "enum.json", "r") as file: + with open(TestData / "enum.json") as file: schema = json.load(file) p = JSF(schema) @@ -165,7 +165,7 @@ def test_fake_enum(TestData): def test_fake_string_enum(TestData): - with open(TestData / "string-enum.json", "r") as file: + with open(TestData / "string-enum.json") as file: schema = json.load(file) p = JSF(schema) @@ -174,7 +174,7 @@ def test_fake_string_enum(TestData): def test_fake_int(TestData): - with open(TestData / "integer.json", "r") as file: + with open(TestData / "integer.json") as file: schema = json.load(file) p = JSF(schema) @@ -187,7 +187,7 @@ def test_fake_int(TestData): def test_fake_number(TestData): - with open(TestData / "number.json", "r") as file: + with open(TestData / "number.json") as file: schema = json.load(file) p = JSF(schema) @@ -199,7 +199,7 @@ def test_fake_number(TestData): def test_fake_number_exclusive(TestData): - with open(TestData / "number-exclusive.json", "r") as file: + with open(TestData / "number-exclusive.json") as file: schema = json.load(file) p = JSF(schema) @@ -211,7 +211,7 @@ def test_fake_number_exclusive(TestData): def test_fake_number_exclusive_float(TestData): - with open(TestData / "number-exclusive-float.json", "r") as file: + with open(TestData / "number-exclusive-float.json") as file: schema = json.load(file) p = JSF(schema) @@ -224,7 +224,7 @@ def test_fake_number_exclusive_float(TestData): def test_fake_array(TestData): - with open(TestData / "array.json", "r") as file: + with open(TestData / "array.json") as file: schema = json.load(file) p = JSF(schema) @@ -237,7 +237,7 @@ def test_fake_array(TestData): def test_fake_array_dicts(TestData): - with open(TestData / "array-dicts.json", "r") as file: + with open(TestData / "array-dicts.json") as file: schema = json.load(file) p = JSF(schema) @@ -255,7 +255,7 @@ def test_fake_array_dicts(TestData): def test_fake_array_fixed_int(TestData): - with open(TestData / "array-fixed-int.json", "r") as file: + with open(TestData / "array-fixed-int.json") as file: schema = json.load(file) p = JSF(schema) @@ -266,7 +266,7 @@ def test_fake_array_fixed_int(TestData): def test_fake_array_fixed_str(TestData): - with open(TestData / "array-fixed-str.json", "r") as file: + with open(TestData / "array-fixed-str.json") as file: schema = json.load(file) p = JSF(schema) @@ -277,7 +277,7 @@ def test_fake_array_fixed_str(TestData): def test_fake_tuple(TestData): - with open(TestData / "tuple.json", "r") as file: + with open(TestData / "tuple.json") as file: schema = json.load(file) p = JSF(schema) @@ -291,7 +291,7 @@ def test_fake_tuple(TestData): def test_fake_object(TestData): - with open(TestData / "object.json", "r") as file: + with open(TestData / "object.json") as file: schema = json.load(file) p = JSF(schema) @@ -303,7 +303,7 @@ def test_fake_object(TestData): def test_fake_object_pattern_properties(TestData): - with open(TestData / "object-pattern-properties.json", "r") as file: + with open(TestData / "object-pattern-properties.json") as file: schema = json.load(file) p = JSF(schema) @@ -329,7 +329,7 @@ def assert_regex(pattern: str, string: str, info: Optional[str]) -> None: def test_fake_string_format(TestData): - with open(TestData / "string-format.json", "r") as file: + with open(TestData / "string-format.json") as file: schema = json.load(file) p = JSF(schema) @@ -381,7 +381,7 @@ def test_fake_string_format(TestData): def test_unique_items_array(TestData): - with open(TestData / "unique-items-array.json", "r") as file: + with open(TestData / "unique-items-array.json") as file: schema = json.load(file) p = JSF(schema) fake_data = p.generate(50) @@ -392,7 +392,7 @@ def test_unique_items_array(TestData): def test_const(TestData): - with open(TestData / "const.json", "r") as file: + with open(TestData / "const.json") as file: schema = json.load(file) p = JSF(schema) fake_data = p.generate(50) @@ -403,7 +403,7 @@ def test_const(TestData): def test_external_ref(TestData): - with open(TestData / "external-ref.json", "r") as file: + with open(TestData / "external-ref.json") as file: schema = json.load(file) p = JSF(schema) fake_data = p.generate(50) @@ -418,14 +418,14 @@ def test_external_ref(TestData): def test_gen_and_validate(TestData): - with open(TestData / "custom.json", "r") as file: + with open(TestData / "custom.json") as file: schema = json.load(file) p = JSF(schema) [p.generate_and_validate() for _ in range(50)] def test_list_of_types(TestData): - with open(TestData / "type-list.json", "r") as file: + with open(TestData / "type-list.json") as file: schema = json.load(file) fake_data = [JSF(schema).generate() for _ in range(100)] for f in fake_data: @@ -438,7 +438,7 @@ def test_list_of_types(TestData): def test_non_required_are_not_none(TestData): - with open(TestData / "object-with-optionals.json", "r") as file: + with open(TestData / "object-with-optionals.json") as file: schema = json.load(file) for _ in range(10): fake_data = JSF(schema, allow_none_optionals=0.0).generate() diff --git a/jsf/tests/test_model_gen.py b/jsf/tests/test_model_gen.py index f2a5bbb..c03013b 100644 --- a/jsf/tests/test_model_gen.py +++ b/jsf/tests/test_model_gen.py @@ -27,7 +27,7 @@ else: def test_gen_model_list(TestData): - with open(TestData / "array.json", "r") as file: + with open(TestData / "array.json") as file: schema = json.load(file) p = JSF(schema) Model = p.pydantic() @@ -35,7 +35,7 @@ def test_gen_model_list(TestData): def test_gen_model_tuple(TestData): - with open(TestData / "tuple.json", "r") as file: + with open(TestData / "tuple.json") as file: schema = json.load(file) p = JSF(schema) Model = p.pydantic() @@ -47,7 +47,7 @@ def test_gen_model_tuple(TestData): expected, ) def test_gen_model(TestData, filestem, expected_type_anno): - with open(TestData / f"{filestem}.json", "r") as file: + with open(TestData / f"{filestem}.json") as file: schema = json.load(file) p = JSF(schema) Model = p.pydantic() diff --git a/jsf/tests/test_nullable_types_gen.py b/jsf/tests/test_nullable_types_gen.py index 244c9c5..f0cf417 100644 --- a/jsf/tests/test_nullable_types_gen.py +++ b/jsf/tests/test_nullable_types_gen.py @@ -4,7 +4,7 @@ def test_string_null_gen(TestData): - with open(TestData / "type-list-null.json", "r") as file: + with open(TestData / "type-list-null.json") as file: schema = json.load(file) p = JSF(schema["str"]) @@ -14,7 +14,7 @@ def test_string_null_gen(TestData): def test_int_null_gen(TestData): - with open(TestData / "type-list-null.json", "r") as file: + with open(TestData / "type-list-null.json") as file: schema = json.load(file) p = JSF(schema["int"]) @@ -23,7 +23,7 @@ def test_int_null_gen(TestData): def test_number_null_gen(TestData): - with open(TestData / "type-list-null.json", "r") as file: + with open(TestData / "type-list-null.json") as file: schema = json.load(file) p = JSF(schema["num"]) @@ -32,7 +32,7 @@ def test_number_null_gen(TestData): def test_boolean_null_gen(TestData): - with open(TestData / "type-list-null.json", "r") as file: + with open(TestData / "type-list-null.json") as file: schema = json.load(file) p = JSF(schema["bool"]) @@ -41,7 +41,7 @@ def test_boolean_null_gen(TestData): def test_enum_null_gen(TestData): - with open(TestData / "type-list-null.json", "r") as file: + with open(TestData / "type-list-null.json") as file: schema = json.load(file) p = JSF(schema["enum"]) @@ -50,7 +50,7 @@ def test_enum_null_gen(TestData): def test_array_null_gen(TestData): - with open(TestData / "type-list-null.json", "r") as file: + with open(TestData / "type-list-null.json") as file: schema = json.load(file) p = JSF(schema["arr"]) @@ -59,7 +59,7 @@ def test_array_null_gen(TestData): def test_array_nested_null_gen(TestData): - with open(TestData / "type-list-null.json", "r") as file: + with open(TestData / "type-list-null.json") as file: schema = json.load(file) p = JSF(schema["arr_nested"]) @@ -70,7 +70,7 @@ def test_array_nested_null_gen(TestData): def test_object_null_gen(TestData): - with open(TestData / "type-list-null.json", "r") as file: + with open(TestData / "type-list-null.json") as file: schema = json.load(file) p = JSF(schema["obj"]) @@ -79,7 +79,7 @@ def test_object_null_gen(TestData): def test_object_nested_null_gen(TestData): - with open(TestData / "type-list-null.json", "r") as file: + with open(TestData / "type-list-null.json") as file: schema = json.load(file) p = JSF(schema["obj_nested"]) diff --git a/jsf/tests/test_parser.py b/jsf/tests/test_parser.py index 346f4ce..15c6f74 100644 --- a/jsf/tests/test_parser.py +++ b/jsf/tests/test_parser.py @@ -33,7 +33,7 @@ ], ) def test_types(TestData, filestem, expected_type): - with open(TestData / f"{filestem}.json", "r") as file: + with open(TestData / f"{filestem}.json") as file: schema = json.load(file) p = JSF(schema) @@ -41,7 +41,7 @@ def test_types(TestData, filestem, expected_type): def test_nested_array(TestData): - with open(TestData / "array.json", "r") as file: + with open(TestData / "array.json") as file: schema = json.load(file) p = JSF(schema) @@ -51,7 +51,7 @@ def test_nested_array(TestData): def test_nested_tuple(TestData): - with open(TestData / "tuple.json", "r") as file: + with open(TestData / "tuple.json") as file: schema = json.load(file) p = JSF(schema) @@ -62,7 +62,7 @@ def test_nested_tuple(TestData): def test_nested_object(TestData): - with open(TestData / "object.json", "r") as file: + with open(TestData / "object.json") as file: schema = json.load(file) p = JSF(schema) @@ -78,7 +78,7 @@ def test_nested_object(TestData): def test_nested_object_ref(TestData): - with open(TestData / "inner-ref.json", "r") as file: + with open(TestData / "inner-ref.json") as file: schema = json.load(file) p = JSF(schema) @@ -97,7 +97,7 @@ def test_nested_object_ref(TestData): def test_ordered_refs_object(TestData): - with open(TestData / "ordered-refs.json", "r") as file: + with open(TestData / "ordered-refs.json") as file: schema = json.load(file) p = JSF(schema) @@ -112,7 +112,7 @@ def test_ordered_refs_object(TestData): def test_unordered_refs_object(TestData): - with open(TestData / "unordered-refs.json", "r") as file: + with open(TestData / "unordered-refs.json") as file: schema = json.load(file) p = JSF(schema) diff --git a/jsf/tests/test_utils.py b/jsf/tests/test_utils.py index a877b7f..ed79057 100644 --- a/jsf/tests/test_utils.py +++ b/jsf/tests/test_utils.py @@ -1,5 +1,4 @@ import pytest # pants: no-infer-dep - from jsf.schema_types.string import random_fixed_length_sentence diff --git a/mkdocs.yml b/mkdocs.yml index 87a01fd..b5031ba 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -5,45 +5,89 @@ repo_url: "https://github.com/ghandic/jsf" repo_name: "ghandic/jsf" nav: - - Getting Started: index.md + - JSF: index.md - Features: features.md - - JSON Schema Intro: intro-to-json-schema.md - - Tutorial - User Guide: - - Tutorial - User Guide - Intro: user-guide/intro.md - - First Steps: user-guide/first-steps.md - - Alternatives, Inspiration and Comparisons: alternatives.md - - Help jsf - Get Help: help-us.md - - Development - Contributing: contributing.md - - Code of Conduct: code-of-conduct.md + - Learn: + - JSON Schema Intro: intro-to-json-schema.md + - Tutorial - User Guide: user-guide/first-steps.md + - Advanced User Guide: user-guide/advanced.md + - About: + - About: about/about.md + - Alternatives, Inspiration and Comparisons: about/alternatives.md + - Code of Conduct: about/code-of-conduct.md + - Help: + - Help: help/index.md + - Get Help: help/get-help.md + - Help jsf - Contributing: help/contributing.md - Release Notes: release-notes.md theme: name: material - custom_dir: docs/overrides logo: assets/imgs/index.png favicon: assets/imgs/index.png + features: + - search.suggest + - search.highlight + - content.tabs.link + - navigation.indexes + - content.tooltips + - navigation.path + - content.code.annotate + - content.code.copy + - content.code.select + - navigation.tabs palette: - scheme: youtube + + # Palette toggle for automatic mode + - media: "(prefers-color-scheme)" + scheme: slate + primary: blue + accent: yellow + toggle: + icon: material/lightbulb + name: Switch to light mode + + # Palette toggle for light mode + - media: '(prefers-color-scheme: light)' + scheme: default + primary: blue + accent: yellow + toggle: + icon: material/lightbulb + name: Switch to dark mode + + # Palette toggle for dark mode + - media: '(prefers-color-scheme: dark)' + scheme: slate + primary: blue + accent: yellow + toggle: + icon: material/lightbulb-outline + name: Switch to system preference extra_css: - assets/css/styles.css -extra_javascript: - - assets/js/theme.js - markdown_extensions: - admonition - codehilite: guess_lang: false + - pymdownx.highlight: + anchor_linenums: true + line_spans: __span + pygments_lang_class: true + - pymdownx.inlinehilite + - pymdownx.snippets - pymdownx.superfences - pymdownx.emoji: - emoji_index: !!python/name:materialx.emoji.twemoji - emoji_generator: !!python/name:materialx.emoji.to_svg + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg - pymdownx.tabbed - toc: permalink: "¤" - pymdownx.tasklist: custom_checkbox: true + plugins: - search @@ -56,6 +100,13 @@ plugins: show_if_no_docstring: no watch: - jsf + - termynal: + title: "shell" + buttons: "macos" + prompt_literal_start: + - "$" + - ">" + - ">>>" extra: social: diff --git a/mypy.ini b/mypy.ini deleted file mode 100644 index 976ba02..0000000 --- a/mypy.ini +++ /dev/null @@ -1,2 +0,0 @@ -[mypy] -ignore_missing_imports = True diff --git a/pants b/pants deleted file mode 100755 index 59f720d..0000000 --- a/pants +++ /dev/null @@ -1,510 +0,0 @@ -#!/usr/bin/env bash -# Copyright 2020 Pants project contributors (see CONTRIBUTORS.md). -# Licensed under the Apache License, Version 2.0 (see LICENSE). - -# =============================== NOTE =============================== -# This ./pants bootstrap script comes from the pantsbuild/setup -# project. It is intended to be checked into your code repository so -# that other developers have the same setup. -# -# Learn more here: https://www.pantsbuild.org/docs/installation -# ==================================================================== - -set -eou pipefail - -# an arbitrary number: bump when there's a change that someone might want to query for -# (e.g. checking $(PANTS_BOOTSTRAP_TOOLS=1 ./pants version) >= ...) -SCRIPT_VERSION=1 - -# Source any custom bootstrap settings for Pants from PANTS_BOOTSTRAP if it exists. -: ${PANTS_BOOTSTRAP:=".pants.bootstrap"} -if [[ -f "${PANTS_BOOTSTRAP}" ]]; then - source "${PANTS_BOOTSTRAP}" -fi - -# NOTE: To use an unreleased version of Pants from the pantsbuild/pants main branch, -# locate the main branch SHA, set PANTS_SHA= in the environment, and run this script as usual. -# -# E.g., PANTS_SHA=725fdaf504237190f6787dda3d72c39010a4c574 ./pants --version -# -# You can also use PANTS_VERSION= to override the config version that is in the pants.toml file. -# -# E.g., PANTS_VERSION=2.13.0 ./pants --version - -PYTHON_BIN_NAME="${PYTHON:-unspecified}" - -# Set this to specify a non-standard location for this script to read the Pants version from. -# NB: This will *not* cause Pants itself to use this location as a config file. -# You can use PANTS_CONFIG_FILES or --pants-config-files to do so. -PANTS_TOML=${PANTS_TOML:-pants.toml} - -PANTS_BIN_NAME="${PANTS_BIN_NAME:-$0}" - -PANTS_SETUP_CACHE="${PANTS_SETUP_CACHE:-${XDG_CACHE_HOME:-$HOME/.cache}/pants/setup}" -# If given a relative path, we fix it to be absolute. -if [[ "$PANTS_SETUP_CACHE" != /* ]]; then - PANTS_SETUP_CACHE="${PWD}/${PANTS_SETUP_CACHE}" -fi - -PANTS_BOOTSTRAP="${PANTS_SETUP_CACHE}/bootstrap-$(uname -s)-$(uname -m)" - -_PEX_VERSION=2.1.103 -_PEX_URL="https://github.com/pantsbuild/pex/releases/download/v${_PEX_VERSION}/pex" -_PEX_EXPECTED_SHA256="4d45336511484100ae4e2bab24542a8b86b12c8cb89230463593c60d08c4b8d3" - -VIRTUALENV_VERSION=20.4.7 -VIRTUALENV_REQUIREMENTS=$( -cat << EOF -virtualenv==${VIRTUALENV_VERSION} --hash sha256:2b0126166ea7c9c3661f5b8e06773d28f83322de7a3ff7d06f0aed18c9de6a76 -filelock==3.0.12 --hash sha256:929b7d63ec5b7d6b71b0fa5ac14e030b3f70b75747cef1b10da9b879fef15836 -six==1.16.0 --hash sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 -distlib==0.3.2 --hash sha256:23e223426b28491b1ced97dc3bbe183027419dfc7982b4fa2f05d5f3ff10711c -appdirs==1.4.4 --hash sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128 -importlib-resources==5.1.4; python_version < "3.7" --hash sha256:e962bff7440364183203d179d7ae9ad90cb1f2b74dcb84300e88ecc42dca3351 -importlib-metadata==4.5.0; python_version < "3.8" --hash sha256:833b26fb89d5de469b24a390e9df088d4e52e4ba33b01dc5e0e4f41b81a16c00 -zipp==3.4.1; python_version < "3.10" --hash sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098 -typing-extensions==3.10.0.0; python_version < "3.8" --hash sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84 -EOF -) - -COLOR_RED="\x1b[31m" -COLOR_GREEN="\x1b[32m" -COLOR_YELLOW="\x1b[33m" -COLOR_RESET="\x1b[0m" - -INSTALL_URL="https://www.pantsbuild.org/docs/installation" - -function log() { - echo -e "$@" 1>&2 -} - -function die() { - (($# > 0)) && log "${COLOR_RED}$*${COLOR_RESET}" - exit 1 -} - -function green() { - (($# > 0)) && log "${COLOR_GREEN}$*${COLOR_RESET}" -} - -function warn() { - (($# > 0)) && log "${COLOR_YELLOW}$*${COLOR_RESET}" -} - -function tempdir { - mkdir -p "$1" - mktemp -d "$1"/pants.XXXXXX -} - -function get_exe_path_or_die { - local exe="$1" - if ! command -v "${exe}"; then - die "Could not find ${exe}. Please ensure ${exe} is on your PATH." - fi -} - -function get_pants_config_string_value { - local config_key="$1" - local optional_space="[[:space:]]*" - local prefix="^${config_key}${optional_space}=${optional_space}" - local raw_value - raw_value="$(sed -ne "/${prefix}/ s|${prefix}||p" "${PANTS_TOML}")" - local optional_suffix="${optional_space}(#.*)?$" - echo "${raw_value}" \ - | sed -E \ - -e "s|^'([^']*)'${optional_suffix}|\1|" \ - -e 's|^"([^"]*)"'"${optional_suffix}"'$|\1|' \ - && return 0 - return 0 -} - -function get_python_major_minor_version { - local python_exe="$1" - "$python_exe" </dev/null 2>&1; then - continue - fi - if [[ -n "$(check_python_exe_compatible_version "${interpreter_path}")" ]]; then - echo "${interpreter_path}" && return 0 - fi - done -} - -function determine_python_exe { - local pants_version="$1" - set_supported_python_versions "${pants_version}" - local requirement_str="For \`pants_version = \"${pants_version}\"\`, Pants requires Python ${supported_message} to run." - - local python_exe - if [[ "${PYTHON_BIN_NAME}" != 'unspecified' ]]; then - python_exe="$(get_exe_path_or_die "${PYTHON_BIN_NAME}")" || exit 1 - if [[ -z "$(check_python_exe_compatible_version "${python_exe}")" ]]; then - die "Invalid Python interpreter version for ${python_exe}. ${requirement_str}" - fi - else - python_exe="$(determine_default_python_exe)" - if [[ -z "${python_exe}" ]]; then - die "No valid Python interpreter found. ${requirement_str} Please check that a valid interpreter is installed and on your \$PATH." - fi - fi - echo "${python_exe}" -} - -function compute_sha256 { - local python="$1" - local path="$2" - - "$python" <&2 || exit 1 - fi - echo "${bootstrapped}" -} - -function scrub_env_vars { - # Ensure the virtualenv PEX runs as shrink-wrapped. - # See: https://github.com/pantsbuild/setup/issues/105 - local -r pex_env_vars=(${!PEX_@}) - if [[ ! ${#pex_env_vars[@]} -eq 0 ]]; then - local -r pex_env_vars_to_scrub="${pex_env_vars[@]/PEX_ROOT}" - if [[ -n "${pex_env_vars_to_scrub[@]}" ]]; then - warn "Scrubbing ${pex_env_vars_to_scrub[@]}" - unset ${pex_env_vars_to_scrub[@]} - fi - fi - # Also ensure pip doesn't think packages on PYTHONPATH - # are already installed. - if [ -n "${PYTHONPATH:-}" ]; then - warn "Scrubbing PYTHONPATH" - unset PYTHONPATH - fi -} - -function bootstrap_virtualenv { - local python="$1" - local bootstrapped="${PANTS_BOOTSTRAP}/virtualenv-${VIRTUALENV_VERSION}/virtualenv.pex" - if [[ ! -f "${bootstrapped}" ]]; then - ( - green "Creating the virtualenv PEX." - pex_path="$(bootstrap_pex "${python}")" || exit 1 - mkdir -p "${PANTS_BOOTSTRAP}" - local staging_dir - staging_dir=$(tempdir "${PANTS_BOOTSTRAP}") - echo "${VIRTUALENV_REQUIREMENTS}" > "${staging_dir}/requirements.txt" - ( - scrub_env_vars - "${python}" "${pex_path}" -r "${staging_dir}/requirements.txt" -c virtualenv -o "${staging_dir}/virtualenv.pex" - ) - mkdir -p "$(dirname "${bootstrapped}")" - mv -f "${staging_dir}/virtualenv.pex" "${bootstrapped}" - rm -rf "${staging_dir}" - ) 1>&2 || exit 1 - fi - echo "${bootstrapped}" -} - -function find_links_url { - local pants_version="$1" - local pants_sha="$2" - echo -n "https://binaries.pantsbuild.org/wheels/pantsbuild.pants/${pants_sha}/${pants_version/+/%2B}/index.html" -} - -function get_version_for_sha { - local sha="$1" - - # Retrieve the Pants version associated with this commit. - local pants_version - pants_version="$(curl --proto "=https" \ - --tlsv1.2 \ - --fail \ - --silent \ - --location \ - "https://raw.githubusercontent.com/pantsbuild/pants/${sha}/src/python/pants/VERSION")" - - # Construct the version as the release version from src/python/pants/VERSION, plus the string `+gitXXXXXXXX`, - # where the XXXXXXXX is the first 8 characters of the SHA. - echo "${pants_version}+git${sha:0:8}" -} - -function bootstrap_pants { - local pants_version="$1" - local python="$2" - local pants_sha="${3:-}" - local pants_debug="${4:-}" - - local pants_requirements=(pantsbuild.pants==${pants_version}) - local maybe_find_links - if [[ -z "${pants_sha}" ]]; then - maybe_find_links="" - else - maybe_find_links="--find-links=$(find_links_url "${pants_version}" "${pants_sha}")" - fi - - local debug_suffix - if [[ -z "${pants_debug}" ]]; then - debug_suffix="" - else - debug_suffix="-debug" - pants_requirements+=(debugpy==1.6.0) - fi - - local python_major_minor_version - python_major_minor_version="$(get_python_major_minor_version "${python}")" - local target_folder_name="${pants_version}_py${python_major_minor_version}${debug_suffix}" - local bootstrapped="${PANTS_BOOTSTRAP}/${target_folder_name}" - - if [[ ! -d "${bootstrapped}" ]]; then - ( - green "Bootstrapping Pants using ${python}" - local staging_dir - staging_dir=$(tempdir "${PANTS_BOOTSTRAP}") - local virtualenv_path - virtualenv_path="$(bootstrap_virtualenv "${python}")" || exit 1 - green "Installing ${pants_requirements[@]} into a virtual environment at ${bootstrapped}" - ( - scrub_env_vars - # shellcheck disable=SC2086 - "${python}" "${virtualenv_path}" --quiet --no-download "${staging_dir}/install" && \ - # Grab the latest pip, but don't advance setuptools past 58 which drops support for the - # `setup` kwarg `use_2to3` which Pants 1.x sdist dependencies (pystache) use. - "${staging_dir}/install/bin/pip" install --quiet -U pip "setuptools<58" && \ - "${staging_dir}/install/bin/pip" install ${maybe_find_links} --quiet --progress-bar off "${pants_requirements[@]}" - ) && \ - ln -s "${staging_dir}/install" "${staging_dir}/${target_folder_name}" && \ - mv "${staging_dir}/${target_folder_name}" "${bootstrapped}" && \ - green "New virtual environment successfully created at ${bootstrapped}." - ) 1>&2 || exit 1 - fi - echo "${bootstrapped}" -} - -function run_bootstrap_tools { - # functionality for introspecting the bootstrapping process, without actually doing it - if [[ "${PANTS_BOOTSTRAP_TOOLS}" -gt "${SCRIPT_VERSION}" ]]; then - die "$0 script (bootstrap version ${SCRIPT_VERSION}) is too old for this invocation (with PANTS_BOOTSTRAP_TOOLS=${PANTS_BOOTSTRAP_TOOLS}). -Please update it by following ${INSTALL_URL}" - fi - - case "${1:-}" in - bootstrap-cache-key) - local pants_version=$(determine_pants_version) - local python="$(determine_python_exe "${pants_version}")" - # the python above may be a shim (e.g. pyenv or homebrew), so let's get an estimate of the - # actual path, as will be symlinked in the virtualenv. (NB. virtualenv does more complicated - # things, but we at least emulate the symlink-resolution that it does.) - local python_executable_path="$("${python}" -c 'import os, sys; print(os.path.realpath(sys.executable))')" - - local requirements_file="$(mktemp)" - echo "${VIRTUALENV_REQUIREMENTS}" > "${requirements_file}" - local virtualenv_requirements_sha256="$(compute_sha256 "${python}" "${requirements_file}")" - rm "${requirements_file}" - - local parts=( - "os_name=$(uname -s)" - "arch=$(uname -m)" - "python_path=${python}" - "python_executable_path=${python_executable_path}" - # the full interpreter information, for maximum compatibility - "python_version=$("$python" --version)" - "pex_version=${_PEX_VERSION}" - "virtualenv_requirements_sha256=${virtualenv_requirements_sha256}" - "pants_version=${pants_version}" - ) - echo "${parts[*]}" - ;; - bootstrap-version) - echo "${SCRIPT_VERSION}" - ;; - help|"") - cat <=3.8,<4"] +enable_resolves = true [flake8] config = ".flake8" +[pytest] +args = ["--no-header", "-vv"] +install_from_resolve = "pytest" +requirements = ["//jsf/3rdparty/python:pytest"] + [test] use_coverage = true -[pytest] -extra_requirements = [ - "typer>=0.7.0", - "pyjwt", - "pytest-cov", -] -lockfile = "" - [coverage-py] report = ["xml", "html"] [mypy] -config = "mypy.ini" +install_from_resolve = "mypy" +requirements = ["//jsf/3rdparty/python:mypy"] + +[python.resolves] +python-default = "jsf/3rdparty/python/user_reqs.lock" +pytest = "jsf/3rdparty/python/pytest.lock" +mypy = "jsf/3rdparty/python/mypy.lock" [anonymous-telemetry] enabled = false diff --git a/pyproject.toml b/pyproject.toml index 8c2e0a3..1f17db3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,4 +3,32 @@ profile = "black" line_length = 100 [tool.black] -line-length = 100 \ No newline at end of file +line-length = 100 + +[pyupgrade] +args = ["--keep-runtime-typing", "--py38-plus"] + +[tool.mypy] +namespace_packages = true +explicit_package_bases = true +plugins = "mypy_typing_asserts.mypy_plugin" + +no_implicit_optional = true +implicit_reexport = false +strict_equality = true + +warn_unused_configs = true +warn_unused_ignores = true +warn_return_any = true +warn_redundant_casts = true +warn_unreachable = true + +pretty = true +show_column_numbers = true +show_error_context = true +show_error_codes = true +show_traceback = true + +[[tool.mypy.overrides]] +module = "jsf" +ignore_missing_imports = true