From d719e961842f6c6c6753d563edbf9ab6b68cdf62 Mon Sep 17 00:00:00 2001 From: Julien Date: Mon, 29 Apr 2024 13:31:54 +0200 Subject: [PATCH] Basic class to poll alerts from the Fink livestream service. (#50) * Basic class to poll alerts from the Fink livestream service. * Clean README * Flake8 * Add a section on testing and debugging --- .github/livestream_targets.png | Bin 0 -> 94975 bytes README.md | 129 ++++- poetry.lock | 957 ++++++++++++++++++++++++++++++++- pyproject.toml | 2 + tom_fink/alertstream.py | 166 ++++++ 5 files changed, 1239 insertions(+), 15 deletions(-) create mode 100644 .github/livestream_targets.png create mode 100644 tom_fink/alertstream.py diff --git a/.github/livestream_targets.png b/.github/livestream_targets.png new file mode 100644 index 0000000000000000000000000000000000000000..b1a7fa71e9f856b5155ca41af6db1eb99331a992 GIT binary patch literal 94975 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 TOnhIv2mwio$%$4A>j(ZfvvIHb literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 4c86b3e..8f54944 100644 --- a/README.md +++ b/README.md @@ -4,24 +4,22 @@ [![Codacy Badge](https://app.codacy.com/project/badge/Grade/43466ecc9ffe4622b3492625a137a70c)](https://www.codacy.com/gh/TOMToolkit/tom_fink/dashboard?utm_source=github.com&utm_medium=referral&utm_content=TOMToolkit/tom_fink&utm_campaign=Badge_Grade) [![Coverage Status](https://coveralls.io/repos/github/TOMToolkit/tom_fink/badge.svg?branch=main)](https://coveralls.io/github/TOMToolkit/tom_fink?branch=main) -This repository hosts the Fink Alert Broker Module for the TOM Toolkit. Fink is a broker currently connected to ZTF. More information on Fink at https://fink-broker.org/. +This repository hosts the Fink Alert Broker Module for the TOM Toolkit. Fink is a broker currently connected to ZTF, and that will handle the massive alert stream from LSST. More information on Fink at https://fink-broker.org/. You can easily install the module using pip: -As of version 0.4, the module simply uses the Fink REST API to retrieve alerts. Note that the Fink databases are updated once a day with the previous night alert data (hence you do not get live alerts for the moment). Users can perform: +```bash +pip install tom-fink +``` + +## Polling data from the REST API + +As of `tom-fink` version 0.4, the module simply uses the [Fink REST API](https://fink-broker.readthedocs.io/en/latest/services/science_portal/) to retrieve alerts. Note that the Fink databases are updated **once a day** with the previous night alert data (hence you do not get live alerts for the moment). Users can perform: - Search by ZTF object ID - Cone Search - Search by Date - Search by derived alert class - Search by Solar System name -## How to use the Fink module inside your TOM - -First, install the module using pip - -```bash -pip install tom-fink -``` - -then you need to declare it in your running TOM instance. To do so just add `tom_fink.fink.FinkBroker` to the `TOM_ALERT_CLASSES` in your TOM's `settings.py`: +You need to declare the `FinkBroker` class in your running TOM instance. To do so just add `tom_fink.fink.FinkBroker` to the `TOM_ALERT_CLASSES` in your TOM's `settings.py`: ```python TOM_ALERT_CLASSES = [ @@ -37,9 +35,116 @@ and finally relaunch your TOM: ./manage.py runserver ``` +## Polling data from the Fink livestream service + +Alternatively from `tom_fink` version 0.6.0, users can poll Fink substreams in real-time, using the [livestream service](https://fink-broker.readthedocs.io/en/latest/services/livestream/). First you need to add `tom_alertstreams` and `tom_fink` to your `INSTALLED_APPS` setting in your project `settings.py`: + +```python +INSTALLED_APPS = [ + ... + 'tom_alertstreams', + 'tom_fink' +] +``` + +Then add the following block to your `settings.py`: + +```python +ALERT_STREAMS = [ + { + 'ACTIVE': True, + 'NAME': 'tom_fink.alertstream.FinkAlertStream', + 'OPTIONS': { + 'URL': os.getenv('FINK_CREDENTIAL_URL', 'set FINK_CREDENTIAL_URL value in environment'), + 'USERNAME': os.getenv('FINK_CREDENTIAL_USERNAME', 'set FINK_CREDENTIAL_USERNAME value in environment'), + 'GROUP_ID': os.getenv('FINK_CREDENTIAL_GROUP_ID', 'set FINK_CREDENTIAL_GROUP_ID value in environment'), + 'TOPIC': os.getenv('FINK_TOPIC', 'set FINK_TOPIC value in environment'), + 'MAX_POLL_NUMBER': os.getenv("FINK_MAX_POLL_NUMBER", 1e10), + 'TIMEOUT': os.getenv('FINK_TIMEOUT', 10), + 'TOPIC_HANDLERS': { + 'fink.stream': 'tom_fink.alertstream.alert_logger', + }, + }, + }, +] +``` + +and declare the following variables in your `~/.bash_profile`: + +```bash +export FINK_CREDENTIAL_USERNAME= # provided when registering to Fink livestream +export FINK_CREDENTIAL_GROUP_ID= # provided when registering to Fink livestream +export FINK_CREDENTIAL_URL= # provided when registering to Fink livestream +export FINK_TOPIC= # str, topic name to poll +export FINK_MAX_POLL_NUMBER= # int, number maximum of alerts to poll before closing the connection. Default is 1e10 (never stops). +export FINK_TIMEOUT= # int, in seconds. Default is 10 seconds if not set +``` + +Credentials are provided when registering to Fink livestream (see https://fink-broker.readthedocs.io/en/latest/services/livestream). The available topic names and description can be found at https://fink-broker.readthedocs.io/en/latest/services/livestream. Note that we currently allow to poll only one topic at once (multi-topic is planned for later). Then launch the `readstreams` service: + +```bash +./manage.py readstreams +``` + +You should see a log similar to: + +```bash +registering new views: args: ('groups', , 'groups'), kwargs: {} +registering new views: args: ('targets', , 'targets'), kwargs: {} +registering new views: args: ('targetextra', , 'targetextra'), kwargs: {} +registering new views: args: ('targetname', , 'targetname'), kwargs: {} +registering new views: args: ('targetlist', , 'targetlist'), kwargs: {} +registering new views: args: ('observations', , 'observations'), kwargs: {} +registering new views: args: ('dataproducts', , 'dataproducts'), kwargs: {} +registering new views: args: ('reduceddatums', , 'reduceddatums'), kwargs: {} +NumExpr defaulting to 8 threads. +FinkAlertStream.listen opening stream: IP:PORT with group_id: julien6 (call number: 0) +read_streams FinkAlertStream TID=378166 ; thread identifier=125271444649536 +readstreams Command.handle() returning... +fink.alert_logger topic: fink_sso_ztf_candidates_ztf +fink.alert_logger value: ZTF24aakwfsz emitted 2024-04-23 07:26:57.998412 (received 2024-04-29 10:45:01) +FinkAlertStream.listen opening stream: IP:PORT with group_id: julien6 (call number: 1) +fink.alert_logger topic: fink_sso_ztf_candidates_ztf +fink.alert_logger value: ZTF24aakwftv emitted 2024-04-23 07:27:39.003823 (received 2024-04-29 10:45:01) +... +``` + +Each new alert will be saved as a `Target`. If more than one alert with the name `objectId` are emitted, you will be warned: + +```bash +fink.alert_logger value: ZTF24aakwfsu emitted 2024-04-23 07:26:57.998412 (received 2024-04-29 08:18:07) +Target ZTF24aakwfsu already in the database +``` + +and the program will continue. Probably we should group these in the future, instead of ignoring subsequent alerts. Then launch the app (do not close the previous process!): + +```bash +./manage.py runserver +``` + +and you should have access to your targets, that are accessible from their topic name: + +![targets](.github/livestream_targets.png) + +### Testing & debugging the connection + +Before running in production, we advise to make tests using a test stream, and polling a few alerts: + +```bash +export FINK_CREDENTIAL_USERNAME= # provided when registering to Fink livestream +export FINK_CREDENTIAL_GROUP_ID= # provided when registering to Fink livestream +export FINK_CREDENTIAL_URL= # provided when registering to Fink livestream +export FINK_TOPIC=fink_sso_ztf_candidates_ztf +export FINK_MAX_POLL_NUMBER=2 +export FINK_TIMEOUT=10 +``` + +This way, you will poll alerts two-by-two, and you will have a reservoir of thousands of alerts (solar system objects)! + ## Todo list - [ ] Add a test suite (preferably running on GitHub Actions) - [x] Add a linter (preferably running on GitHub Actions) - [x] Update the Query Form with all API features -- [ ] Enable querying livestreams using the Fink Kafka client +- [x] Enable querying live streams using the Fink Kafka client +- [x] Update visualisation of targets from the livestream service diff --git a/poetry.lock b/poetry.lock index ef27b8a..5e01374 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,9 +1,32 @@ -# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. +# This file is automatically @generated by Poetry and should not be changed by hand. + +[[package]] +name = "adc-streaming" +version = "2.3.2" +description = "Astronomy Data Commons streaming client libraries" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "adc-streaming-2.3.2.tar.gz", hash = "sha256:0f7097f5ed6d56a31c1a91d2ddbfb18b64ed651c175a43dd982be01002f16ce3"}, + {file = "adc_streaming-2.3.2-py3-none-any.whl", hash = "sha256:9b010c01e08c761a1173bd05068b0a4f31c88b1c12b9c9554924b2de478fddbf"}, +] + +[package.dependencies] +authlib = "*" +certifi = ">=2020.04.05.1" +confluent-kafka = ">=1.6.1,<2.1.0 || >2.1.0,<2.1.1 || >2.1.1" +requests = "*" +tqdm = "*" + +[package.extras] +dev = ["autopep8", "docker", "flake8", "isort", "pytest", "pytest-integration", "pytest-timeout", "sphinx", "sphinx-rtd-theme", "twine"] [[package]] name = "asdf" version = "2.15.0" description = "Python implementation of the ASDF Standard" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -36,6 +59,7 @@ tests = ["astropy (>=5.0.4)", "fsspec[http] (>=2022.8.2)", "gwcs (>=0.18.3)", "l name = "asdf-astropy" version = "0.4.0" description = "ASDF serialization support for astropy" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -60,6 +84,7 @@ test = ["coverage", "pytest-astropy", "scipy"] name = "asdf-coordinates-schemas" version = "0.2.0" description = "ASDF schemas for coordinates" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -78,6 +103,7 @@ test = ["pytest"] name = "asdf-standard" version = "1.0.3" description = "The ASDF Standard schemas" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -96,6 +122,7 @@ test = ["asdf (>=2.8.0)", "astropy (>=5.0.4)", "gwcs", "packaging (>=16.0)", "py name = "asdf-transform-schemas" version = "0.4.0" description = "ASDF schemas for transforms" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -115,6 +142,7 @@ test = ["asdf (>=2.8.0)", "asdf-astropy", "pytest", "scipy"] name = "asdf-unit-schemas" version = "0.2.0" description = "DEPRECATED: ASDF schemas for units" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -130,6 +158,7 @@ test = ["asdf", "pytest"] name = "asdf-wcs-schemas" version = "0.3.0" description = "ASDF WCS schemas" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -151,6 +180,7 @@ test = ["asdf (>=2.8.0)", "asdf-astropy", "pytest (>=4.6.0)", "pytest-openfiles name = "asgiref" version = "3.7.2" description = "ASGI specs, helper code, and adapters" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -168,6 +198,7 @@ tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] name = "astroplan" version = "0.9.1" description = "Observation planning package for astronomers" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -190,6 +221,7 @@ test = ["pytest-astropy", "pytest-mpl"] name = "astropy" version = "5.2.2" description = "Astronomy and astrophysics core library" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -243,6 +275,7 @@ test-all = ["coverage[toml]", "ipython (>=4.2)", "objgraph", "pytest (>=7.0)", " name = "astroquery" version = "0.4.7" description = "Functions and classes to access online astronomical data resources" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -268,6 +301,7 @@ test = ["matplotlib", "pytest-astropy", "pytest-dependency", "pytest-rerunfailur name = "async-timeout" version = "4.0.3" description = "Timeout context manager for asyncio programs" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -279,6 +313,7 @@ files = [ name = "attrs" version = "23.2.0" description = "Classes Without Boilerplate" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -294,10 +329,26 @@ tests = ["attrs[tests-no-zope]", "zope-interface"] tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] +[[package]] +name = "authlib" +version = "1.3.0" +description = "The ultimate Python library in building OAuth and OpenID Connect servers and clients." +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "Authlib-1.3.0-py2.py3-none-any.whl", hash = "sha256:9637e4de1fb498310a56900b3e2043a206b03cb11c05422014b0302cbc814be3"}, + {file = "Authlib-1.3.0.tar.gz", hash = "sha256:959ea62a5b7b5123c5059758296122b57cd2585ae2ed1c0622c21b371ffdae06"}, +] + +[package.dependencies] +cryptography = "*" + [[package]] name = "backports-zoneinfo" version = "0.2.1" description = "Backport of the standard library zoneinfo module" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -326,6 +377,7 @@ tzdata = ["tzdata"] name = "beautifulsoup4" version = "4.12.3" description = "Screen-scraping library" +category = "main" optional = false python-versions = ">=3.6.0" files = [ @@ -347,6 +399,7 @@ lxml = ["lxml"] name = "certifi" version = "2024.2.2" description = "Python package for providing Mozilla's CA Bundle." +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -358,6 +411,7 @@ files = [ name = "cffi" version = "1.16.0" description = "Foreign Function Interface for Python calling C code." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -422,6 +476,7 @@ pycparser = "*" name = "charset-normalizer" version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -517,10 +572,142 @@ files = [ {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "confluent-kafka" +version = "2.2.0" +description = "Confluent's Python client for Apache Kafka" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "confluent-kafka-2.2.0.tar.gz", hash = "sha256:c91a79cd0420eec98d547bdc974232619831d8ca5214eade55443cdf1015b0bc"}, + {file = "confluent_kafka-2.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:069830518594f2639025b60351bc44a9ef9e33a3cf648706854e6f84dbbf2fa4"}, + {file = "confluent_kafka-2.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6af70f3a8a4ad3df232c8d25658f87fe6318daa85867851a469cd853859cc976"}, + {file = "confluent_kafka-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c544064acd50c8f4cb5b6e2158f0dd046fe36ce49a3bf69f018d67d8aa31252a"}, + {file = "confluent_kafka-2.2.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:0ecfb19465d2272e985b2cf8d02cbc6b1e878ad24fe342e7489a22bb0694e0ff"}, + {file = "confluent_kafka-2.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:bfe649c950db27b36fe099e7dec3e6f9f6264dcd683fefca1a3d1baafea71489"}, + {file = "confluent_kafka-2.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:994fcf16cb59906558921fa58c9357c8211feef534a0218a75acd805786c67bd"}, + {file = "confluent_kafka-2.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:36d74ae7880c504e347dca6f573681c6e17d35e000b187300dfdde1250330636"}, + {file = "confluent_kafka-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4df1118f5ed39a59aed3c4e1b94ec7d369f30a99e7609cb1eebc789cd2c0f86c"}, + {file = "confluent_kafka-2.2.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:3f8033fabdd32e51b8fec44783b5d54ce7e2569207b42536b822c44911a06b4e"}, + {file = "confluent_kafka-2.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:f6ff4b71ea8b5b58fc38a401481dc0406b501a9f469e0a3c7920db379b4667c8"}, + {file = "confluent_kafka-2.2.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:aa78d70c12e04c3331ac34b00e59f3216aacb140e464f3d55d965741e9cbae7a"}, + {file = "confluent_kafka-2.2.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93cd00b95f317c190e1c73266ff63c2001c08db141f3543792970f8019311d12"}, + {file = "confluent_kafka-2.2.0-cp36-cp36m-manylinux_2_28_aarch64.whl", hash = "sha256:76ae8f773e7b34db4d1ca7e83ca3b7bca4d75172aee71cb49db0adf30e091156"}, + {file = "confluent_kafka-2.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:59596a6d6e53cebb5dc020edf972700cb93f147703638bca9ff659e5ba41b096"}, + {file = "confluent_kafka-2.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a80e7202b361466fe275b76e8b76e7a89e2933099e4a1fbb5a5b71ccc3898647"}, + {file = "confluent_kafka-2.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0099be6c21c54c09b18f99d40b9189b20d9779af520b79320dc3be1b954a6735"}, + {file = "confluent_kafka-2.2.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:7fbc55cf74babe350974836691225920e2cc0acf51a49aac9896df4ca1ba6375"}, + {file = "confluent_kafka-2.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ee8f1ddb977d94be7daa30527eaded6357d62dbbe7fdff764df260f134f6e304"}, + {file = "confluent_kafka-2.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cabea69e2e6803eabaa99c8b72eb3747150bd9672bb819e16883750b37deae26"}, + {file = "confluent_kafka-2.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bdf449bd515d7ae859449e170ccf7f65d1ad9093ed5c8d7e4b6132a2388d1ae8"}, + {file = "confluent_kafka-2.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67f5ea8b5669165a808a19f9aacae54e9606a4ccad40af1bb5da5c2ac95ad32c"}, + {file = "confluent_kafka-2.2.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:404b7c628721feaabc7c92e7a7308f2002b42d307aef2c22a62fc1554a8edea1"}, + {file = "confluent_kafka-2.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:ab27f2c13e581b02ac34ce972f9a2f4165358c346f7ff8514d63ff13f422319d"}, + {file = "confluent_kafka-2.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9ded465e3dbdf3cae2be02aeed084b198832cbb97f08a433e83bb38fd6be9bf3"}, + {file = "confluent_kafka-2.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e24a41d7be375e96b0149646b676c923cab7871fbf782c485c740f7cc2d8a68"}, + {file = "confluent_kafka-2.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71cd9dbb7553f2fe3c5cac6fe47808e450aa4b09d9cbf448454fe049d8f603b2"}, + {file = "confluent_kafka-2.2.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:7b84e9b75b47646ca195d54bacca4b8cadc31ee676594cd7f4e5260ee09586be"}, + {file = "confluent_kafka-2.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:29bc97ec1bc42c8995a0fba50d055a6b968d9ad4f4e95277754df43fcc8195a8"}, +] + +[package.extras] +avro = ["avro (>=1.11.1,<2)", "fastavro (>=0.23.0,<1.0)", "fastavro (>=1.0)", "requests"] +dev = ["avro (>=1.11.1,<2)", "fastavro (>=0.23.0,<1.0)", "fastavro (>=1.0)", "flake8", "pytest", "pytest (==4.6.4)", "pytest-timeout", "requests"] +doc = ["avro (>=1.11.1,<2)", "fastavro (>=0.23.0,<1.0)", "fastavro (>=1.0)", "requests", "sphinx", "sphinx-rtd-theme"] +json = ["jsonschema", "pyrsistent", "pyrsistent (==0.16.1)", "requests"] +protobuf = ["protobuf", "requests"] +schema-registry = ["requests"] + +[[package]] +name = "contourpy" +version = "1.1.1" +description = "Python library for calculating contours of 2D quadrilateral grids" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "contourpy-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:46e24f5412c948d81736509377e255f6040e94216bf1a9b5ea1eaa9d29f6ec1b"}, + {file = "contourpy-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e48694d6a9c5a26ee85b10130c77a011a4fedf50a7279fa0bdaf44bafb4299d"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a66045af6cf00e19d02191ab578a50cb93b2028c3eefed999793698e9ea768ae"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ebf42695f75ee1a952f98ce9775c873e4971732a87334b099dde90b6af6a916"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6aec19457617ef468ff091669cca01fa7ea557b12b59a7908b9474bb9674cf0"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:462c59914dc6d81e0b11f37e560b8a7c2dbab6aca4f38be31519d442d6cde1a1"}, + {file = "contourpy-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6d0a8efc258659edc5299f9ef32d8d81de8b53b45d67bf4bfa3067f31366764d"}, + {file = "contourpy-1.1.1-cp310-cp310-win32.whl", hash = "sha256:d6ab42f223e58b7dac1bb0af32194a7b9311065583cc75ff59dcf301afd8a431"}, + {file = "contourpy-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:549174b0713d49871c6dee90a4b499d3f12f5e5f69641cd23c50a4542e2ca1eb"}, + {file = "contourpy-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:407d864db716a067cc696d61fa1ef6637fedf03606e8417fe2aeed20a061e6b2"}, + {file = "contourpy-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe80c017973e6a4c367e037cb31601044dd55e6bfacd57370674867d15a899b"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e30aaf2b8a2bac57eb7e1650df1b3a4130e8d0c66fc2f861039d507a11760e1b"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3de23ca4f381c3770dee6d10ead6fff524d540c0f662e763ad1530bde5112532"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:566f0e41df06dfef2431defcfaa155f0acfa1ca4acbf8fd80895b1e7e2ada40e"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b04c2f0adaf255bf756cf08ebef1be132d3c7a06fe6f9877d55640c5e60c72c5"}, + {file = "contourpy-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d0c188ae66b772d9d61d43c6030500344c13e3f73a00d1dc241da896f379bb62"}, + {file = "contourpy-1.1.1-cp311-cp311-win32.whl", hash = "sha256:0683e1ae20dc038075d92e0e0148f09ffcefab120e57f6b4c9c0f477ec171f33"}, + {file = "contourpy-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:8636cd2fc5da0fb102a2504fa2c4bea3cbc149533b345d72cdf0e7a924decc45"}, + {file = "contourpy-1.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:560f1d68a33e89c62da5da4077ba98137a5e4d3a271b29f2f195d0fba2adcb6a"}, + {file = "contourpy-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:24216552104ae8f3b34120ef84825400b16eb6133af2e27a190fdc13529f023e"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56de98a2fb23025882a18b60c7f0ea2d2d70bbbcfcf878f9067234b1c4818442"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:07d6f11dfaf80a84c97f1a5ba50d129d9303c5b4206f776e94037332e298dda8"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1eaac5257a8f8a047248d60e8f9315c6cff58f7803971170d952555ef6344a7"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19557fa407e70f20bfaba7d55b4d97b14f9480856c4fb65812e8a05fe1c6f9bf"}, + {file = "contourpy-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:081f3c0880712e40effc5f4c3b08feca6d064cb8cfbb372ca548105b86fd6c3d"}, + {file = "contourpy-1.1.1-cp312-cp312-win32.whl", hash = "sha256:059c3d2a94b930f4dafe8105bcdc1b21de99b30b51b5bce74c753686de858cb6"}, + {file = "contourpy-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f44d78b61740e4e8c71db1cf1fd56d9050a4747681c59ec1094750a658ceb970"}, + {file = "contourpy-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:70e5a10f8093d228bb2b552beeb318b8928b8a94763ef03b858ef3612b29395d"}, + {file = "contourpy-1.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8394e652925a18ef0091115e3cc191fef350ab6dc3cc417f06da66bf98071ae9"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5bd5680f844c3ff0008523a71949a3ff5e4953eb7701b28760805bc9bcff217"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66544f853bfa85c0d07a68f6c648b2ec81dafd30f272565c37ab47a33b220684"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0c02b75acfea5cab07585d25069207e478d12309557f90a61b5a3b4f77f46ce"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41339b24471c58dc1499e56783fedc1afa4bb018bcd035cfb0ee2ad2a7501ef8"}, + {file = "contourpy-1.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f29fb0b3f1217dfe9362ec55440d0743fe868497359f2cf93293f4b2701b8251"}, + {file = "contourpy-1.1.1-cp38-cp38-win32.whl", hash = "sha256:f9dc7f933975367251c1b34da882c4f0e0b2e24bb35dc906d2f598a40b72bfc7"}, + {file = "contourpy-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:498e53573e8b94b1caeb9e62d7c2d053c263ebb6aa259c81050766beb50ff8d9"}, + {file = "contourpy-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ba42e3810999a0ddd0439e6e5dbf6d034055cdc72b7c5c839f37a7c274cb4eba"}, + {file = "contourpy-1.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c06e4c6e234fcc65435223c7b2a90f286b7f1b2733058bdf1345d218cc59e34"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca6fab080484e419528e98624fb5c4282148b847e3602dc8dbe0cb0669469887"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93df44ab351119d14cd1e6b52a5063d3336f0754b72736cc63db59307dabb718"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eafbef886566dc1047d7b3d4b14db0d5b7deb99638d8e1be4e23a7c7ac59ff0f"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efe0fab26d598e1ec07d72cf03eaeeba8e42b4ecf6b9ccb5a356fde60ff08b85"}, + {file = "contourpy-1.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f08e469821a5e4751c97fcd34bcb586bc243c39c2e39321822060ba902eac49e"}, + {file = "contourpy-1.1.1-cp39-cp39-win32.whl", hash = "sha256:bfc8a5e9238232a45ebc5cb3bfee71f1167064c8d382cadd6076f0d51cff1da0"}, + {file = "contourpy-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:c84fdf3da00c2827d634de4fcf17e3e067490c4aea82833625c4c8e6cdea0887"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:229a25f68046c5cf8067d6d6351c8b99e40da11b04d8416bf8d2b1d75922521e"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a10dab5ea1bd4401c9483450b5b0ba5416be799bbd50fc7a6cc5e2a15e03e8a3"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4f9147051cb8fdb29a51dc2482d792b3b23e50f8f57e3720ca2e3d438b7adf23"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a75cc163a5f4531a256f2c523bd80db509a49fc23721b36dd1ef2f60ff41c3cb"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b53d5769aa1f2d4ea407c65f2d1d08002952fac1d9e9d307aa2e1023554a163"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11b836b7dbfb74e049c302bbf74b4b8f6cb9d0b6ca1bf86cfa8ba144aedadd9c"}, + {file = "contourpy-1.1.1.tar.gz", hash = "sha256:96ba37c2e24b7212a77da85004c38e7c4d155d3e72a45eeaf22c1f03f607e8ab"}, +] + +[package.dependencies] +numpy = {version = ">=1.16,<2.0", markers = "python_version <= \"3.11\""} + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.4.1)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "wurlitzer"] + [[package]] name = "coverage" version = "6.5.0" description = "Code coverage measurement for Python" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -583,6 +770,7 @@ toml = ["tomli"] name = "coveralls" version = "3.3.1" description = "Show coverage stats online via coveralls.io" +category = "main" optional = false python-versions = ">= 3.5" files = [ @@ -591,7 +779,7 @@ files = [ ] [package.dependencies] -coverage = ">=4.1,<6.0.dev0 || >6.1,<6.1.1 || >6.1.1,<7.0" +coverage = ">=4.1,<6.0.0 || >6.1,<6.1.1 || >6.1.1,<7.0" docopt = ">=0.6.1" requests = ">=1.0.0" @@ -602,6 +790,7 @@ yaml = ["PyYAML (>=3.10)"] name = "crispy-bootstrap4" version = "2024.1" description = "Bootstrap4 template pack for django-crispy-forms" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -617,6 +806,7 @@ django-crispy-forms = ">=2.0" name = "cryptography" version = "42.0.5" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -667,10 +857,27 @@ ssh = ["bcrypt (>=3.1.5)"] test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] +[[package]] +name = "cycler" +version = "0.12.1" +description = "Composable style cycles" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, +] + +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] + [[package]] name = "django" version = "4.2.11" description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -692,6 +899,7 @@ bcrypt = ["bcrypt"] name = "django-bootstrap4" version = "24.1" description = "Django extensions by Zostera" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -707,6 +915,7 @@ Django = ">=3.2" name = "django-contrib-comments" version = "2.2.0" description = "The code formerly known as django.contrib.comments." +category = "main" optional = false python-versions = "*" files = [ @@ -721,6 +930,7 @@ Django = ">=2.2" name = "django-crispy-forms" version = "2.1" description = "Best way to have Django DRY forms" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -735,6 +945,7 @@ django = ">=4.2" name = "django-dramatiq" version = "0.11.6" description = "A Django app for Dramatiq." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -753,6 +964,7 @@ dev = ["bumpversion", "flake8", "flake8-quotes", "isort", "pytest", "pytest-cov" name = "django-extensions" version = "3.2.3" description = "Extensions for Django" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -767,6 +979,7 @@ Django = ">=3.2" name = "django-filter" version = "24.1" description = "Django-filter is a reusable Django application for allowing users to filter querysets dynamically." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -781,6 +994,7 @@ Django = ">=4.2" name = "django-gravatar2" version = "1.4.4" description = "Essential Gravatar support for Django. Features helper methods, templatetags and a full test suite!" +category = "main" optional = false python-versions = "*" files = [ @@ -792,6 +1006,7 @@ files = [ name = "django-guardian" version = "2.4.0" description = "Implementation of per object permissions for Django." +category = "main" optional = false python-versions = ">=3.5" files = [ @@ -806,6 +1021,7 @@ Django = ">=2.2" name = "djangorestframework" version = "3.15.0" description = "Web APIs for Django, made easy." +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -821,6 +1037,7 @@ django = ">=3.0" name = "docopt" version = "0.6.2" description = "Pythonic argument parser, that will make you smile" +category = "main" optional = false python-versions = "*" files = [ @@ -831,6 +1048,7 @@ files = [ name = "dramatiq" version = "1.16.0" description = "Background Processing for Python 3." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -857,6 +1075,7 @@ watch = ["watchdog", "watchdog-gevent"] name = "elastic-transport" version = "8.12.0" description = "Transport classes and utilities shared among Python Elastic client libraries" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -875,6 +1094,7 @@ develop = ["aiohttp", "furo", "mock", "pytest", "pytest-asyncio", "pytest-cov", name = "elasticsearch" version = "8.12.1" description = "Python client for Elasticsearch" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -893,6 +1113,7 @@ requests = ["requests (>=2.4.0,<3.0.0)"] name = "elasticsearch-dsl" version = "8.12.0" description = "Python client for Elasticsearch" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -911,6 +1132,7 @@ develop = ["coverage", "pytest", "pytest-cov", "pytest-mock", "pytz", "sphinx (> name = "factory-boy" version = "3.2.1" description = "A versatile test fixtures replacement based on thoughtbot's factory_bot for Ruby." +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -929,6 +1151,7 @@ doc = ["Sphinx", "sphinx-rtd-theme", "sphinxcontrib-spelling"] name = "faker" version = "24.2.0" description = "Faker is a Python package that generates fake data for you." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -940,10 +1163,83 @@ files = [ python-dateutil = ">=2.4" typing-extensions = {version = ">=3.10.0.1", markers = "python_version <= \"3.8\""} +[[package]] +name = "fastavro" +version = "1.9.4" +description = "Fast read/write of AVRO files" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fastavro-1.9.4-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:60cb38f07462a7fb4e4440ed0de67d3d400ae6b3d780f81327bebde9aa55faef"}, + {file = "fastavro-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:063d01d197fc929c20adc09ca9f0ca86d33ac25ee0963ce0b438244eee8315ae"}, + {file = "fastavro-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87a9053fcfbc895f2a16a4303af22077e3a8fdcf1cd5d6ed47ff2ef22cbba2f0"}, + {file = "fastavro-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:02bf1276b7326397314adf41b34a4890f6ffa59cf7e0eb20b9e4ab0a143a1598"}, + {file = "fastavro-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56bed9eca435389a8861e6e2d631ec7f8f5dda5b23f93517ac710665bd34ca29"}, + {file = "fastavro-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:0cd2099c8c672b853e0b20c13e9b62a69d3fbf67ee7c59c7271ba5df1680310d"}, + {file = "fastavro-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:af8c6d8c43a02b5569c093fc5467469541ac408c79c36a5b0900d3dd0b3ba838"}, + {file = "fastavro-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4a138710bd61580324d23bc5e3df01f0b82aee0a76404d5dddae73d9e4c723f"}, + {file = "fastavro-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:903d97418120ca6b6a7f38a731166c1ccc2c4344ee5e0470d09eb1dc3687540a"}, + {file = "fastavro-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c443eeb99899d062dbf78c525e4614dd77e041a7688fa2710c224f4033f193ae"}, + {file = "fastavro-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ac26ab0774d1b2b7af6d8f4300ad20bbc4b5469e658a02931ad13ce23635152f"}, + {file = "fastavro-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:cf7247874c22be856ba7d1f46a0f6e0379a6025f1a48a7da640444cbac6f570b"}, + {file = "fastavro-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:68912f2020e1b3d70557260b27dd85fb49a4fc6bfab18d384926127452c1da4c"}, + {file = "fastavro-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6925ce137cdd78e109abdb0bc33aad55de6c9f2d2d3036b65453128f2f5f5b92"}, + {file = "fastavro-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b928cd294e36e35516d0deb9e104b45be922ba06940794260a4e5dbed6c192a"}, + {file = "fastavro-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:90c9838bc4c991ffff5dd9d88a0cc0030f938b3fdf038cdf6babde144b920246"}, + {file = "fastavro-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:eca6e54da571b06a3c5a72dbb7212073f56c92a6fbfbf847b91c347510f8a426"}, + {file = "fastavro-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a4b02839ac261100cefca2e2ad04cdfedc556cb66b5ec735e0db428e74b399de"}, + {file = "fastavro-1.9.4-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:4451ee9a305a73313a1558d471299f3130e4ecc10a88bf5742aa03fb37e042e6"}, + {file = "fastavro-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8524fccfb379565568c045d29b2ebf71e1f2c0dd484aeda9fe784ef5febe1a8"}, + {file = "fastavro-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33d0a00a6e09baa20f6f038d7a2ddcb7eef0e7a9980e947a018300cb047091b8"}, + {file = "fastavro-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:23d7e5b29c9bf6f26e8be754b2c8b919838e506f78ef724de7d22881696712fc"}, + {file = "fastavro-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2e6ab3ee53944326460edf1125b2ad5be2fadd80f7211b13c45fa0c503b4cf8d"}, + {file = "fastavro-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:64d335ec2004204c501f8697c385d0a8f6b521ac82d5b30696f789ff5bc85f3c"}, + {file = "fastavro-1.9.4-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:7e05f44c493e89e73833bd3ff3790538726906d2856f59adc8103539f4a1b232"}, + {file = "fastavro-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:253c63993250bff4ee7b11fb46cf3a4622180a783bedc82a24c6fdcd1b10ca2a"}, + {file = "fastavro-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24d6942eb1db14640c2581e0ecd1bbe0afc8a83731fcd3064ae7f429d7880cb7"}, + {file = "fastavro-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d47bb66be6091cd48cfe026adcad11c8b11d7d815a2949a1e4ccf03df981ca65"}, + {file = "fastavro-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c293897f12f910e58a1024f9c77f565aa8e23b36aafda6ad8e7041accc57a57f"}, + {file = "fastavro-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:f05d2afcb10a92e2a9e580a3891f090589b3e567fdc5641f8a46a0b084f120c3"}, + {file = "fastavro-1.9.4.tar.gz", hash = "sha256:56b8363e360a1256c94562393dc7f8611f3baf2b3159f64fb2b9c6b87b14e876"}, +] + +[package.extras] +codecs = ["cramjam", "lz4", "zstandard"] +lz4 = ["lz4"] +snappy = ["cramjam"] +zstandard = ["zstandard"] + +[[package]] +name = "fink-client" +version = "7.2" +description = "Light-weight client to manipulate alerts from Fink" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "fink-client-7.2.tar.gz", hash = "sha256:64a88742b30b9c7362c4d89cdb0ed04278fdf9d0b94556f64fc39b46dd1fc436"}, + {file = "fink_client-7.2-py3-none-any.whl", hash = "sha256:05711ebe5acabc103718d0959e943ca2fd987eb3093d8128b24c00750b373ecf"}, +] + +[package.dependencies] +astropy = "*" +confluent-kafka = "2.2.0" +coverage = ">=4.2" +coveralls = "*" +matplotlib = "*" +numpy = "<1.25" +pandas = "*" +pyarrow = ">=10.0.1" +pyyaml = "*" +tabulate = "*" +tqdm = "*" + [[package]] name = "fits2image" version = "0.4.7" description = "Common libraries for the conversion and scaling of fits images" +category = "main" optional = false python-versions = "*" files = [ @@ -960,6 +1256,7 @@ Pillow = "*" name = "flake8" version = "7.0.0" description = "the modular source code checker: pep8 pyflakes and co" +category = "dev" optional = false python-versions = ">=3.8.1" files = [ @@ -972,10 +1269,98 @@ mccabe = ">=0.7.0,<0.8.0" pycodestyle = ">=2.11.0,<2.12.0" pyflakes = ">=3.2.0,<3.3.0" +[[package]] +name = "fonttools" +version = "4.51.0" +description = "Tools to manipulate font files" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fonttools-4.51.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:84d7751f4468dd8cdd03ddada18b8b0857a5beec80bce9f435742abc9a851a74"}, + {file = "fonttools-4.51.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8b4850fa2ef2cfbc1d1f689bc159ef0f45d8d83298c1425838095bf53ef46308"}, + {file = "fonttools-4.51.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5b48a1121117047d82695d276c2af2ee3a24ffe0f502ed581acc2673ecf1037"}, + {file = "fonttools-4.51.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:180194c7fe60c989bb627d7ed5011f2bef1c4d36ecf3ec64daec8302f1ae0716"}, + {file = "fonttools-4.51.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:96a48e137c36be55e68845fc4284533bda2980f8d6f835e26bca79d7e2006438"}, + {file = "fonttools-4.51.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:806e7912c32a657fa39d2d6eb1d3012d35f841387c8fc6cf349ed70b7c340039"}, + {file = "fonttools-4.51.0-cp310-cp310-win32.whl", hash = "sha256:32b17504696f605e9e960647c5f64b35704782a502cc26a37b800b4d69ff3c77"}, + {file = "fonttools-4.51.0-cp310-cp310-win_amd64.whl", hash = "sha256:c7e91abdfae1b5c9e3a543f48ce96013f9a08c6c9668f1e6be0beabf0a569c1b"}, + {file = "fonttools-4.51.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a8feca65bab31479d795b0d16c9a9852902e3a3c0630678efb0b2b7941ea9c74"}, + {file = "fonttools-4.51.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ac27f436e8af7779f0bb4d5425aa3535270494d3bc5459ed27de3f03151e4c2"}, + {file = "fonttools-4.51.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e19bd9e9964a09cd2433a4b100ca7f34e34731e0758e13ba9a1ed6e5468cc0f"}, + {file = "fonttools-4.51.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2b92381f37b39ba2fc98c3a45a9d6383bfc9916a87d66ccb6553f7bdd129097"}, + {file = "fonttools-4.51.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5f6bc991d1610f5c3bbe997b0233cbc234b8e82fa99fc0b2932dc1ca5e5afec0"}, + {file = "fonttools-4.51.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9696fe9f3f0c32e9a321d5268208a7cc9205a52f99b89479d1b035ed54c923f1"}, + {file = "fonttools-4.51.0-cp311-cp311-win32.whl", hash = "sha256:3bee3f3bd9fa1d5ee616ccfd13b27ca605c2b4270e45715bd2883e9504735034"}, + {file = "fonttools-4.51.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f08c901d3866a8905363619e3741c33f0a83a680d92a9f0e575985c2634fcc1"}, + {file = "fonttools-4.51.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4060acc2bfa2d8e98117828a238889f13b6f69d59f4f2d5857eece5277b829ba"}, + {file = "fonttools-4.51.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1250e818b5f8a679ad79660855528120a8f0288f8f30ec88b83db51515411fcc"}, + {file = "fonttools-4.51.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76f1777d8b3386479ffb4a282e74318e730014d86ce60f016908d9801af9ca2a"}, + {file = "fonttools-4.51.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b5ad456813d93b9c4b7ee55302208db2b45324315129d85275c01f5cb7e61a2"}, + {file = "fonttools-4.51.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:68b3fb7775a923be73e739f92f7e8a72725fd333eab24834041365d2278c3671"}, + {file = "fonttools-4.51.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8e2f1a4499e3b5ee82c19b5ee57f0294673125c65b0a1ff3764ea1f9db2f9ef5"}, + {file = "fonttools-4.51.0-cp312-cp312-win32.whl", hash = "sha256:278e50f6b003c6aed19bae2242b364e575bcb16304b53f2b64f6551b9c000e15"}, + {file = "fonttools-4.51.0-cp312-cp312-win_amd64.whl", hash = "sha256:b3c61423f22165541b9403ee39874dcae84cd57a9078b82e1dce8cb06b07fa2e"}, + {file = "fonttools-4.51.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1621ee57da887c17312acc4b0e7ac30d3a4fb0fec6174b2e3754a74c26bbed1e"}, + {file = "fonttools-4.51.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e9d9298be7a05bb4801f558522adbe2feea1b0b103d5294ebf24a92dd49b78e5"}, + {file = "fonttools-4.51.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee1af4be1c5afe4c96ca23badd368d8dc75f611887fb0c0dac9f71ee5d6f110e"}, + {file = "fonttools-4.51.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c18b49adc721a7d0b8dfe7c3130c89b8704baf599fb396396d07d4aa69b824a1"}, + {file = "fonttools-4.51.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de7c29bdbdd35811f14493ffd2534b88f0ce1b9065316433b22d63ca1cd21f14"}, + {file = "fonttools-4.51.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cadf4e12a608ef1d13e039864f484c8a968840afa0258b0b843a0556497ea9ed"}, + {file = "fonttools-4.51.0-cp38-cp38-win32.whl", hash = "sha256:aefa011207ed36cd280babfaa8510b8176f1a77261833e895a9d96e57e44802f"}, + {file = "fonttools-4.51.0-cp38-cp38-win_amd64.whl", hash = "sha256:865a58b6e60b0938874af0968cd0553bcd88e0b2cb6e588727117bd099eef836"}, + {file = "fonttools-4.51.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:60a3409c9112aec02d5fb546f557bca6efa773dcb32ac147c6baf5f742e6258b"}, + {file = "fonttools-4.51.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f7e89853d8bea103c8e3514b9f9dc86b5b4120afb4583b57eb10dfa5afbe0936"}, + {file = "fonttools-4.51.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56fc244f2585d6c00b9bcc59e6593e646cf095a96fe68d62cd4da53dd1287b55"}, + {file = "fonttools-4.51.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d145976194a5242fdd22df18a1b451481a88071feadf251221af110ca8f00ce"}, + {file = "fonttools-4.51.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5b8cab0c137ca229433570151b5c1fc6af212680b58b15abd797dcdd9dd5051"}, + {file = "fonttools-4.51.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:54dcf21a2f2d06ded676e3c3f9f74b2bafded3a8ff12f0983160b13e9f2fb4a7"}, + {file = "fonttools-4.51.0-cp39-cp39-win32.whl", hash = "sha256:0118ef998a0699a96c7b28457f15546815015a2710a1b23a7bf6c1be60c01636"}, + {file = "fonttools-4.51.0-cp39-cp39-win_amd64.whl", hash = "sha256:599bdb75e220241cedc6faebfafedd7670335d2e29620d207dd0378a4e9ccc5a"}, + {file = "fonttools-4.51.0-py3-none-any.whl", hash = "sha256:15c94eeef6b095831067f72c825eb0e2d48bb4cea0647c1b05c981ecba2bf39f"}, + {file = "fonttools-4.51.0.tar.gz", hash = "sha256:dc0673361331566d7a663d7ce0f6fdcbfbdc1f59c6e3ed1165ad7202ca183c68"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres", "pycairo", "scipy"] +lxml = ["lxml (>=4.0)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] +symfont = ["sympy"] +type1 = ["xattr"] +ufo = ["fs (>=2.2.0,<3)"] +unicode = ["unicodedata2 (>=15.1.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] + +[[package]] +name = "gcn-kafka" +version = "0.2.3" +description = "Kafka client for NASA's General Coordinates Network (GCN)" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "gcn-kafka-0.2.3.tar.gz", hash = "sha256:44747bdb0e25362887d9e421f63480c6701a9b6e0a3b3019a799cd905607d308"}, + {file = "gcn_kafka-0.2.3-py3-none-any.whl", hash = "sha256:ac51a35c1c597786decdbc1cb422d7a012a63c28e221c4a2f20434cf6d33d810"}, +] + +[package.dependencies] +authlib = "*" +certifi = "*" +confluent-kafka = ">=1.6.1" +requests = "*" + +[package.extras] +test = ["pytest"] + [[package]] name = "gevent" version = "24.2.1" description = "Coroutine-based network library" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1042,6 +1427,7 @@ test = ["cffi (>=1.12.2)", "coverage (>=5.0)", "dnspython (>=1.16.0,<2.0)", "idn name = "greenlet" version = "3.0.3" description = "Lightweight in-process concurrent programming" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1113,6 +1499,7 @@ test = ["objgraph", "psutil"] name = "gwcs" version = "0.18.3" description = "Generalized World Coordinate System" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1132,10 +1519,34 @@ scipy = "*" docs = ["sphinx", "sphinx-asdf", "sphinx-astropy", "sphinx-automodapi", "sphinx-rtd-theme", "stsci-rtd-theme"] test = ["ci-watson (>=0.3.0)", "codecov", "pytest (>=4.6.0)", "pytest-astropy"] +[[package]] +name = "hop-client" +version = "0.8.0" +description = "A pub-sub client library for Multi-messenger Astrophysics" +category = "main" +optional = false +python-versions = ">=3.6.*" +files = [ + {file = "hop-client-0.8.0.tar.gz", hash = "sha256:340831d3c5c716599e678827ea994913d41100ca9eaac86ffaa2ab980be8ea51"}, + {file = "hop_client-0.8.0-py3-none-any.whl", hash = "sha256:0c9ed7e795d1c06b74bd173e9f40ecd51f712e83f1a35e9b4e26037a1fdac3e9"}, +] + +[package.dependencies] +adc-streaming = ">=2.1.0" +fastavro = ">=1.4.0" +pluggy = ">=0.11" +toml = ">=0.9.4" +xmltodict = ">=0.9.0" + +[package.extras] +dev = ["autopep8", "flake8", "pytest (>=5.0,<5.4)", "pytest-console-scripts", "pytest-cov", "pytest-runner", "twine"] +docs = ["sphinx", "sphinx-rtd-theme", "sphinxcontrib-programoutput"] + [[package]] name = "html5lib" version = "1.1" description = "HTML parser based on the WHATWG HTML specification" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -1157,6 +1568,7 @@ lxml = ["lxml"] name = "idna" version = "3.6" description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1168,6 +1580,7 @@ files = [ name = "importlib-metadata" version = "7.0.2" description = "Read metadata from Python packages" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1187,6 +1600,7 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs name = "importlib-resources" version = "6.3.1" description = "Read resources from Python packages" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1205,6 +1619,7 @@ testing = ["jaraco.collections", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "py name = "jaraco-classes" version = "3.3.1" description = "Utility functions for Python class constructs" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1223,6 +1638,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-ena name = "jeepney" version = "0.8.0" description = "Low-level, pure Python DBus protocol wrapper." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1238,6 +1654,7 @@ trio = ["async_generator", "trio"] name = "jmespath" version = "1.0.1" description = "JSON Matching Expressions" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1249,6 +1666,7 @@ files = [ name = "jsonschema" version = "4.17.3" description = "An implementation of JSON Schema validation for Python" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1270,6 +1688,7 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- name = "keyring" version = "24.3.1" description = "Store and access your passwords safely." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1290,10 +1709,125 @@ completion = ["shtab (>=1.1.0)"] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +[[package]] +name = "kiwisolver" +version = "1.4.5" +description = "A fast implementation of the Cassowary constraint solver" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, + {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, +] + [[package]] name = "markdown" version = "3.6" description = "Python implementation of John Gruber's Markdown." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1308,10 +1842,80 @@ importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] testing = ["coverage", "pyyaml"] +[[package]] +name = "matplotlib" +version = "3.7.5" +description = "Python plotting package" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "matplotlib-3.7.5-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:4a87b69cb1cb20943010f63feb0b2901c17a3b435f75349fd9865713bfa63925"}, + {file = "matplotlib-3.7.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d3ce45010fefb028359accebb852ca0c21bd77ec0f281952831d235228f15810"}, + {file = "matplotlib-3.7.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fbea1e762b28400393d71be1a02144aa16692a3c4c676ba0178ce83fc2928fdd"}, + {file = "matplotlib-3.7.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec0e1adc0ad70ba8227e957551e25a9d2995e319c29f94a97575bb90fa1d4469"}, + {file = "matplotlib-3.7.5-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6738c89a635ced486c8a20e20111d33f6398a9cbebce1ced59c211e12cd61455"}, + {file = "matplotlib-3.7.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1210b7919b4ed94b5573870f316bca26de3e3b07ffdb563e79327dc0e6bba515"}, + {file = "matplotlib-3.7.5-cp310-cp310-win32.whl", hash = "sha256:068ebcc59c072781d9dcdb82f0d3f1458271c2de7ca9c78f5bd672141091e9e1"}, + {file = "matplotlib-3.7.5-cp310-cp310-win_amd64.whl", hash = "sha256:f098ffbaab9df1e3ef04e5a5586a1e6b1791380698e84938d8640961c79b1fc0"}, + {file = "matplotlib-3.7.5-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:f65342c147572673f02a4abec2d5a23ad9c3898167df9b47c149f32ce61ca078"}, + {file = "matplotlib-3.7.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4ddf7fc0e0dc553891a117aa083039088d8a07686d4c93fb8a810adca68810af"}, + {file = "matplotlib-3.7.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0ccb830fc29442360d91be48527809f23a5dcaee8da5f4d9b2d5b867c1b087b8"}, + {file = "matplotlib-3.7.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efc6bb28178e844d1f408dd4d6341ee8a2e906fc9e0fa3dae497da4e0cab775d"}, + {file = "matplotlib-3.7.5-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b15c4c2d374f249f324f46e883340d494c01768dd5287f8bc00b65b625ab56c"}, + {file = "matplotlib-3.7.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d028555421912307845e59e3de328260b26d055c5dac9b182cc9783854e98fb"}, + {file = "matplotlib-3.7.5-cp311-cp311-win32.whl", hash = "sha256:fe184b4625b4052fa88ef350b815559dd90cc6cc8e97b62f966e1ca84074aafa"}, + {file = "matplotlib-3.7.5-cp311-cp311-win_amd64.whl", hash = "sha256:084f1f0f2f1010868c6f1f50b4e1c6f2fb201c58475494f1e5b66fed66093647"}, + {file = "matplotlib-3.7.5-cp312-cp312-macosx_10_12_universal2.whl", hash = "sha256:34bceb9d8ddb142055ff27cd7135f539f2f01be2ce0bafbace4117abe58f8fe4"}, + {file = "matplotlib-3.7.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c5a2134162273eb8cdfd320ae907bf84d171de948e62180fa372a3ca7cf0f433"}, + {file = "matplotlib-3.7.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:039ad54683a814002ff37bf7981aa1faa40b91f4ff84149beb53d1eb64617980"}, + {file = "matplotlib-3.7.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d742ccd1b09e863b4ca58291728db645b51dab343eebb08d5d4b31b308296ce"}, + {file = "matplotlib-3.7.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:743b1c488ca6a2bc7f56079d282e44d236bf375968bfd1b7ba701fd4d0fa32d6"}, + {file = "matplotlib-3.7.5-cp312-cp312-win_amd64.whl", hash = "sha256:fbf730fca3e1f23713bc1fae0a57db386e39dc81ea57dc305c67f628c1d7a342"}, + {file = "matplotlib-3.7.5-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:cfff9b838531698ee40e40ea1a8a9dc2c01edb400b27d38de6ba44c1f9a8e3d2"}, + {file = "matplotlib-3.7.5-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:1dbcca4508bca7847fe2d64a05b237a3dcaec1f959aedb756d5b1c67b770c5ee"}, + {file = "matplotlib-3.7.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4cdf4ef46c2a1609a50411b66940b31778db1e4b73d4ecc2eaa40bd588979b13"}, + {file = "matplotlib-3.7.5-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:167200ccfefd1674b60e957186dfd9baf58b324562ad1a28e5d0a6b3bea77905"}, + {file = "matplotlib-3.7.5-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:53e64522934df6e1818b25fd48cf3b645b11740d78e6ef765fbb5fa5ce080d02"}, + {file = "matplotlib-3.7.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3e3bc79b2d7d615067bd010caff9243ead1fc95cf735c16e4b2583173f717eb"}, + {file = "matplotlib-3.7.5-cp38-cp38-win32.whl", hash = "sha256:6b641b48c6819726ed47c55835cdd330e53747d4efff574109fd79b2d8a13748"}, + {file = "matplotlib-3.7.5-cp38-cp38-win_amd64.whl", hash = "sha256:f0b60993ed3488b4532ec6b697059897891927cbfc2b8d458a891b60ec03d9d7"}, + {file = "matplotlib-3.7.5-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:090964d0afaff9c90e4d8de7836757e72ecfb252fb02884016d809239f715651"}, + {file = "matplotlib-3.7.5-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:9fc6fcfbc55cd719bc0bfa60bde248eb68cf43876d4c22864603bdd23962ba25"}, + {file = "matplotlib-3.7.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7cc3078b019bb863752b8b60e8b269423000f1603cb2299608231996bd9d54"}, + {file = "matplotlib-3.7.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e4e9a868e8163abaaa8259842d85f949a919e1ead17644fb77a60427c90473c"}, + {file = "matplotlib-3.7.5-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fa7ebc995a7d747dacf0a717d0eb3aa0f0c6a0e9ea88b0194d3a3cd241a1500f"}, + {file = "matplotlib-3.7.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3785bfd83b05fc0e0c2ae4c4a90034fe693ef96c679634756c50fe6efcc09856"}, + {file = "matplotlib-3.7.5-cp39-cp39-win32.whl", hash = "sha256:29b058738c104d0ca8806395f1c9089dfe4d4f0f78ea765c6c704469f3fffc81"}, + {file = "matplotlib-3.7.5-cp39-cp39-win_amd64.whl", hash = "sha256:fd4028d570fa4b31b7b165d4a685942ae9cdc669f33741e388c01857d9723eab"}, + {file = "matplotlib-3.7.5-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2a9a3f4d6a7f88a62a6a18c7e6a84aedcaf4faf0708b4ca46d87b19f1b526f88"}, + {file = "matplotlib-3.7.5-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9b3fd853d4a7f008a938df909b96db0b454225f935d3917520305b90680579c"}, + {file = "matplotlib-3.7.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0ad550da9f160737d7890217c5eeed4337d07e83ca1b2ca6535078f354e7675"}, + {file = "matplotlib-3.7.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:20da7924a08306a861b3f2d1da0d1aa9a6678e480cf8eacffe18b565af2813e7"}, + {file = "matplotlib-3.7.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b45c9798ea6bb920cb77eb7306409756a7fab9db9b463e462618e0559aecb30e"}, + {file = "matplotlib-3.7.5-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a99866267da1e561c7776fe12bf4442174b79aac1a47bd7e627c7e4d077ebd83"}, + {file = "matplotlib-3.7.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b6aa62adb6c268fc87d80f963aca39c64615c31830b02697743c95590ce3fbb"}, + {file = "matplotlib-3.7.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e530ab6a0afd082d2e9c17eb1eb064a63c5b09bb607b2b74fa41adbe3e162286"}, + {file = "matplotlib-3.7.5.tar.gz", hash = "sha256:1e5c971558ebc811aa07f54c7b7c677d78aa518ef4c390e14673a09e0860184a"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} +kiwisolver = ">=1.0.1" +numpy = ">=1.20,<2" +packaging = ">=20.0" +pillow = ">=6.2.0" +pyparsing = ">=2.3.1" +python-dateutil = ">=2.7" + [[package]] name = "mccabe" version = "0.7.0" description = "McCabe checker, plugin for flake8" +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1323,6 +1927,7 @@ files = [ name = "more-itertools" version = "10.2.0" description = "More routines for operating on iterables, beyond itertools" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1334,6 +1939,7 @@ files = [ name = "ndcube" version = "2.1.4" description = "A package for multi-dimensional contiguous and non-contiguous coordinate aware arrays." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1358,6 +1964,7 @@ tests = ["dask", "pytest", "pytest-astropy", "pytest-mpl (>=0.12)", "scipy", "su name = "numpy" version = "1.24.4" description = "Fundamental package for array computing in Python" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1395,6 +2002,7 @@ files = [ name = "packaging" version = "24.0" description = "Core utilities for Python packages" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1402,10 +2010,79 @@ files = [ {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, ] +[[package]] +name = "pandas" +version = "2.0.3" +description = "Powerful data structures for data analysis, time series, and statistics" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pandas-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4c7c9f27a4185304c7caf96dc7d91bc60bc162221152de697c98eb0b2648dd8"}, + {file = "pandas-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f167beed68918d62bffb6ec64f2e1d8a7d297a038f86d4aed056b9493fca407f"}, + {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce0c6f76a0f1ba361551f3e6dceaff06bde7514a374aa43e33b588ec10420183"}, + {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba619e410a21d8c387a1ea6e8a0e49bb42216474436245718d7f2e88a2f8d7c0"}, + {file = "pandas-2.0.3-cp310-cp310-win32.whl", hash = "sha256:3ef285093b4fe5058eefd756100a367f27029913760773c8bf1d2d8bebe5d210"}, + {file = "pandas-2.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:9ee1a69328d5c36c98d8e74db06f4ad518a1840e8ccb94a4ba86920986bb617e"}, + {file = "pandas-2.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b084b91d8d66ab19f5bb3256cbd5ea661848338301940e17f4492b2ce0801fe8"}, + {file = "pandas-2.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37673e3bdf1551b95bf5d4ce372b37770f9529743d2498032439371fc7b7eb26"}, + {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9cb1e14fdb546396b7e1b923ffaeeac24e4cedd14266c3497216dd4448e4f2d"}, + {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9cd88488cceb7635aebb84809d087468eb33551097d600c6dad13602029c2df"}, + {file = "pandas-2.0.3-cp311-cp311-win32.whl", hash = "sha256:694888a81198786f0e164ee3a581df7d505024fbb1f15202fc7db88a71d84ebd"}, + {file = "pandas-2.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6a21ab5c89dcbd57f78d0ae16630b090eec626360085a4148693def5452d8a6b"}, + {file = "pandas-2.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4da0d45e7f34c069fe4d522359df7d23badf83abc1d1cef398895822d11061"}, + {file = "pandas-2.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:32fca2ee1b0d93dd71d979726b12b61faa06aeb93cf77468776287f41ff8fdc5"}, + {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:258d3624b3ae734490e4d63c430256e716f488c4fcb7c8e9bde2d3aa46c29089"}, + {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eae3dc34fa1aa7772dd3fc60270d13ced7346fcbcfee017d3132ec625e23bb0"}, + {file = "pandas-2.0.3-cp38-cp38-win32.whl", hash = "sha256:f3421a7afb1a43f7e38e82e844e2bca9a6d793d66c1a7f9f0ff39a795bbc5e02"}, + {file = "pandas-2.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:69d7f3884c95da3a31ef82b7618af5710dba95bb885ffab339aad925c3e8ce78"}, + {file = "pandas-2.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5247fb1ba347c1261cbbf0fcfba4a3121fbb4029d95d9ef4dc45406620b25c8b"}, + {file = "pandas-2.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:81af086f4543c9d8bb128328b5d32e9986e0c84d3ee673a2ac6fb57fd14f755e"}, + {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1994c789bf12a7c5098277fb43836ce090f1073858c10f9220998ac74f37c69b"}, + {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ec591c48e29226bcbb316e0c1e9423622bc7a4eaf1ef7c3c9fa1a3981f89641"}, + {file = "pandas-2.0.3-cp39-cp39-win32.whl", hash = "sha256:04dbdbaf2e4d46ca8da896e1805bc04eb85caa9a82e259e8eed00254d5e0c682"}, + {file = "pandas-2.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:1168574b036cd8b93abc746171c9b4f1b83467438a5e45909fed645cf8692dbc"}, + {file = "pandas-2.0.3.tar.gz", hash = "sha256:c02f372a88e0d17f36d3093a644c73cfc1788e876a7c4bcb4020a77512e2043c"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.20.3", markers = "python_version < \"3.10\""}, + {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, + {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.1" + +[package.extras] +all = ["PyQt5 (>=5.15.1)", "SQLAlchemy (>=1.4.16)", "beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.07.0)", "gcsfs (>=2021.07.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "s3fs (>=2021.08.0)", "scipy (>=1.7.1)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"] +aws = ["s3fs (>=2021.08.0)"] +clipboard = ["PyQt5 (>=5.15.1)", "qtpy (>=2.2.0)"] +compression = ["brotlipy (>=0.7.0)", "python-snappy (>=0.6.0)", "zstandard (>=0.15.2)"] +computation = ["scipy (>=1.7.1)", "xarray (>=0.21.0)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pyxlsb (>=1.0.8)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)"] +feather = ["pyarrow (>=7.0.0)"] +fss = ["fsspec (>=2021.07.0)"] +gcp = ["gcsfs (>=2021.07.0)", "pandas-gbq (>=0.15.0)"] +hdf5 = ["tables (>=3.6.1)"] +html = ["beautifulsoup4 (>=4.9.3)", "html5lib (>=1.1)", "lxml (>=4.6.3)"] +mysql = ["SQLAlchemy (>=1.4.16)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.0.0)", "tabulate (>=0.8.9)"] +parquet = ["pyarrow (>=7.0.0)"] +performance = ["bottleneck (>=1.3.2)", "numba (>=0.53.1)", "numexpr (>=2.7.1)"] +plot = ["matplotlib (>=3.6.1)"] +postgresql = ["SQLAlchemy (>=1.4.16)", "psycopg2 (>=2.8.6)"] +spss = ["pyreadstat (>=1.1.2)"] +sql-other = ["SQLAlchemy (>=1.4.16)"] +test = ["hypothesis (>=6.34.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.6.3)"] + [[package]] name = "pillow" version = "10.2.0" description = "Python Imaging Library (Fork)" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1491,6 +2168,7 @@ xmp = ["defusedxml"] name = "pkgutil-resolve-name" version = "1.3.10" description = "Resolve a name to an object." +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1502,6 +2180,7 @@ files = [ name = "plotly" version = "5.20.0" description = "An open-source, interactive data visualization library for Python" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1513,10 +2192,27 @@ files = [ packaging = "*" tenacity = ">=6.2.0" +[[package]] +name = "pluggy" +version = "1.5.0" +description = "plugin and hook calling mechanisms for python" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + [[package]] name = "prometheus-client" version = "0.20.0" description = "Python client for the Prometheus monitoring system." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1527,10 +2223,142 @@ files = [ [package.extras] twisted = ["twisted"] +[[package]] +name = "psycopg2-binary" +version = "2.9.9" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "psycopg2-binary-2.9.9.tar.gz", hash = "sha256:7f01846810177d829c7692f1f5ada8096762d9172af1b1a28d4ab5b77c923c1c"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c2470da5418b76232f02a2fcd2229537bb2d5a7096674ce61859c3229f2eb202"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c6af2a6d4b7ee9615cbb162b0738f6e1fd1f5c3eda7e5da17861eacf4c717ea7"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75723c3c0fbbf34350b46a3199eb50638ab22a0228f93fb472ef4d9becc2382b"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83791a65b51ad6ee6cf0845634859d69a038ea9b03d7b26e703f94c7e93dbcf9"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ef4854e82c09e84cc63084a9e4ccd6d9b154f1dbdd283efb92ecd0b5e2b8c84"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed1184ab8f113e8d660ce49a56390ca181f2981066acc27cf637d5c1e10ce46e"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d2997c458c690ec2bc6b0b7ecbafd02b029b7b4283078d3b32a852a7ce3ddd98"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b58b4710c7f4161b5e9dcbe73bb7c62d65670a87df7bcce9e1faaad43e715245"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0c009475ee389757e6e34611d75f6e4f05f0cf5ebb76c6037508318e1a1e0d7e"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8dbf6d1bc73f1d04ec1734bae3b4fb0ee3cb2a493d35ede9badbeb901fb40f6f"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-win32.whl", hash = "sha256:3f78fd71c4f43a13d342be74ebbc0666fe1f555b8837eb113cb7416856c79682"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-win_amd64.whl", hash = "sha256:876801744b0dee379e4e3c38b76fc89f88834bb15bf92ee07d94acd06ec890a0"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ee825e70b1a209475622f7f7b776785bd68f34af6e7a46e2e42f27b659b5bc26"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1ea665f8ce695bcc37a90ee52de7a7980be5161375d42a0b6c6abedbf0d81f0f"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:143072318f793f53819048fdfe30c321890af0c3ec7cb1dfc9cc87aa88241de2"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c332c8d69fb64979ebf76613c66b985414927a40f8defa16cf1bc028b7b0a7b0"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7fc5a5acafb7d6ccca13bfa8c90f8c51f13d8fb87d95656d3950f0158d3ce53"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:977646e05232579d2e7b9c59e21dbe5261f403a88417f6a6512e70d3f8a046be"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b6356793b84728d9d50ead16ab43c187673831e9d4019013f1402c41b1db9b27"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bc7bb56d04601d443f24094e9e31ae6deec9ccb23581f75343feebaf30423359"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:77853062a2c45be16fd6b8d6de2a99278ee1d985a7bd8b103e97e41c034006d2"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:78151aa3ec21dccd5cdef6c74c3e73386dcdfaf19bced944169697d7ac7482fc"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-win32.whl", hash = "sha256:dc4926288b2a3e9fd7b50dc6a1909a13bbdadfc67d93f3374d984e56f885579d"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:b76bedd166805480ab069612119ea636f5ab8f8771e640ae103e05a4aae3e417"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8532fd6e6e2dc57bcb3bc90b079c60de896d2128c5d9d6f24a63875a95a088cf"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0605eaed3eb239e87df0d5e3c6489daae3f7388d455d0c0b4df899519c6a38d"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f8544b092a29a6ddd72f3556a9fcf249ec412e10ad28be6a0c0d948924f2212"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d423c8d8a3c82d08fe8af900ad5b613ce3632a1249fd6a223941d0735fce493"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e5afae772c00980525f6d6ecf7cbca55676296b580c0e6abb407f15f3706996"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e6f98446430fdf41bd36d4faa6cb409f5140c1c2cf58ce0bbdaf16af7d3f119"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c77e3d1862452565875eb31bdb45ac62502feabbd53429fdc39a1cc341d681ba"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb16c65dcb648d0a43a2521f2f0a2300f40639f6f8c1ecbc662141e4e3e1ee07"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:911dda9c487075abd54e644ccdf5e5c16773470a6a5d3826fda76699410066fb"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:57fede879f08d23c85140a360c6a77709113efd1c993923c59fde17aa27599fe"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win32.whl", hash = "sha256:64cf30263844fa208851ebb13b0732ce674d8ec6a0c86a4e160495d299ba3c93"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:81ff62668af011f9a48787564ab7eded4e9fb17a4a6a74af5ffa6a457400d2ab"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2293b001e319ab0d869d660a704942c9e2cce19745262a8aba2115ef41a0a42a"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a602ea5aff39bb9fac6308e9c9d82b9a35c2bf288e184a816002c9fae930b77"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8359bf4791968c5a78c56103702000105501adb557f3cf772b2c207284273984"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:275ff571376626195ab95a746e6a04c7df8ea34638b99fc11160de91f2fef503"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f9b5571d33660d5009a8b3c25dc1db560206e2d2f89d3df1cb32d72c0d117d52"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:420f9bbf47a02616e8554e825208cb947969451978dceb77f95ad09c37791dae"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4154ad09dac630a0f13f37b583eae260c6aa885d67dfbccb5b02c33f31a6d420"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a148c5d507bb9b4f2030a2025c545fccb0e1ef317393eaba42e7eabd28eb6041"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-win32.whl", hash = "sha256:68fc1f1ba168724771e38bee37d940d2865cb0f562380a1fb1ffb428b75cb692"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-win_amd64.whl", hash = "sha256:281309265596e388ef483250db3640e5f414168c5a67e9c665cafce9492eda2f"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:60989127da422b74a04345096c10d416c2b41bd7bf2a380eb541059e4e999980"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:246b123cc54bb5361588acc54218c8c9fb73068bf227a4a531d8ed56fa3ca7d6"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34eccd14566f8fe14b2b95bb13b11572f7c7d5c36da61caf414d23b91fcc5d94"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18d0ef97766055fec15b5de2c06dd8e7654705ce3e5e5eed3b6651a1d2a9a152"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d3f82c171b4ccd83bbaf35aa05e44e690113bd4f3b7b6cc54d2219b132f3ae55"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ead20f7913a9c1e894aebe47cccf9dc834e1618b7aa96155d2091a626e59c972"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ca49a8119c6cbd77375ae303b0cfd8c11f011abbbd64601167ecca18a87e7cdd"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:323ba25b92454adb36fa425dc5cf6f8f19f78948cbad2e7bc6cdf7b0d7982e59"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:1236ed0952fbd919c100bc839eaa4a39ebc397ed1c08a97fc45fee2a595aa1b3"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:729177eaf0aefca0994ce4cffe96ad3c75e377c7b6f4efa59ebf003b6d398716"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-win32.whl", hash = "sha256:804d99b24ad523a1fe18cc707bf741670332f7c7412e9d49cb5eab67e886b9b5"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-win_amd64.whl", hash = "sha256:a6cdcc3ede532f4a4b96000b6362099591ab4a3e913d70bcbac2b56c872446f7"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:72dffbd8b4194858d0941062a9766f8297e8868e1dd07a7b36212aaa90f49472"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:30dcc86377618a4c8f3b72418df92e77be4254d8f89f14b8e8f57d6d43603c0f"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31a34c508c003a4347d389a9e6fcc2307cc2150eb516462a7a17512130de109e"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15208be1c50b99203fe88d15695f22a5bed95ab3f84354c494bcb1d08557df67"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1873aade94b74715be2246321c8650cabf5a0d098a95bab81145ffffa4c13876"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a58c98a7e9c021f357348867f537017057c2ed7f77337fd914d0bedb35dace7"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4686818798f9194d03c9129a4d9a702d9e113a89cb03bffe08c6cf799e053291"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ebdc36bea43063116f0486869652cb2ed7032dbc59fbcb4445c4862b5c1ecf7f"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ca08decd2697fdea0aea364b370b1249d47336aec935f87b8bbfd7da5b2ee9c1"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac05fb791acf5e1a3e39402641827780fe44d27e72567a000412c648a85ba860"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-win32.whl", hash = "sha256:9dba73be7305b399924709b91682299794887cbbd88e38226ed9f6712eabee90"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-win_amd64.whl", hash = "sha256:f7ae5d65ccfbebdfa761585228eb4d0df3a8b15cfb53bd953e713e09fbb12957"}, +] + +[[package]] +name = "pyarrow" +version = "16.0.0" +description = "Python library for Apache Arrow" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyarrow-16.0.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:22a1fdb1254e5095d629e29cd1ea98ed04b4bbfd8e42cc670a6b639ccc208b60"}, + {file = "pyarrow-16.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:574a00260a4ed9d118a14770edbd440b848fcae5a3024128be9d0274dbcaf858"}, + {file = "pyarrow-16.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0815d0ddb733b8c1b53a05827a91f1b8bde6240f3b20bf9ba5d650eb9b89cdf"}, + {file = "pyarrow-16.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df0080339387b5d30de31e0a149c0c11a827a10c82f0c67d9afae3981d1aabb7"}, + {file = "pyarrow-16.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:edf38cce0bf0dcf726e074159c60516447e4474904c0033f018c1f33d7dac6c5"}, + {file = "pyarrow-16.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:91d28f9a40f1264eab2af7905a4d95320ac2f287891e9c8b0035f264fe3c3a4b"}, + {file = "pyarrow-16.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:99af421ee451a78884d7faea23816c429e263bd3618b22d38e7992c9ce2a7ad9"}, + {file = "pyarrow-16.0.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:d22d0941e6c7bafddf5f4c0662e46f2075850f1c044bf1a03150dd9e189427ce"}, + {file = "pyarrow-16.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:266ddb7e823f03733c15adc8b5078db2df6980f9aa93d6bb57ece615df4e0ba7"}, + {file = "pyarrow-16.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cc23090224b6594f5a92d26ad47465af47c1d9c079dd4a0061ae39551889efe"}, + {file = "pyarrow-16.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56850a0afe9ef37249d5387355449c0f94d12ff7994af88f16803a26d38f2016"}, + {file = "pyarrow-16.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:705db70d3e2293c2f6f8e84874b5b775f690465798f66e94bb2c07bab0a6bb55"}, + {file = "pyarrow-16.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:5448564754c154997bc09e95a44b81b9e31ae918a86c0fcb35c4aa4922756f55"}, + {file = "pyarrow-16.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:729f7b262aa620c9df8b9967db96c1575e4cfc8c25d078a06968e527b8d6ec05"}, + {file = "pyarrow-16.0.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:fb8065dbc0d051bf2ae2453af0484d99a43135cadabacf0af588a3be81fbbb9b"}, + {file = "pyarrow-16.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:20ce707d9aa390593ea93218b19d0eadab56390311cb87aad32c9a869b0e958c"}, + {file = "pyarrow-16.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5823275c8addbbb50cd4e6a6839952682a33255b447277e37a6f518d6972f4e1"}, + {file = "pyarrow-16.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ab8b9050752b16a8b53fcd9853bf07d8daf19093533e990085168f40c64d978"}, + {file = "pyarrow-16.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:42e56557bc7c5c10d3e42c3b32f6cff649a29d637e8f4e8b311d334cc4326730"}, + {file = "pyarrow-16.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:2a7abdee4a4a7cfa239e2e8d721224c4b34ffe69a0ca7981354fe03c1328789b"}, + {file = "pyarrow-16.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:ef2f309b68396bcc5a354106741d333494d6a0d3e1951271849787109f0229a6"}, + {file = "pyarrow-16.0.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:ed66e5217b4526fa3585b5e39b0b82f501b88a10d36bd0d2a4d8aa7b5a48e2df"}, + {file = "pyarrow-16.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc8814310486f2a73c661ba8354540f17eef51e1b6dd090b93e3419d3a097b3a"}, + {file = "pyarrow-16.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c2f5e239db7ed43e0ad2baf46a6465f89c824cc703f38ef0fde927d8e0955f7"}, + {file = "pyarrow-16.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f293e92d1db251447cb028ae12f7bc47526e4649c3a9924c8376cab4ad6b98bd"}, + {file = "pyarrow-16.0.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:dd9334a07b6dc21afe0857aa31842365a62eca664e415a3f9536e3a8bb832c07"}, + {file = "pyarrow-16.0.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:d91073d1e2fef2c121154680e2ba7e35ecf8d4969cc0af1fa6f14a8675858159"}, + {file = "pyarrow-16.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:71d52561cd7aefd22cf52538f262850b0cc9e4ec50af2aaa601da3a16ef48877"}, + {file = "pyarrow-16.0.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:b93c9a50b965ee0bf4fef65e53b758a7e8dcc0c2d86cebcc037aaaf1b306ecc0"}, + {file = "pyarrow-16.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d831690844706e374c455fba2fb8cfcb7b797bfe53ceda4b54334316e1ac4fa4"}, + {file = "pyarrow-16.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35692ce8ad0b8c666aa60f83950957096d92f2a9d8d7deda93fb835e6053307e"}, + {file = "pyarrow-16.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9dd3151d098e56f16a8389c1247137f9e4c22720b01c6f3aa6dec29a99b74d80"}, + {file = "pyarrow-16.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:bd40467bdb3cbaf2044ed7a6f7f251c8f941c8b31275aaaf88e746c4f3ca4a7a"}, + {file = "pyarrow-16.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:00a1dcb22ad4ceb8af87f7bd30cc3354788776c417f493089e0a0af981bc8d80"}, + {file = "pyarrow-16.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:fda9a7cebd1b1d46c97b511f60f73a5b766a6de4c5236f144f41a5d5afec1f35"}, + {file = "pyarrow-16.0.0.tar.gz", hash = "sha256:59bb1f1edbbf4114c72415f039f1359f1a57d166a331c3229788ccbfbb31689a"}, +] + +[package.dependencies] +numpy = ">=1.16.6" + [[package]] name = "pycodestyle" version = "2.11.1" description = "Python style guide checker" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1542,6 +2370,7 @@ files = [ name = "pycparser" version = "2.21" description = "C parser in Python" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1553,6 +2382,7 @@ files = [ name = "pyerfa" version = "2.0.0.3" description = "Python bindings for ERFA" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1609,6 +2439,7 @@ test = ["pytest", "pytest-doctestplus (>=0.7)"] name = "pyflakes" version = "3.2.0" description = "passive checker of Python programs" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1616,10 +2447,26 @@ files = [ {file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"}, ] +[[package]] +name = "pyparsing" +version = "3.1.2" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +category = "main" +optional = false +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, + {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + [[package]] name = "pyrsistent" version = "0.20.0" description = "Persistent/Functional/Immutable data structures" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1661,6 +2508,7 @@ files = [ name = "python-dateutil" version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" +category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ @@ -1675,6 +2523,7 @@ six = ">=1.5" name = "pytz" version = "2024.1" description = "World timezone definitions, modern and historical" +category = "main" optional = false python-versions = "*" files = [ @@ -1686,6 +2535,7 @@ files = [ name = "pyvo" version = "1.5.1" description = "Astropy affiliated package for accessing Virtual Observatory data and services" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1706,6 +2556,7 @@ test = ["pytest-astropy", "pytest-doctestplus (>=0.13)", "requests-mock"] name = "pywin32-ctypes" version = "0.2.2" description = "A (partial) reimplementation of pywin32 using ctypes/cffi" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1717,6 +2568,7 @@ files = [ name = "pyyaml" version = "6.0.1" description = "YAML parser and emitter for Python" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1777,6 +2629,7 @@ files = [ name = "redis" version = "5.0.3" description = "Python client for Redis database and key-value store" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1795,6 +2648,7 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)" name = "requests" version = "2.31.0" description = "Python HTTP for Humans." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1816,6 +2670,7 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "scipy" version = "1.10.1" description = "Fundamental algorithms for scientific computing in Python" +category = "main" optional = false python-versions = "<3.12,>=3.8" files = [ @@ -1854,6 +2709,7 @@ test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeo name = "secretstorage" version = "3.3.3" description = "Python bindings to FreeDesktop.org Secret Service API" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1869,6 +2725,7 @@ jeepney = ">=0.6" name = "semantic-version" version = "2.10.0" description = "A library implementing the 'SemVer' scheme." +category = "main" optional = false python-versions = ">=2.7" files = [ @@ -1884,6 +2741,7 @@ doc = ["Sphinx", "sphinx-rtd-theme"] name = "setuptools" version = "69.2.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1900,6 +2758,7 @@ testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jar name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -1911,6 +2770,7 @@ files = [ name = "soupsieve" version = "2.5" description = "A modern CSS selector implementation for Beautiful Soup." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1922,6 +2782,7 @@ files = [ name = "specutils" version = "1.13.0" description = "Package for spectroscopic astronomical data" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1947,6 +2808,7 @@ test = ["matplotlib", "pytest-astropy", "spectral-cube", "tox"] name = "sqlparse" version = "0.4.4" description = "A non-validating SQL parser." +category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1959,10 +2821,26 @@ dev = ["build", "flake8"] doc = ["sphinx"] test = ["pytest", "pytest-cov"] +[[package]] +name = "tabulate" +version = "0.9.0" +description = "Pretty-print tabular data" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, + {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, +] + +[package.extras] +widechars = ["wcwidth"] + [[package]] name = "tenacity" version = "8.2.3" description = "Retry code until it succeeds" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1973,10 +2851,41 @@ files = [ [package.extras] doc = ["reno", "sphinx", "tornado (>=4.5)"] +[[package]] +name = "tom-alertstreams" +version = "0.6.2" +description = "Reusable TOMToolkit app for listening to kafka streams." +category = "main" +optional = false +python-versions = ">=3.8,<3.12" +files = [ + {file = "tom_alertstreams-0.6.2-py3-none-any.whl", hash = "sha256:8d83b34213bdb060e676925ab57bea19cf7a2c153ad64988ad47374b9a191854"}, + {file = "tom_alertstreams-0.6.2.tar.gz", hash = "sha256:9a1e01bd413ef23cb70542854478971308146b6b43adb53c5c16ac47c3c435d0"}, +] + +[package.dependencies] +gcn-kafka = ">=0.2,<0.3" +hop-client = ">=0.8,<0.9" +psycopg2-binary = ">=2.9,<3.0" +tomtoolkit = ">=2.10,<3.0" + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "main" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] + [[package]] name = "tomtoolkit" version = "2.17.2" description = "TOM Toolkit and base modules" +category = "main" optional = false python-versions = ">=3.8.1,<3.12" files = [ @@ -2010,10 +2919,32 @@ python-dateutil = "<3" requests = "<3" specutils = "<2" +[[package]] +name = "tqdm" +version = "4.66.2" +description = "Fast, Extensible Progress Meter" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.66.2-py3-none-any.whl", hash = "sha256:1ee4f8a893eb9bef51c6e35730cebf234d5d0b6bd112b0271e10ed7c24a02bd9"}, + {file = "tqdm-4.66.2.tar.gz", hash = "sha256:6cd52cdf0fef0e0f543299cfc96fec90d7b8a7e88745f411ec33eb44d5ed3531"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + [[package]] name = "typing-extensions" version = "4.10.0" description = "Backported and Experimental Type Hints for Python 3.8+" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2025,6 +2956,7 @@ files = [ name = "tzdata" version = "2024.1" description = "Provider of IANA time zone data" +category = "main" optional = false python-versions = ">=2" files = [ @@ -2036,6 +2968,7 @@ files = [ name = "urllib3" version = "2.2.1" description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2053,6 +2986,7 @@ zstd = ["zstandard (>=0.18.0)"] name = "watchdog" version = "4.0.0" description = "Filesystem events monitoring" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2094,6 +3028,7 @@ watchmedo = ["PyYAML (>=3.10)"] name = "watchdog-gevent" version = "0.1.1" description = "A gevent-based observer for watchdog." +category = "main" optional = false python-versions = "*" files = [ @@ -2109,6 +3044,7 @@ watchdog = ">=0.8" name = "webencodings" version = "0.5.1" description = "Character encoding aliases for legacy web content" +category = "main" optional = false python-versions = "*" files = [ @@ -2116,10 +3052,23 @@ files = [ {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, ] +[[package]] +name = "xmltodict" +version = "0.13.0" +description = "Makes working with XML feel like you are working with JSON" +category = "main" +optional = false +python-versions = ">=3.4" +files = [ + {file = "xmltodict-0.13.0-py2.py3-none-any.whl", hash = "sha256:aa89e8fd76320154a40d19a0df04a4695fb9dc5ba977cbb68ab3e4eb225e7852"}, + {file = "xmltodict-0.13.0.tar.gz", hash = "sha256:341595a488e3e01a85a9d8911d8912fd922ede5fecc4dce437eb4b6c8d037e56"}, +] + [[package]] name = "zipp" version = "3.18.1" description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2135,6 +3084,7 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p name = "zope-event" version = "5.0" description = "Very basic event publishing system" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2153,6 +3103,7 @@ test = ["zope.testrunner"] name = "zope-interface" version = "6.2" description = "Interfaces for Python" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2205,4 +3156,4 @@ testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] [metadata] lock-version = "2.0" python-versions = ">=3.8.1,<3.12" -content-hash = "ec92daee221b3b5b02e56723678f740c4321203c45e31bfabe61bb4dfe4a01e8" +content-hash = "817a614e1c2df22670c3e23b9613fc8d5fcd5be7171940c91654c1d4882e98aa" diff --git a/pyproject.toml b/pyproject.toml index 2726771..9277f79 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -40,6 +40,8 @@ python = ">=3.8.1,<3.12" tomtoolkit = "^2.17.2" elasticsearch-dsl = "^8.12.0" Markdown = "^3.5.2" +fink-client = "^7.2" +tom-alertstreams = "^0.6.2" [tool.poetry.group.test.dependencies] factory_boy = ">=3.1,<3.3" diff --git a/tom_fink/alertstream.py b/tom_fink/alertstream.py new file mode 100644 index 0000000..41475c9 --- /dev/null +++ b/tom_fink/alertstream.py @@ -0,0 +1,166 @@ +# Copyright (c) 2024 Julien Peloton +# +# This file is part of TOM Toolkit +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +import time +import logging +import traceback + +from fink_client.consumer import AlertConsumer + +from tom_alertstreams.alertstreams.alertstream import AlertStream +from tom_targets.models import Target, TargetList + +from psycopg2.errors import UniqueViolation +from django.db.utils import IntegrityError as DJ_IntegrityError +from sqlite3 import IntegrityError as SQL_IntegrityError +from django.contrib.auth.models import Group +from guardian.shortcuts import assign_perm + +logger = logging.getLogger(__name__) + + +class FinkAlertStream(AlertStream): + """Poll alerts from a stream generated by Fink""" + + required_keys = [ + "URL", + "GROUP_ID", + "USERNAME", + "TOPIC", + "TOPIC_HANDLERS", + "MAX_POLL_NUMBER", + "TIMEOUT", + ] + allowed_keys = [ + "URL", + "GROUP_ID", + "USERNAME", + "PASSWORD", + "TOPIC", + "TOPIC_HANDLERS", + "MAX_POLL_NUMBER", + "TIMEOUT", + ] + + def __init__(self, *args, **kwargs) -> None: + """Initialise credentials and target list""" + super().__init__(*args, **kwargs) + + # Define target list based on topics + public_group, _ = Group.objects.get_or_create(name="Public") + tl, is_created = TargetList.objects.get_or_create(name=self.topic) + assign_perm("tom_targets.view_targetlist", public_group, tl) + + def listen(self): + """Listen to one topic from Fink Kafka server + + Each alert is saved into the target list named from + the topic. + + Note + ---------- + This only handles one topic at once for the moment. + """ + super().listen() + + myconfig = { + "username": self.username, + "bootstrap.servers": self.url, + "group_id": self.group_id, + } + + consumer = AlertConsumer([self.topic], myconfig, schema_path=None) + + poll_number = 0 + while poll_number < int(self.max_poll_number): + try: + logger.info( + "FinkAlertStream.listen opening stream: {} with group_id: {} (call number: {})".format( + self.url, + self.group_id, + poll_number + ) + ) + topic, alert, key = consumer.poll(timeout=int(self.timeout)) + + if topic is not None: + # TODO: handle MMA vs regular streams + self.alert_handler["fink.stream"](alert, topic) + else: + logger.info("No alerts received") + poll_number += 1 + except Exception as ex: + logger.error(f"FinkAlertStream.listen: {ex}") + logger.error(traceback.format_exc()) + break + consumer.close() + + +def alert_logger(alert, topic): + """Basic alert handler for Fink + + This alert handler simply display on screen basic information, + and save the alert as a new Target. + + Parameters + ---------- + alert: dic + Dictionary containing alert data. See `consumer.poll`. + topic: str + Topic name + + Warnings + ---------- + UniqueViolation, SQL_IntegrityError, DJ_IntegrityError + If the target is already saved + + Raises + ---------- + Exception (base) + for any other failures than name clash when + saving the target in the database. + + """ + utc = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime()) + logger.info("fink.alert_logger topic: {}".format(topic)) + logger.info( + "fink.alert_logger value: {} emitted {} (received {})".format( + alert["objectId"], alert["timestamp"], utc + ) + ) + + mytarget = Target( + name=alert["objectId"], + type="SIDEREAL", + ra=alert["candidate"]["ra"], + dec=alert["candidate"]["dec"], + epoch=alert["candidate"]["jd"], + ) + + try: + mytarget.save( + extras={ + "fink broker link": "https://fink-portal.org/{}".format( + alert["objectId"] + ) + } + ) + except (UniqueViolation, SQL_IntegrityError, DJ_IntegrityError): + logger.warning(f"Target {mytarget} already in the database") + pass + except Exception: + logger.error("error when trying to save new alerts in the db", exc_info=1) + logger.error(traceback.format_exc())