<div align="center">
<img src="https://raw.githubusercontent.com/pioneershub/pytanis/main/docs/assets/images/logo.svg" alt="Pytanis logo" width="500" role="img">
</div>
Pytanis includes a [Pretalx] client and all the tooling you need for conferences using [Pretalx], from handling the initial call for papers to creating the final program.
<br/>
| | |
|---------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| CI/CD | [](https://github.com/pioneershub/pytanis/actions/workflows/run-tests.yml) [](https://coveralls.io/github/PioneersHub/pytanis) [](https://github.com/pioneershub/pytanis/actions/workflows/publish-pkg.yml) [](https://github.com/pioneershub/pytanis/actions/workflows/build-rel-docs.yml) |
| Package | [](https://pypi.org/project/pytanis/) [](https://pypistats.org/packages/pytanis) [](https://pypi.org/project/pytanis/) |
| Details | [](https://github.com/pypa/hatch) [](https://github.com/charliermarsh/ruff) [](https://github.com/python/mypy) [](https://spdx.org/licenses/) [](https://github.com/sponsors/pioneershub) |
**Trivia**: The name *Pytanis* is a reference to [Prytanis] using the typical *py* prefix of [Python] tools. [Prytanis]
was the name given to the leading members of the government of a city (polis) in ancient Greece. Offices that used this
title usually had responsibility for presiding over councils of some kind, which met in the [Prytaneion]. Romani ite domum!
## Features
- [x] simple configuration management with a config folder in your home directory, just like many other tools do
- [x] easily access [Google Sheets], potentially filled by some [Google Forms], and download sheets as data frames
- [x] easy to use [Pretalx] client that returns proper Python objects thanks to the power of [pydantic]
- [x] simple e-mail clients for batch mails, e.g. to your reviewers, via [Mailgun] and [HelpDesk]
- [x] awesome [documentation] with best practices for the program committee of any community-based conference
- [x] tools to assign proposals to reviewers based on constraints like preferences
- [x] tools to support the final selection process of proposals
- [x] tools to support the creation of the final program schedule
## Getting started
To install Pytanis simple run:
```commandline
pip install pytanis
```
or to install all recommended additional dependencies:
```commandline
pip install 'pytanis[all]'
```
Then create a configuration file and directory in your user's home directory. For Linux/MacOS/Unix use
`~/.pytanis/config.toml` and for Windows `$HOME\.pytanis\config.toml`, where `$HOME` is e.g. `C:\Users\yourusername\`.
Use your favourite editor to open `config.toml` within the `.pytanis` directory and add the following content:
```toml
[Pretalx]
api_token = "932ndsf9uk32nf9sdkn3454532nj32jn"
[Google]
client_secret_json = "client_secret.json"
token_json = "token.json"
service_user_authentication = false
[HelpDesk]
account = "934jcjkdf-39df-9df-93kf-934jfhuuij39fd"
entity_id = "email@host.com"
token = "dal:Sx4id934C3Y-X934jldjdfjk"
[Mailgun]
token = "gguzdgshbdhjsb87239njsa"
from_address = "PyCon DE & PyData Program Committee <program25@mg.pycon.de>"
reply_to = "program25@pycon.de"
```
where you need to replace the dummy values in the sections `[Pretalx]` and `[HelpDesk]` accordingly. Note that `service_user_authentication` is not required to be set if authentication via a service user is not necessary (see [GSpread using Service Account] for more details).
### Retrieving the Credentials and Tokens
- **Google**:
- For end users: Follow the [Python Quickstart for the Google API] to generate and download the file `client_secret.json`.
Move it to the `~/.pytanis` folder as `client_secret.json`. The file `token.json` will be automatically generated
later. Note that `config.toml` references those two files relative to its own location.
- For any automation project: Follow [GSpread using Service Account] to generate and download the file `client_secret.json`.
Move it to the `~/.pytanis` folder as `client_secret.json`. Also make sure to set `service_user_authentication = true` in your `~/.pytanis/config.toml`.
- **Pretalx**: The API token can be found in the [Pretalx user settings].
- **HelpDesk**: Login to the [LiveChat Developer Console] then go to <kbd>Tools</kbd> » <kbd>Personal Access Tokens</kbd>.
Choose <kbd>Create new token +</kbd>, enter a the name `Pytanis`, select all scopes and confirm. In the following screen
copy the `Account ID`, `Entity ID` and `Token` and paste them into `config.toml`.
In case there is any trouble with livechat, contact a helpdesk admin. Also note that the `Account ID` from your token is
the `Agent ID` needed when you create a ticket. The `Team ID` you get from [HelpDesk] then <kbd>Agents</kbd> »
<kbd>Name of your agent</kbd> and the final part of the URL shown now.
**When setting up your agent the first time**,
you also need to go to [LiveChat] then log in with your Helpdesk team credentials and click <kbd>Request</kbd> to get an invitation.
An admin of [LiveChat] needs to confirm this and add you as role `admin`. Then, check [HelpDesk] to receive the invitation
and accept.
## Development
This section is only relevant if you want to contribute to Pytanis itself. Your help is highly appreciated! There are two options for local development.
Whilst both option are valid, the Devcontainer setup is the most convenient, as all dependencies are preconfigured.
### Devcontainer Setup
After having cloned this repository:
1. Make sure to have a local installation of [Docker] and [VS Code] running.
2. Open [VS Code] and make sure to have the [Dev Containers Extension] from Microsoft installed.
3. Open the cloned project in [VS Code] and from the bottom right corner confirm to open the project to be opened within the Devcontainer.
If you miss any dependencies check out the `devcontainer.json` within the `.devcontainer` folder. Otherwise, the right python environment with [pipx], [hatch], [pre-commit] and the initialization steps for the Hatch environments, are already included.
For the use of the `pytanis` libary some credentials and tokens are necessary (see the "Getting Started" section). With the Devcontainer setup the `config.yaml` is already created. Just navigate to `~/.pytanis/config.toml` and update the file with the corresponding tokens.
### Conventional Setup
After having cloned this repository:
1. install [hatch] globally, e.g. `pipx install hatch`,
2. install [pre-commit] globally, e.g. `pipx install pre-commit`,
3. \[only once\] run `hatch config set dirs.env.virtual .direnv` to let [VS Code] find your virtual environments.
And then you are already set up to start hacking. Use `hatch run` to do everything you would normally do in a virtual
environment, e.g. `hatch run jupyter lab` to start [JupyterLab] in the default environment, `hatch run cov` for unit tests
and coverage (like [tox]) or `hatch run docs:serve` to build & serve the documentation. For code hygiene, execute `hatch run lint:all`
in order to run [ruff] and [mypy] or `hatch run lint:fix` to automatically fix formatting issues.
Check out the `[tool.hatch.envs]` sections in [pyproject.toml](pyproject.toml) to learn about other commands.
If you really must enter a virtual environment, use `hatch shell` to enter the default environment.
## Testing
### Integration Tests
Pytanis includes comprehensive integration tests to validate compatibility with the Pretalx API. These tests ensure all data models work correctly with live API responses.
To run integration tests interactively:
```shell
# Using Hatch (recommended for development)
hatch run integration
# Or directly
python scripts/run_pretalx_integration_tests.py
```
This will prompt you for:
- Pretalx API token (required)
- Event slug to test against
- API version to use
For automated testing:
```shell
# Using Hatch with arguments
hatch run integration --token YOUR_TOKEN --event pyconde-pydata-2025
# Using environment variables for quick testing
export PRETALX_API_TOKEN="your-token"
export PRETALX_TEST_EVENT="pyconde-pydata-2025"
hatch run integration-quick
# Direct pytest for more control
hatch run test-endpoints
# Without Hatch
python scripts/run_pretalx_integration_tests.py --token YOUR_TOKEN --event pyconde-pydata-2025 --api-version v2
```
See [tests/pretalx/README_INTEGRATION.md](tests/pretalx/README_INTEGRATION.md) for more details.
## Documentation
The [documentation] is made with [Material for MkDocs] and is hosted by [GitHub Pages]. Your help to extend the
documentation, especially in the context of using Pytanis for community conferences like [PyConDE], [EuroPython], etc.
is highly appreciated.
## License & Credits
[Pytanis] is distributed under the terms of the [MIT](https://spdx.org/licenses/MIT.html) license.
To start this project off a lot of inspiration and code was taken from [Alexander Hendorf] and [Matthias Hofmann].
[Pytanis]: https://pioneershub.github.io/pytanis/
[Python]: https://www.python.org/
[Pretalx]: https://pretalx.com/
[hatch]: https://hatch.pypa.io/
[pre-commit]: https://pre-commit.com/
[Prytanis]: https://en.wikipedia.org/wiki/Prytaneis
[Prytaneion]: https://en.wikipedia.org/wiki/Prytaneion
[Python Quickstart for the Google API]: https://developers.google.com/sheets/api/quickstart/python
[GSpread using Service Account]: https://docs.gspread.org/en/v5.12.4/oauth2.html#for-bots-using-service-account
[Pretalx user settings]: https://pretalx.com/orga/me
[documentation]: https://pioneershub.github.io/pytanis/
[Alexander Hendorf]: https://github.com/alanderex
[Matthias Hofmann]: https://github.com/mj-hofmann
[Google Forms]: https://www.google.com/forms/about/
[Google Sheets]: https://www.google.com/sheets/about/
[pydantic]: https://docs.pydantic.dev/
[HelpDesk]: https://www.helpdesk.com/
[Material for MkDocs]: https://github.com/squidfunk/mkdocs-material
[GitHub Pages]: https://docs.github.com/en/pages
[PyConDE]: https://pycon.de/
[EuroPython]: https://europython.eu/
[LiveChat Developer Console]: https://platform.text.com/console/
[JupyterLab]: https://jupyter.org/
[tox]: https://tox.wiki/
[mypy]: https://mypy-lang.org/
[ruff]: https://github.com/astral-sh/ruff
[VS Code]: https://code.visualstudio.com/
[LiveChat]: https://www.livechat.com/
[Docker]: https://www.docker.com/
[Dev Containers Extension]: https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers
[Mailgun]: https://www.mailgun.com/
[pipx]: https://pipx.pypa.io/
Raw data
{
"_id": null,
"home_page": null,
"name": "Pytanis",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.12",
"maintainer_email": null,
"keywords": "cfp, conference, google sheet, gsheet, helpdesk, pretalx",
"author": null,
"author_email": "Florian Wilhelm <Florian.Wilhelm@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/67/6e/989949790c2219e41244bafaa7adfdadda07f272e1243b3016329e6bcbe9/pytanis-0.9.6.tar.gz",
"platform": null,
"description": "<div align=\"center\">\n\n<img src=\"https://raw.githubusercontent.com/pioneershub/pytanis/main/docs/assets/images/logo.svg\" alt=\"Pytanis logo\" width=\"500\" role=\"img\">\n</div>\n\nPytanis includes a [Pretalx] client and all the tooling you need for conferences using [Pretalx], from handling the initial call for papers to creating the final program.\n<br/>\n\n| | |\n|---------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| CI/CD | [](https://github.com/pioneershub/pytanis/actions/workflows/run-tests.yml) [](https://coveralls.io/github/PioneersHub/pytanis) [](https://github.com/pioneershub/pytanis/actions/workflows/publish-pkg.yml) [](https://github.com/pioneershub/pytanis/actions/workflows/build-rel-docs.yml) |\n| Package | [](https://pypi.org/project/pytanis/) [](https://pypistats.org/packages/pytanis) [](https://pypi.org/project/pytanis/) |\n| Details | [](https://github.com/pypa/hatch) [](https://github.com/charliermarsh/ruff) [](https://github.com/python/mypy) [](https://spdx.org/licenses/) [](https://github.com/sponsors/pioneershub) |\n\n**Trivia**: The name *Pytanis* is a reference to [Prytanis] using the typical *py* prefix of [Python] tools. [Prytanis]\nwas the name given to the leading members of the government of a city (polis) in ancient Greece. Offices that used this\ntitle usually had responsibility for presiding over councils of some kind, which met in the [Prytaneion]. Romani ite domum!\n\n## Features\n\n- [x] simple configuration management with a config folder in your home directory, just like many other tools do\n- [x] easily access [Google Sheets], potentially filled by some [Google Forms], and download sheets as data frames\n- [x] easy to use [Pretalx] client that returns proper Python objects thanks to the power of [pydantic]\n- [x] simple e-mail clients for batch mails, e.g. to your reviewers, via [Mailgun] and [HelpDesk]\n- [x] awesome [documentation] with best practices for the program committee of any community-based conference\n- [x] tools to assign proposals to reviewers based on constraints like preferences\n- [x] tools to support the final selection process of proposals\n- [x] tools to support the creation of the final program schedule\n\n## Getting started\n\nTo install Pytanis simple run:\n\n```commandline\npip install pytanis\n```\n\nor to install all recommended additional dependencies:\n\n```commandline\npip install 'pytanis[all]'\n```\n\nThen create a configuration file and directory in your user's home directory. For Linux/MacOS/Unix use\n`~/.pytanis/config.toml` and for Windows `$HOME\\.pytanis\\config.toml`, where `$HOME` is e.g. `C:\\Users\\yourusername\\`.\nUse your favourite editor to open `config.toml` within the `.pytanis` directory and add the following content:\n\n```toml\n[Pretalx]\napi_token = \"932ndsf9uk32nf9sdkn3454532nj32jn\"\n\n[Google]\nclient_secret_json = \"client_secret.json\"\ntoken_json = \"token.json\"\nservice_user_authentication = false\n\n[HelpDesk]\naccount = \"934jcjkdf-39df-9df-93kf-934jfhuuij39fd\"\nentity_id = \"email@host.com\"\ntoken = \"dal:Sx4id934C3Y-X934jldjdfjk\"\n\n[Mailgun]\ntoken = \"gguzdgshbdhjsb87239njsa\"\nfrom_address = \"PyCon DE & PyData Program Committee <program25@mg.pycon.de>\"\nreply_to = \"program25@pycon.de\"\n```\n\nwhere you need to replace the dummy values in the sections `[Pretalx]` and `[HelpDesk]` accordingly. Note that `service_user_authentication` is not required to be set if authentication via a service user is not necessary (see [GSpread using Service Account] for more details).\n\n### Retrieving the Credentials and Tokens\n\n- **Google**:\n - For end users: Follow the [Python Quickstart for the Google API] to generate and download the file `client_secret.json`.\nMove it to the `~/.pytanis` folder as `client_secret.json`. The file `token.json` will be automatically generated\nlater. Note that `config.toml` references those two files relative to its own location.\n - For any automation project: Follow [GSpread using Service Account] to generate and download the file `client_secret.json`.\nMove it to the `~/.pytanis` folder as `client_secret.json`. Also make sure to set `service_user_authentication = true` in your `~/.pytanis/config.toml`.\n- **Pretalx**: The API token can be found in the [Pretalx user settings].\n- **HelpDesk**: Login to the [LiveChat Developer Console] then go to <kbd>Tools</kbd> \u00bb <kbd>Personal Access Tokens</kbd>.\n Choose <kbd>Create new token +</kbd>, enter a the name `Pytanis`, select all scopes and confirm. In the following screen\n copy the `Account ID`, `Entity ID` and `Token` and paste them into `config.toml`.\n In case there is any trouble with livechat, contact a helpdesk admin. Also note that the `Account ID` from your token is\n the `Agent ID` needed when you create a ticket. The `Team ID` you get from [HelpDesk] then <kbd>Agents</kbd> \u00bb\n <kbd>Name of your agent</kbd> and the final part of the URL shown now.\n\n **When setting up your agent the first time**,\n you also need to go to [LiveChat] then log in with your Helpdesk team credentials and click <kbd>Request</kbd> to get an invitation.\n An admin of [LiveChat] needs to confirm this and add you as role `admin`. Then, check [HelpDesk] to receive the invitation\n and accept.\n\n## Development\n\nThis section is only relevant if you want to contribute to Pytanis itself. Your help is highly appreciated! There are two options for local development.\n\nWhilst both option are valid, the Devcontainer setup is the most convenient, as all dependencies are preconfigured.\n\n### Devcontainer Setup\n\nAfter having cloned this repository:\n\n1. Make sure to have a local installation of [Docker] and [VS Code] running.\n2. Open [VS Code] and make sure to have the [Dev Containers Extension] from Microsoft installed.\n3. Open the cloned project in [VS Code] and from the bottom right corner confirm to open the project to be opened within the Devcontainer.\n\nIf you miss any dependencies check out the `devcontainer.json` within the `.devcontainer` folder. Otherwise, the right python environment with [pipx], [hatch], [pre-commit] and the initialization steps for the Hatch environments, are already included.\n\nFor the use of the `pytanis` libary some credentials and tokens are necessary (see the \"Getting Started\" section). With the Devcontainer setup the `config.yaml` is already created. Just navigate to `~/.pytanis/config.toml` and update the file with the corresponding tokens.\n\n### Conventional Setup\n\nAfter having cloned this repository:\n\n1. install [hatch] globally, e.g. `pipx install hatch`,\n2. install [pre-commit] globally, e.g. `pipx install pre-commit`,\n3. \\[only once\\] run `hatch config set dirs.env.virtual .direnv` to let [VS Code] find your virtual environments.\n\n\nAnd then you are already set up to start hacking. Use `hatch run` to do everything you would normally do in a virtual\nenvironment, e.g. `hatch run jupyter lab` to start [JupyterLab] in the default environment, `hatch run cov` for unit tests\nand coverage (like [tox]) or `hatch run docs:serve` to build & serve the documentation. For code hygiene, execute `hatch run lint:all`\nin order to run [ruff] and [mypy] or `hatch run lint:fix` to automatically fix formatting issues.\nCheck out the `[tool.hatch.envs]` sections in [pyproject.toml](pyproject.toml) to learn about other commands.\nIf you really must enter a virtual environment, use `hatch shell` to enter the default environment.\n\n## Testing\n\n### Integration Tests\n\nPytanis includes comprehensive integration tests to validate compatibility with the Pretalx API. These tests ensure all data models work correctly with live API responses.\n\nTo run integration tests interactively:\n\n```shell\n# Using Hatch (recommended for development)\nhatch run integration\n\n# Or directly\npython scripts/run_pretalx_integration_tests.py\n```\n\nThis will prompt you for:\n- Pretalx API token (required)\n- Event slug to test against\n- API version to use\n\nFor automated testing:\n\n```shell\n# Using Hatch with arguments\nhatch run integration --token YOUR_TOKEN --event pyconde-pydata-2025\n\n# Using environment variables for quick testing\nexport PRETALX_API_TOKEN=\"your-token\"\nexport PRETALX_TEST_EVENT=\"pyconde-pydata-2025\"\nhatch run integration-quick\n\n# Direct pytest for more control\nhatch run test-endpoints\n\n# Without Hatch\npython scripts/run_pretalx_integration_tests.py --token YOUR_TOKEN --event pyconde-pydata-2025 --api-version v2\n```\n\nSee [tests/pretalx/README_INTEGRATION.md](tests/pretalx/README_INTEGRATION.md) for more details.\n\n## Documentation\n\nThe [documentation] is made with [Material for MkDocs] and is hosted by [GitHub Pages]. Your help to extend the\ndocumentation, especially in the context of using Pytanis for community conferences like [PyConDE], [EuroPython], etc.\nis highly appreciated.\n\n## License & Credits\n\n[Pytanis] is distributed under the terms of the [MIT](https://spdx.org/licenses/MIT.html) license.\nTo start this project off a lot of inspiration and code was taken from [Alexander Hendorf] and [Matthias Hofmann].\n\n[Pytanis]: https://pioneershub.github.io/pytanis/\n[Python]: https://www.python.org/\n[Pretalx]: https://pretalx.com/\n[hatch]: https://hatch.pypa.io/\n[pre-commit]: https://pre-commit.com/\n[Prytanis]: https://en.wikipedia.org/wiki/Prytaneis\n[Prytaneion]: https://en.wikipedia.org/wiki/Prytaneion\n[Python Quickstart for the Google API]: https://developers.google.com/sheets/api/quickstart/python\n[GSpread using Service Account]: https://docs.gspread.org/en/v5.12.4/oauth2.html#for-bots-using-service-account\n[Pretalx user settings]: https://pretalx.com/orga/me\n[documentation]: https://pioneershub.github.io/pytanis/\n[Alexander Hendorf]: https://github.com/alanderex\n[Matthias Hofmann]: https://github.com/mj-hofmann\n[Google Forms]: https://www.google.com/forms/about/\n[Google Sheets]: https://www.google.com/sheets/about/\n[pydantic]: https://docs.pydantic.dev/\n[HelpDesk]: https://www.helpdesk.com/\n[Material for MkDocs]: https://github.com/squidfunk/mkdocs-material\n[GitHub Pages]: https://docs.github.com/en/pages\n[PyConDE]: https://pycon.de/\n[EuroPython]: https://europython.eu/\n[LiveChat Developer Console]: https://platform.text.com/console/\n[JupyterLab]: https://jupyter.org/\n[tox]: https://tox.wiki/\n[mypy]: https://mypy-lang.org/\n[ruff]: https://github.com/astral-sh/ruff\n[VS Code]: https://code.visualstudio.com/\n[LiveChat]: https://www.livechat.com/\n[Docker]: https://www.docker.com/\n[Dev Containers Extension]: https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers\n[Mailgun]: https://www.mailgun.com/\n[pipx]: https://pipx.pypa.io/\n",
"bugtrack_url": null,
"license": null,
"summary": "Utilities for the program organization of conferences using Pretalx",
"version": "0.9.6",
"project_urls": {
"Documentation": "https://pioneershub.github.io/pytanis/",
"Source": "https://github.com/PioneersHub/pytanis",
"Sponsor": "https://github.com/sponsors/PioneersHub",
"Tracker": "https://github.com/PioneersHub/pytanis/issues"
},
"split_keywords": [
"cfp",
" conference",
" google sheet",
" gsheet",
" helpdesk",
" pretalx"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "f4c24cf60ee703731662ad2fae43b181b8308ea921aac3360feace6808ef7f91",
"md5": "0c7511bd5d5b73147bd251db026f065a",
"sha256": "444da0c59da89beecb55a1f2ee65d9ec42991cdf9551fef29fc5518d049b5a1a"
},
"downloads": -1,
"filename": "pytanis-0.9.6-py3-none-any.whl",
"has_sig": false,
"md5_digest": "0c7511bd5d5b73147bd251db026f065a",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.12",
"size": 57884,
"upload_time": "2025-08-11T07:26:35",
"upload_time_iso_8601": "2025-08-11T07:26:35.681520Z",
"url": "https://files.pythonhosted.org/packages/f4/c2/4cf60ee703731662ad2fae43b181b8308ea921aac3360feace6808ef7f91/pytanis-0.9.6-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "676e989949790c2219e41244bafaa7adfdadda07f272e1243b3016329e6bcbe9",
"md5": "ccfd420668e197222fc2d951cf2feb9d",
"sha256": "0624a15637c4d787734c8ebf9acd16ef26715269622cd663778066d54f12c7cf"
},
"downloads": -1,
"filename": "pytanis-0.9.6.tar.gz",
"has_sig": false,
"md5_digest": "ccfd420668e197222fc2d951cf2feb9d",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.12",
"size": 51034,
"upload_time": "2025-08-11T07:26:37",
"upload_time_iso_8601": "2025-08-11T07:26:37.155005Z",
"url": "https://files.pythonhosted.org/packages/67/6e/989949790c2219e41244bafaa7adfdadda07f272e1243b3016329e6bcbe9/pytanis-0.9.6.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-11 07:26:37",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "PioneersHub",
"github_project": "pytanis",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "annotated-types",
"specs": [
[
"==",
"0.7.0"
]
]
},
{
"name": "anyio",
"specs": [
[
"==",
"4.7.0"
]
]
},
{
"name": "appnope",
"specs": [
[
"==",
"0.1.4"
]
]
},
{
"name": "argon2-cffi",
"specs": [
[
"==",
"25.1.0"
]
]
},
{
"name": "argon2-cffi-bindings",
"specs": [
[
"==",
"21.2.0"
]
]
},
{
"name": "arrow",
"specs": [
[
"==",
"1.3.0"
]
]
},
{
"name": "asttokens",
"specs": [
[
"==",
"3.0.0"
]
]
},
{
"name": "async-lru",
"specs": [
[
"==",
"2.0.5"
]
]
},
{
"name": "attrs",
"specs": [
[
"==",
"25.3.0"
]
]
},
{
"name": "babel",
"specs": [
[
"==",
"2.17.0"
]
]
},
{
"name": "beautifulsoup4",
"specs": [
[
"==",
"4.13.4"
]
]
},
{
"name": "bleach",
"specs": [
[
"==",
"6.2.0"
]
]
},
{
"name": "cachetools",
"specs": [
[
"==",
"5.5.2"
]
]
},
{
"name": "certifi",
"specs": [
[
"==",
"2024.12.14"
]
]
},
{
"name": "cffi",
"specs": [
[
"==",
"1.17.1"
]
]
},
{
"name": "charset-normalizer",
"specs": [
[
"==",
"3.4.2"
]
]
},
{
"name": "comm",
"specs": [
[
"==",
"0.2.2"
]
]
},
{
"name": "contourpy",
"specs": [
[
"==",
"1.3.2"
]
]
},
{
"name": "coverage",
"specs": [
[
"==",
"7.9.1"
]
]
},
{
"name": "cycler",
"specs": [
[
"==",
"0.12.1"
]
]
},
{
"name": "debugpy",
"specs": [
[
"==",
"1.8.14"
]
]
},
{
"name": "decorator",
"specs": [
[
"==",
"5.2.1"
]
]
},
{
"name": "defusedxml",
"specs": [
[
"==",
"0.7.1"
]
]
},
{
"name": "et-xmlfile",
"specs": [
[
"==",
"2.0.0"
]
]
},
{
"name": "exceptiongroup",
"specs": [
[
"==",
"1.3.0"
]
]
},
{
"name": "executing",
"specs": [
[
"==",
"2.2.0"
]
]
},
{
"name": "fastjsonschema",
"specs": [
[
"==",
"2.21.1"
]
]
},
{
"name": "fonttools",
"specs": [
[
"==",
"4.58.4"
]
]
},
{
"name": "fqdn",
"specs": [
[
"==",
"1.5.1"
]
]
},
{
"name": "google-auth",
"specs": [
[
"==",
"2.40.3"
]
]
},
{
"name": "google-auth-oauthlib",
"specs": [
[
"==",
"1.2.2"
]
]
},
{
"name": "gspread",
"specs": [
[
"==",
"5.12.4"
]
]
},
{
"name": "gspread-dataframe",
"specs": [
[
"==",
"4.0.0"
]
]
},
{
"name": "gspread-formatting",
"specs": [
[
"==",
"1.2.1"
]
]
},
{
"name": "h11",
"specs": [
[
"==",
"0.14.0"
]
]
},
{
"name": "highspy",
"specs": [
[
"==",
"1.11.0"
]
]
},
{
"name": "httpcore",
"specs": [
[
"==",
"1.0.7"
]
]
},
{
"name": "httpx",
"specs": [
[
"==",
"0.27.2"
]
]
},
{
"name": "httpx-auth",
"specs": [
[
"==",
"0.22.0"
]
]
},
{
"name": "hypothesis",
"specs": [
[
"==",
"6.135.16"
]
]
},
{
"name": "idna",
"specs": [
[
"==",
"3.10"
]
]
},
{
"name": "iniconfig",
"specs": [
[
"==",
"2.1.0"
]
]
},
{
"name": "ipykernel",
"specs": [
[
"==",
"6.29.5"
]
]
},
{
"name": "ipython",
"specs": [
[
"==",
"8.37.0"
]
]
},
{
"name": "ipywidgets",
"specs": [
[
"==",
"8.1.7"
]
]
},
{
"name": "isoduration",
"specs": [
[
"==",
"20.11.0"
]
]
},
{
"name": "jedi",
"specs": [
[
"==",
"0.19.2"
]
]
},
{
"name": "jinja2",
"specs": [
[
"==",
"3.1.6"
]
]
},
{
"name": "json5",
"specs": [
[
"==",
"0.12.0"
]
]
},
{
"name": "jsonpointer",
"specs": [
[
"==",
"3.0.0"
]
]
},
{
"name": "jsonschema",
"specs": [
[
"==",
"4.24.0"
]
]
},
{
"name": "jsonschema-specifications",
"specs": [
[
"==",
"2025.4.1"
]
]
},
{
"name": "jupyter",
"specs": [
[
"==",
"1.1.1"
]
]
},
{
"name": "jupyter-client",
"specs": [
[
"==",
"8.6.3"
]
]
},
{
"name": "jupyter-console",
"specs": [
[
"==",
"6.6.3"
]
]
},
{
"name": "jupyter-core",
"specs": [
[
"==",
"5.8.1"
]
]
},
{
"name": "jupyter-events",
"specs": [
[
"==",
"0.12.0"
]
]
},
{
"name": "jupyter-lsp",
"specs": [
[
"==",
"2.2.5"
]
]
},
{
"name": "jupyter-server",
"specs": [
[
"==",
"2.16.0"
]
]
},
{
"name": "jupyter-server-terminals",
"specs": [
[
"==",
"0.5.3"
]
]
},
{
"name": "jupyterlab",
"specs": [
[
"==",
"4.4.3"
]
]
},
{
"name": "jupyterlab-pygments",
"specs": [
[
"==",
"0.3.0"
]
]
},
{
"name": "jupyterlab-server",
"specs": [
[
"==",
"2.27.3"
]
]
},
{
"name": "jupyterlab-widgets",
"specs": [
[
"==",
"3.0.15"
]
]
},
{
"name": "kiwisolver",
"specs": [
[
"==",
"1.4.8"
]
]
},
{
"name": "markupsafe",
"specs": [
[
"==",
"3.0.2"
]
]
},
{
"name": "matplotlib",
"specs": [
[
"==",
"3.10.3"
]
]
},
{
"name": "matplotlib-inline",
"specs": [
[
"==",
"0.1.7"
]
]
},
{
"name": "mistune",
"specs": [
[
"==",
"3.1.3"
]
]
},
{
"name": "multidict",
"specs": [
[
"==",
"6.6.0"
]
]
},
{
"name": "nbclient",
"specs": [
[
"==",
"0.10.2"
]
]
},
{
"name": "nbconvert",
"specs": [
[
"==",
"7.16.6"
]
]
},
{
"name": "nbformat",
"specs": [
[
"==",
"5.10.4"
]
]
},
{
"name": "nest-asyncio",
"specs": [
[
"==",
"1.6.0"
]
]
},
{
"name": "notebook",
"specs": [
[
"==",
"7.4.3"
]
]
},
{
"name": "notebook-shim",
"specs": [
[
"==",
"0.2.4"
]
]
},
{
"name": "numpy",
"specs": [
[
"==",
"2.2.1"
]
]
},
{
"name": "oauthlib",
"specs": [
[
"==",
"3.3.1"
]
]
},
{
"name": "openpyxl",
"specs": [
[
"==",
"3.1.5"
]
]
},
{
"name": "overrides",
"specs": [
[
"==",
"7.7.0"
]
]
},
{
"name": "packaging",
"specs": [
[
"==",
"25.0"
]
]
},
{
"name": "pandas",
"specs": [
[
"==",
"2.2.3"
]
]
},
{
"name": "pandas-stubs",
"specs": [
[
"==",
"2.2.3.250527"
]
]
},
{
"name": "pandocfilters",
"specs": [
[
"==",
"1.5.1"
]
]
},
{
"name": "parso",
"specs": [
[
"==",
"0.8.4"
]
]
},
{
"name": "pexpect",
"specs": [
[
"==",
"4.9.0"
]
]
},
{
"name": "pillow",
"specs": [
[
"==",
"11.2.1"
]
]
},
{
"name": "platformdirs",
"specs": [
[
"==",
"4.3.8"
]
]
},
{
"name": "pluggy",
"specs": [
[
"==",
"1.6.0"
]
]
},
{
"name": "ply",
"specs": [
[
"==",
"3.11"
]
]
},
{
"name": "prometheus-client",
"specs": [
[
"==",
"0.22.1"
]
]
},
{
"name": "prompt-toolkit",
"specs": [
[
"==",
"3.0.51"
]
]
},
{
"name": "propcache",
"specs": [
[
"==",
"0.3.2"
]
]
},
{
"name": "psutil",
"specs": [
[
"==",
"7.0.0"
]
]
},
{
"name": "ptyprocess",
"specs": [
[
"==",
"0.7.0"
]
]
},
{
"name": "pure-eval",
"specs": [
[
"==",
"0.2.3"
]
]
},
{
"name": "pyasn1",
"specs": [
[
"==",
"0.6.1"
]
]
},
{
"name": "pyasn1-modules",
"specs": [
[
"==",
"0.4.2"
]
]
},
{
"name": "pycparser",
"specs": [
[
"==",
"2.22"
]
]
},
{
"name": "pydantic",
"specs": [
[
"==",
"2.10.4"
]
]
},
{
"name": "pydantic-core",
"specs": [
[
"==",
"2.27.2"
]
]
},
{
"name": "pygments",
"specs": [
[
"==",
"2.19.2"
]
]
},
{
"name": "pyomo",
"specs": [
[
"==",
"6.9.2"
]
]
},
{
"name": "pyparsing",
"specs": [
[
"==",
"3.2.3"
]
]
},
{
"name": "pytest",
"specs": [
[
"==",
"8.4.1"
]
]
},
{
"name": "pytest-cov",
"specs": [
[
"==",
"6.2.1"
]
]
},
{
"name": "pytest-mock",
"specs": [
[
"==",
"3.14.1"
]
]
},
{
"name": "pytest-sugar",
"specs": [
[
"==",
"1.0.0"
]
]
},
{
"name": "pytest-vcr",
"specs": [
[
"==",
"1.0.2"
]
]
},
{
"name": "python-dateutil",
"specs": [
[
"==",
"2.9.0.post0"
]
]
},
{
"name": "python-json-logger",
"specs": [
[
"==",
"3.3.0"
]
]
},
{
"name": "pytz",
"specs": [
[
"==",
"2024.2"
]
]
},
{
"name": "pyyaml",
"specs": [
[
"==",
"6.0.2"
]
]
},
{
"name": "pyzmq",
"specs": [
[
"==",
"27.0.0"
]
]
},
{
"name": "referencing",
"specs": [
[
"==",
"0.36.2"
]
]
},
{
"name": "requests",
"specs": [
[
"==",
"2.32.4"
]
]
},
{
"name": "requests-oauthlib",
"specs": [
[
"==",
"2.0.0"
]
]
},
{
"name": "rfc3339-validator",
"specs": [
[
"==",
"0.1.4"
]
]
},
{
"name": "rfc3986-validator",
"specs": [
[
"==",
"0.1.1"
]
]
},
{
"name": "rpds-py",
"specs": [
[
"==",
"0.25.1"
]
]
},
{
"name": "rsa",
"specs": [
[
"==",
"4.9.1"
]
]
},
{
"name": "seaborn",
"specs": [
[
"==",
"0.13.2"
]
]
},
{
"name": "send2trash",
"specs": [
[
"==",
"1.8.3"
]
]
},
{
"name": "setuptools-scm",
"specs": [
[
"==",
"8.3.1"
]
]
},
{
"name": "six",
"specs": [
[
"==",
"1.17.0"
]
]
},
{
"name": "sniffio",
"specs": [
[
"==",
"1.3.1"
]
]
},
{
"name": "sortedcontainers",
"specs": [
[
"==",
"2.4.0"
]
]
},
{
"name": "soupsieve",
"specs": [
[
"==",
"2.7"
]
]
},
{
"name": "stack-data",
"specs": [
[
"==",
"0.6.3"
]
]
},
{
"name": "structlog",
"specs": [
[
"==",
"24.4.0"
]
]
},
{
"name": "termcolor",
"specs": [
[
"==",
"3.1.0"
]
]
},
{
"name": "terminado",
"specs": [
[
"==",
"0.18.1"
]
]
},
{
"name": "tinycss2",
"specs": [
[
"==",
"1.4.0"
]
]
},
{
"name": "tomli",
"specs": [
[
"==",
"2.2.1"
]
]
},
{
"name": "tornado",
"specs": [
[
"==",
"6.5.1"
]
]
},
{
"name": "tqdm",
"specs": [
[
"==",
"4.67.1"
]
]
},
{
"name": "traitlets",
"specs": [
[
"==",
"5.14.3"
]
]
},
{
"name": "types-python-dateutil",
"specs": [
[
"==",
"2.9.0.20250516"
]
]
},
{
"name": "types-pytz",
"specs": [
[
"==",
"2025.2.0.20250516"
]
]
},
{
"name": "typing-extensions",
"specs": [
[
"==",
"4.12.2"
]
]
},
{
"name": "tzdata",
"specs": [
[
"==",
"2024.2"
]
]
},
{
"name": "uri-template",
"specs": [
[
"==",
"1.3.0"
]
]
},
{
"name": "urllib3",
"specs": [
[
"==",
"2.5.0"
]
]
},
{
"name": "vcrpy",
"specs": [
[
"==",
"7.0.0"
]
]
},
{
"name": "wcwidth",
"specs": [
[
"==",
"0.2.13"
]
]
},
{
"name": "webcolors",
"specs": [
[
"==",
"24.11.1"
]
]
},
{
"name": "webencodings",
"specs": [
[
"==",
"0.5.1"
]
]
},
{
"name": "websocket-client",
"specs": [
[
"==",
"1.8.0"
]
]
},
{
"name": "widgetsnbextension",
"specs": [
[
"==",
"4.0.14"
]
]
},
{
"name": "wrapt",
"specs": [
[
"==",
"1.17.2"
]
]
},
{
"name": "yarl",
"specs": [
[
"==",
"1.20.1"
]
]
}
],
"lcname": "pytanis"
}