From 4c426af8060e6c319cbd53c64c94b1230be01622 Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Wed, 12 Feb 2025 13:17:07 -0500 Subject: [PATCH 01/46] Fixes to migration from cals by block. --- .gitignore | 1 + CHANGES.md | 5 + Dockerfile | 2 +- ...c50_migration_of_past_data_for_blockid_.py | 81 +++ ...dd_calibrations_block_info_proposal_id_.py | 36 -- banzai/dbs.py | 6 +- banzai/stages.py | 6 + banzai/utils/fits_utils.py | 3 +- banzai/utils/stage_utils.py | 1 - environment.yaml | 538 ++++++++++-------- pyproject.toml | 124 ++++ setup.cfg | 91 --- tox.ini | 40 +- 13 files changed, 532 insertions(+), 402 deletions(-) create mode 100644 alembic/migrations/versions/51b98e26cc50_migration_of_past_data_for_blockid_.py diff --git a/.gitignore b/.gitignore index acb9875b6..edb2cfdc2 100644 --- a/.gitignore +++ b/.gitignore @@ -75,3 +75,4 @@ distribute-*.tar.gz *.iml .coverage.subprocess +test.db diff --git a/CHANGES.md b/CHANGES.md index b22ec997b..16723385a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,8 @@ +1.20.2 (2025-02-10) +------------------- +- Bugfix to logging on reduction stopped +- Updated the alembic scripts because the migration was taking too long + 1.20.1 (2025-02-05) ------------------- - Added tso proposals to be instantly public diff --git a/Dockerfile b/Dockerfile index 5a7af7bfb..29e2a4eea 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM continuumio/miniconda3:23.5.2-0 +FROM continuumio/miniconda3:25.1.1-2 # In principle I could remove the gcc to shrink the image, but pytorch is already so large it doesn't make much difference RUN apt-get -y update && apt-get -y install gcc && \ diff --git a/alembic/migrations/versions/51b98e26cc50_migration_of_past_data_for_blockid_.py b/alembic/migrations/versions/51b98e26cc50_migration_of_past_data_for_blockid_.py new file mode 100644 index 000000000..36547da20 --- /dev/null +++ b/alembic/migrations/versions/51b98e26cc50_migration_of_past_data_for_blockid_.py @@ -0,0 +1,81 @@ +"""Migration of past data for blockid, public-date, and proposalid + +Revision ID: 51b98e26cc50 +Revises: 8e35c490a971 +Create Date: 2025-02-10 11:08:49.733571 + +""" +from typing import Sequence, Union + +from alembic import op +from sqlalchemy.sql import text +import os +import requests +import datetime + +# revision identifiers, used by Alembic. +revision: str = '51b98e26cc50' +down_revision: Union[str, None] = '8e35c490a971' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = '8e35c490a971' + + +def parse_public_date(date_to_parse): + date_formats = ['%Y-%m-%dT%H:%M:%S.%fZ', '%Y-%m-%dT%H:%M:%SZ'] + for date_format in date_formats: + try: + public_date = datetime.datetime.strptime(date_to_parse, date_format) + break + except ValueError: + continue + return public_date + + +def upgrade() -> None: + if os.getenv("AUTH_TOKEN") is not None: + auth_header = {'Authorization': f'Token {os.environ["AUTH_TOKEN"]}'} + else: + auth_header = None + + connection = op.get_bind() + offset = 0 + batch_size = 1000 + query_str = "SELECT id, frameid, filename, type, dateobs, camera FROM calimages INNER JOIN instruments" + query_str += "ON calimages.instrument_id = instruments.id ORDER BY dateobs LIMIT :limit OFFSET :offset" + more_data = True + while more_data: + # Get all of the frames from all of the cameras for all obstypes in this batch + rows = connection.execute(text(query_str, {"limit": batch_size, "offset": offset})).fetchall() + + for row in rows: + instruments = list(set(row.camera for row in rows)) + obstypes = list(set(row.type for row in rows)) + start = min([row.dateobs for row in rows]) + end = max([row.dateobs for row in rows]) + params = {'instruments': instruments, 'obstypes': obstypes, 'start': start, 'end': end} + request_results = requests.get('https://archive-api.lco.global/frames/aggregate/', params=params, headers=auth_header) + request_results = request_results.json()['results'] + if len(request_results) == 0: + more_data = False + break + request_results[0]['public_date'] + hashed_results = {result['basename']: {'blockid': result['BLKUID'], + 'proposal': result['proposal_id'], + 'public_date': parse_public_date(result['public_date'])} + for result in request_results} + for row in rows: + basename = row.filename.replace('.fits', '').replace('.fz', '') + values = {'id': row.id, 'public_date': hashed_results[basename]['public_date'], + 'proposal': hashed_results[basename]['proposal'], + 'blockid': hashed_results[basename]['blockid']} + query_str = 'blockid = :blockid, proposal = :proposal, public_date = :public_date' + if row.frameid is None: + query_str += ', frameid = :frameid' + values['frameid'] = request_results[0]['id'] + connection.execute(text(f"UPDATE calimages SET {query_str} WHERE id = :id"), values) + + offset += batch_size + + +def downgrade() -> None: + pass diff --git a/alembic/migrations/versions/8e35c490a971_add_calibrations_block_info_proposal_id_.py b/alembic/migrations/versions/8e35c490a971_add_calibrations_block_info_proposal_id_.py index c2f2546ef..1724339d5 100644 --- a/alembic/migrations/versions/8e35c490a971_add_calibrations_block_info_proposal_id_.py +++ b/alembic/migrations/versions/8e35c490a971_add_calibrations_block_info_proposal_id_.py @@ -10,10 +10,6 @@ from alembic import op import sqlalchemy as sa from sqlalchemy import inspect -from sqlalchemy.sql import text -import requests -import os -import datetime # revision identifiers, used by Alembic. @@ -34,38 +30,6 @@ def upgrade() -> None: op.add_column('calimages', sa.Column('proposal', sa.String(50), nullable=True)) if 'public_date' not in columns: op.add_column('calimages', sa.Column('public_date', sa.DateTime(), nullable=True)) - if os.getenv("AUTH_TOKEN") is not None: - auth_header = {'Authorization': f'Token {os.environ["AUTH_TOKEN"]}'} - else: - auth_header = None - - connection = op.get_bind() - rows = connection.execute(text("SELECT id, frameid, filename FROM calimages")) - for row in rows: - params = {'basename_exact': row.filename.replace('.fz', '').replace('.fits', '')} - request_results = requests.get('https://archive-api.lco.global/frames/', params=params, headers=auth_header) - request_results = request_results.json()['results'] - if len(request_results) == 0: - continue - - blockid = request_results[0]['BLKUID'] - proposal = request_results[0]['proposal_id'] - date_formats = ['%Y-%m-%dT%H:%M:%S.%fZ', '%Y-%m-%dT%H:%M:%SZ'] - for date_format in date_formats: - try: - public_date = datetime.datetime.strptime(request_results[0]['public_date'], date_format) - break - except ValueError: - continue - values = {'id': row.id, 'public_date': public_date, 'proposal': proposal, 'blockid': blockid} - query_str = 'blockid = :blockid, proposal = :proposal, public_date = :public_date' - if row.frameid is None: - query_str += ', frameid = :frameid' - values['frameid'] = request_results[0]['id'] - connection.execute( - text(f"UPDATE calimages SET {query_str} WHERE id = :id"), - values - ) def downgrade() -> None: diff --git a/banzai/dbs.py b/banzai/dbs.py index 7c4e45951..106e27463 100755 --- a/banzai/dbs.py +++ b/banzai/dbs.py @@ -11,7 +11,7 @@ import datetime from dateutil.parser import parse import requests -from sqlalchemy import create_engine, pool, type_coerce, cast, func +from sqlalchemy import create_engine, pool, func from sqlalchemy.orm import sessionmaker from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Boolean, CHAR, JSON, UniqueConstraint, Float from sqlalchemy.ext.declarative import declarative_base @@ -348,8 +348,8 @@ def get_master_cal_record(image, calibration_type, master_selection_criteria, db for criterion in master_selection_criteria: # We have to cast to strings according to the sqlalchemy docs for version 1.3: # https://docs.sqlalchemy.org/en/latest/core/type_basics.html?highlight=json#sqlalchemy.types.JSON - calibration_criteria &= cast(CalibrationImage.attributes[criterion], String) ==\ - type_coerce(str(getattr(image, criterion)), JSON) + calibration_criteria &= CalibrationImage.attributes[criterion].as_string() ==\ + str(getattr(image, criterion)) # During real-time reduction, we want to avoid using different master calibrations for the same block, # therefore we make sure the the calibration frame used was created before the block start time diff --git a/banzai/stages.py b/banzai/stages.py index 5019cb540..4f7b136ea 100755 --- a/banzai/stages.py +++ b/banzai/stages.py @@ -54,6 +54,12 @@ def run(self, images): processed_images.append(processed_image) except Exception: logger.error(logs.format_exception()) + if isinstance(image_set, Iterable): + for image in image_set: + logger.error('Reduction stopped', extra_tags={'filename': image}) + else: + logger.error('Reduction stopped', extra_tags={'filename': image}) + return processed_images @abc.abstractmethod diff --git a/banzai/utils/fits_utils.py b/banzai/utils/fits_utils.py index 7e64e5103..c12775518 100755 --- a/banzai/utils/fits_utils.py +++ b/banzai/utils/fits_utils.py @@ -93,10 +93,9 @@ def get_primary_header(filename) -> Optional[fits.Header]: @retry(wait=wait_exponential(multiplier=2, min=4, max=10), stop=stop_after_attempt(4), reraise=True) def download_from_s3(file_info, context, is_raw_frame=False): frame_id = file_info.get('frameid') - logger.info(f"Downloading file {file_info.get('filename')} from archive. ID: {frame_id}.", extra_tags={'filename': file_info.get('filename'), - 'attempt_number': download_from_s3.retry.statistics['attempt_number']}) + 'attempt_number': download_from_s3.statistics['attempt_number']}) if is_raw_frame: url = f'{context.RAW_DATA_FRAME_URL}/{frame_id}/?include_related_frames=false' diff --git a/banzai/utils/stage_utils.py b/banzai/utils/stage_utils.py index 5400c4edc..6ea68dd9c 100644 --- a/banzai/utils/stage_utils.py +++ b/banzai/utils/stage_utils.py @@ -57,7 +57,6 @@ def run_pipeline_stages(image_paths: list, runtime_context: Context, calibration images = stage.run(images) if not images: - logger.error('Reduction stopped', extra_tags={'filename': image_paths}) return for image in images: diff --git a/environment.yaml b/environment.yaml index d569e58a6..875982426 100644 --- a/environment.yaml +++ b/environment.yaml @@ -2,312 +2,352 @@ # conda create -n banzai python=3.10 'cython<3' 'numpy<1.24' bottleneck scipy astropy pytest mock requests ipython coverage pyyaml kombu sep 'elasticsearch<6.0.0,>=5.0.0' pytest-astropy mysql-connector-python photutils psycopg2-binary tenacity 'amqp<3' 'celery[redis]>=4.3.1,<5' scikit-image emcee # python-dateutil 'sqlalchemy>=1.3.0b1' psycopg2-binary apscheduler 'pytorch>=1.6.0' --channel conda-forge --channel astropy --channel pytorch --solver=libmamba channels: - - pytorch - - conda-forge - - astropy - defaults + - conda-forge + - https://repo.anaconda.com/pkgs/main + - https://repo.anaconda.com/pkgs/r dependencies: - - _openmp_mutex=4.5=2_gnu + - _libgcc_mutex=0.1 + - _openmp_mutex=4.5 - affine=2.4.0 - - amqp=2.6.1 - - anyio=4.0.0 - - aom=3.6.1 - - apscheduler=3.10.4 - - asdf=2.15.1 - - asdf-astropy=0.4.0 - - asdf-coordinates-schemas=0.2.0 - - asdf-standard=1.0.3 - - asdf-transform-schemas=0.3.0 - - asdf-unit-schemas=0.1.0 - - asdf-wcs-schemas=0.1.1 - - astropy=5.3.4 - - asttokens=2.4.0 - - attrs=23.1.0 - - backcall=0.2.0 - - backports=1.0 - - backports.functools_lru_cache=1.6.5 + - aiobotocore=2.19.0 + - aiohappyeyeballs=2.4.6 + - aiohttp=3.11.12 + - aioitertools=0.12.0 + - aiosignal=1.3.2 + - alembic=1.14.1 + - amqp=5.2.0 + - aom=3.9.1 + - apscheduler=3.11.0 + - asdf=4.1.0 + - asdf-astropy=0.7.0 + - asdf-coordinates-schemas=0.3.0 + - asdf-standard=1.1.1 + - asdf-transform-schemas=0.5.0 + - asdf-wcs-schemas=0.4.0 + - astropy-iers-data=0.2025.2.10.0.33.26 + - asttokens=3.0.0 + - attrs=25.1.0 + - aws-c-auth=0.8.1 + - aws-c-cal=0.8.1 + - aws-c-common=0.10.6 + - aws-c-compression=0.3.0 + - aws-c-event-stream=0.5.0 + - aws-c-http=0.9.2 + - aws-c-io=0.15.3 + - aws-c-mqtt=0.11.0 + - aws-c-s3=0.7.9 + - aws-c-sdkutils=0.2.2 + - aws-checksums=0.2.2 + - aws-crt-cpp=0.29.9 + - aws-sdk-cpp=1.11.489 + - azure-core-cpp=1.14.0 + - azure-identity-cpp=1.10.0 + - azure-storage-blobs-cpp=12.13.0 + - azure-storage-common-cpp=12.8.0 + - azure-storage-files-datalake-cpp=12.12.0 - backports.zoneinfo=0.2.1 - - billiard=3.6.4.0 - - blosc=1.21.5 - - bottleneck=1.3.7 + - beautifulsoup4=4.13.3 + - billiard=4.2.1 + - bleach=6.2.0 + - blosc=1.21.6 + - boto3=1.36.3 + - botocore=1.36.3 + - bottleneck=1.4.2 + - bqplot=0.12.43 - brotli=1.1.0 - brotli-bin=1.1.0 - brotli-python=1.1.0 - brunsli=0.1 - bzip2=1.0.8 - - c-ares=1.20.1 - - c-blosc2=2.10.5 - - ca-certificates=2023.7.22 - - cairo=1.18.0 - - celery=4.4.0 - - certifi=2023.7.22 - - cffi=1.16.0 - - cfitsio=4.3.0 + - c-ares=1.34.4 + - c-blosc2=2.15.2 + - ca-certificates=2025.1.31 + - cached-property=1.5.2 + - cached_property=1.5.2 + - celery=5.4.0 + - certifi=2025.1.31 - charls=2.4.2 - - charset-normalizer=3.3.0 - - click=8.1.7 + - charset-normalizer=3.4.1 + - click=8.1.8 + - click-didyoumean=0.3.1 - click-plugins=1.1.1 + - click-repl=0.3.0 - cligj=0.7.2 + - cloudpickle=3.1.1 - colorama=0.4.6 - - contourpy=1.1.1 - - coverage=7.3.2 - - cryptography=41.0.4 + - comm=0.2.2 + - contourpy=1.3.1 - cycler=0.12.1 - - cython=0.29.36 + - cyrus-sasl=2.1.27 + - cython=3.0.12 + - dask-core=2025.1.0 - dav1d=1.2.1 + - debugpy=1.8.12 - decorator=5.1.1 - - dnspython=2.4.2 - - elasticsearch=5.5.3 - - emcee=3.1.4 - - exceptiongroup=1.1.3 - - executing=1.2.0 - - expat=2.5.0 - - font-ttf-dejavu-sans-mono=2.37 - - font-ttf-inconsolata=3.000 - - font-ttf-source-code-pro=2.038 - - font-ttf-ubuntu=0.83 - - fontconfig=2.14.2 - - fonts-conda-ecosystem=1 - - fonts-conda-forge=1 - - fonttools=4.43.1 + - emcee=3.1.6 + - exceptiongroup=1.2.2 + - executing=2.1.0 + - expat=2.6.4 + - filelock=3.17.0 + - fonttools=4.56.0 - freetype=2.12.1 - freexl=2.0.0 - - geos=3.12.0 - - geotiff=1.7.1 - - gettext=0.21.1 - - giflib=5.2.1 - - greenlet=3.0.0 - - gwcs=0.19.0 - - h11=0.14.0 - - h2=4.1.0 - - hdf4=4.2.15 - - hdf5=1.14.2 - - hpack=4.0.0 - - httpcore=1.0.0 - - hyperframe=6.0.1 - - hypothesis=6.87.4 - - icu=73.2 - - idna=3.4 - - imagecodecs=2023.9.18 - - imageio=2.31.5 - - importlib-metadata=6.8.0 - - importlib-resources=6.1.0 - - importlib_resources=6.1.0 + - frozenlist=1.5.0 + - fsspec=2025.2.0 + - gast=0.4.0 + - geos=3.13.0 + - geotiff=1.7.3 + - gflags=2.2.2 + - giflib=5.2.2 + - glog=0.7.1 + - gmp=6.3.0 + - gmpy2=2.1.5 + - greenlet=3.1.1 + - h5py=3.12.1 + - hdf5=1.14.4 + - html5lib=1.1 + - icu=75.1 + - idna=3.10 + - imagecodecs=2024.12.30 + - imageio=2.37.0 + - importlib-metadata=8.6.1 - iniconfig=2.0.0 - - ipython=8.16.1 - - jedi=0.19.1 + - ipydatagrid=1.4.0 + - ipykernel=6.29.5 + - ipython=8.32.0 + - ipywidgets=8.1.5 + - jedi=0.19.2 + - jinja2=3.1.5 - jmespath=1.0.1 - - joblib=1.3.2 - - json-c=0.17 - - jsonschema=4.19.1 - - jsonschema-specifications=2023.7.1 + - jplephem=2.21 + - json-c=0.18 + - jupyter_client=8.6.3 + - jupyter_core=5.7.2 + - jupyterlab_widgets=3.0.13 - jxrlib=1.1 - - kealib=1.5.2 - keyutils=1.6.1 - - kiwisolver=1.4.5 - - krb5=1.21.2 - - lazy_loader=0.3 - - lcms2=2.15 + - kiwisolver=1.4.8 + - kombu=5.4.1 + - krb5=1.21.3 + - lazy-loader=0.4 + - lazy_loader=0.4 + - lcms2=2.17 - ld_impl_linux-64=2.40 - lerc=4.0.0 - - libaec=1.1.2 - - libarchive=3.7.2 - - libavif16=1.0.1 + - libabseil=20240722.0 + - libaec=1.1.3 + - libarchive=3.7.7 + - libarrow=19.0.0 + - libarrow-acero=19.0.0 + - libarrow-dataset=19.0.0 + - libarrow-substrait=19.0.0 + - libavif16=1.1.1 - libblas=3.9.0 - - libboost-headers=1.82.0 - libbrotlicommon=1.1.0 - libbrotlidec=1.1.0 - libbrotlienc=1.1.0 - libcblas=3.9.0 - - libcurl=8.4.0 - - libdeflate=1.19 + - libcrc32c=1.1.2 + - libcurl=8.11.1 + - libde265=1.0.15 + - libdeflate=1.23 - libedit=3.1.20191231 - libev=4.33 - - libexpat=2.5.0 - - libffi=3.4.2 - - libgcc-ng=13.2.0 - - libgdal=3.7.2 - - libgfortran-ng=13.2.0 - - libgfortran5=13.2.0 - - libglib=2.78.0 - - libgomp=13.2.0 + - libevent=2.1.12 + - libexpat=2.6.4 + - libffi=3.4.4 + - libgcc=14.2.0 + - libgcc-ng=14.2.0 + - libgdal-core=3.10.1 + - libgfortran=14.2.0 + - libgfortran5=14.2.0 + - libgomp=14.2.0 + - libgoogle-cloud=2.34.0 + - libgoogle-cloud-storage=2.34.0 + - libgrpc=1.67.1 + - libheif=1.19.5 + - libhwloc=2.11.2 + - libhwy=1.1.0 - libiconv=1.17 - libjpeg-turbo=3.0.0 + - libjxl=0.11.1 - libkml=1.3.0 - liblapack=3.9.0 - - libnetcdf=4.9.2 - - libnghttp2=1.52.0 - - libnsl=2.0.0 - - libopenblas=0.3.24 - - libpng=1.6.39 - - libpq=16.0 - - libprotobuf=3.20.3 + - liblzma=5.6.4 + - libnghttp2=1.64.0 + - libnsl=2.0.1 + - libopentelemetry-cpp=1.18.0 + - libopentelemetry-cpp-headers=1.18.0 + - libparquet=19.0.0 + - libpng=1.6.46 + - libpq=17.2 + - libprotobuf=5.28.3 + - libre2-11=2024.07.02 - librttopo=1.1.0 + - libsodium=1.0.20 - libspatialite=5.1.0 - - libsqlite=3.43.2 - - libssh2=1.11.0 - - libstdcxx-ng=13.2.0 - - libtiff=4.6.0 + - libsqlite=3.48.0 + - libssh2=1.11.1 + - libstdcxx=14.2.0 + - libstdcxx-ng=14.2.0 + - libthrift=0.21.0 + - libtiff=4.7.0 + - libtorch=2.5.1 + - libutf8proc=2.10.0 - libuuid=2.38.1 - - libwebp-base=1.3.2 - - libxcb=1.15 - - libxml2=2.11.5 - - libzip=1.10.1 - - libzlib=1.2.13 + - libuv=1.50.0 + - libwebp-base=1.5.0 + - libxcb=1.17.0 + - libxcrypt=4.4.36 + - libxml2=2.13.5 + - libzlib=1.3.1 - libzopfli=1.0.3 - - lz4-c=1.9.4 + - llvm-openmp=19.1.7 + - locket=1.0.0 + - logutils=0.3.5 + - lz4-c=1.10.0 - lzo=2.10 - - matplotlib-base=3.8.0 - - matplotlib-inline=0.1.6 - - minizip=4.0.1 - - mock=5.1.0 + - mako=1.3.9 + - markupsafe=3.0.2 + - matplotlib-base=3.10.0 + - matplotlib-inline=0.1.7 + - minizip=4.0.7 + - mpc=1.3.1 + - mpfr=4.2.1 + - mpmath=1.3.0 + - multidict=6.1.0 - munkres=1.1.4 - - mysql-common=8.0.33 - - mysql-connector-python=8.0.32 - - mysql-libs=8.0.33 - ncurses=6.4 - - networkx=3.1 - - ninja=1.11.1 - - nspr=4.35 - - nss=3.94 - - numpy=1.23.5 - - openjpeg=2.5.0 - - openssl=3.1.3 - - packaging=23.2 - - parso=0.8.3 - - pcre2=10.40 - - pexpect=4.8.0 - - photutils=1.9.0 + - nest-asyncio=1.6.0 + - networkx=3.4.2 + - nlohmann_json=3.11.3 + - openjpeg=2.5.3 + - openldap=2.6.9 + - opensearch-py=2.5.0 + - openssl=3.4.1 + - orc=2.0.3 + - packaging=24.2 + - pandas=2.2.3 + - parso=0.8.4 + - partd=1.4.2 + - pcre2=10.44 + - pexpect=4.9.0 + - photutils=2.1.0 - pickleshare=0.7.5 - - pillow=10.0.1 - - pip=23.2.1 - - pixman=0.42.2 - - pkgutil-resolve-name=1.3.10 + - pillow=11.1.0 + - pip=25.0 + - platformdirs=4.3.6 - pluggy=1.5.0 - - poppler=23.10.0 - - poppler-data=0.4.12 - - postgresql=16.0 - - proj=9.3.0 - - prompt-toolkit=3.0.39 - - prompt_toolkit=3.0.39 - - protobuf=3.20.3 - - psutil=5.9.5 - - psycopg2=2.9.7 - - psycopg2-binary=2.9.7 + - proj=9.5.1 + - prometheus-cpp=1.3.0 + - prompt-toolkit=3.0.50 + - prompt_toolkit=3.0.50 + - propcache=0.2.1 + - psutil=6.1.1 + - psycopg2=2.9.9 + - psycopg2-binary=2.9.9 - pthread-stubs=0.4 - ptyprocess=0.7.0 - - pure_eval=0.2.2 - - pycparser=2.21 - - pyerfa=2.0.0.3 - - pygments=2.16.1 - - pyparsing=3.1.1 + - pure_eval=0.2.3 + - py2vega=0.6.1 + - pyarrow=19.0.0 + - pyarrow-core=19.0.0 + - pybind11=2.13.6 + - pybind11-global=2.13.6 + - pyerfa=2.0.1.5 + - pygments=2.19.1 + - pyparsing=3.2.1 - pysocks=1.7.1 - - pytest=8.0.0 - - pytest-arraydiff=0.5.0 - - pytest-astropy=0.10.0 - - pytest-astropy-header=0.2.2 - - pytest-cov=4.1.0 - - pytest-doctestplus=1.0.0 - - pytest-filter-subpackage=0.1.2 - - pytest-mock=3.11.1 - - pytest-openfiles=0.5.0 - - pytest-remotedata=0.4.1 - - python=3.10.12 - - python-dateutil=2.8.2 - - python_abi=3.10 - - pytorch=1.12.1 - - pytz=2023.3.post1 - - pywavelets=1.4.1 - - pyyaml=6.0.1 - - rasterio=1.3.8 + - pytest=8.3.4 + - python=3.12.2 + - python-dateutil=2.9.0.post0 + - python-tzdata=2025.1 + - python_abi=3.12 + - pytorch=2.5.1 + - pytz=2024.1 + - pywavelets=1.8.0 + - pyyaml=6.0.2 + - pyzmq=26.2.1 + - qhull=2020.2 + - rasterio=1.4.3 - rav1e=0.6.6 + - re2=2024.07.02 - readline=8.2 - - referencing=0.30.2 - - requests=2.31.0 - - rpds-py=0.10.6 - - scikit-image=0.22.0 - - scikit-learn=1.3.1 - - scipy=1.11.3 + - regions=0.10 + - requests=2.32.3 + - s2n=1.5.11 + - s3fs=2025.2.0 + - s3transfer=0.11.2 + - scikit-image=0.25.1 + - scipy=1.15.1 - semantic_version=2.10.0 - - setuptools=68.2.2 - - shapely=2.0.2 - - simplejson=3.19.2 - - six=1.16.0 - - sleef=3.5.1 - - snappy=1.1.10 - - sniffio=1.3.0 + - setuptools=75.8.0 + - shapely=2.0.7 + - six=1.17.0 + - sleef=3.8 + - snappy=1.2.1 - snuggs=1.4.7 - sortedcontainers=2.4.0 - - sqlalchemy=2.0.22 - - sqlite=3.43.2 - - stack_data=0.6.2 - - svt-av1=1.7.0 - - tenacity=8.2.3 - - threadpoolctl=3.2.0 - - tifffile=2023.9.26 - - tiledb=2.16.3 + - soupsieve=2.5 + - sqlalchemy=2.0.38 + - sqlite=3.32.3 + - stack_data=0.6.3 + - svt-av1=2.3.0 + - sympy=1.13.3 + - tbb=2021.13.0 + - tenacity=9.0.0 + - tifffile=2025.1.10 - tk=8.6.13 - - toml=0.10.2 - - tomli=2.0.1 - - tqdm=4.66.1 - - traitlets=5.11.2 - - typing-extensions=4.8.0 - - typing_extensions=4.8.0 - - tzcode=2023c - - tzdata=2023c - - tzlocal=5.1 - - unicodedata2=15.1.0 - - uriparser=0.9.7 - - wcwidth=0.2.8 - - wheel=0.41.2 - - xerces-c=3.2.4 - - xorg-kbproto=1.0.7 - - xorg-libice=1.1.1 - - xorg-libsm=1.2.4 - - xorg-libx11=1.8.7 - - xorg-libxau=1.0.11 - - xorg-libxdmcp=1.1.3 - - xorg-libxext=1.3.4 - - xorg-libxrender=0.9.11 - - xorg-renderproto=0.11.1 - - xorg-xextproto=7.3.0 - - xorg-xproto=7.0.31 - - xz=5.2.6 + - tomli=2.2.1 + - toolz=1.0.0 + - tornado=6.4.2 + - tqdm=4.67.1 + - traitlets=5.14.3 + - traittypes=0.2.1 + - typing-extensions=4.12.2 + - typing_extensions=4.12.2 + - tzdata=2025a + - tzlocal=5.2 + - unicodedata2=16.0.0 + - uriparser=0.9.8 + - urllib3=1.26.19 + - vine=5.1.0 + - wcwidth=0.2.13 + - webencodings=0.5.1 + - wheel=0.45.1 + - widgetsnbextension=4.0.13 + - wrapt=1.17.2 + - x265=3.5 + - xerces-c=3.2.5 + - xorg-libxau=1.0.12 + - xorg-libxdmcp=1.1.5 + - xz=5.4.6 - yaml=0.2.5 - - zfp=1.0.0 - - zipp=3.17.0 - - zlib=1.2.13 - - zlib-ng=2.0.7 - - zstd=1.5.5 + - yarl=1.18.3 + - zeromq=4.3.5 + - zfp=1.0.1 + - zipp=3.21.0 + - zlib=1.3.1 + - zlib-ng=2.2.4 + - zstd=1.5.6 - pip: - - asciitree==0.3.3 - - astropy-healpix==1.0.0 - - async-timeout==4.0.3 - - boto3==1.28.63 - - botocore==1.31.63 - - cloudpickle==2.2.1 + - astropy==5.3.4 + - astropy-healpix==1.1.0 - cosmic-conn==0.4.1 - - dask==2023.9.3 - - extension_helpers==1.1.1 - - fasteners==0.19 - - fsspec==2023.9.2 - - kombu==4.6.11 + - crc32c==2.7.1 + - deprecated==1.2.18 + - donfig==0.8.1.post1 + - gwcs==0.21.0 - lcogt-logging==0.3.2 - - locket==1.0.0 - - logutils==0.3.5 - - numcodecs==0.12.0 - - ocs-archive==0.2.10 - - ocs-ingester==3.0.5 - - opensearch-py==1.1.0 + - numcodecs==0.15.1 + - numpy==1.26.4 + - ocs-archive==0.4.0 + - ocs-ingester==3.1.0 - opentsdb-http-client==0.2.0 - opentsdb-python-metrics==0.2.0 - - partd==1.4.1 - pretty-errors==1.2.25 - - redis==5.0.1 - - reproject==0.12.0 - - s3transfer==0.7.0 - - sep==1.2.1 - - toolz==0.12.0 - - urllib3==1.26.17 - - vine==1.3.0 - - zarr==2.16.1 + - redis==5.2.1 + - reproject==0.14.1 + - sep==1.4.0 + - zarr==3.0.2 diff --git a/pyproject.toml b/pyproject.toml index 384f0e5dd..9be61a9da 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,3 +8,127 @@ requires = ["setuptools", "cython>=0.29.23,<3.0.0"] build-backend = 'setuptools.build_meta' + +[project] +name = "lco-banzai" +version = "1.20.2" +description = "Python data reduction package for LCOGT data" +authors = [ + { name="Curtis McCully", email="cmccully@lco.global" }, +] +license = {text="GPL-3.0-or-later"} +readme = "README.rst" +keywords = ["astronomy", "reduction", "LCOGT"] +classifiers = [ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", + "Operating System :: OS Independent" +] +dependencies = [ + "astropy>=4.0", + "scipy", + "sqlalchemy>=1.3.0b1", + "logutils", + "numpy>=1.24", + "cython", + "lcogt_logging", + "photutils", + "bottleneck", + "kombu", + "amqp", + "requests", + "opensearch-py>=1", + "pytest>=4.0", + "pyyaml", + "psycopg2-binary", + "celery[redis]>5", + "apscheduler", + "ocs_ingester>=3.0.4,<4.0.0", + "tenacity>=8.5", + "python-dateutil", + "emcee", + "scikit-image", + "cosmic-conn>=0.2.8", + "alembic" +] + +[project.optional-dependencies] +test = [ + "pytest>=4.0", + "mock", + "coverage", + "pytest-astropy" +] +docs = [ + "sphinx-astropy" +] + +[project.urls] +"Source" = "https://github.com/lcogt/banzai" +"Docs" = "https://banzai.readthedocs.io/en/latest/" + +[tool.setuptools.packages.find] +include = ["banzai*"] + +[tool.pycodestyle] +# E101 - mix of tabs and spaces +# W191 - use of tabs +# W291 - trailing whitespace +# W292 - no newline at end of file +# W293 - trailing whitespace +# W391 - blank line at end of file +# E111 - 4 spaces per indentation level +# E112 - 4 spaces per indentation level +# E113 - 4 spaces per indentation level +# E901 - SyntaxError or IndentationError +# E902 - IOError +select = [ + "E101", "W191", "W291", "W292", "W293", "W391", "E111", "E112", "E113", "E901", "E902" +] +exclude = ["extern", "sphinx", "*parsetab.py"] + +[tool.setuptools] +zip-safe = false + +[tool.setuptools.package-data] +"banzai.tests" = ["data/*"] + +[project.scripts] + banzai_reduce_individual_frame = "banzai.main:reduce_single_frame" + banzai_reduce_directory = "banzai.main:reduce_directory" + banzai_make_master_calibrations = "banzai.main:make_master_calibrations" + banzai_automate_stack_calibrations = "banzai.main:start_stacking_scheduler" + banzai_run_realtime_pipeline = "banzai.main:run_realtime_pipeline" + banzai_mark_frame_as_good = "banzai.main:mark_frame_as_good" + banzai_mark_frame_as_bad = "banzai.main:mark_frame_as_bad" + banzai_update_db = "banzai.main:update_db" + banzai_add_instrument = "banzai.main:add_instrument" + banzai_add_site = "banzai.main:add_site" + banzai_add_super_calibration = "banzai.main:add_super_calibration" + banzai_populate_bpms = "banzai.main:add_bpms_from_archive" + banzai_create_db = "banzai.main:create_db" + +[tool.coverage.run] +source = ["banzai"] +omit = [ + "banzai/_astropy_init*", + "banzai/conftest*", + "banzai/cython_version*", + "banzai/setup_package*", + "banzai/*/setup_package*", + "banzai/*/*/setup_package*", + "banzai/tests/*", + "banzai/*/tests/*", + "banzai/*/*/tests/*", + "banzai/version*" +] + +[tool.coverage.report] +exclude_lines = [ + "pragma: no cover", + "except ImportError", + "raise AssertionError", + "raise NotImplementedError", + "def main\\(.*\\):", + "pragma: py{ignore_python_version}" +] diff --git a/setup.cfg b/setup.cfg index 0ad2a3633..7de4734f5 100755 --- a/setup.cfg +++ b/setup.cfg @@ -12,97 +12,6 @@ all_files = 1 upload-dir = docs/_build/html show-response = 1 -[pycodestyle] -# E101 - mix of tabs and spaces -# W191 - use of tabs -# W291 - trailing whitespace -# W292 - no newline at end of file -# W293 - trailing whitespace -# W391 - blank line at end of file -# E111 - 4 spaces per indentation level -# E112 - 4 spaces per indentation level -# E113 - 4 spaces per indentation level -# E901 - SyntaxError or IndentationError -# E902 - IOError -select = E101,W191,W291,W292,W293,W391,E111,E112,E113,E901,E902 -exclude = extern,sphinx,*parsetab.py - -[metadata] -# TODO: This no longer works with pypi because on pypi we are lco-banzai. -name = banzai -description = Python data reduction package for LCOGT data -long_description = This is a package to reduce LCOGT raw imaging data. -author = Curtis McCully -author_email = cmccully@lco.global -license = GPLv3 -url = http://github.com/lcogt/banzai - -edit_on_github = True -github_project = lcogt/banzai - -[options] -zip_safe = False -packages = find: -install_requires = - astropy>=3.0 - scipy - sqlalchemy>=1.3.0b1 - logutils - numpy<1.24 - cython - mysql-connector-python - lcogt_logging - photutils - bottleneck - kombu - amqp - requests - opensearch-py>=1,<2 - pytest>=4.0 - pyyaml - psycopg2-binary - celery[redis]>5,<6 - apscheduler - python-dateutil - ocs_ingester>=3.0.4,<4.0.0 - tenacity>=8,<=9 - python-dateutil - emcee - scikit-image - cosmic-conn>=0.2.8 - alembic - -setup_requires = setuptools_scm -python_requires = >=3.7 - -[options.extras_require] -test = - pytest>=4.0 - mock - coverage - pytest-astropy -docs = - sphinx-astropy - -[options.package_data] -banzai.tests = data/* - -[options.entry_points] -console_scripts = - banzai_reduce_individual_frame = banzai.main:reduce_single_frame - banzai_reduce_directory = banzai.main:reduce_directory - banzai_make_master_calibrations = banzai.main:make_master_calibrations - banzai_automate_stack_calibrations = banzai.main:start_stacking_scheduler - banzai_run_realtime_pipeline = banzai.main:run_realtime_pipeline - banzai_mark_frame_as_good = banzai.main:mark_frame_as_good - banzai_mark_frame_as_bad = banzai.main:mark_frame_as_bad - banzai_update_db = banzai.main:update_db - banzai_add_instrument = banzai.main:add_instrument - banzai_add_site = banzai.main:add_site - banzai_add_super_calibration = banzai.main:add_super_calibration - banzai_populate_bpms = banzai.main:add_bpms_from_archive - banzai_create_db = banzai.main:create_db - [coverage:run] source = {packagename} omit = diff --git a/tox.ini b/tox.ini index 2490b244e..c32bd7277 100644 --- a/tox.ini +++ b/tox.ini @@ -1,8 +1,8 @@ [tox] envlist = - py{36,37,38,39,310}-test{,-alldeps,-devdeps}{,-cov} - py{36,37,38,39,310}-test-numpy{116,117,118} - py{36,37,38,39,310}-test-astropy{30,40,lts} + py{310,311,312,313}-test{,-alldeps}{,-cov} + py{310,311,312,313}-test-numpy{124,125,126,20,21} + py{310,311,312,313}-test-astropy{43,53,61,70} build_docs linkcheck codestyle @@ -34,23 +34,28 @@ description = devdeps: with the latest developer version of key dependencies oldestdeps: with the oldest supported version of key dependencies cov: and test coverage - numpy117: with numpy 1.17.* - numpy118: with numpy 1.18.* - astropy30: with astropy 3.0.* - astropy40: with astropy 4.0.* - astropylts: with the latest astropy LTS + numpy124: with numpy 1.24.* + numpy125: with numpy 1.24.* + numpy126: with numpy 1.24.* + numpy20: with numpy 2.0.* + numpy21: with numpy 2.1.* + astropy43: with astropy 4.3.* + astropy53: with astropy 5.3.* + astropy43: with astropy 6.1.* + astropy43: with astropy 7.0.* # The following provides some specific pinnings for key packages deps = - numpy117: numpy==1.17.* - numpy118: numpy==1.18.* + numpy124: numpy==1.24.* + numpy125: numpy==1.25.* + numpy126: numpy==1.26.* + numpy20: numpy==2.0.* + numpy21: numpy==2.1.* - astropy30: astropy==3.0.* - astropy40: astropy==4.0.* - astropylts: astropy==4.0.* - - devdeps: git+https://github.com/numpy/numpy.git#egg=numpy - devdeps: git+https://github.com/astropy/astropy.git#egg=astropy + astropy43: astropy==4.3.* + astropy53: astropy==5.3.* + astropy61: astropy==6.1.* + astropy70: astropy==7.0.* # The following indicates which extras_require from setup.cfg will be installed extras = @@ -62,9 +67,6 @@ commands = !cov: pytest --pyargs banzai.tests -m "not e2e" "{toxinidir}/docs" {posargs} cov: pytest --pyargs banzai.tests "{toxinidir}/docs" --cov banzai --cov-config="{toxinidir}/setup.cfg" {posargs} -[testenv:py310-test] -install_command = pip install --pre torch -f https://download.pytorch.org/whl/nightly/cpu/torch_nightly.html {opts} {packages} - [testenv:build_docs] changedir = docs description = invoke sphinx-build to build the HTML docs From 4b58555e7366bb1a3b188c251d3ee6127dbc74be Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Wed, 12 Feb 2025 17:57:05 -0500 Subject: [PATCH 02/46] Moved codestyle back to setup.cfg because that's all they support. --- pyproject.toml | 17 ----------------- setup.cfg | 27 ++++++++++++++------------- 2 files changed, 14 insertions(+), 30 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 9be61a9da..5c1caa4d5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -70,23 +70,6 @@ docs = [ [tool.setuptools.packages.find] include = ["banzai*"] -[tool.pycodestyle] -# E101 - mix of tabs and spaces -# W191 - use of tabs -# W291 - trailing whitespace -# W292 - no newline at end of file -# W293 - trailing whitespace -# W391 - blank line at end of file -# E111 - 4 spaces per indentation level -# E112 - 4 spaces per indentation level -# E113 - 4 spaces per indentation level -# E901 - SyntaxError or IndentationError -# E902 - IOError -select = [ - "E101", "W191", "W291", "W292", "W293", "W391", "E111", "E112", "E113", "E901", "E902" -] -exclude = ["extern", "sphinx", "*parsetab.py"] - [tool.setuptools] zip-safe = false diff --git a/setup.cfg b/setup.cfg index 7de4734f5..988eb2306 100755 --- a/setup.cfg +++ b/setup.cfg @@ -1,16 +1,17 @@ -[build_sphinx] -source-dir = docs -build-dir = docs/_build -all_files = 1 - -[build_docs] -source-dir = docs -build-dir = docs/_build -all_files = 1 - -[upload_docs] -upload-dir = docs/_build/html -show-response = 1 +[pycodestyle] +# E101 - mix of tabs and spaces +# W191 - use of tabs +# W291 - trailing whitespace +# W292 - no newline at end of file +# W293 - trailing whitespace +# W391 - blank line at end of file +# E111 - 4 spaces per indentation level +# E112 - 4 spaces per indentation level +# E113 - 4 spaces per indentation level +# E901 - SyntaxError or IndentationError +# E902 - IOError +select = E101,W191,W291,W292,W293,W391,E111,E112,E113,E901,E902 +exclude = extern,sphinx,*parsetab.py [coverage:run] source = {packagename} From 975b7bf188a4094972f60e4ccf1e36239576afdb Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Wed, 12 Feb 2025 18:15:38 -0500 Subject: [PATCH 03/46] More reversions to setup.cfg because not all tools deal with pyproject well. --- pyproject.toml | 4 ++-- setup.cfg | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 5c1caa4d5..4eba37fe6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,13 +49,13 @@ dependencies = [ "emcee", "scikit-image", "cosmic-conn>=0.2.8", - "alembic" + "alembic", + "mock", ] [project.optional-dependencies] test = [ "pytest>=4.0", - "mock", "coverage", "pytest-astropy" ] diff --git a/setup.cfg b/setup.cfg index 988eb2306..6f1f4ec3b 100755 --- a/setup.cfg +++ b/setup.cfg @@ -1,3 +1,27 @@ +[build_sphinx] +source-dir = docs +build-dir = docs/_build +all_files = 1 + +[build_docs] +source-dir = docs +build-dir = docs/_build +all_files = 1 + +[upload_docs] +upload-dir = docs/_build/html +show-response = 1 + +[metadata] +# TODO: This no longer works with pypi because on pypi we are lco-banzai. +name = banzai +description = Python data reduction package for LCOGT data +long_description = This is a package to reduce LCOGT raw imaging data. +author = Curtis McCully +author_email = cmccully@lco.global +license = GPLv3 +url = http://github.com/lcogt/banzai + [pycodestyle] # E101 - mix of tabs and spaces # W191 - use of tabs From f3f6552a6cb506c86e5949940396d3f0873f41dd Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Wed, 12 Feb 2025 18:23:07 -0500 Subject: [PATCH 04/46] Updates to unit tests python versions to use currently supported versions. --- .github/workflows/unit-tests.yml | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index 5d96d175a..0585afa43 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -15,13 +15,13 @@ jobs: - name: Documentation build os: ubuntu-latest - python-version: 3.9 + python-version: 3.12 toxenv: build_docs - - name: Python 3.9 with minimal dependencies + - name: Python 3.12 with minimal dependencies os: ubuntu-latest - python-version: '3.9' - toxenv: py39-test + python-version: '3.12' + toxenv: py12-test - name: Python 3.10 with minimal dependencies os: ubuntu-latest @@ -32,10 +32,20 @@ jobs: os: ubuntu-latest python-version: '3.11' toxenv: py311-test + + - name: Python 3.12 with minimal dependencies + os: ubuntu-latest + python-version: '3.10' + toxenv: py310-test + + - name: Python 3.13 with minimal dependencies + os: ubuntu-latest + python-version: '3.11' + toxenv: py311-test - name: Code style checks os: ubuntu-latest - python-version: 3.9 + python-version: 3.12 toxenv: codestyle steps: From fc7f46b4ad94f70ebfd7c6036a79c1baa0153a1e Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Thu, 13 Feb 2025 12:18:16 -0500 Subject: [PATCH 05/46] Fixes to weird sqlite failure in dockerfile. --- Dockerfile | 11 ++- environment.yaml | 176 ----------------------------------------------- 2 files changed, 8 insertions(+), 179 deletions(-) diff --git a/Dockerfile b/Dockerfile index 29e2a4eea..57ff8c72c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,6 +9,8 @@ RUN mkdir /home/archive && /usr/sbin/groupadd -g 10000 "domainusers" \ && /usr/sbin/useradd -g 10000 -d /home/archive -M -N -u 10087 archive \ && chown -R archive:domainusers /home/archive +RUN chown -R 10087:10000 /opt/conda + USER archive ENV HOME=/home/archive @@ -16,13 +18,16 @@ ENV HOME=/home/archive WORKDIR /home/archive COPY environment.yaml . +RUN conda init +SHELL ["/bin/bash", "--login", "-c"] -RUN . /opt/conda/etc/profile.d/conda.sh && conda config --set remote_read_timeout_secs 900 && conda env create -p /home/archive/envs/banzai -f environment.yaml --solver=libmamba +RUN conda activate base && conda config --set remote_read_timeout_secs 900 && conda env update -f environment.yaml --solver=libmamba COPY --chown=10087:10000 . /lco/banzai -ENV PATH=/home/archive/envs/banzai/bin:$PATH +RUN conda activate base && pip install --no-cache-dir /lco/banzai/ -RUN /home/archive/envs/banzai/bin/pip install --no-cache-dir /lco/banzai/ +# Don't ask me why but something about the install breaks sqlite but this fixes it +RUN conda activate base && conda install libsqlite --force-reinstall -y RUN cp /lco/banzai/pytest.ini /home/archive/pytest.ini diff --git a/environment.yaml b/environment.yaml index 875982426..96d0635e3 100644 --- a/environment.yaml +++ b/environment.yaml @@ -7,94 +7,30 @@ channels: - https://repo.anaconda.com/pkgs/main - https://repo.anaconda.com/pkgs/r dependencies: - - _libgcc_mutex=0.1 - - _openmp_mutex=4.5 - affine=2.4.0 - - aiobotocore=2.19.0 - aiohappyeyeballs=2.4.6 - aiohttp=3.11.12 - aioitertools=0.12.0 - aiosignal=1.3.2 - - alembic=1.14.1 - amqp=5.2.0 - aom=3.9.1 - - apscheduler=3.11.0 - asdf=4.1.0 - asdf-astropy=0.7.0 - - asdf-coordinates-schemas=0.3.0 - asdf-standard=1.1.1 - - asdf-transform-schemas=0.5.0 - - asdf-wcs-schemas=0.4.0 - astropy-iers-data=0.2025.2.10.0.33.26 - asttokens=3.0.0 - attrs=25.1.0 - - aws-c-auth=0.8.1 - - aws-c-cal=0.8.1 - - aws-c-common=0.10.6 - - aws-c-compression=0.3.0 - - aws-c-event-stream=0.5.0 - - aws-c-http=0.9.2 - - aws-c-io=0.15.3 - - aws-c-mqtt=0.11.0 - - aws-c-s3=0.7.9 - - aws-c-sdkutils=0.2.2 - - aws-checksums=0.2.2 - - aws-crt-cpp=0.29.9 - - aws-sdk-cpp=1.11.489 - - azure-core-cpp=1.14.0 - - azure-identity-cpp=1.10.0 - - azure-storage-blobs-cpp=12.13.0 - - azure-storage-common-cpp=12.8.0 - - azure-storage-files-datalake-cpp=12.12.0 - - backports.zoneinfo=0.2.1 - beautifulsoup4=4.13.3 - billiard=4.2.1 - - bleach=6.2.0 - - blosc=1.21.6 - boto3=1.36.3 - - botocore=1.36.3 - - bottleneck=1.4.2 - bqplot=0.12.43 - - brotli=1.1.0 - - brotli-bin=1.1.0 - - brotli-python=1.1.0 - brunsli=0.1 - - bzip2=1.0.8 - - c-ares=1.34.4 - - c-blosc2=2.15.2 - - ca-certificates=2025.1.31 - - cached-property=1.5.2 - - cached_property=1.5.2 - - celery=5.4.0 - - certifi=2025.1.31 - - charls=2.4.2 - - charset-normalizer=3.4.1 - - click=8.1.8 - - click-didyoumean=0.3.1 - - click-plugins=1.1.1 - - click-repl=0.3.0 - - cligj=0.7.2 - - cloudpickle=3.1.1 - - colorama=0.4.6 - - comm=0.2.2 - - contourpy=1.3.1 - - cycler=0.12.1 - - cyrus-sasl=2.1.27 - - cython=3.0.12 - - dask-core=2025.1.0 - dav1d=1.2.1 - debugpy=1.8.12 - - decorator=5.1.1 - - emcee=3.1.6 - - exceptiongroup=1.2.2 - - executing=2.1.0 - - expat=2.6.4 - - filelock=3.17.0 - fonttools=4.56.0 - freetype=2.12.1 - freexl=2.0.0 - frozenlist=1.5.0 - - fsspec=2025.2.0 - gast=0.4.0 - geos=3.13.0 - geotiff=1.7.3 @@ -107,78 +43,39 @@ dependencies: - h5py=3.12.1 - hdf5=1.14.4 - html5lib=1.1 - - icu=75.1 - - idna=3.10 - - imagecodecs=2024.12.30 - imageio=2.37.0 - importlib-metadata=8.6.1 - - iniconfig=2.0.0 - ipydatagrid=1.4.0 - ipykernel=6.29.5 - - ipython=8.32.0 - ipywidgets=8.1.5 - jedi=0.19.2 - jinja2=3.1.5 - jmespath=1.0.1 - jplephem=2.21 - - json-c=0.18 - - jupyter_client=8.6.3 - - jupyter_core=5.7.2 - jupyterlab_widgets=3.0.13 - jxrlib=1.1 - keyutils=1.6.1 - kiwisolver=1.4.8 - kombu=5.4.1 - - krb5=1.21.3 - lazy-loader=0.4 - lazy_loader=0.4 - - lcms2=2.17 - - ld_impl_linux-64=2.40 - - lerc=4.0.0 - libabseil=20240722.0 - - libaec=1.1.3 - - libarchive=3.7.7 - libarrow=19.0.0 - - libarrow-acero=19.0.0 - libarrow-dataset=19.0.0 - libarrow-substrait=19.0.0 - libavif16=1.1.1 - libblas=3.9.0 - - libbrotlicommon=1.1.0 - - libbrotlidec=1.1.0 - - libbrotlienc=1.1.0 - - libcblas=3.9.0 - - libcrc32c=1.1.2 - - libcurl=8.11.1 - libde265=1.0.15 - libdeflate=1.23 - - libedit=3.1.20191231 - - libev=4.33 - - libevent=2.1.12 - - libexpat=2.6.4 - - libffi=3.4.4 - - libgcc=14.2.0 - - libgcc-ng=14.2.0 - - libgdal-core=3.10.1 - libgfortran=14.2.0 - libgfortran5=14.2.0 - - libgomp=14.2.0 - - libgoogle-cloud=2.34.0 - - libgoogle-cloud-storage=2.34.0 - - libgrpc=1.67.1 - libheif=1.19.5 - - libhwloc=2.11.2 - libhwy=1.1.0 - - libiconv=1.17 - libjpeg-turbo=3.0.0 - libjxl=0.11.1 - libkml=1.3.0 - - liblapack=3.9.0 - liblzma=5.6.4 - - libnghttp2=1.64.0 - libnsl=2.0.1 - - libopentelemetry-cpp=1.18.0 - - libopentelemetry-cpp-headers=1.18.0 - libparquet=19.0.0 - libpng=1.6.46 - libpq=17.2 @@ -187,150 +84,77 @@ dependencies: - librttopo=1.1.0 - libsodium=1.0.20 - libspatialite=5.1.0 - - libsqlite=3.48.0 - - libssh2=1.11.1 - - libstdcxx=14.2.0 - - libstdcxx-ng=14.2.0 - libthrift=0.21.0 - libtiff=4.7.0 - - libtorch=2.5.1 - - libutf8proc=2.10.0 - - libuuid=2.38.1 - libuv=1.50.0 - libwebp-base=1.5.0 - - libxcb=1.17.0 - - libxcrypt=4.4.36 - - libxml2=2.13.5 - - libzlib=1.3.1 - libzopfli=1.0.3 - llvm-openmp=19.1.7 - - locket=1.0.0 - logutils=0.3.5 - - lz4-c=1.10.0 - lzo=2.10 - mako=1.3.9 - markupsafe=3.0.2 - matplotlib-base=3.10.0 - matplotlib-inline=0.1.7 - minizip=4.0.7 - - mpc=1.3.1 - mpfr=4.2.1 - mpmath=1.3.0 - - multidict=6.1.0 - munkres=1.1.4 - - ncurses=6.4 - - nest-asyncio=1.6.0 - networkx=3.4.2 - - nlohmann_json=3.11.3 - openjpeg=2.5.3 - openldap=2.6.9 - - opensearch-py=2.5.0 - - openssl=3.4.1 - - orc=2.0.3 - - packaging=24.2 - pandas=2.2.3 - parso=0.8.4 - partd=1.4.2 - - pcre2=10.44 - - pexpect=4.9.0 - photutils=2.1.0 - - pickleshare=0.7.5 - pillow=11.1.0 - - pip=25.0 - - platformdirs=4.3.6 - - pluggy=1.5.0 - proj=9.5.1 - - prometheus-cpp=1.3.0 - prompt-toolkit=3.0.50 - prompt_toolkit=3.0.50 - - propcache=0.2.1 - psutil=6.1.1 - - psycopg2=2.9.9 - - psycopg2-binary=2.9.9 - pthread-stubs=0.4 - - ptyprocess=0.7.0 - pure_eval=0.2.3 - py2vega=0.6.1 - pyarrow=19.0.0 - - pyarrow-core=19.0.0 - - pybind11=2.13.6 - - pybind11-global=2.13.6 - pyerfa=2.0.1.5 - - pygments=2.19.1 - pyparsing=3.2.1 - - pysocks=1.7.1 - pytest=8.3.4 - - python=3.12.2 - - python-dateutil=2.9.0.post0 - - python-tzdata=2025.1 - - python_abi=3.12 - - pytorch=2.5.1 - pytz=2024.1 - pywavelets=1.8.0 - - pyyaml=6.0.2 - pyzmq=26.2.1 - qhull=2020.2 - rasterio=1.4.3 - rav1e=0.6.6 - re2=2024.07.02 - - readline=8.2 - regions=0.10 - - requests=2.32.3 - s2n=1.5.11 - s3fs=2025.2.0 - s3transfer=0.11.2 - - scikit-image=0.25.1 - - scipy=1.15.1 - - semantic_version=2.10.0 - - setuptools=75.8.0 - shapely=2.0.7 - six=1.17.0 - sleef=3.8 - snappy=1.2.1 - snuggs=1.4.7 - - sortedcontainers=2.4.0 - soupsieve=2.5 - - sqlalchemy=2.0.38 - - sqlite=3.32.3 - - stack_data=0.6.3 - svt-av1=2.3.0 - sympy=1.13.3 - tbb=2021.13.0 - - tenacity=9.0.0 - tifffile=2025.1.10 - - tk=8.6.13 - tomli=2.2.1 - toolz=1.0.0 - tornado=6.4.2 - - tqdm=4.67.1 - traitlets=5.14.3 - traittypes=0.2.1 - - typing-extensions=4.12.2 - - typing_extensions=4.12.2 - - tzdata=2025a - - tzlocal=5.2 - - unicodedata2=16.0.0 - uriparser=0.9.8 - - urllib3=1.26.19 - vine=5.1.0 - - wcwidth=0.2.13 - - webencodings=0.5.1 - - wheel=0.45.1 - widgetsnbextension=4.0.13 - wrapt=1.17.2 - x265=3.5 - - xerces-c=3.2.5 - xorg-libxau=1.0.12 - - xorg-libxdmcp=1.1.5 - - xz=5.4.6 - - yaml=0.2.5 - yarl=1.18.3 - zeromq=4.3.5 - zfp=1.0.1 - zipp=3.21.0 - - zlib=1.3.1 - - zlib-ng=2.2.4 - - zstd=1.5.6 - pip: - astropy==5.3.4 - astropy-healpix==1.1.0 From ef22f9c0de8ae7ee35de2aef560383ea22830acb Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Thu, 13 Feb 2025 16:07:11 -0500 Subject: [PATCH 06/46] Minor bugfixes for alembic migrations. --- ...c50_migration_of_past_data_for_blockid_.py | 67 ++++++++----------- environment.yaml | 1 + 2 files changed, 29 insertions(+), 39 deletions(-) diff --git a/alembic/migrations/versions/51b98e26cc50_migration_of_past_data_for_blockid_.py b/alembic/migrations/versions/51b98e26cc50_migration_of_past_data_for_blockid_.py index 36547da20..b5ab10125 100644 --- a/alembic/migrations/versions/51b98e26cc50_migration_of_past_data_for_blockid_.py +++ b/alembic/migrations/versions/51b98e26cc50_migration_of_past_data_for_blockid_.py @@ -20,15 +20,15 @@ depends_on: Union[str, Sequence[str], None] = '8e35c490a971' -def parse_public_date(date_to_parse): - date_formats = ['%Y-%m-%dT%H:%M:%S.%fZ', '%Y-%m-%dT%H:%M:%SZ'] +def parse_date(date_to_parse): + date_formats = ['%Y-%m-%dT%H:%M:%S.%fZ', '%Y-%m-%dT%H:%M:%SZ', '%Y-%m-%d %H:%M:%S.%f'] for date_format in date_formats: try: - public_date = datetime.datetime.strptime(date_to_parse, date_format) + parsed_date = datetime.datetime.strptime(date_to_parse, date_format) break except ValueError: continue - return public_date + return parsed_date def upgrade() -> None: @@ -38,43 +38,32 @@ def upgrade() -> None: auth_header = None connection = op.get_bind() - offset = 0 - batch_size = 1000 - query_str = "SELECT id, frameid, filename, type, dateobs, camera FROM calimages INNER JOIN instruments" - query_str += "ON calimages.instrument_id = instruments.id ORDER BY dateobs LIMIT :limit OFFSET :offset" - more_data = True - while more_data: - # Get all of the frames from all of the cameras for all obstypes in this batch - rows = connection.execute(text(query_str, {"limit": batch_size, "offset": offset})).fetchall() - for row in rows: - instruments = list(set(row.camera for row in rows)) - obstypes = list(set(row.type for row in rows)) - start = min([row.dateobs for row in rows]) - end = max([row.dateobs for row in rows]) - params = {'instruments': instruments, 'obstypes': obstypes, 'start': start, 'end': end} - request_results = requests.get('https://archive-api.lco.global/frames/aggregate/', params=params, headers=auth_header) - request_results = request_results.json()['results'] - if len(request_results) == 0: - more_data = False - break - request_results[0]['public_date'] - hashed_results = {result['basename']: {'blockid': result['BLKUID'], - 'proposal': result['proposal_id'], - 'public_date': parse_public_date(result['public_date'])} - for result in request_results} - for row in rows: - basename = row.filename.replace('.fits', '').replace('.fz', '') - values = {'id': row.id, 'public_date': hashed_results[basename]['public_date'], - 'proposal': hashed_results[basename]['proposal'], - 'blockid': hashed_results[basename]['blockid']} - query_str = 'blockid = :blockid, proposal = :proposal, public_date = :public_date' - if row.frameid is None: - query_str += ', frameid = :frameid' - values['frameid'] = request_results[0]['id'] - connection.execute(text(f"UPDATE calimages SET {query_str} WHERE id = :id"), values) + query_str = "SELECT id, frameid, filename,type, dateobs FROM calimages" + # Get all of the frames from all of the cameras for all obstypes in this batch + rows = connection.execute(text(query_str)).fetchall() + for row in rows: + basename = row.filename.replace('.fits', '').replace('.fz', '') + if row.frameid is not None: + request_results = requests.get(f'https://archive-api.lco.global/frames/{row.frameid}', headers=auth_header) + request_results = request_results.json() + else: + params = {'basename_exact': basename, 'start': parse_date(row.dateobs) - datetime.timedelta(days=1), + 'end': parse_date(row.dateobs) + datetime.timedelta(days=1)} + request_results = requests.get('https://archive-api.lco.global/frames/', params=params, headers=auth_header) + if len(request_results.json()['results']) == 0: + continue + request_results = request_results.json()['results'][0] - offset += batch_size + values = {'id': row.id, + 'public_date': parse_date(request_results['public_date']), + 'proposal': request_results['proposal_id'], + 'blockid': request_results['BLKUID']} + query_str = 'blockid = :blockid, proposal = :proposal, public_date = :public_date' + if row.frameid is None: + query_str += ', frameid = :frameid' + values['frameid'] = request_results['id'] + connection.execute(text(f"UPDATE calimages SET {query_str} WHERE id = :id"), values) def downgrade() -> None: diff --git a/environment.yaml b/environment.yaml index 96d0635e3..5971ab58f 100644 --- a/environment.yaml +++ b/environment.yaml @@ -156,6 +156,7 @@ dependencies: - zfp=1.0.1 - zipp=3.21.0 - pip: + - alembic==1.14.1 - astropy==5.3.4 - astropy-healpix==1.1.0 - cosmic-conn==0.4.1 From 98dd0749ac1aa973778de4eabadb348fa43bbf23 Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Thu, 20 Feb 2025 13:25:53 -0500 Subject: [PATCH 07/46] Switching to poetry. --- .dockerignore | 4 ++ Dockerfile | 26 +++---- appveyor.yml | 52 -------------- environment.yaml | 178 ----------------------------------------------- pyproject.toml | 14 ++-- 5 files changed, 22 insertions(+), 252 deletions(-) delete mode 100644 appveyor.yml delete mode 100644 environment.yaml diff --git a/.dockerignore b/.dockerignore index 85f331d93..d78dafdd9 100644 --- a/.dockerignore +++ b/.dockerignore @@ -73,3 +73,7 @@ distribute-*.tar.gz *.xml *.iml + +.tmp + +.tox diff --git a/Dockerfile b/Dockerfile index 57ff8c72c..04d036afc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,15 +1,15 @@ -FROM continuumio/miniconda3:25.1.1-2 - -# In principle I could remove the gcc to shrink the image, but pytorch is already so large it doesn't make much difference -RUN apt-get -y update && apt-get -y install gcc && \ - apt-get autoclean && \ - rm -rf /var/lib/apt/lists/* +FROM python:3.12-slim RUN mkdir /home/archive && /usr/sbin/groupadd -g 10000 "domainusers" \ && /usr/sbin/useradd -g 10000 -d /home/archive -M -N -u 10087 archive \ && chown -R archive:domainusers /home/archive -RUN chown -R 10087:10000 /opt/conda +RUN pip install poetry --no-cache + + +RUN apt-get -y update && apt-get -y install gcc && \ + apt-get autoclean && \ + rm -rf /var/lib/apt/lists/* USER archive @@ -21,13 +21,13 @@ COPY environment.yaml . RUN conda init SHELL ["/bin/bash", "--login", "-c"] -RUN conda activate base && conda config --set remote_read_timeout_secs 900 && conda env update -f environment.yaml --solver=libmamba +# RUN conda activate base && conda config --set remote_read_timeout_secs 900 && conda env update -f environment.yaml --solver=libmamba && conda clean --all -COPY --chown=10087:10000 . /lco/banzai +# COPY --chown=10087:10000 . /lco/banzai -RUN conda activate base && pip install --no-cache-dir /lco/banzai/ +# RUN conda activate base && pip install --no-cache-dir /lco/banzai/ -# Don't ask me why but something about the install breaks sqlite but this fixes it -RUN conda activate base && conda install libsqlite --force-reinstall -y +# # Don't ask me why but something about the install breaks sqlite but this fixes it +# RUN conda activate base && conda install libsqlite --force-reinstall -y -RUN cp /lco/banzai/pytest.ini /home/archive/pytest.ini +# RUN cp /lco/banzai/pytest.ini /home/archive/pytest.ini diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index c7a3ded21..000000000 --- a/appveyor.yml +++ /dev/null @@ -1,52 +0,0 @@ -# AppVeyor.com is a Continuous Integration service to build and run tests under -# Windows - -environment: - - global: - PYTHON: "C:\\conda" - MINICONDA_VERSION: "latest" - CMD_IN_ENV: "cmd /E:ON /V:ON /C .\\ci-helpers\\appveyor\\windows_sdk.cmd" - PYTHON_ARCH: "64" # needs to be set for CMD_IN_ENV to succeed. If a mix - # of 32 bit and 64 bit builds are needed, move this - # to the matrix section. - - # For this package-template, we include examples of Cython modules, - # so Cython is required for testing. If your package does not include - # Cython code, you can set CONDA_DEPENDENCIES='' - CONDA_DEPENDENCIES: "Cython" - - # Conda packages for affiliated packages are hosted in channel - # "astropy" while builds for astropy LTS with recent numpy versions - # are in astropy-ci-extras. If your package uses either of these, - # add the channels to CONDA_CHANNELS along with any other channels - # you want to use. - # CONDA_CHANNELS: "astropy-ci-extras astropy" - - matrix: - - # We test Python 2.7 and 3.6 because 2.7 is the supported Python 2 - # release of Astropy and Python 3.6 is the latest Python 3 release. - - - PYTHON_VERSION: "2.7" - ASTROPY_VERSION: "stable" - NUMPY_VERSION: "stable" - - - PYTHON_VERSION: "3.6" - ASTROPY_VERSION: "stable" - NUMPY_VERSION: "stable" - -platform: - -x64 - -install: - - "git clone --depth 1 git://github.com/astropy/ci-helpers.git" - - "powershell ci-helpers/appveyor/install-miniconda.ps1" - - "SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%" - - "activate test" - -# Not a .NET project, we build the package in the install step instead -build: false - -test_script: - - "%CMD_IN_ENV% python setup.py test" diff --git a/environment.yaml b/environment.yaml deleted file mode 100644 index 5971ab58f..000000000 --- a/environment.yaml +++ /dev/null @@ -1,178 +0,0 @@ -# This environment was produced with the following: -# conda create -n banzai python=3.10 'cython<3' 'numpy<1.24' bottleneck scipy astropy pytest mock requests ipython coverage pyyaml kombu sep 'elasticsearch<6.0.0,>=5.0.0' pytest-astropy mysql-connector-python photutils psycopg2-binary tenacity 'amqp<3' 'celery[redis]>=4.3.1,<5' scikit-image emcee -# python-dateutil 'sqlalchemy>=1.3.0b1' psycopg2-binary apscheduler 'pytorch>=1.6.0' --channel conda-forge --channel astropy --channel pytorch --solver=libmamba -channels: - - defaults - - conda-forge - - https://repo.anaconda.com/pkgs/main - - https://repo.anaconda.com/pkgs/r -dependencies: - - affine=2.4.0 - - aiohappyeyeballs=2.4.6 - - aiohttp=3.11.12 - - aioitertools=0.12.0 - - aiosignal=1.3.2 - - amqp=5.2.0 - - aom=3.9.1 - - asdf=4.1.0 - - asdf-astropy=0.7.0 - - asdf-standard=1.1.1 - - astropy-iers-data=0.2025.2.10.0.33.26 - - asttokens=3.0.0 - - attrs=25.1.0 - - beautifulsoup4=4.13.3 - - billiard=4.2.1 - - boto3=1.36.3 - - bqplot=0.12.43 - - brunsli=0.1 - - dav1d=1.2.1 - - debugpy=1.8.12 - - fonttools=4.56.0 - - freetype=2.12.1 - - freexl=2.0.0 - - frozenlist=1.5.0 - - gast=0.4.0 - - geos=3.13.0 - - geotiff=1.7.3 - - gflags=2.2.2 - - giflib=5.2.2 - - glog=0.7.1 - - gmp=6.3.0 - - gmpy2=2.1.5 - - greenlet=3.1.1 - - h5py=3.12.1 - - hdf5=1.14.4 - - html5lib=1.1 - - imageio=2.37.0 - - importlib-metadata=8.6.1 - - ipydatagrid=1.4.0 - - ipykernel=6.29.5 - - ipywidgets=8.1.5 - - jedi=0.19.2 - - jinja2=3.1.5 - - jmespath=1.0.1 - - jplephem=2.21 - - jupyterlab_widgets=3.0.13 - - jxrlib=1.1 - - keyutils=1.6.1 - - kiwisolver=1.4.8 - - kombu=5.4.1 - - lazy-loader=0.4 - - lazy_loader=0.4 - - libabseil=20240722.0 - - libarrow=19.0.0 - - libarrow-dataset=19.0.0 - - libarrow-substrait=19.0.0 - - libavif16=1.1.1 - - libblas=3.9.0 - - libde265=1.0.15 - - libdeflate=1.23 - - libgfortran=14.2.0 - - libgfortran5=14.2.0 - - libheif=1.19.5 - - libhwy=1.1.0 - - libjpeg-turbo=3.0.0 - - libjxl=0.11.1 - - libkml=1.3.0 - - liblzma=5.6.4 - - libnsl=2.0.1 - - libparquet=19.0.0 - - libpng=1.6.46 - - libpq=17.2 - - libprotobuf=5.28.3 - - libre2-11=2024.07.02 - - librttopo=1.1.0 - - libsodium=1.0.20 - - libspatialite=5.1.0 - - libthrift=0.21.0 - - libtiff=4.7.0 - - libuv=1.50.0 - - libwebp-base=1.5.0 - - libzopfli=1.0.3 - - llvm-openmp=19.1.7 - - logutils=0.3.5 - - lzo=2.10 - - mako=1.3.9 - - markupsafe=3.0.2 - - matplotlib-base=3.10.0 - - matplotlib-inline=0.1.7 - - minizip=4.0.7 - - mpfr=4.2.1 - - mpmath=1.3.0 - - munkres=1.1.4 - - networkx=3.4.2 - - openjpeg=2.5.3 - - openldap=2.6.9 - - pandas=2.2.3 - - parso=0.8.4 - - partd=1.4.2 - - photutils=2.1.0 - - pillow=11.1.0 - - proj=9.5.1 - - prompt-toolkit=3.0.50 - - prompt_toolkit=3.0.50 - - psutil=6.1.1 - - pthread-stubs=0.4 - - pure_eval=0.2.3 - - py2vega=0.6.1 - - pyarrow=19.0.0 - - pyerfa=2.0.1.5 - - pyparsing=3.2.1 - - pytest=8.3.4 - - pytz=2024.1 - - pywavelets=1.8.0 - - pyzmq=26.2.1 - - qhull=2020.2 - - rasterio=1.4.3 - - rav1e=0.6.6 - - re2=2024.07.02 - - regions=0.10 - - s2n=1.5.11 - - s3fs=2025.2.0 - - s3transfer=0.11.2 - - shapely=2.0.7 - - six=1.17.0 - - sleef=3.8 - - snappy=1.2.1 - - snuggs=1.4.7 - - soupsieve=2.5 - - svt-av1=2.3.0 - - sympy=1.13.3 - - tbb=2021.13.0 - - tifffile=2025.1.10 - - tomli=2.2.1 - - toolz=1.0.0 - - tornado=6.4.2 - - traitlets=5.14.3 - - traittypes=0.2.1 - - uriparser=0.9.8 - - vine=5.1.0 - - widgetsnbextension=4.0.13 - - wrapt=1.17.2 - - x265=3.5 - - xorg-libxau=1.0.12 - - yarl=1.18.3 - - zeromq=4.3.5 - - zfp=1.0.1 - - zipp=3.21.0 - - pip: - - alembic==1.14.1 - - astropy==5.3.4 - - astropy-healpix==1.1.0 - - cosmic-conn==0.4.1 - - crc32c==2.7.1 - - deprecated==1.2.18 - - donfig==0.8.1.post1 - - gwcs==0.21.0 - - lcogt-logging==0.3.2 - - numcodecs==0.15.1 - - numpy==1.26.4 - - ocs-archive==0.4.0 - - ocs-ingester==3.1.0 - - opentsdb-http-client==0.2.0 - - opentsdb-python-metrics==0.2.0 - - pretty-errors==1.2.25 - - redis==5.2.1 - - reproject==0.14.1 - - sep==1.4.0 - - zarr==3.0.2 diff --git a/pyproject.toml b/pyproject.toml index 4eba37fe6..b7bb6a4ed 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,16 +1,12 @@ [build-system] +requires = ["poetry-core>=2.0.0,<3.0.0", + "cython"] +build-backend = "poetry.core.masonry.api" -requires = ["setuptools", - "setuptools_scm", - "wheel", - "extension-helpers", - "oldest-supported-numpy", - "cython>=0.29.23,<3.0.0"] - -build-backend = 'setuptools.build_meta' [project] name = "lco-banzai" +python = ">=3.10,<4" version = "1.20.2" description = "Python data reduction package for LCOGT data" authors = [ @@ -37,7 +33,7 @@ dependencies = [ "kombu", "amqp", "requests", - "opensearch-py>=1", + "opensearch-py", "pytest>=4.0", "pyyaml", "psycopg2-binary", From 1589654bc37e8e776472067ab31e351a11553163 Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Thu, 20 Feb 2025 17:31:04 -0500 Subject: [PATCH 08/46] Added poetry file. --- Dockerfile | 22 +- poetry.lock | 3466 ++++++++++++++++++++++++++++++++++++++++++++++++ pyproject.toml | 15 +- 3 files changed, 3488 insertions(+), 15 deletions(-) create mode 100644 poetry.lock diff --git a/Dockerfile b/Dockerfile index 04d036afc..ad139c495 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,28 +6,22 @@ RUN mkdir /home/archive && /usr/sbin/groupadd -g 10000 "domainusers" \ RUN pip install poetry --no-cache - RUN apt-get -y update && apt-get -y install gcc && \ apt-get autoclean && \ rm -rf /var/lib/apt/lists/* -USER archive - -ENV HOME=/home/archive +COPY pyproject.toml poetry.lock /lco/banzai/ -WORKDIR /home/archive +RUN poetry install --directory=/lco/banzai --no-root --no-cache -COPY environment.yaml . -RUN conda init -SHELL ["/bin/bash", "--login", "-c"] +COPY . /lco/banzai -# RUN conda activate base && conda config --set remote_read_timeout_secs 900 && conda env update -f environment.yaml --solver=libmamba && conda clean --all +RUN poetry install --directory /lco/banzai --no-cache -# COPY --chown=10087:10000 . /lco/banzai +USER archive -# RUN conda activate base && pip install --no-cache-dir /lco/banzai/ +ENV HOME=/home/archive -# # Don't ask me why but something about the install breaks sqlite but this fixes it -# RUN conda activate base && conda install libsqlite --force-reinstall -y +WORKDIR /home/archive -# RUN cp /lco/banzai/pytest.ini /home/archive/pytest.ini +RUN cp /lco/banzai/pytest.ini /home/archive/pytest.ini diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 000000000..346e0f4de --- /dev/null +++ b/poetry.lock @@ -0,0 +1,3466 @@ +# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. + +[[package]] +name = "alabaster" +version = "1.0.0" +description = "A light, configurable Sphinx theme" +optional = true +python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"docs\"" +files = [ + {file = "alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b"}, + {file = "alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e"}, +] + +[[package]] +name = "alembic" +version = "1.14.1" +description = "A database migration tool for SQLAlchemy." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "alembic-1.14.1-py3-none-any.whl", hash = "sha256:1acdd7a3a478e208b0503cd73614d5e4c6efafa4e73518bb60e4f2846a37b1c5"}, + {file = "alembic-1.14.1.tar.gz", hash = "sha256:496e888245a53adf1498fcab31713a469c65836f8de76e01399aa1c3e90dd213"}, +] + +[package.dependencies] +Mako = "*" +SQLAlchemy = ">=1.3.0" +typing-extensions = ">=4" + +[package.extras] +tz = ["backports.zoneinfo ; python_version < \"3.9\"", "tzdata"] + +[[package]] +name = "amqp" +version = "5.3.1" +description = "Low-level AMQP client for Python (fork of amqplib)." +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "amqp-5.3.1-py3-none-any.whl", hash = "sha256:43b3319e1b4e7d1251833a93d672b4af1e40f3d632d479b98661a95f117880a2"}, + {file = "amqp-5.3.1.tar.gz", hash = "sha256:cddc00c725449522023bad949f70fff7b48f0b1ade74d170a6f10ab044739432"}, +] + +[package.dependencies] +vine = ">=5.0.0,<6.0.0" + +[[package]] +name = "apscheduler" +version = "3.11.0" +description = "In-process task scheduler with Cron-like capabilities" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "APScheduler-3.11.0-py3-none-any.whl", hash = "sha256:fc134ca32e50f5eadcc4938e3a4545ab19131435e851abb40b34d63d5141c6da"}, + {file = "apscheduler-3.11.0.tar.gz", hash = "sha256:4c622d250b0955a65d5d0eb91c33e6d43fd879834bf541e0a18661ae60460133"}, +] + +[package.dependencies] +tzlocal = ">=3.0" + +[package.extras] +doc = ["packaging", "sphinx", "sphinx-rtd-theme (>=1.3.0)"] +etcd = ["etcd3", "protobuf (<=3.21.0)"] +gevent = ["gevent"] +mongodb = ["pymongo (>=3.0)"] +redis = ["redis (>=3.0)"] +rethinkdb = ["rethinkdb (>=2.4.0)"] +sqlalchemy = ["sqlalchemy (>=1.4)"] +test = ["APScheduler[etcd,mongodb,redis,rethinkdb,sqlalchemy,tornado,zookeeper]", "PySide6 ; platform_python_implementation == \"CPython\" and python_version < \"3.14\"", "anyio (>=4.5.2)", "gevent ; python_version < \"3.14\"", "pytest", "pytz", "twisted ; python_version < \"3.14\""] +tornado = ["tornado (>=4.3)"] +twisted = ["twisted"] +zookeeper = ["kazoo"] + +[[package]] +name = "asciitree" +version = "0.3.3" +description = "Draws ASCII trees." +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "asciitree-0.3.3.tar.gz", hash = "sha256:4aa4b9b649f85e3fcb343363d97564aa1fb62e249677f2e18a96765145cc0f6e"}, +] + +[[package]] +name = "astropy" +version = "5.3.4" +description = "Astronomy and astrophysics core library" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "astropy-5.3.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6c63abc95d094cd3062e32c1ebf80c07502e4f3094b1e276458db5ce6b6a2"}, + {file = "astropy-5.3.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e85871ec762fc7eab2f7e716c97dad1b3c546bb75941ea7fae6c8eadd51f0bf8"}, + {file = "astropy-5.3.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e82fdad3417b70af381945aa42fdae0f11bc9aaf94b95027b1e24379bf847d6"}, + {file = "astropy-5.3.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbce56f46ec1051fd67a5e2244e5f2e08599a176fe524c0bee2294c62be317b3"}, + {file = "astropy-5.3.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a489c2322136b76a43208e3e9b5a7947a7fd624a10e49d2909b94f12b624da06"}, + {file = "astropy-5.3.4-cp310-cp310-win32.whl", hash = "sha256:c713695e39f5a874705bc3bd262c5d218890e3e7c43f0b6c0b5e7d46bdff527c"}, + {file = "astropy-5.3.4-cp310-cp310-win_amd64.whl", hash = "sha256:2576579befb0674cdfd18f5cc138c919a109c6886a25aa3d8ed8ab4e4607c581"}, + {file = "astropy-5.3.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4ce096dde6b86a87aa84aec4198732ec379fbb7649af66a96f85b96d17214c2a"}, + {file = "astropy-5.3.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:830fb4b19c36bf8092fdd74ecf9df5b78c6435bf571c5e09b7f644875148a058"}, + {file = "astropy-5.3.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a707c534408d26d90014a1938af883f6cbf43a3dd78df8bb9a191d275c09f8d"}, + {file = "astropy-5.3.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0bb2b9b93bc879bcd032931e7fc07c3a3de6f9546fed17f0f12974e0ffc83e0"}, + {file = "astropy-5.3.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1fa4437fe8d1e103f14cb1cb4e8449c93ae4190b5e9fd97e9c61a5155de9af0d"}, + {file = "astropy-5.3.4-cp311-cp311-win32.whl", hash = "sha256:c656c7fd3d862bcb9d3c4a87b8e9488d0c351b4edf348410c09a26641b9d4731"}, + {file = "astropy-5.3.4-cp311-cp311-win_amd64.whl", hash = "sha256:4c4971abae8e3ddfb8f40447d78aaf24e6ce44b976b3874770ff533609050366"}, + {file = "astropy-5.3.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:887db411555692fb1858ae305f87fd2ff42a021b68c78abbf3fa1fc64641e895"}, + {file = "astropy-5.3.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e4033d7a6bd2da38b83ec65f7282dfeb2641f2b2d41b1cd392cdbe3d6f8abfff"}, + {file = "astropy-5.3.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2cc6503b79d4fb61ca80e1d37dd609fabca6d2e0124e17f831cc08c2e6ff75e"}, + {file = "astropy-5.3.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f3f9fe1d76d151428a8d2bc7d50f4a47ae6e7141c11880a3ad259ac7b906b03"}, + {file = "astropy-5.3.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6e0f7ecbb2a8acb3eace99bcaca30dd1ce001e6f4750a009fd9cc3b8d1b49c58"}, + {file = "astropy-5.3.4-cp312-cp312-win32.whl", hash = "sha256:d915e6370315a1a6a40c2576e77d0063f48cc3b5f8873087cad8ad19dd429d19"}, + {file = "astropy-5.3.4-cp312-cp312-win_amd64.whl", hash = "sha256:69f5a3789a8a4cb00815630b63f950be629a983896dc1aba92566ccc7937a77d"}, + {file = "astropy-5.3.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d5d1a1be788344f11a94a5356c1a25b4d45f1736b740edb4d8e3a272b872a8fa"}, + {file = "astropy-5.3.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ae59e4d41461ad96a2573bc51408000a7b4f90dce2bad07646fa6409a12a5a74"}, + {file = "astropy-5.3.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4c4d3a14e8e3a33208683331b16a721ab9f9493ed998d34533532fdaeaa3642"}, + {file = "astropy-5.3.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f58f53294f07cd3f9173bb113ad60d2cd823501c99251891936202fed76681"}, + {file = "astropy-5.3.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f79400dc6641bb0202a8998cfb08ad1afe197818e27c946491a292e2ffd16a1b"}, + {file = "astropy-5.3.4-cp39-cp39-win32.whl", hash = "sha256:fd0baa7621d03aa74bb8ba673d7955381d15aed4f30dc2a56654560401fc3aca"}, + {file = "astropy-5.3.4-cp39-cp39-win_amd64.whl", hash = "sha256:9ed6116d07de02183d966e9a5dabc86f6fd3d86cc3e1e8b9feef89fd757be8a6"}, + {file = "astropy-5.3.4.tar.gz", hash = "sha256:d490f7e2faac2ccc01c9244202d629154259af8a979104ced89dc4ace4e6f1d8"}, +] + +[package.dependencies] +numpy = ">=1.21,<2" +packaging = ">=19.0" +pyerfa = ">=2.0" +PyYAML = ">=3.13" + +[package.extras] +all = ["asdf (>=2.10.0)", "beautifulsoup4", "bleach", "bottleneck", "certifi", "dask[array]", "fsspec[http] (>=2022.8.2)", "h5py", "html5lib", "ipython (>=4.2)", "jplephem", "matplotlib (>=3.3,!=3.4.0,!=3.5.2)", "mpmath", "pandas", "pre-commit", "pyarrow (>=5.0.0)", "pytest (>=7.0,<8)", "pytz", "s3fs (>=2022.8.2)", "scipy (>=1.5)", "sortedcontainers", "typing-extensions (>=3.10.0.1)"] +docs = ["Jinja2 (>=3.0)", "matplotlib (>=3.3,!=3.4.0,!=3.5.2)", "pytest (>=7.0,<8)", "scipy (>=1.3)", "sphinx", "sphinx-astropy (>=1.6)", "sphinx-changelog (>=1.2.0)"] +recommended = ["matplotlib (>=3.3,!=3.4.0,!=3.5.2)", "scipy (>=1.5)"] +test = ["pytest (>=7.0,<8)", "pytest-astropy (>=0.10)", "pytest-astropy-header (>=0.2.1)", "pytest-doctestplus (>=0.12)", "pytest-xdist"] +test-all = ["coverage[toml]", "ipython (>=4.2)", "objgraph", "pytest (>=7.0,<8)", "pytest-astropy (>=0.10)", "pytest-astropy-header (>=0.2.1)", "pytest-doctestplus (>=0.12)", "pytest-xdist", "sgp4 (>=2.3)", "skyfield (>=1.20)"] + +[[package]] +name = "astropy-healpix" +version = "1.1.2" +description = "BSD-licensed HEALPix for Astropy" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "astropy_healpix-1.1.2-cp310-abi3-macosx_10_9_x86_64.whl", hash = "sha256:fb504c998e1661215c74da9537558cd2048d29b44acb2d63e613aae133b91668"}, + {file = "astropy_healpix-1.1.2-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:00a0c9378d7e844aecb23d62c206a999e045a48781a320ac5f012f8c95ac4022"}, + {file = "astropy_healpix-1.1.2-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee37b14700d28cf53e2376c65f8cb6224a59f80067feb3f3cd6dd6f9a4577337"}, + {file = "astropy_healpix-1.1.2-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf7a616af0b7df9c1d96f6af1e12382f29bd43e3fb88ce98f46992bfa23a149e"}, + {file = "astropy_healpix-1.1.2-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3526008fc5ccd4c13f3166a878bfb856b909a00912b27d26666992615c668e88"}, + {file = "astropy_healpix-1.1.2-cp310-abi3-win32.whl", hash = "sha256:94f4a2fcee2e66ab68f8face8d20be4553cbf6ce81bd214052ddf307e2118513"}, + {file = "astropy_healpix-1.1.2-cp310-abi3-win_amd64.whl", hash = "sha256:f6b3e50c49e73a66bb1847dc3451e1d22bf828c10881275bf359928e95d25fe3"}, + {file = "astropy_healpix-1.1.2.tar.gz", hash = "sha256:03671df12a36ec3b357c244d5154b6786362ff5d80770675c7b24815101066e4"}, +] + +[package.dependencies] +astropy = ">=5" +numpy = ">=1.25" + +[package.extras] +docs = ["matplotlib", "sphinx-astropy"] +test = ["hypothesis", "pytest-astropy"] + +[[package]] +name = "astropy-sphinx-theme" +version = "1.1" +description = "The sphinx theme for Astropy and affiliated packages." +optional = true +python-versions = "*" +groups = ["main"] +markers = "extra == \"docs\"" +files = [ + {file = "astropy-sphinx-theme-1.1.tar.gz", hash = "sha256:ee1dafa0cf4d109455f7a0d19da4cdd608ad24d380ed2eb8090bb945a3d286f9"}, + {file = "astropy_sphinx_theme-1.1-py2.py3-none-any.whl", hash = "sha256:089a2007b8645137460eb70bdbbc4dbc5c15f0873991d5b526da013cfac008c4"}, +] + +[package.dependencies] +setuptools = "*" + +[[package]] +name = "async-timeout" +version = "5.0.1" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.8" +groups = ["main"] +markers = "python_full_version < \"3.11.3\"" +files = [ + {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, + {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, +] + +[[package]] +name = "attrs" +version = "25.1.0" +description = "Classes Without Boilerplate" +optional = true +python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"test\"" +files = [ + {file = "attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a"}, + {file = "attrs-25.1.0.tar.gz", hash = "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e"}, +] + +[package.extras] +benchmark = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +cov = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\""] + +[[package]] +name = "babel" +version = "2.17.0" +description = "Internationalization utilities" +optional = true +python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"docs\"" +files = [ + {file = "babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2"}, + {file = "babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d"}, +] + +[package.extras] +dev = ["backports.zoneinfo ; python_version < \"3.9\"", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata ; sys_platform == \"win32\""] + +[[package]] +name = "billiard" +version = "4.2.1" +description = "Python multiprocessing fork with improvements and bugfixes" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "billiard-4.2.1-py3-none-any.whl", hash = "sha256:40b59a4ac8806ba2c2369ea98d876bc6108b051c227baffd928c644d15d8f3cb"}, + {file = "billiard-4.2.1.tar.gz", hash = "sha256:12b641b0c539073fc8d3f5b8b7be998956665c4233c7c1fcd66a7e677c4fb36f"}, +] + +[[package]] +name = "boto3" +version = "1.36.25" +description = "The AWS SDK for Python" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "boto3-1.36.25-py3-none-any.whl", hash = "sha256:41fb90a516995946563ec91b9d891e2516c58617e9556d5e86dfa62da3fdebe6"}, + {file = "boto3-1.36.25.tar.gz", hash = "sha256:a057c19adffb48737c192bdb10f9d85e0d9dcecd21327f51520c15db9022a835"}, +] + +[package.dependencies] +botocore = ">=1.36.25,<1.37.0" +jmespath = ">=0.7.1,<2.0.0" +s3transfer = ">=0.11.0,<0.12.0" + +[package.extras] +crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] + +[[package]] +name = "botocore" +version = "1.36.25" +description = "Low-level, data-driven core of boto 3." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "botocore-1.36.25-py3-none-any.whl", hash = "sha256:04c8ff03531e8d92baa8c98d1850bdf01668a805467f4222b65e5325f94aa8af"}, + {file = "botocore-1.36.25.tar.gz", hash = "sha256:3b0a857d2621c336fb82a36cb6da4b6e062d346451ac46d110b074e5e5fd7cfc"}, +] + +[package.dependencies] +jmespath = ">=0.7.1,<2.0.0" +python-dateutil = ">=2.1,<3.0.0" +urllib3 = {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""} + +[package.extras] +crt = ["awscrt (==0.23.8)"] + +[[package]] +name = "bottleneck" +version = "1.4.2" +description = "Fast NumPy array functions written in C" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "Bottleneck-1.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:125436df93751a226eab1732783aa8f6125e88e779587aa61be071fb66e41f9d"}, + {file = "Bottleneck-1.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c6df9a60ec6ab88fec934ca864266ba95edd89c490af71dc9cd8afb2a54ebd9"}, + {file = "Bottleneck-1.4.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e2fe327dc2d0564e295a5857a252755103f8c6e05b07d3ff80a69afaa9f5065"}, + {file = "Bottleneck-1.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6b7790ca8658cd69e3cc0d0e4ff0e9829d60849bf7945fbd7344fbce05b2bbb8"}, + {file = "Bottleneck-1.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6282fa925ac3768f66e3547f89a512376d3f9de7ef53bdd37aa29232fd864054"}, + {file = "Bottleneck-1.4.2-cp310-cp310-win32.whl", hash = "sha256:e56a206fbf48e3b8054a964398bf1ed843e9625d3c6bdbeb7898cb48bf97441b"}, + {file = "Bottleneck-1.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:eb0c611d15b0fd8f511d288e8964e4725b4b3b0d9d310880cf0ff6b8dd03c859"}, + {file = "Bottleneck-1.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b6902ebf3e85315b481bc084f10c5770f8240275ad1e039ac69c7c8d2013b040"}, + {file = "Bottleneck-1.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2fd34b9b490204f95288f0dd35d37042486a95029617246c88c0f94a0ab49fe"}, + {file = "Bottleneck-1.4.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:122845e3106c85465551d4a9a3777841347cfedfbebb3aa985cca110e07030b1"}, + {file = "Bottleneck-1.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1f61658ebdf5a178298544336b65020730bf86cc092dab5f6579a99a86bd888b"}, + {file = "Bottleneck-1.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7c7d29c044a3511b36fd744503c3e697e279c273a8477a6d91a2831d04fd19e0"}, + {file = "Bottleneck-1.4.2-cp311-cp311-win32.whl", hash = "sha256:c663cbba8f52011fd82ee08c6a85c93b34b19e0e7ebba322d2d67809f34e0597"}, + {file = "Bottleneck-1.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:89651ef18c06616850203bf8875c958c5d316ea48d8ba60d9b450199d39ae391"}, + {file = "Bottleneck-1.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a74ddd0417f42eeaba37375f0fc065b28451e0fba45cb2f99e88880b10b3fa43"}, + {file = "Bottleneck-1.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:070d22f2f62ab81297380a89492cca931e4d9443fa4b84c2baeb52db09c3b1b4"}, + {file = "Bottleneck-1.4.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1fc4e7645bd425c05e05acd5541e9e09cb4179e71164e862f082561bf4509eac"}, + {file = "Bottleneck-1.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:037315c56605128a39f77d19af6a6019dc8c21a63694a4bfef3c026ed963be2e"}, + {file = "Bottleneck-1.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:99778329331d5fae8df19772a019e8b73ba4d9d1650f110cd995ab7657114db0"}, + {file = "Bottleneck-1.4.2-cp312-cp312-win32.whl", hash = "sha256:7363b3c8ce6ca433779cd7e96bcb94c0e516dcacadff0011adcbf0b3ac86bc9d"}, + {file = "Bottleneck-1.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:48c6b9d9287c4102b803fcb01ae66ae7ef6b310b711b4b7b7e23bf952894dc05"}, + {file = "Bottleneck-1.4.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c1c885ad02a6a8fa1f7ee9099f29b9d4c03eb1da2c7ab25839482d5cce739021"}, + {file = "Bottleneck-1.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7a1b023de1de3d84b18826462718fba548fed41870df44354f9ab6a414ea82f"}, + {file = "Bottleneck-1.4.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c9dbaf737b605b30c81611f2c1d197c2fd2e46c33f605876c1d332d3360c4fc"}, + {file = "Bottleneck-1.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7ebbcbe5d4062e37507b9a81e2aacdb1fcccc6193f7feff124ef2b5a6a5eb740"}, + {file = "Bottleneck-1.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:964f6ac4118ddab3bbbac79d4f726b093459be751baba73ee0aa364666e8068e"}, + {file = "Bottleneck-1.4.2-cp313-cp313-win32.whl", hash = "sha256:2db287f6ecdbb1c998085eca9b717fec2bfc48a4ab6ae070a9820ba8ab59c90b"}, + {file = "Bottleneck-1.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:26b5f0531f7044befaad95c20365dd666372e66bdacbfaf009ff65d60285534d"}, + {file = "Bottleneck-1.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:72d6aa95cdd782833d2589f81434fd865ba004b8938e07920b6ef02796ce8918"}, + {file = "Bottleneck-1.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b33e83665e7daf7f513fe1f7b04b13944d44b6635c45d5a9c89c9e5ed11811b6"}, + {file = "Bottleneck-1.4.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52248f3e0fead78c17912fb086a585c86f567019247d21c69e87645241b97b02"}, + {file = "Bottleneck-1.4.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:dce1a3c5ff89a56fb2678c9bda17b89f60f710d6002ab7cd72b7661bc3fae64d"}, + {file = "Bottleneck-1.4.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:48d2e101d99a9d72aa86da1a048d2094f4e1db0cf77519d1c33239f9d62da162"}, + {file = "Bottleneck-1.4.2-cp39-cp39-win32.whl", hash = "sha256:9d7b12936516f944e3d981a64038f99acb21f0e99f92fad16d9a468248c2b231"}, + {file = "Bottleneck-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:7b459d08f1f3e2da85db0a9e2d3e6e3541105f5866e9026dbca32dafc5106f2b"}, + {file = "bottleneck-1.4.2.tar.gz", hash = "sha256:fa8e8e1799dea5483ce6669462660f9d9a95649f6f98a80d315b84ec89f449f4"}, +] + +[package.dependencies] +numpy = "*" + +[package.extras] +doc = ["gitpython", "numpydoc", "sphinx"] + +[[package]] +name = "celery" +version = "5.4.0" +description = "Distributed Task Queue." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "celery-5.4.0-py3-none-any.whl", hash = "sha256:369631eb580cf8c51a82721ec538684994f8277637edde2dfc0dacd73ed97f64"}, + {file = "celery-5.4.0.tar.gz", hash = "sha256:504a19140e8d3029d5acad88330c541d4c3f64c789d85f94756762d8bca7e706"}, +] + +[package.dependencies] +billiard = ">=4.2.0,<5.0" +click = ">=8.1.2,<9.0" +click-didyoumean = ">=0.3.0" +click-plugins = ">=1.1.1" +click-repl = ">=0.2.0" +kombu = ">=5.3.4,<6.0" +python-dateutil = ">=2.8.2" +redis = {version = ">=4.5.2,<4.5.5 || >4.5.5,<6.0.0", optional = true, markers = "extra == \"redis\""} +tzdata = ">=2022.7" +vine = ">=5.1.0,<6.0" + +[package.extras] +arangodb = ["pyArango (>=2.0.2)"] +auth = ["cryptography (==42.0.5)"] +azureblockblob = ["azure-storage-blob (>=12.15.0)"] +brotli = ["brotli (>=1.0.0) ; platform_python_implementation == \"CPython\"", "brotlipy (>=0.7.0) ; platform_python_implementation == \"PyPy\""] +cassandra = ["cassandra-driver (>=3.25.0,<4)"] +consul = ["python-consul2 (==0.1.5)"] +cosmosdbsql = ["pydocumentdb (==2.3.5)"] +couchbase = ["couchbase (>=3.0.0) ; platform_python_implementation != \"PyPy\" and (platform_system != \"Windows\" or python_version < \"3.10\")"] +couchdb = ["pycouchdb (==1.14.2)"] +django = ["Django (>=2.2.28)"] +dynamodb = ["boto3 (>=1.26.143)"] +elasticsearch = ["elastic-transport (<=8.13.0)", "elasticsearch (<=8.13.0)"] +eventlet = ["eventlet (>=0.32.0) ; python_version < \"3.10\""] +gcs = ["google-cloud-storage (>=2.10.0)"] +gevent = ["gevent (>=1.5.0)"] +librabbitmq = ["librabbitmq (>=2.0.0) ; python_version < \"3.11\""] +memcache = ["pylibmc (==1.6.3) ; platform_system != \"Windows\""] +mongodb = ["pymongo[srv] (>=4.0.2)"] +msgpack = ["msgpack (==1.0.8)"] +pymemcache = ["python-memcached (>=1.61)"] +pyro = ["pyro4 (==4.82) ; python_version < \"3.11\""] +pytest = ["pytest-celery[all] (>=1.0.0)"] +redis = ["redis (>=4.5.2,!=4.5.5,<6.0.0)"] +s3 = ["boto3 (>=1.26.143)"] +slmq = ["softlayer-messaging (>=1.0.3)"] +solar = ["ephem (==4.1.5) ; platform_python_implementation != \"PyPy\""] +sqlalchemy = ["sqlalchemy (>=1.4.48,<2.1)"] +sqs = ["boto3 (>=1.26.143)", "kombu[sqs] (>=5.3.4)", "pycurl (>=7.43.0.5) ; sys_platform != \"win32\" and platform_python_implementation == \"CPython\"", "urllib3 (>=1.26.16)"] +tblib = ["tblib (>=1.3.0) ; python_version < \"3.8.0\"", "tblib (>=1.5.0) ; python_version >= \"3.8.0\""] +yaml = ["PyYAML (>=3.10)"] +zookeeper = ["kazoo (>=1.3.1)"] +zstd = ["zstandard (==0.22.0)"] + +[[package]] +name = "certifi" +version = "2025.1.31" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, + {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.1" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"}, + {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"}, + {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, +] + +[[package]] +name = "click" +version = "8.1.8" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, + {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "click-didyoumean" +version = "0.3.1" +description = "Enables git-like *did-you-mean* feature in click" +optional = false +python-versions = ">=3.6.2" +groups = ["main"] +files = [ + {file = "click_didyoumean-0.3.1-py3-none-any.whl", hash = "sha256:5c4bb6007cfea5f2fd6583a2fb6701a22a41eb98957e63d0fac41c10e7c3117c"}, + {file = "click_didyoumean-0.3.1.tar.gz", hash = "sha256:4f82fdff0dbe64ef8ab2279bd6aa3f6a99c3b28c05aa09cbfc07c9d7fbb5a463"}, +] + +[package.dependencies] +click = ">=7" + +[[package]] +name = "click-plugins" +version = "1.1.1" +description = "An extension module for click to enable registering CLI commands via setuptools entry-points." +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "click-plugins-1.1.1.tar.gz", hash = "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b"}, + {file = "click_plugins-1.1.1-py2.py3-none-any.whl", hash = "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8"}, +] + +[package.dependencies] +click = ">=4.0" + +[package.extras] +dev = ["coveralls", "pytest (>=3.6)", "pytest-cov", "wheel"] + +[[package]] +name = "click-repl" +version = "0.3.0" +description = "REPL plugin for Click" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "click-repl-0.3.0.tar.gz", hash = "sha256:17849c23dba3d667247dc4defe1757fff98694e90fe37474f3feebb69ced26a9"}, + {file = "click_repl-0.3.0-py3-none-any.whl", hash = "sha256:fb7e06deb8da8de86180a33a9da97ac316751c094c6899382da7feeeeb51b812"}, +] + +[package.dependencies] +click = ">=7.0" +prompt-toolkit = ">=3.0.36" + +[package.extras] +testing = ["pytest (>=7.2.1)", "pytest-cov (>=4.0.0)", "tox (>=4.4.3)"] + +[[package]] +name = "cloudpickle" +version = "3.1.1" +description = "Pickler class to extend the standard pickle.Pickler functionality" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "cloudpickle-3.1.1-py3-none-any.whl", hash = "sha256:c8c5a44295039331ee9dad40ba100a9c7297b6f988e50e87ccdf3765a668350e"}, + {file = "cloudpickle-3.1.1.tar.gz", hash = "sha256:b216fa8ae4019d5482a8ac3c95d8f6346115d8835911fd4aefd1a445e4242c64"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main"] +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 = "cosmic-conn" +version = "0.4.1" +description = "Cosmic-CoNN: A Cosmic Ray Detection Deep Learning Framework, Dataset, and Toolkit" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "cosmic_conn-0.4.1-py2.py3-none-any.whl", hash = "sha256:9582b9afaadfbe93be9e81534194e9a441dd4a9fd2d361fd44608dfe4a709b62"}, + {file = "cosmic_conn-0.4.1.tar.gz", hash = "sha256:b32755b2d7ccf0e3992862d66c7fd9b8f8b895641b82246950d2ce11b8dfdc06"}, +] + +[package.dependencies] +astropy = ">=3.0" +numpy = "*" +pretty-errors = "*" +psutil = "*" +reproject = "*" +requests = "*" +scikit-image = "*" +sep = "*" +torch = ">=1.6.0" +tqdm = "*" + +[package.extras] +develop = ["Flask (>=1.1.0)", "Flask-APScheduler (>=1.12.0)", "scikit-learn (>=0.24.0)", "tensorboard (>=2.4.0)"] +webapp = ["Flask (>=1.1.0)", "Flask-APScheduler (>=1.12.0)"] + +[[package]] +name = "coverage" +version = "7.6.12" +description = "Code coverage measurement for Python" +optional = true +python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"test\"" +files = [ + {file = "coverage-7.6.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:704c8c8c6ce6569286ae9622e534b4f5b9759b6f2cd643f1c1a61f666d534fe8"}, + {file = "coverage-7.6.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ad7525bf0241e5502168ae9c643a2f6c219fa0a283001cee4cf23a9b7da75879"}, + {file = "coverage-7.6.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06097c7abfa611c91edb9e6920264e5be1d6ceb374efb4986f38b09eed4cb2fe"}, + {file = "coverage-7.6.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:220fa6c0ad7d9caef57f2c8771918324563ef0d8272c94974717c3909664e674"}, + {file = "coverage-7.6.12-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3688b99604a24492bcfe1c106278c45586eb819bf66a654d8a9a1433022fb2eb"}, + {file = "coverage-7.6.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d1a987778b9c71da2fc8948e6f2656da6ef68f59298b7e9786849634c35d2c3c"}, + {file = "coverage-7.6.12-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:cec6b9ce3bd2b7853d4a4563801292bfee40b030c05a3d29555fd2a8ee9bd68c"}, + {file = "coverage-7.6.12-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ace9048de91293e467b44bce0f0381345078389814ff6e18dbac8fdbf896360e"}, + {file = "coverage-7.6.12-cp310-cp310-win32.whl", hash = "sha256:ea31689f05043d520113e0552f039603c4dd71fa4c287b64cb3606140c66f425"}, + {file = "coverage-7.6.12-cp310-cp310-win_amd64.whl", hash = "sha256:676f92141e3c5492d2a1596d52287d0d963df21bf5e55c8b03075a60e1ddf8aa"}, + {file = "coverage-7.6.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e18aafdfb3e9ec0d261c942d35bd7c28d031c5855dadb491d2723ba54f4c3015"}, + {file = "coverage-7.6.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:66fe626fd7aa5982cdebad23e49e78ef7dbb3e3c2a5960a2b53632f1f703ea45"}, + {file = "coverage-7.6.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ef01d70198431719af0b1f5dcbefc557d44a190e749004042927b2a3fed0702"}, + {file = "coverage-7.6.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e92ae5a289a4bc4c0aae710c0948d3c7892e20fd3588224ebe242039573bf0"}, + {file = "coverage-7.6.12-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e695df2c58ce526eeab11a2e915448d3eb76f75dffe338ea613c1201b33bab2f"}, + {file = "coverage-7.6.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d74c08e9aaef995f8c4ef6d202dbd219c318450fe2a76da624f2ebb9c8ec5d9f"}, + {file = "coverage-7.6.12-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e995b3b76ccedc27fe4f477b349b7d64597e53a43fc2961db9d3fbace085d69d"}, + {file = "coverage-7.6.12-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b1f097878d74fe51e1ddd1be62d8e3682748875b461232cf4b52ddc6e6db0bba"}, + {file = "coverage-7.6.12-cp311-cp311-win32.whl", hash = "sha256:1f7ffa05da41754e20512202c866d0ebfc440bba3b0ed15133070e20bf5aeb5f"}, + {file = "coverage-7.6.12-cp311-cp311-win_amd64.whl", hash = "sha256:e216c5c45f89ef8971373fd1c5d8d1164b81f7f5f06bbf23c37e7908d19e8558"}, + {file = "coverage-7.6.12-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b172f8e030e8ef247b3104902cc671e20df80163b60a203653150d2fc204d1ad"}, + {file = "coverage-7.6.12-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:641dfe0ab73deb7069fb972d4d9725bf11c239c309ce694dd50b1473c0f641c3"}, + {file = "coverage-7.6.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e549f54ac5f301e8e04c569dfdb907f7be71b06b88b5063ce9d6953d2d58574"}, + {file = "coverage-7.6.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:959244a17184515f8c52dcb65fb662808767c0bd233c1d8a166e7cf74c9ea985"}, + {file = "coverage-7.6.12-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bda1c5f347550c359f841d6614fb8ca42ae5cb0b74d39f8a1e204815ebe25750"}, + {file = "coverage-7.6.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1ceeb90c3eda1f2d8c4c578c14167dbd8c674ecd7d38e45647543f19839dd6ea"}, + {file = "coverage-7.6.12-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f16f44025c06792e0fb09571ae454bcc7a3ec75eeb3c36b025eccf501b1a4c3"}, + {file = "coverage-7.6.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b076e625396e787448d27a411aefff867db2bffac8ed04e8f7056b07024eed5a"}, + {file = "coverage-7.6.12-cp312-cp312-win32.whl", hash = "sha256:00b2086892cf06c7c2d74983c9595dc511acca00665480b3ddff749ec4fb2a95"}, + {file = "coverage-7.6.12-cp312-cp312-win_amd64.whl", hash = "sha256:7ae6eabf519bc7871ce117fb18bf14e0e343eeb96c377667e3e5dd12095e0288"}, + {file = "coverage-7.6.12-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:488c27b3db0ebee97a830e6b5a3ea930c4a6e2c07f27a5e67e1b3532e76b9ef1"}, + {file = "coverage-7.6.12-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d1095bbee1851269f79fd8e0c9b5544e4c00c0c24965e66d8cba2eb5bb535fd"}, + {file = "coverage-7.6.12-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0533adc29adf6a69c1baa88c3d7dbcaadcffa21afbed3ca7a225a440e4744bf9"}, + {file = "coverage-7.6.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53c56358d470fa507a2b6e67a68fd002364d23c83741dbc4c2e0680d80ca227e"}, + {file = "coverage-7.6.12-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64cbb1a3027c79ca6310bf101014614f6e6e18c226474606cf725238cf5bc2d4"}, + {file = "coverage-7.6.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:79cac3390bfa9836bb795be377395f28410811c9066bc4eefd8015258a7578c6"}, + {file = "coverage-7.6.12-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9b148068e881faa26d878ff63e79650e208e95cf1c22bd3f77c3ca7b1d9821a3"}, + {file = "coverage-7.6.12-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8bec2ac5da793c2685ce5319ca9bcf4eee683b8a1679051f8e6ec04c4f2fd7dc"}, + {file = "coverage-7.6.12-cp313-cp313-win32.whl", hash = "sha256:200e10beb6ddd7c3ded322a4186313d5ca9e63e33d8fab4faa67ef46d3460af3"}, + {file = "coverage-7.6.12-cp313-cp313-win_amd64.whl", hash = "sha256:2b996819ced9f7dbb812c701485d58f261bef08f9b85304d41219b1496b591ef"}, + {file = "coverage-7.6.12-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:299cf973a7abff87a30609879c10df0b3bfc33d021e1adabc29138a48888841e"}, + {file = "coverage-7.6.12-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4b467a8c56974bf06e543e69ad803c6865249d7a5ccf6980457ed2bc50312703"}, + {file = "coverage-7.6.12-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2458f275944db8129f95d91aee32c828a408481ecde3b30af31d552c2ce284a0"}, + {file = "coverage-7.6.12-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a9d8be07fb0832636a0f72b80d2a652fe665e80e720301fb22b191c3434d924"}, + {file = "coverage-7.6.12-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14d47376a4f445e9743f6c83291e60adb1b127607a3618e3185bbc8091f0467b"}, + {file = "coverage-7.6.12-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b95574d06aa9d2bd6e5cc35a5bbe35696342c96760b69dc4287dbd5abd4ad51d"}, + {file = "coverage-7.6.12-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:ecea0c38c9079570163d663c0433a9af4094a60aafdca491c6a3d248c7432827"}, + {file = "coverage-7.6.12-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2251fabcfee0a55a8578a9d29cecfee5f2de02f11530e7d5c5a05859aa85aee9"}, + {file = "coverage-7.6.12-cp313-cp313t-win32.whl", hash = "sha256:eb5507795caabd9b2ae3f1adc95f67b1104971c22c624bb354232d65c4fc90b3"}, + {file = "coverage-7.6.12-cp313-cp313t-win_amd64.whl", hash = "sha256:f60a297c3987c6c02ffb29effc70eadcbb412fe76947d394a1091a3615948e2f"}, + {file = "coverage-7.6.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e7575ab65ca8399c8c4f9a7d61bbd2d204c8b8e447aab9d355682205c9dd948d"}, + {file = "coverage-7.6.12-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8161d9fbc7e9fe2326de89cd0abb9f3599bccc1287db0aba285cb68d204ce929"}, + {file = "coverage-7.6.12-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a1e465f398c713f1b212400b4e79a09829cd42aebd360362cd89c5bdc44eb87"}, + {file = "coverage-7.6.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f25d8b92a4e31ff1bd873654ec367ae811b3a943583e05432ea29264782dc32c"}, + {file = "coverage-7.6.12-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a936309a65cc5ca80fa9f20a442ff9e2d06927ec9a4f54bcba9c14c066323f2"}, + {file = "coverage-7.6.12-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:aa6f302a3a0b5f240ee201297fff0bbfe2fa0d415a94aeb257d8b461032389bd"}, + {file = "coverage-7.6.12-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f973643ef532d4f9be71dd88cf7588936685fdb576d93a79fe9f65bc337d9d73"}, + {file = "coverage-7.6.12-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:78f5243bb6b1060aed6213d5107744c19f9571ec76d54c99cc15938eb69e0e86"}, + {file = "coverage-7.6.12-cp39-cp39-win32.whl", hash = "sha256:69e62c5034291c845fc4df7f8155e8544178b6c774f97a99e2734b05eb5bed31"}, + {file = "coverage-7.6.12-cp39-cp39-win_amd64.whl", hash = "sha256:b01a840ecc25dce235ae4c1b6a0daefb2a203dba0e6e980637ee9c2f6ee0df57"}, + {file = "coverage-7.6.12-pp39.pp310-none-any.whl", hash = "sha256:7e39e845c4d764208e7b8f6a21c541ade741e2c41afabdfa1caa28687a3c98cf"}, + {file = "coverage-7.6.12-py3-none-any.whl", hash = "sha256:eb8668cfbc279a536c633137deeb9435d2962caec279c3f8cf8b91fff6ff8953"}, + {file = "coverage-7.6.12.tar.gz", hash = "sha256:48cfc4641d95d34766ad41d9573cc0f22a48aa88d22657a1fe01dca0dbae4de2"}, +] + +[package.dependencies] +tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} + +[package.extras] +toml = ["tomli ; python_full_version <= \"3.11.0a6\""] + +[[package]] +name = "cython" +version = "3.0.12" +description = "The Cython compiler for writing C extensions in the Python language." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +groups = ["main"] +files = [ + {file = "Cython-3.0.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba67eee9413b66dd9fbacd33f0bc2e028a2a120991d77b5fd4b19d0b1e4039b9"}, + {file = "Cython-3.0.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bee2717e5b5f7d966d0c6e27d2efe3698c357aa4d61bb3201997c7a4f9fe485a"}, + {file = "Cython-3.0.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7cffc3464f641c8d0dda942c7c53015291beea11ec4d32421bed2f13b386b819"}, + {file = "Cython-3.0.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d3a8f81980ffbd74e52f9186d8f1654e347d0c44bfea6b5997028977f481a179"}, + {file = "Cython-3.0.12-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8d32856716c369d01f2385ad9177cdd1a11079ac89ea0932dc4882de1aa19174"}, + {file = "Cython-3.0.12-cp310-cp310-win32.whl", hash = "sha256:712c3f31adec140dc60d064a7f84741f50e2c25a8edd7ae746d5eb4d3ef7072a"}, + {file = "Cython-3.0.12-cp310-cp310-win_amd64.whl", hash = "sha256:d6945694c5b9170cfbd5f2c0d00ef7487a2de7aba83713a64ee4ebce7fad9e05"}, + {file = "Cython-3.0.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:feb86122a823937cc06e4c029d80ff69f082ebb0b959ab52a5af6cdd271c5dc3"}, + {file = "Cython-3.0.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfdbea486e702c328338314adb8e80f5f9741f06a0ae83aaec7463bc166d12e8"}, + {file = "Cython-3.0.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:563de1728c8e48869d2380a1b76bbc1b1b1d01aba948480d68c1d05e52d20c92"}, + {file = "Cython-3.0.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:398d4576c1e1f6316282aa0b4a55139254fbed965cba7813e6d9900d3092b128"}, + {file = "Cython-3.0.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1e5eadef80143026944ea8f9904715a008f5108d1d644a89f63094cc37351e73"}, + {file = "Cython-3.0.12-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5a93cbda00a5451175b97dea5a9440a3fcee9e54b4cba7a7dbcba9a764b22aec"}, + {file = "Cython-3.0.12-cp311-cp311-win32.whl", hash = "sha256:3109e1d44425a2639e9a677b66cd7711721a5b606b65867cb2d8ef7a97e2237b"}, + {file = "Cython-3.0.12-cp311-cp311-win_amd64.whl", hash = "sha256:d4b70fc339adba1e2111b074ee6119fe9fd6072c957d8597bce9a0dd1c3c6784"}, + {file = "Cython-3.0.12-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fe030d4a00afb2844f5f70896b7f2a1a0d7da09bf3aa3d884cbe5f73fff5d310"}, + {file = "Cython-3.0.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7fec4f052b8fe173fe70eae75091389955b9a23d5cec3d576d21c5913b49d47"}, + {file = "Cython-3.0.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0faa5e39e5c8cdf6f9c3b1c3f24972826e45911e7f5b99cf99453fca5432f45e"}, + {file = "Cython-3.0.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d53de996ed340e9ab0fc85a88aaa8932f2591a2746e1ab1c06e262bd4ec4be7"}, + {file = "Cython-3.0.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ea3a0e19ab77266c738aa110684a753a04da4e709472cadeff487133354d6ab8"}, + {file = "Cython-3.0.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c151082884be468f2f405645858a857298ac7f7592729e5b54788b5c572717ba"}, + {file = "Cython-3.0.12-cp312-cp312-win32.whl", hash = "sha256:3083465749911ac3b2ce001b6bf17f404ac9dd35d8b08469d19dc7e717f5877a"}, + {file = "Cython-3.0.12-cp312-cp312-win_amd64.whl", hash = "sha256:c0b91c7ebace030dd558ea28730de8c580680b50768e5af66db2904a3716c3e3"}, + {file = "Cython-3.0.12-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4ee6f1ea1bead8e6cbc4e64571505b5d8dbdb3b58e679d31f3a84160cebf1a1a"}, + {file = "Cython-3.0.12-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57aefa6d3341109e46ec1a13e3a763aaa2cbeb14e82af2485b318194be1d9170"}, + {file = "Cython-3.0.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:879ae9023958d63c0675015369384642d0afb9c9d1f3473df9186c42f7a9d265"}, + {file = "Cython-3.0.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:36fcd584dae547de6f095500a380f4a0cce72b7a7e409e9ff03cb9beed6ac7a1"}, + {file = "Cython-3.0.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:62b79dcc0de49efe9e84b9d0e2ae0a6fc9b14691a65565da727aa2e2e63c6a28"}, + {file = "Cython-3.0.12-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4aa255781b093a8401109d8f2104bbb2e52de7639d5896aefafddc85c30e0894"}, + {file = "Cython-3.0.12-cp313-cp313-win32.whl", hash = "sha256:77d48f2d4bab9fe1236eb753d18f03e8b2619af5b6f05d51df0532a92dfb38ab"}, + {file = "Cython-3.0.12-cp313-cp313-win_amd64.whl", hash = "sha256:86c304b20bd57c727c7357e90d5ba1a2b6f1c45492de2373814d7745ef2e63b4"}, + {file = "Cython-3.0.12-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ff5c0b6a65b08117d0534941d404833d516dac422eee88c6b4fd55feb409a5ed"}, + {file = "Cython-3.0.12-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:680f1d6ed4436ae94805db264d6155ed076d2835d84f20dcb31a7a3ad7f8668c"}, + {file = "Cython-3.0.12-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebc24609613fa06d0d896309f7164ba168f7e8d71c1e490ed2a08d23351c3f41"}, + {file = "Cython-3.0.12-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1879c073e2b34924ce9b7ca64c212705dcc416af4337c45f371242b2e5f6d32"}, + {file = "Cython-3.0.12-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:bfb75123dd4ff767baa37d7036da0de2dfb6781ff256eef69b11b88b9a0691d1"}, + {file = "Cython-3.0.12-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:f39640f8df0400cde6882e23c734f15bb8196de0a008ae5dc6c8d1ec5957d7c8"}, + {file = "Cython-3.0.12-cp36-cp36m-win32.whl", hash = "sha256:8c9efe9a0895abee3cadfdad4130b30f7b5e57f6e6a51ef2a44f9fc66a913880"}, + {file = "Cython-3.0.12-cp36-cp36m-win_amd64.whl", hash = "sha256:63d840f2975e44d74512f8f34f1f7cb8121c9428e26a3f6116ff273deb5e60a2"}, + {file = "Cython-3.0.12-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:75c5acd40b97cff16fadcf6901a91586cbca5dcdba81f738efaf1f4c6bc8dccb"}, + {file = "Cython-3.0.12-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e62564457851db1c40399bd95a5346b9bb99e17a819bf583b362f418d8f3457a"}, + {file = "Cython-3.0.12-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ccd1228cc203b1f1b8a3d403f5a20ad1c40e5879b3fbf5851ce09d948982f2c"}, + {file = "Cython-3.0.12-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25529ee948f44d9a165ff960c49d4903267c20b5edf2df79b45924802e4cca6e"}, + {file = "Cython-3.0.12-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:90cf599372c5a22120609f7d3a963f17814799335d56dd0dcf8fe615980a8ae1"}, + {file = "Cython-3.0.12-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:9f8c48748a9c94ea5d59c26ab49ad0fad514d36f894985879cf3c3ca0e600bf4"}, + {file = "Cython-3.0.12-cp37-cp37m-win32.whl", hash = "sha256:3e4fa855d98bc7bd6a2049e0c7dc0dcf595e2e7f571a26e808f3efd84d2db374"}, + {file = "Cython-3.0.12-cp37-cp37m-win_amd64.whl", hash = "sha256:120681093772bf3600caddb296a65b352a0d3556e962b9b147efcfb8e8c9801b"}, + {file = "Cython-3.0.12-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:731d719423e041242c9303c80cae4327467299b90ffe62d4cc407e11e9ea3160"}, + {file = "Cython-3.0.12-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3238a29f37999e27494d120983eca90d14896b2887a0bd858a381204549137a"}, + {file = "Cython-3.0.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b588c0a089a9f4dd316d2f9275230bad4a7271e5af04e1dc41d2707c816be44b"}, + {file = "Cython-3.0.12-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ab9f5198af74eb16502cc143cdde9ca1cbbf66ea2912e67440dd18a36e3b5fa"}, + {file = "Cython-3.0.12-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8ee841c0e114efa1e849c281ac9b8df8aa189af10b4a103b1c5fd71cbb799679"}, + {file = "Cython-3.0.12-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:43c48b5789398b228ea97499f5b864843ba9b1ab837562a9227c6f58d16ede8b"}, + {file = "Cython-3.0.12-cp38-cp38-win32.whl", hash = "sha256:5e5f17c48a4f41557fbcc7ee660ccfebe4536a34c557f553b6893c1b3c83df2d"}, + {file = "Cython-3.0.12-cp38-cp38-win_amd64.whl", hash = "sha256:309c081057930bb79dc9ea3061a1af5086c679c968206e9c9c2ec90ab7cb471a"}, + {file = "Cython-3.0.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54115fcc126840926ff3b53cfd2152eae17b3522ae7f74888f8a41413bd32f25"}, + {file = "Cython-3.0.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:629db614b9c364596d7c975fa3fb3978e8c5349524353dbe11429896a783fc1e"}, + {file = "Cython-3.0.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:af081838b0f9e12a83ec4c3809a00a64c817f489f7c512b0e3ecaf5f90a2a816"}, + {file = "Cython-3.0.12-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:34ce459808f7d8d5d4007bc5486fe50532529096b43957af6cbffcb4d9cc5c8d"}, + {file = "Cython-3.0.12-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d6c6cd6a75c8393e6805d17f7126b96a894f310a1a9ea91c47d141fb9341bfa8"}, + {file = "Cython-3.0.12-cp39-cp39-win32.whl", hash = "sha256:a4032e48d4734d2df68235d21920c715c451ac9de15fa14c71b378e8986b83be"}, + {file = "Cython-3.0.12-cp39-cp39-win_amd64.whl", hash = "sha256:dcdc3e5d4ce0e7a4af6903ed580833015641e968d18d528d8371e2435a34132c"}, + {file = "Cython-3.0.12-py2.py3-none-any.whl", hash = "sha256:0038c9bae46c459669390e53a1ec115f8096b2e4647ae007ff1bf4e6dee92806"}, + {file = "cython-3.0.12.tar.gz", hash = "sha256:b988bb297ce76c671e28c97d017b95411010f7c77fa6623dd0bb47eed1aee1bc"}, +] + +[[package]] +name = "dask" +version = "2025.2.0" +description = "Parallel PyData with Task Scheduling" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "dask-2025.2.0-py3-none-any.whl", hash = "sha256:f0fdeef6ceb0a06569d456c9e704f220f7f54e80f3a6ea42ab98cea6bc642b6e"}, + {file = "dask-2025.2.0.tar.gz", hash = "sha256:89c87125d04d28141eaccc4794164ce9098163fd22d8ad943db48f8d4c815460"}, +] + +[package.dependencies] +click = ">=8.1" +cloudpickle = ">=3.0.0" +fsspec = ">=2021.09.0" +importlib_metadata = {version = ">=4.13.0", markers = "python_version < \"3.12\""} +numpy = {version = ">=1.24", optional = true, markers = "extra == \"array\""} +packaging = ">=20.0" +partd = ">=1.4.0" +pyyaml = ">=5.3.1" +toolz = ">=0.10.0" + +[package.extras] +array = ["numpy (>=1.24)"] +complete = ["dask[array,dataframe,diagnostics,distributed]", "lz4 (>=4.3.2)", "pyarrow (>=14.0.1)"] +dataframe = ["dask[array]", "pandas (>=2.0)", "pyarrow (>=14.0.1)"] +diagnostics = ["bokeh (>=3.1.0)", "jinja2 (>=2.10.3)"] +distributed = ["distributed (==2025.2.0)"] +test = ["pandas[test]", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytest-rerunfailures", "pytest-timeout", "pytest-xdist"] + +[[package]] +name = "docutils" +version = "0.21.2" +description = "Docutils -- Python Documentation Utilities" +optional = true +python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"docs\"" +files = [ + {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, + {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, +] + +[[package]] +name = "emcee" +version = "3.1.6" +description = "The Python ensemble sampling toolkit for MCMC" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "emcee-3.1.6-py2.py3-none-any.whl", hash = "sha256:f2d63752023bdccf744461450e512a5b417ae7d28f18e12acd76a33de87580cb"}, + {file = "emcee-3.1.6.tar.gz", hash = "sha256:11af4daf6ab8f9ca69681e3c29054665db7bbd87fd4eb8e437d2c3a1248c637d"}, +] + +[package.dependencies] +numpy = "*" + +[package.extras] +extras = ["h5py", "scipy"] +tests = ["coverage[toml]", "pytest", "pytest-cov"] + +[[package]] +name = "events" +version = "0.5" +description = "Bringing the elegance of C# EventHandler to Python" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "Events-0.5-py3-none-any.whl", hash = "sha256:a7286af378ba3e46640ac9825156c93bdba7502174dd696090fdfcd4d80a1abd"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.2.2" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +groups = ["main"] +markers = "python_version < \"3.11\"" +files = [ + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "fasteners" +version = "0.19" +description = "A python package that provides useful locks" +optional = false +python-versions = ">=3.6" +groups = ["main"] +markers = "sys_platform != \"emscripten\"" +files = [ + {file = "fasteners-0.19-py3-none-any.whl", hash = "sha256:758819cb5d94cdedf4e836988b74de396ceacb8e2794d21f82d131fd9ee77237"}, + {file = "fasteners-0.19.tar.gz", hash = "sha256:b4f37c3ac52d8a445af3a66bce57b33b5e90b97c696b7b984f530cf8f0ded09c"}, +] + +[[package]] +name = "filelock" +version = "3.17.0" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "filelock-3.17.0-py3-none-any.whl", hash = "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338"}, + {file = "filelock-3.17.0.tar.gz", hash = "sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e"}, +] + +[package.extras] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.10)", "diff-cover (>=9.2.1)", "pytest (>=8.3.4)", "pytest-asyncio (>=0.25.2)", "pytest-cov (>=6)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.28.1)"] +typing = ["typing-extensions (>=4.12.2) ; python_version < \"3.11\""] + +[[package]] +name = "fsspec" +version = "2025.2.0" +description = "File-system specification" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "fsspec-2025.2.0-py3-none-any.whl", hash = "sha256:9de2ad9ce1f85e1931858535bc882543171d197001a0a5eb2ddc04f1781ab95b"}, + {file = "fsspec-2025.2.0.tar.gz", hash = "sha256:1c24b16eaa0a1798afa0337aa0db9b256718ab2a89c425371f5628d22c3b6afd"}, +] + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +dev = ["pre-commit", "ruff"] +doc = ["numpydoc", "sphinx", "sphinx-design", "sphinx-rtd-theme", "yarl"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] +fuse = ["fusepy"] +gcs = ["gcsfs"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +gui = ["panel"] +hdfs = ["pyarrow (>=1)"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +test = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "numpy", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "requests"] +test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"] +test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard"] +tqdm = ["tqdm"] + +[[package]] +name = "greenlet" +version = "3.1.1" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=3.7" +groups = ["main"] +markers = "python_version < \"3.14\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")" +files = [ + {file = "greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617"}, + {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7"}, + {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6"}, + {file = "greenlet-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80"}, + {file = "greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395"}, + {file = "greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39"}, + {file = "greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942"}, + {file = "greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01"}, + {file = "greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e"}, + {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1"}, + {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c"}, + {file = "greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822"}, + {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01"}, + {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de"}, + {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa"}, + {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af"}, + {file = "greenlet-3.1.1-cp37-cp37m-win32.whl", hash = "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798"}, + {file = "greenlet-3.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef"}, + {file = "greenlet-3.1.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1"}, + {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd"}, + {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7"}, + {file = "greenlet-3.1.1-cp38-cp38-win32.whl", hash = "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef"}, + {file = "greenlet-3.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d"}, + {file = "greenlet-3.1.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c"}, + {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e"}, + {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e"}, + {file = "greenlet-3.1.1-cp39-cp39-win32.whl", hash = "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c"}, + {file = "greenlet-3.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22"}, + {file = "greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467"}, +] + +[package.extras] +docs = ["Sphinx", "furo"] +test = ["objgraph", "psutil"] + +[[package]] +name = "hypothesis" +version = "6.126.0" +description = "A library for property-based testing" +optional = true +python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"test\"" +files = [ + {file = "hypothesis-6.126.0-py3-none-any.whl", hash = "sha256:323c58a773482a2b4ba4e35202560cfcba45e8a8e09e7ffb83c0f9bac5b544da"}, + {file = "hypothesis-6.126.0.tar.gz", hash = "sha256:648b6215ee0468fa85eaee9dceb5b7766a5861c20ee4801bd904a2c02f1a6c9b"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +exceptiongroup = {version = ">=1.0.0", markers = "python_version < \"3.11\""} +sortedcontainers = ">=2.1.0,<3.0.0" + +[package.extras] +all = ["black (>=19.10b0)", "click (>=7.0)", "crosshair-tool (>=0.0.82)", "django (>=4.2)", "dpcontracts (>=0.4)", "hypothesis-crosshair (>=0.0.19)", "lark (>=0.10.1)", "libcst (>=0.3.16)", "numpy (>=1.19.3)", "pandas (>=1.1)", "pytest (>=4.6)", "python-dateutil (>=1.4)", "pytz (>=2014.1)", "redis (>=3.0.0)", "rich (>=9.0.0)", "tzdata (>=2025.1) ; sys_platform == \"win32\" or sys_platform == \"emscripten\"", "watchdog (>=4.0.0)"] +cli = ["black (>=19.10b0)", "click (>=7.0)", "rich (>=9.0.0)"] +codemods = ["libcst (>=0.3.16)"] +crosshair = ["crosshair-tool (>=0.0.82)", "hypothesis-crosshair (>=0.0.19)"] +dateutil = ["python-dateutil (>=1.4)"] +django = ["django (>=4.2)"] +dpcontracts = ["dpcontracts (>=0.4)"] +ghostwriter = ["black (>=19.10b0)"] +lark = ["lark (>=0.10.1)"] +numpy = ["numpy (>=1.19.3)"] +pandas = ["pandas (>=1.1)"] +pytest = ["pytest (>=4.6)"] +pytz = ["pytz (>=2014.1)"] +redis = ["redis (>=3.0.0)"] +watchdog = ["watchdog (>=4.0.0)"] +zoneinfo = ["tzdata (>=2025.1) ; sys_platform == \"win32\" or sys_platform == \"emscripten\""] + +[[package]] +name = "idna" +version = "3.10" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, +] + +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + +[[package]] +name = "imageio" +version = "2.37.0" +description = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "imageio-2.37.0-py3-none-any.whl", hash = "sha256:11efa15b87bc7871b61590326b2d635439acc321cf7f8ce996f812543ce10eed"}, + {file = "imageio-2.37.0.tar.gz", hash = "sha256:71b57b3669666272c818497aebba2b4c5f20d5b37c81720e5e1a56d59c492996"}, +] + +[package.dependencies] +numpy = "*" +pillow = ">=8.3.2" + +[package.extras] +all-plugins = ["astropy", "av", "imageio-ffmpeg", "numpy (>2)", "pillow-heif", "psutil", "rawpy", "tifffile"] +all-plugins-pypy = ["av", "imageio-ffmpeg", "pillow-heif", "psutil", "tifffile"] +build = ["wheel"] +dev = ["black", "flake8", "fsspec[github]", "pytest", "pytest-cov"] +docs = ["numpydoc", "pydata-sphinx-theme", "sphinx (<6)"] +ffmpeg = ["imageio-ffmpeg", "psutil"] +fits = ["astropy"] +full = ["astropy", "av", "black", "flake8", "fsspec[github]", "gdal", "imageio-ffmpeg", "itk", "numpy (>2)", "numpydoc", "pillow-heif", "psutil", "pydata-sphinx-theme", "pytest", "pytest-cov", "rawpy", "sphinx (<6)", "tifffile", "wheel"] +gdal = ["gdal"] +itk = ["itk"] +linting = ["black", "flake8"] +pillow-heif = ["pillow-heif"] +pyav = ["av"] +rawpy = ["numpy (>2)", "rawpy"] +test = ["fsspec[github]", "pytest", "pytest-cov"] +tifffile = ["tifffile"] + +[[package]] +name = "imagesize" +version = "1.4.1" +description = "Getting image size from png/jpeg/jpeg2000/gif file" +optional = true +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["main"] +markers = "extra == \"docs\"" +files = [ + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, +] + +[[package]] +name = "importlib-metadata" +version = "8.6.1" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.9" +groups = ["main"] +markers = "python_version < \"3.12\"" +files = [ + {file = "importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e"}, + {file = "importlib_metadata-8.6.1.tar.gz", hash = "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580"}, +] + +[package.dependencies] +zipp = ">=3.20" + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +perf = ["ipython"] +test = ["flufl.flake8", "importlib_resources (>=1.3) ; python_version < \"3.9\"", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +type = ["pytest-mypy"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "jinja2" +version = "3.1.5" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, + {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "jmespath" +version = "1.0.1" +description = "JSON Matching Expressions" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, + {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, +] + +[[package]] +name = "kombu" +version = "5.4.2" +description = "Messaging library for Python." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "kombu-5.4.2-py3-none-any.whl", hash = "sha256:14212f5ccf022fc0a70453bb025a1dcc32782a588c49ea866884047d66e14763"}, + {file = "kombu-5.4.2.tar.gz", hash = "sha256:eef572dd2fd9fc614b37580e3caeafdd5af46c1eff31e7fba89138cdb406f2cf"}, +] + +[package.dependencies] +amqp = ">=5.1.1,<6.0.0" +tzdata = {version = "*", markers = "python_version >= \"3.9\""} +vine = "5.1.0" + +[package.extras] +azureservicebus = ["azure-servicebus (>=7.10.0)"] +azurestoragequeues = ["azure-identity (>=1.12.0)", "azure-storage-queue (>=12.6.0)"] +confluentkafka = ["confluent-kafka (>=2.2.0)"] +consul = ["python-consul2 (==0.1.5)"] +librabbitmq = ["librabbitmq (>=2.0.0) ; python_version < \"3.11\""] +mongodb = ["pymongo (>=4.1.1)"] +msgpack = ["msgpack (==1.1.0)"] +pyro = ["pyro4 (==4.82)"] +qpid = ["qpid-python (>=0.26)", "qpid-tools (>=0.26)"] +redis = ["redis (>=4.5.2,!=4.5.5,!=5.0.2)"] +slmq = ["softlayer-messaging (>=1.0.3)"] +sqlalchemy = ["sqlalchemy (>=1.4.48,<2.1)"] +sqs = ["boto3 (>=1.26.143)", "pycurl (>=7.43.0.5) ; sys_platform != \"win32\" and platform_python_implementation == \"CPython\"", "urllib3 (>=1.26.16)"] +yaml = ["PyYAML (>=3.10)"] +zookeeper = ["kazoo (>=2.8.0)"] + +[[package]] +name = "lazy-loader" +version = "0.4" +description = "Makes it easy to load subpackages and functions on demand." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "lazy_loader-0.4-py3-none-any.whl", hash = "sha256:342aa8e14d543a154047afb4ba8ef17f5563baad3fc610d7b15b213b0f119efc"}, + {file = "lazy_loader-0.4.tar.gz", hash = "sha256:47c75182589b91a4e1a85a136c074285a5ad4d9f39c63e0d7fb76391c4574cd1"}, +] + +[package.dependencies] +packaging = "*" + +[package.extras] +dev = ["changelist (==0.5)"] +lint = ["pre-commit (==3.7.0)"] +test = ["pytest (>=7.4)", "pytest-cov (>=4.1)"] + +[[package]] +name = "lcogt-logging" +version = "0.3.2" +description = "Library for formatting python log calls according to\nLCOGT standards" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "lcogt-logging-0.3.2.tar.gz", hash = "sha256:b58f9b1ce3b16193d122a17cbafa7557601847481f3d3d69fb13361a3019e52a"}, +] + +[[package]] +name = "locket" +version = "1.0.0" +description = "File-based locks for Python on Linux and Windows" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["main"] +files = [ + {file = "locket-1.0.0-py2.py3-none-any.whl", hash = "sha256:b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3"}, + {file = "locket-1.0.0.tar.gz", hash = "sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632"}, +] + +[[package]] +name = "logutils" +version = "0.3.5" +description = "Logging utilities" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "logutils-0.3.5.tar.gz", hash = "sha256:bc058a25d5c209461f134e1f03cab637d66a7a5ccc12e593db56fbb279899a82"}, +] + +[[package]] +name = "mako" +version = "1.3.9" +description = "A super-fast templating language that borrows the best ideas from the existing templating languages." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "Mako-1.3.9-py3-none-any.whl", hash = "sha256:95920acccb578427a9aa38e37a186b1e43156c87260d7ba18ca63aa4c7cbd3a1"}, + {file = "mako-1.3.9.tar.gz", hash = "sha256:b5d65ff3462870feec922dbccf38f6efb44e5714d7b593a656be86663d8600ac"}, +] + +[package.dependencies] +MarkupSafe = ">=0.9.2" + +[package.extras] +babel = ["Babel"] +lingua = ["lingua"] +testing = ["pytest"] + +[[package]] +name = "markupsafe" +version = "3.0.2" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, +] + +[[package]] +name = "mock" +version = "5.1.0" +description = "Rolling backport of unittest.mock for all Pythons" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "mock-5.1.0-py3-none-any.whl", hash = "sha256:18c694e5ae8a208cdb3d2c20a993ca1a7b0efa258c247a1e565150f477f83744"}, + {file = "mock-5.1.0.tar.gz", hash = "sha256:5e96aad5ccda4718e0a229ed94b2024df75cc2d55575ba5762d31f5767b8767d"}, +] + +[package.extras] +build = ["blurb", "twine", "wheel"] +docs = ["sphinx"] +test = ["pytest", "pytest-cov"] + +[[package]] +name = "mpmath" +version = "1.3.0" +description = "Python library for arbitrary-precision floating-point arithmetic" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, + {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, +] + +[package.extras] +develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] +docs = ["sphinx"] +gmpy = ["gmpy2 (>=2.1.0a4) ; platform_python_implementation != \"PyPy\""] +tests = ["pytest (>=4.6)"] + +[[package]] +name = "networkx" +version = "3.4.2" +description = "Python package for creating and manipulating graphs and networks" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f"}, + {file = "networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1"}, +] + +[package.extras] +default = ["matplotlib (>=3.7)", "numpy (>=1.24)", "pandas (>=2.0)", "scipy (>=1.10,!=1.11.0,!=1.11.1)"] +developer = ["changelist (==0.5)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] +doc = ["intersphinx-registry", "myst-nb (>=1.1)", "numpydoc (>=1.8.0)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.15)", "sphinx (>=7.3)", "sphinx-gallery (>=0.16)", "texext (>=0.6.7)"] +example = ["cairocffi (>=1.7)", "contextily (>=1.6)", "igraph (>=0.11)", "momepy (>=0.7.2)", "osmnx (>=1.9)", "scikit-learn (>=1.5)", "seaborn (>=0.13)"] +extra = ["lxml (>=4.6)", "pydot (>=3.0.1)", "pygraphviz (>=1.14)", "sympy (>=1.10)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] + +[[package]] +name = "numcodecs" +version = "0.13.1" +description = "A Python package providing buffer compression and transformation codecs for use in data storage and communication applications." +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "numcodecs-0.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:96add4f783c5ce57cc7e650b6cac79dd101daf887c479a00a29bc1487ced180b"}, + {file = "numcodecs-0.13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:237b7171609e868a20fd313748494444458ccd696062f67e198f7f8f52000c15"}, + {file = "numcodecs-0.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96e42f73c31b8c24259c5fac6adba0c3ebf95536e37749dc6c62ade2989dca28"}, + {file = "numcodecs-0.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:eda7d7823c9282e65234731fd6bd3986b1f9e035755f7fed248d7d366bb291ab"}, + {file = "numcodecs-0.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2eda97dd2f90add98df6d295f2c6ae846043396e3d51a739ca5db6c03b5eb666"}, + {file = "numcodecs-0.13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2a86f5367af9168e30f99727ff03b27d849c31ad4522060dde0bce2923b3a8bc"}, + {file = "numcodecs-0.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233bc7f26abce24d57e44ea8ebeb5cd17084690b4e7409dd470fdb75528d615f"}, + {file = "numcodecs-0.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:796b3e6740107e4fa624cc636248a1580138b3f1c579160f260f76ff13a4261b"}, + {file = "numcodecs-0.13.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5195bea384a6428f8afcece793860b1ab0ae28143c853f0b2b20d55a8947c917"}, + {file = "numcodecs-0.13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3501a848adaddce98a71a262fee15cd3618312692aa419da77acd18af4a6a3f6"}, + {file = "numcodecs-0.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da2230484e6102e5fa3cc1a5dd37ca1f92dfbd183d91662074d6f7574e3e8f53"}, + {file = "numcodecs-0.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:e5db4824ebd5389ea30e54bc8aeccb82d514d28b6b68da6c536b8fa4596f4bca"}, + {file = "numcodecs-0.13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7a60d75179fd6692e301ddfb3b266d51eb598606dcae7b9fc57f986e8d65cb43"}, + {file = "numcodecs-0.13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f593c7506b0ab248961a3b13cb148cc6e8355662ff124ac591822310bc55ecf"}, + {file = "numcodecs-0.13.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80d3071465f03522e776a31045ddf2cfee7f52df468b977ed3afdd7fe5869701"}, + {file = "numcodecs-0.13.1-cp313-cp313-win_amd64.whl", hash = "sha256:90d3065ae74c9342048ae0046006f99dcb1388b7288da5a19b3bddf9c30c3176"}, + {file = "numcodecs-0.13.1.tar.gz", hash = "sha256:a3cf37881df0898f3a9c0d4477df88133fe85185bffe57ba31bcc2fa207709bc"}, +] + +[package.dependencies] +numpy = ">=1.7" + +[package.extras] +docs = ["mock", "numpydoc", "pydata-sphinx-theme", "sphinx", "sphinx-issues"] +msgpack = ["msgpack"] +pcodec = ["pcodec (>=0.2.0)"] +test = ["coverage", "pytest", "pytest-cov"] +test-extras = ["importlib-metadata"] +zfpy = ["numpy (<2.0.0)", "zfpy (>=1.0.0)"] + +[[package]] +name = "numpy" +version = "1.26.4" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +] + +[[package]] +name = "numpydoc" +version = "1.8.0" +description = "Sphinx extension to support docstrings in Numpy format" +optional = true +python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"docs\"" +files = [ + {file = "numpydoc-1.8.0-py3-none-any.whl", hash = "sha256:72024c7fd5e17375dec3608a27c03303e8ad00c81292667955c6fea7a3ccf541"}, + {file = "numpydoc-1.8.0.tar.gz", hash = "sha256:022390ab7464a44f8737f79f8b31ce1d3cfa4b4af79ccaa1aac5e8368db587fb"}, +] + +[package.dependencies] +sphinx = ">=6" +tabulate = ">=0.8.10" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} + +[package.extras] +developer = ["pre-commit (>=3.3)", "tomli ; python_version < \"3.11\""] +doc = ["intersphinx-registry", "matplotlib (>=3.5)", "numpy (>=1.22)", "pydata-sphinx-theme (>=0.13.3)", "sphinx (>=7)"] +test = ["matplotlib", "pytest", "pytest-cov"] + +[[package]] +name = "nvidia-cublas-cu12" +version = "12.4.5.8" +description = "CUBLAS native runtime libraries" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0f8aa1706812e00b9f19dfe0cdb3999b092ccb8ca168c0db5b8ea712456fd9b3"}, + {file = "nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl", hash = "sha256:2fc8da60df463fdefa81e323eef2e36489e1c94335b5358bcb38360adf75ac9b"}, + {file = "nvidia_cublas_cu12-12.4.5.8-py3-none-win_amd64.whl", hash = "sha256:5a796786da89203a0657eda402bcdcec6180254a8ac22d72213abc42069522dc"}, +] + +[[package]] +name = "nvidia-cuda-cupti-cu12" +version = "12.4.127" +description = "CUDA profiling tools runtime libs." +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:79279b35cf6f91da114182a5ce1864997fd52294a87a16179ce275773799458a"}, + {file = "nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:9dec60f5ac126f7bb551c055072b69d85392b13311fcc1bcda2202d172df30fb"}, + {file = "nvidia_cuda_cupti_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:5688d203301ab051449a2b1cb6690fbe90d2b372f411521c86018b950f3d7922"}, +] + +[[package]] +name = "nvidia-cuda-nvrtc-cu12" +version = "12.4.127" +description = "NVRTC native runtime libraries" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0eedf14185e04b76aa05b1fea04133e59f465b6f960c0cbf4e37c3cb6b0ea198"}, + {file = "nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a178759ebb095827bd30ef56598ec182b85547f1508941a3d560eb7ea1fbf338"}, + {file = "nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:a961b2f1d5f17b14867c619ceb99ef6fcec12e46612711bcec78eb05068a60ec"}, +] + +[[package]] +name = "nvidia-cuda-runtime-cu12" +version = "12.4.127" +description = "CUDA Runtime native Libraries" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:961fe0e2e716a2a1d967aab7caee97512f71767f852f67432d572e36cb3a11f3"}, + {file = "nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:64403288fa2136ee8e467cdc9c9427e0434110899d07c779f25b5c068934faa5"}, + {file = "nvidia_cuda_runtime_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:09c2e35f48359752dfa822c09918211844a3d93c100a715d79b59591130c5e1e"}, +] + +[[package]] +name = "nvidia-cudnn-cu12" +version = "9.1.0.70" +description = "cuDNN runtime libraries" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f"}, + {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-win_amd64.whl", hash = "sha256:6278562929433d68365a07a4a1546c237ba2849852c0d4b2262a486e805b977a"}, +] + +[package.dependencies] +nvidia-cublas-cu12 = "*" + +[[package]] +name = "nvidia-cufft-cu12" +version = "11.2.1.3" +description = "CUFFT native runtime libraries" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5dad8008fc7f92f5ddfa2101430917ce2ffacd86824914c82e28990ad7f00399"}, + {file = "nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f083fc24912aa410be21fa16d157fed2055dab1cc4b6934a0e03cba69eb242b9"}, + {file = "nvidia_cufft_cu12-11.2.1.3-py3-none-win_amd64.whl", hash = "sha256:d802f4954291101186078ccbe22fc285a902136f974d369540fd4a5333d1440b"}, +] + +[package.dependencies] +nvidia-nvjitlink-cu12 = "*" + +[[package]] +name = "nvidia-curand-cu12" +version = "10.3.5.147" +description = "CURAND native runtime libraries" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1f173f09e3e3c76ab084aba0de819c49e56614feae5c12f69883f4ae9bb5fad9"}, + {file = "nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a88f583d4e0bb643c49743469964103aa59f7f708d862c3ddb0fc07f851e3b8b"}, + {file = "nvidia_curand_cu12-10.3.5.147-py3-none-win_amd64.whl", hash = "sha256:f307cc191f96efe9e8f05a87096abc20d08845a841889ef78cb06924437f6771"}, +] + +[[package]] +name = "nvidia-cusolver-cu12" +version = "11.6.1.9" +description = "CUDA solver native runtime libraries" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_aarch64.whl", hash = "sha256:d338f155f174f90724bbde3758b7ac375a70ce8e706d70b018dd3375545fc84e"}, + {file = "nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:19e33fa442bcfd085b3086c4ebf7e8debc07cfe01e11513cc6d332fd918ac260"}, + {file = "nvidia_cusolver_cu12-11.6.1.9-py3-none-win_amd64.whl", hash = "sha256:e77314c9d7b694fcebc84f58989f3aa4fb4cb442f12ca1a9bde50f5e8f6d1b9c"}, +] + +[package.dependencies] +nvidia-cublas-cu12 = "*" +nvidia-cusparse-cu12 = "*" +nvidia-nvjitlink-cu12 = "*" + +[[package]] +name = "nvidia-cusparse-cu12" +version = "12.3.1.170" +description = "CUSPARSE native runtime libraries" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9d32f62896231ebe0480efd8a7f702e143c98cfaa0e8a76df3386c1ba2b54df3"}, + {file = "nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ea4f11a2904e2a8dc4b1833cc1b5181cde564edd0d5cd33e3c168eff2d1863f1"}, + {file = "nvidia_cusparse_cu12-12.3.1.170-py3-none-win_amd64.whl", hash = "sha256:9bc90fb087bc7b4c15641521f31c0371e9a612fc2ba12c338d3ae032e6b6797f"}, +] + +[package.dependencies] +nvidia-nvjitlink-cu12 = "*" + +[[package]] +name = "nvidia-cusparselt-cu12" +version = "0.6.2" +description = "NVIDIA cuSPARSELt" +optional = false +python-versions = "*" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:067a7f6d03ea0d4841c85f0c6f1991c5dda98211f6302cb83a4ab234ee95bef8"}, + {file = "nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:df2c24502fd76ebafe7457dbc4716b2fec071aabaed4fb7691a201cde03704d9"}, + {file = "nvidia_cusparselt_cu12-0.6.2-py3-none-win_amd64.whl", hash = "sha256:0057c91d230703924c0422feabe4ce768841f9b4b44d28586b6f6d2eb86fbe70"}, +] + +[[package]] +name = "nvidia-nccl-cu12" +version = "2.21.5" +description = "NVIDIA Collective Communication Library (NCCL) Runtime" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "nvidia_nccl_cu12-2.21.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:8579076d30a8c24988834445f8d633c697d42397e92ffc3f63fa26766d25e0a0"}, +] + +[[package]] +name = "nvidia-nvjitlink-cu12" +version = "12.4.127" +description = "Nvidia JIT LTO Library" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4abe7fef64914ccfa909bc2ba39739670ecc9e820c83ccc7a6ed414122599b83"}, + {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57"}, + {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:fd9020c501d27d135f983c6d3e244b197a7ccad769e34df53a42e276b0e25fa1"}, +] + +[[package]] +name = "nvidia-nvtx-cu12" +version = "12.4.127" +description = "NVIDIA Tools Extension" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7959ad635db13edf4fc65c06a6e9f9e55fc2f92596db928d169c0bb031e88ef3"}, + {file = "nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:781e950d9b9f60d8241ccea575b32f5105a5baf4c2351cab5256a24869f12a1a"}, + {file = "nvidia_nvtx_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:641dccaaa1139f3ffb0d3164b4b84f9d253397e38246a4f2f36728b48566d485"}, +] + +[[package]] +name = "ocs-archive" +version = "0.4.0" +description = "Base library for the science archive and ingester of an observatory control system" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "ocs_archive-0.4.0-py3-none-any.whl", hash = "sha256:8f27186bcc938e664904f5d71b7ee338b5a2614cd278d9e2ac6a4f3bd1021368"}, + {file = "ocs_archive-0.4.0.tar.gz", hash = "sha256:ba2846b6294edfb0566397749c22153309eb711c40f788bef9ac926521bc3349"}, +] + +[package.dependencies] +astropy = ">=3,<6" +boto3 = ">=1,<2" +python-dateutil = ">=2,<3" +requests = ">=2,<3" + +[[package]] +name = "ocs-ingester" +version = "3.1.0" +description = "Ingest frames into the science archive of an observatory control system" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "ocs_ingester-3.1.0-py3-none-any.whl", hash = "sha256:5c017e1c56414c9beedc3b5cfe17540f6fc2acd67dfd2fcfd102cc05eaa15273"}, + {file = "ocs_ingester-3.1.0.tar.gz", hash = "sha256:d97772525640c7378003b2a82190543316df9c759cc52264ededce057ef3f3c5"}, +] + +[package.dependencies] +astropy = "*" +boto3 = "*" +lcogt-logging = "*" +ocs-archive = "0.4.0" +opentsdb-python-metrics = ">=0.2.0" +python-dateutil = "*" +requests = "*" + +[package.extras] +tests = ["pytest"] + +[[package]] +name = "opensearch-py" +version = "2.8.0" +description = "Python client for OpenSearch" +optional = false +python-versions = "<4,>=3.8" +groups = ["main"] +files = [ + {file = "opensearch_py-2.8.0-py3-none-any.whl", hash = "sha256:52c60fdb5d4dcf6cce3ee746c13b194529b0161e0f41268b98ab8f1624abe2fa"}, + {file = "opensearch_py-2.8.0.tar.gz", hash = "sha256:6598df0bc7a003294edd0ba88a331e0793acbb8c910c43edf398791e3b2eccda"}, +] + +[package.dependencies] +certifi = ">=2024.07.04" +Events = "*" +python-dateutil = "*" +requests = ">=2.32.0,<3.0.0" +urllib3 = {version = ">=1.26.19,<2.2.0 || >2.2.0,<2.2.1 || >2.2.1,<3", markers = "python_version >= \"3.10\""} + +[package.extras] +async = ["aiohttp (>=3.9.4,<4)"] +develop = ["black (>=24.3.0)", "botocore", "coverage (<8.0.0)", "jinja2", "myst_parser", "pytest (>=3.0.0)", "pytest-cov", "pytest-mock (<4.0.0)", "pytz", "pyyaml", "requests (>=2.0.0,<3.0.0)", "sphinx", "sphinx_copybutton", "sphinx_rtd_theme"] +docs = ["aiohttp (>=3.9.4,<4)", "myst_parser", "sphinx", "sphinx_copybutton", "sphinx_rtd_theme"] +kerberos = ["requests_kerberos"] + +[[package]] +name = "opentsdb-http-client" +version = "0.2.0" +description = "Library for asynchronously uploading metrics to opentsdb http API." +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "opentsdb_http_client-0.2.0-py3-none-any.whl", hash = "sha256:bca12f0488476f92d94b63bc5e0b2844b3d32b1fe4f1e430ed56aafc69653513"}, + {file = "opentsdb_http_client-0.2.0.tar.gz", hash = "sha256:fdde31fbd6e507f86931587421d8da998f05f657346622557dcfe8f64eb6b559"}, +] + +[package.dependencies] +requests = "*" + +[[package]] +name = "opentsdb-python-metrics" +version = "0.2.0" +description = "Library for collecting and storing metrics from python methods" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "opentsdb_python_metrics-0.2.0-py3-none-any.whl", hash = "sha256:23ac5ccf9b2cda3f4d6b45c481ec81012a235ad3c5c2464c16467add2543974d"}, + {file = "opentsdb_python_metrics-0.2.0.tar.gz", hash = "sha256:b446fcbf7995080d1c1243e4852e9a056e8628232602f741ce4f914e2a33aed7"}, +] + +[package.dependencies] +opentsdb-http-client = ">=0.2.0" + +[[package]] +name = "packaging" +version = "24.2" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, + {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, +] + +[[package]] +name = "partd" +version = "1.4.2" +description = "Appendable key-value storage" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "partd-1.4.2-py3-none-any.whl", hash = "sha256:978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f"}, + {file = "partd-1.4.2.tar.gz", hash = "sha256:d022c33afbdc8405c226621b015e8067888173d85f7f5ecebb3cafed9a20f02c"}, +] + +[package.dependencies] +locket = "*" +toolz = "*" + +[package.extras] +complete = ["blosc", "numpy (>=1.20.0)", "pandas (>=1.3)", "pyzmq"] + +[[package]] +name = "photutils" +version = "2.0.2" +description = "An Astropy package for source detection and photometry" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "photutils-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f2cb47f72c0661e2f71280899a28daf5bf820e1637618566df86be50b492faf2"}, + {file = "photutils-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0c2ecbf659d2a7e72622486ef006fe95eb77bd23933a342a92f0d0d169680000"}, + {file = "photutils-2.0.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43df0fc02a5a4f74bc9eeefd5e7bc7de375c84b146cc5a43956583751352eedb"}, + {file = "photutils-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:392c7596120f43e85a3e0a0c740b777ddb5697d1289678e8e222f215ac054055"}, + {file = "photutils-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:661166db28a8c0e5dfe997fa8c461457bb00627b5e8512fed6e66007104dbda7"}, + {file = "photutils-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a07c2090356aac1d66dcb5e8d150ba846a7fd3f76e934844f9d54a3ed430c03a"}, + {file = "photutils-2.0.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38537e89419a696af7d71ba872a81ff350e041d595d16c72c30f8ad63125cd54"}, + {file = "photutils-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:8c348f661e0171bb6509b78685247df1f7e686157d43376dd8a8ab601899681a"}, + {file = "photutils-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cb33e115db2809b1c19cb4d6e1cbebdaf9eaf4c67c25c01a83c550de6ceb425e"}, + {file = "photutils-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:401120aacdbe58a88fb380127d0da92b69dcddc8ad29a1081a44ec0f2793de50"}, + {file = "photutils-2.0.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03007bd09156b3e478cbe2b5637e596e693afdd0f6eba403259b3734ee81d853"}, + {file = "photutils-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:75c07b2a7b48dda1542c0052a9b8ab19085e716db405ebc15087eb8f8acd0659"}, + {file = "photutils-2.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9c7c3fe140697d13d3680cbad98f6ba77fdda381d0009f544feebc616c72f00b"}, + {file = "photutils-2.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0c8c506aee771bce673d3fec7629855e2d4207c0ad609c27ae605c2344aa389"}, + {file = "photutils-2.0.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc77e117879283b34ac5f35a411c1e52ed1be0aa7efc0e0d779861a7813bdea8"}, + {file = "photutils-2.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:7bd8ce4fae76fd00dab66f3bc50d88cbbe8e3acdfd2b44414361e0fc9f369dbb"}, + {file = "photutils-2.0.2.tar.gz", hash = "sha256:f07b7d0eadf4b6a761074204915e8ba32f32565d853dd2503c792c4ed481ea52"}, +] + +[package.dependencies] +astropy = ">=5.3" +numpy = ">=1.24" +scipy = ">=1.10" + +[package.extras] +all = ["bottleneck", "gwcs (>=0.19)", "matplotlib (>=3.7)", "rasterio", "regions (>=0.9)", "scikit-image (>=0.20)", "shapely", "tqdm"] +docs = ["photutils[all]", "sphinx", "sphinx-astropy[confv2] (>=1.9.1)", "sphinx-design", "tomli ; python_version < \"3.11\""] +test = ["pytest-astropy (>=0.11)", "pytest-xdist (>=2.5.0)"] + +[[package]] +name = "pillow" +version = "11.1.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pillow-11.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:e1abe69aca89514737465752b4bcaf8016de61b3be1397a8fc260ba33321b3a8"}, + {file = "pillow-11.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c640e5a06869c75994624551f45e5506e4256562ead981cce820d5ab39ae2192"}, + {file = "pillow-11.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a07dba04c5e22824816b2615ad7a7484432d7f540e6fa86af60d2de57b0fcee2"}, + {file = "pillow-11.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e267b0ed063341f3e60acd25c05200df4193e15a4a5807075cd71225a2386e26"}, + {file = "pillow-11.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bd165131fd51697e22421d0e467997ad31621b74bfc0b75956608cb2906dda07"}, + {file = "pillow-11.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:abc56501c3fd148d60659aae0af6ddc149660469082859fa7b066a298bde9482"}, + {file = "pillow-11.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:54ce1c9a16a9561b6d6d8cb30089ab1e5eb66918cb47d457bd996ef34182922e"}, + {file = "pillow-11.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:73ddde795ee9b06257dac5ad42fcb07f3b9b813f8c1f7f870f402f4dc54b5269"}, + {file = "pillow-11.1.0-cp310-cp310-win32.whl", hash = "sha256:3a5fe20a7b66e8135d7fd617b13272626a28278d0e578c98720d9ba4b2439d49"}, + {file = "pillow-11.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:b6123aa4a59d75f06e9dd3dac5bf8bc9aa383121bb3dd9a7a612e05eabc9961a"}, + {file = "pillow-11.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:a76da0a31da6fcae4210aa94fd779c65c75786bc9af06289cd1c184451ef7a65"}, + {file = "pillow-11.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e06695e0326d05b06833b40b7ef477e475d0b1ba3a6d27da1bb48c23209bf457"}, + {file = "pillow-11.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96f82000e12f23e4f29346e42702b6ed9a2f2fea34a740dd5ffffcc8c539eb35"}, + {file = "pillow-11.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3cd561ded2cf2bbae44d4605837221b987c216cff94f49dfeed63488bb228d2"}, + {file = "pillow-11.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f189805c8be5ca5add39e6f899e6ce2ed824e65fb45f3c28cb2841911da19070"}, + {file = "pillow-11.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:dd0052e9db3474df30433f83a71b9b23bd9e4ef1de13d92df21a52c0303b8ab6"}, + {file = "pillow-11.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:837060a8599b8f5d402e97197d4924f05a2e0d68756998345c829c33186217b1"}, + {file = "pillow-11.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:aa8dd43daa836b9a8128dbe7d923423e5ad86f50a7a14dc688194b7be5c0dea2"}, + {file = "pillow-11.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0a2f91f8a8b367e7a57c6e91cd25af510168091fb89ec5146003e424e1558a96"}, + {file = "pillow-11.1.0-cp311-cp311-win32.whl", hash = "sha256:c12fc111ef090845de2bb15009372175d76ac99969bdf31e2ce9b42e4b8cd88f"}, + {file = "pillow-11.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbd43429d0d7ed6533b25fc993861b8fd512c42d04514a0dd6337fb3ccf22761"}, + {file = "pillow-11.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:f7955ecf5609dee9442cbface754f2c6e541d9e6eda87fad7f7a989b0bdb9d71"}, + {file = "pillow-11.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2062ffb1d36544d42fcaa277b069c88b01bb7298f4efa06731a7fd6cc290b81a"}, + {file = "pillow-11.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a85b653980faad27e88b141348707ceeef8a1186f75ecc600c395dcac19f385b"}, + {file = "pillow-11.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9409c080586d1f683df3f184f20e36fb647f2e0bc3988094d4fd8c9f4eb1b3b3"}, + {file = "pillow-11.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fdadc077553621911f27ce206ffcbec7d3f8d7b50e0da39f10997e8e2bb7f6a"}, + {file = "pillow-11.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:93a18841d09bcdd774dcdc308e4537e1f867b3dec059c131fde0327899734aa1"}, + {file = "pillow-11.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9aa9aeddeed452b2f616ff5507459e7bab436916ccb10961c4a382cd3e03f47f"}, + {file = "pillow-11.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3cdcdb0b896e981678eee140d882b70092dac83ac1cdf6b3a60e2216a73f2b91"}, + {file = "pillow-11.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:36ba10b9cb413e7c7dfa3e189aba252deee0602c86c309799da5a74009ac7a1c"}, + {file = "pillow-11.1.0-cp312-cp312-win32.whl", hash = "sha256:cfd5cd998c2e36a862d0e27b2df63237e67273f2fc78f47445b14e73a810e7e6"}, + {file = "pillow-11.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:a697cd8ba0383bba3d2d3ada02b34ed268cb548b369943cd349007730c92bddf"}, + {file = "pillow-11.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:4dd43a78897793f60766563969442020e90eb7847463eca901e41ba186a7d4a5"}, + {file = "pillow-11.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae98e14432d458fc3de11a77ccb3ae65ddce70f730e7c76140653048c71bfcbc"}, + {file = "pillow-11.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cc1331b6d5a6e144aeb5e626f4375f5b7ae9934ba620c0ac6b3e43d5e683a0f0"}, + {file = "pillow-11.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:758e9d4ef15d3560214cddbc97b8ef3ef86ce04d62ddac17ad39ba87e89bd3b1"}, + {file = "pillow-11.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b523466b1a31d0dcef7c5be1f20b942919b62fd6e9a9be199d035509cbefc0ec"}, + {file = "pillow-11.1.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:9044b5e4f7083f209c4e35aa5dd54b1dd5b112b108648f5c902ad586d4f945c5"}, + {file = "pillow-11.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:3764d53e09cdedd91bee65c2527815d315c6b90d7b8b79759cc48d7bf5d4f114"}, + {file = "pillow-11.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31eba6bbdd27dde97b0174ddf0297d7a9c3a507a8a1480e1e60ef914fe23d352"}, + {file = "pillow-11.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b5d658fbd9f0d6eea113aea286b21d3cd4d3fd978157cbf2447a6035916506d3"}, + {file = "pillow-11.1.0-cp313-cp313-win32.whl", hash = "sha256:f86d3a7a9af5d826744fabf4afd15b9dfef44fe69a98541f666f66fbb8d3fef9"}, + {file = "pillow-11.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:593c5fd6be85da83656b93ffcccc2312d2d149d251e98588b14fbc288fd8909c"}, + {file = "pillow-11.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:11633d58b6ee5733bde153a8dafd25e505ea3d32e261accd388827ee987baf65"}, + {file = "pillow-11.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:70ca5ef3b3b1c4a0812b5c63c57c23b63e53bc38e758b37a951e5bc466449861"}, + {file = "pillow-11.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8000376f139d4d38d6851eb149b321a52bb8893a88dae8ee7d95840431977081"}, + {file = "pillow-11.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ee85f0696a17dd28fbcfceb59f9510aa71934b483d1f5601d1030c3c8304f3c"}, + {file = "pillow-11.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:dd0e081319328928531df7a0e63621caf67652c8464303fd102141b785ef9547"}, + {file = "pillow-11.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e63e4e5081de46517099dc30abe418122f54531a6ae2ebc8680bcd7096860eab"}, + {file = "pillow-11.1.0-cp313-cp313t-win32.whl", hash = "sha256:dda60aa465b861324e65a78c9f5cf0f4bc713e4309f83bc387be158b077963d9"}, + {file = "pillow-11.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ad5db5781c774ab9a9b2c4302bbf0c1014960a0a7be63278d13ae6fdf88126fe"}, + {file = "pillow-11.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756"}, + {file = "pillow-11.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:bf902d7413c82a1bfa08b06a070876132a5ae6b2388e2712aab3a7cbc02205c6"}, + {file = "pillow-11.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c1eec9d950b6fe688edee07138993e54ee4ae634c51443cfb7c1e7613322718e"}, + {file = "pillow-11.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e275ee4cb11c262bd108ab2081f750db2a1c0b8c12c1897f27b160c8bd57bbc"}, + {file = "pillow-11.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4db853948ce4e718f2fc775b75c37ba2efb6aaea41a1a5fc57f0af59eee774b2"}, + {file = "pillow-11.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:ab8a209b8485d3db694fa97a896d96dd6533d63c22829043fd9de627060beade"}, + {file = "pillow-11.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:54251ef02a2309b5eec99d151ebf5c9904b77976c8abdcbce7891ed22df53884"}, + {file = "pillow-11.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5bb94705aea800051a743aa4874bb1397d4695fb0583ba5e425ee0328757f196"}, + {file = "pillow-11.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89dbdb3e6e9594d512780a5a1c42801879628b38e3efc7038094430844e271d8"}, + {file = "pillow-11.1.0-cp39-cp39-win32.whl", hash = "sha256:e5449ca63da169a2e6068dd0e2fcc8d91f9558aba89ff6d02121ca8ab11e79e5"}, + {file = "pillow-11.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:3362c6ca227e65c54bf71a5f88b3d4565ff1bcbc63ae72c34b07bbb1cc59a43f"}, + {file = "pillow-11.1.0-cp39-cp39-win_arm64.whl", hash = "sha256:b20be51b37a75cc54c2c55def3fa2c65bb94ba859dde241cd0a4fd302de5ae0a"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8c730dc3a83e5ac137fbc92dfcfe1511ce3b2b5d7578315b63dbbb76f7f51d90"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:7d33d2fae0e8b170b6a6c57400e077412240f6f5bb2a342cf1ee512a787942bb"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8d65b38173085f24bc07f8b6c505cbb7418009fa1a1fcb111b1f4961814a442"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:015c6e863faa4779251436db398ae75051469f7c903b043a48f078e437656f83"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d44ff19eea13ae4acdaaab0179fa68c0c6f2f45d66a4d8ec1eda7d6cecbcc15f"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d3d8da4a631471dfaf94c10c85f5277b1f8e42ac42bade1ac67da4b4a7359b73"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:4637b88343166249fe8aa94e7c4a62a180c4b3898283bb5d3d2fd5fe10d8e4e0"}, + {file = "pillow-11.1.0.tar.gz", hash = "sha256:368da70808b36d73b4b390a8ffac11069f8a5c85f29eff1f1b01bcf3ef5b2a20"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=8.1)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout", "trove-classifiers (>=2024.10.12)"] +typing = ["typing-extensions ; python_version < \"3.10\""] +xmp = ["defusedxml"] + +[[package]] +name = "pluggy" +version = "1.5.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +groups = ["main"] +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 = "pretty-errors" +version = "1.2.25" +description = "Prettifies Python exception output to make it legible." +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "pretty_errors-1.2.25-py3-none-any.whl", hash = "sha256:8ce68ccd99e0f2a099265c8c1f1c23b7c60a15d69bb08816cb336e237d5dc983"}, + {file = "pretty_errors-1.2.25.tar.gz", hash = "sha256:a16ba5c752c87c263bf92f8b4b58624e3b1e29271a9391f564f12b86e93c6755"}, +] + +[package.dependencies] +colorama = "*" + +[[package]] +name = "prompt-toolkit" +version = "3.0.50" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.8.0" +groups = ["main"] +files = [ + {file = "prompt_toolkit-3.0.50-py3-none-any.whl", hash = "sha256:9b6427eb19e479d98acff65196a307c555eb567989e6d88ebbb1b509d9779198"}, + {file = "prompt_toolkit-3.0.50.tar.gz", hash = "sha256:544748f3860a2623ca5cd6d2795e7a14f3d0e1c3c9728359013f79877fc89bab"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "psutil" +version = "7.0.0" +description = "Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7." +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25"}, + {file = "psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da"}, + {file = "psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91"}, + {file = "psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34"}, + {file = "psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993"}, + {file = "psutil-7.0.0-cp36-cp36m-win32.whl", hash = "sha256:84df4eb63e16849689f76b1ffcb36db7b8de703d1bc1fe41773db487621b6c17"}, + {file = "psutil-7.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1e744154a6580bc968a0195fd25e80432d3afec619daf145b9e5ba16cc1d688e"}, + {file = "psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99"}, + {file = "psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553"}, + {file = "psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456"}, +] + +[package.extras] +dev = ["abi3audit", "black (==24.10.0)", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest", "pytest-cov", "pytest-xdist", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "vulture", "wheel"] +test = ["pytest", "pytest-xdist", "setuptools"] + +[[package]] +name = "psycopg2-binary" +version = "2.9.10" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "psycopg2-binary-2.9.10.tar.gz", hash = "sha256:4b3df0e6990aa98acda57d983942eff13d824135fe2250e6522edaa782a06de2"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:0ea8e3d0ae83564f2fc554955d327fa081d065c8ca5cc6d2abb643e2c9c1200f"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:3e9c76f0ac6f92ecfc79516a8034a544926430f7b080ec5a0537bca389ee0906"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ad26b467a405c798aaa1458ba09d7e2b6e5f96b1ce0ac15d82fd9f95dc38a92"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:270934a475a0e4b6925b5f804e3809dd5f90f8613621d062848dd82f9cd62007"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:48b338f08d93e7be4ab2b5f1dbe69dc5e9ef07170fe1f86514422076d9c010d0"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4152f8f76d2023aac16285576a9ecd2b11a9895373a1f10fd9db54b3ff06b4"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:32581b3020c72d7a421009ee1c6bf4a131ef5f0a968fab2e2de0c9d2bb4577f1"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:2ce3e21dc3437b1d960521eca599d57408a695a0d3c26797ea0f72e834c7ffe5"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e984839e75e0b60cfe75e351db53d6db750b00de45644c5d1f7ee5d1f34a1ce5"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c4745a90b78e51d9ba06e2088a2fe0c693ae19cc8cb051ccda44e8df8a6eb53"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-win32.whl", hash = "sha256:e5720a5d25e3b99cd0dc5c8a440570469ff82659bb09431c1439b92caf184d3b"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-win_amd64.whl", hash = "sha256:3c18f74eb4386bf35e92ab2354a12c17e5eb4d9798e4c0ad3a00783eae7cd9f1"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:04392983d0bb89a8717772a193cfaac58871321e3ec69514e1c4e0d4957b5aff"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:1a6784f0ce3fec4edc64e985865c17778514325074adf5ad8f80636cd029ef7c"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5f86c56eeb91dc3135b3fd8a95dc7ae14c538a2f3ad77a19645cf55bab1799c"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b3d2491d4d78b6b14f76881905c7a8a8abcf974aad4a8a0b065273a0ed7a2cb"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2286791ececda3a723d1910441c793be44625d86d1a4e79942751197f4d30341"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:512d29bb12608891e349af6a0cccedce51677725a921c07dba6342beaf576f9a"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5a507320c58903967ef7384355a4da7ff3f28132d679aeb23572753cbf2ec10b"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6d4fa1079cab9018f4d0bd2db307beaa612b0d13ba73b5c6304b9fe2fb441ff7"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:851485a42dbb0bdc1edcdabdb8557c09c9655dfa2ca0460ff210522e073e319e"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:35958ec9e46432d9076286dda67942ed6d968b9c3a6a2fd62b48939d1d78bf68"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-win32.whl", hash = "sha256:ecced182e935529727401b24d76634a357c71c9275b356efafd8a2a91ec07392"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-win_amd64.whl", hash = "sha256:ee0e8c683a7ff25d23b55b11161c2663d4b099770f6085ff0a20d4505778d6b4"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:880845dfe1f85d9d5f7c412efea7a08946a46894537e4e5d091732eb1d34d9a0"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9440fa522a79356aaa482aa4ba500b65f28e5d0e63b801abf6aa152a29bd842a"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3923c1d9870c49a2d44f795df0c889a22380d36ef92440ff618ec315757e539"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b2c956c028ea5de47ff3a8d6b3cc3330ab45cf0b7c3da35a2d6ff8420896526"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f758ed67cab30b9a8d2833609513ce4d3bd027641673d4ebc9c067e4d208eec1"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cd9b4f2cfab88ed4a9106192de509464b75a906462fb846b936eabe45c2063e"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dc08420625b5a20b53551c50deae6e231e6371194fa0651dbe0fb206452ae1f"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d7cd730dfa7c36dbe8724426bf5612798734bff2d3c3857f36f2733f5bfc7c00"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:155e69561d54d02b3c3209545fb08938e27889ff5a10c19de8d23eb5a41be8a5"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3cc28a6fd5a4a26224007712e79b81dbaee2ffb90ff406256158ec4d7b52b47"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-win32.whl", hash = "sha256:ec8a77f521a17506a24a5f626cb2aee7850f9b69a0afe704586f63a464f3cd64"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-win_amd64.whl", hash = "sha256:18c5ee682b9c6dd3696dad6e54cc7ff3a1a9020df6a5c0f861ef8bfd338c3ca0"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:26540d4a9a4e2b096f1ff9cce51253d0504dca5a85872c7f7be23be5a53eb18d"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e217ce4d37667df0bc1c397fdcd8de5e81018ef305aed9415c3b093faaeb10fb"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:245159e7ab20a71d989da00f280ca57da7641fa2cdcf71749c193cea540a74f7"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c4ded1a24b20021ebe677b7b08ad10bf09aac197d6943bfe6fec70ac4e4690d"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3abb691ff9e57d4a93355f60d4f4c1dd2d68326c968e7db17ea96df3c023ef73"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8608c078134f0b3cbd9f89b34bd60a943b23fd33cc5f065e8d5f840061bd0673"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:230eeae2d71594103cd5b93fd29d1ace6420d0b86f4778739cb1a5a32f607d1f"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bb89f0a835bcfc1d42ccd5f41f04870c1b936d8507c6df12b7737febc40f0909"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f0c2d907a1e102526dd2986df638343388b94c33860ff3bbe1384130828714b1"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8157bed2f51db683f31306aa497311b560f2265998122abe1dce6428bd86567"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-win_amd64.whl", hash = "sha256:27422aa5f11fbcd9b18da48373eb67081243662f9b46e6fd07c3eb46e4535142"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:eb09aa7f9cecb45027683bb55aebaaf45a0df8bf6de68801a6afdc7947bb09d4"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b73d6d7f0ccdad7bc43e6d34273f70d587ef62f824d7261c4ae9b8b1b6af90e8"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce5ab4bf46a211a8e924d307c1b1fcda82368586a19d0a24f8ae166f5c784864"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:056470c3dc57904bbf63d6f534988bafc4e970ffd50f6271fc4ee7daad9498a5"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aa0e31fa4bb82578f3a6c74a73c273367727de397a7a0f07bd83cbea696baa"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8de718c0e1c4b982a54b41779667242bc630b2197948405b7bd8ce16bcecac92"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5c370b1e4975df846b0277b4deba86419ca77dbc25047f535b0bb03d1a544d44"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:ffe8ed017e4ed70f68b7b371d84b7d4a790368db9203dfc2d222febd3a9c8863"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:8aecc5e80c63f7459a1a2ab2c64df952051df196294d9f739933a9f6687e86b3"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:7a813c8bdbaaaab1f078014b9b0b13f5de757e2b5d9be6403639b298a04d218b"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d00924255d7fc916ef66e4bf22f354a940c67179ad3fd7067d7a0a9c84d2fbfc"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7559bce4b505762d737172556a4e6ea8a9998ecac1e39b5233465093e8cee697"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e8b58f0a96e7a1e341fc894f62c1177a7c83febebb5ff9123b579418fdc8a481"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b269105e59ac96aba877c1707c600ae55711d9dcd3fc4b5012e4af68e30c648"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:79625966e176dc97ddabc142351e0409e28acf4660b88d1cf6adb876d20c490d"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:8aabf1c1a04584c168984ac678a668094d831f152859d06e055288fa515e4d30"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:19721ac03892001ee8fdd11507e6a2e01f4e37014def96379411ca99d78aeb2c"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7f5d859928e635fa3ce3477704acee0f667b3a3d3e4bb109f2b18d4005f38287"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-win32.whl", hash = "sha256:3216ccf953b3f267691c90c6fe742e45d890d8272326b4a8b20850a03d05b7b8"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-win_amd64.whl", hash = "sha256:30e34c4e97964805f715206c7b789d54a78b70f3ff19fbe590104b71c45600e5"}, +] + +[[package]] +name = "pyerfa" +version = "2.0.1.5" +description = "Python bindings for ERFA" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pyerfa-2.0.1.5-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b282d7c60c4c47cf629c484c17ac504fcb04abd7b3f4dfcf53ee042afc3a5944"}, + {file = "pyerfa-2.0.1.5-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:be1aeb70390dd03a34faf96749d5cabc58437410b4aab7213c512323932427df"}, + {file = "pyerfa-2.0.1.5-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0603e8e1b839327d586c8a627cdc634b795e18b007d84f0cda5500a0908254e"}, + {file = "pyerfa-2.0.1.5-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e43c7194e3242083f2350b46c09fd4bf8ba1bcc0ebd1460b98fc47fe2389906"}, + {file = "pyerfa-2.0.1.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:07b80cd70701f5d066b1ac8cce406682cfcd667a1186ec7d7ade597239a6021d"}, + {file = "pyerfa-2.0.1.5-cp39-abi3-win32.whl", hash = "sha256:d30b9b0df588ed5467e529d851ea324a67239096dd44703125072fd11b351ea2"}, + {file = "pyerfa-2.0.1.5-cp39-abi3-win_amd64.whl", hash = "sha256:66292d437dcf75925b694977aa06eb697126e7b86553e620371ed3e48b5e0ad0"}, + {file = "pyerfa-2.0.1.5-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4991dee680ff36c87911d8faa4c7d1aa6278ad9b5e0d16158cf22fa7d74ba25c"}, + {file = "pyerfa-2.0.1.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:690e258294202c86f479e78e80fd235cd27bd717f7f60062fccc3dbd6ef0b1a9"}, + {file = "pyerfa-2.0.1.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:171ce9676a448a7eb555f03aa19ad5c749dbced1ce4f9923e4d93443c4a9c612"}, + {file = "pyerfa-2.0.1.5.tar.gz", hash = "sha256:17d6b24fe4846c65d5e7d8c362dcb08199dc63b30a236aedd73875cc83e1f6c0"}, +] + +[package.dependencies] +numpy = ">=1.19.3" + +[package.extras] +docs = ["sphinx-astropy (>=1.3)"] +test = ["pytest", "pytest-doctestplus (>=0.7)"] + +[[package]] +name = "pygments" +version = "2.19.1" +description = "Pygments is a syntax highlighting package written in Python." +optional = true +python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"docs\"" +files = [ + {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, + {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "pytest" +version = "8.3.4" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, + {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=1.5,<2" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} + +[package.extras] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-arraydiff" +version = "0.6.1" +description = "pytest plugin to help with comparing array output from tests" +optional = true +python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"test\"" +files = [ + {file = "pytest-arraydiff-0.6.1.tar.gz", hash = "sha256:2937b1450fc935620f24709d87d40c67e055a043d7b8541a25fdfa994dda67de"}, + {file = "pytest_arraydiff-0.6.1-py3-none-any.whl", hash = "sha256:64be1cc8e79874203eca80b1959134b8bb7a47b41cf7631310ba7fe6e5840694"}, +] + +[package.dependencies] +numpy = "*" +pytest = ">=4.6" + +[package.extras] +test = ["astropy", "pandas", "tables"] + +[[package]] +name = "pytest-astropy" +version = "0.11.0" +description = "Meta-package containing dependencies for testing" +optional = true +python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"test\"" +files = [ + {file = "pytest-astropy-0.11.0.tar.gz", hash = "sha256:4eaeaa99ed91163ed8f9aac132c70a81f25bc4c12f3cd54dba329fc26c6739b5"}, + {file = "pytest_astropy-0.11.0-py3-none-any.whl", hash = "sha256:5b9404cfa85bd815af86da78bd7d50d451419021bff27b127418886f85ae9ffa"}, +] + +[package.dependencies] +attrs = ">=19.2.0" +hypothesis = ">=5.1" +pytest = ">=4.6" +pytest-arraydiff = ">=0.5" +pytest-astropy-header = ">=0.2.2" +pytest-cov = ">=2.3.1" +pytest-doctestplus = ">=1.0.0" +pytest-filter-subpackage = ">=0.1.2" +pytest-mock = ">=2.0" +pytest-remotedata = ">=0.4.1" + +[[package]] +name = "pytest-astropy-header" +version = "0.2.2" +description = "pytest plugin to add diagnostic information to the header of the test output" +optional = true +python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"test\"" +files = [ + {file = "pytest-astropy-header-0.2.2.tar.gz", hash = "sha256:77891101c94b75a8ca305453b879b318ab6001b370df02be2c0b6d1bb322db10"}, + {file = "pytest_astropy_header-0.2.2-py3-none-any.whl", hash = "sha256:6088db080166d59f27c045247ad038ac8656f7c35d5c979cb87ed9a8f7efdee0"}, +] + +[package.dependencies] +pytest = ">=4.6" + +[package.extras] +test = ["astropy (>=4.0)", "numpy"] + +[[package]] +name = "pytest-cov" +version = "6.0.0" +description = "Pytest plugin for measuring coverage." +optional = true +python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"test\"" +files = [ + {file = "pytest-cov-6.0.0.tar.gz", hash = "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0"}, + {file = "pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35"}, +] + +[package.dependencies] +coverage = {version = ">=7.5", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] + +[[package]] +name = "pytest-doctestplus" +version = "1.4.0" +description = "Pytest plugin with advanced doctest features." +optional = true +python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"test\" or extra == \"docs\"" +files = [ + {file = "pytest_doctestplus-1.4.0-py3-none-any.whl", hash = "sha256:cfbae130ec90d4a2831819bbbfd097121b8e55f1e4d20a47ea992e4eaad2539a"}, + {file = "pytest_doctestplus-1.4.0.tar.gz", hash = "sha256:df83832b1d11288572df2ee4c7cccdb421d812b8038a658bb514c9c62bdbd626"}, +] + +[package.dependencies] +packaging = ">=17.0" +pytest = ">=4.6" + +[package.extras] +test = ["numpy", "pytest-remotedata (>=0.3.2)", "setuptools (>=30.3.0)", "sphinx"] + +[[package]] +name = "pytest-filter-subpackage" +version = "0.2.0" +description = "Pytest plugin for filtering based on sub-packages" +optional = true +python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"test\"" +files = [ + {file = "pytest-filter-subpackage-0.2.0.tar.gz", hash = "sha256:3f468f1b36518128869b95deab661ba45ed6293854329fef14da4c8cac78af56"}, + {file = "pytest_filter_subpackage-0.2.0-py2.py3-none-any.whl", hash = "sha256:b4a8c21b52110c3fefe949229c387c18be081132138ca3acc4953869a459b3f6"}, +] + +[package.dependencies] +packaging = "*" +pytest = ">=4.6" + +[package.extras] +test = ["pytest", "pytest-cov", "pytest-doctestplus"] + +[[package]] +name = "pytest-mock" +version = "3.14.0" +description = "Thin-wrapper around the mock package for easier use with pytest" +optional = true +python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"test\"" +files = [ + {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, + {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, +] + +[package.dependencies] +pytest = ">=6.2.5" + +[package.extras] +dev = ["pre-commit", "pytest-asyncio", "tox"] + +[[package]] +name = "pytest-remotedata" +version = "0.4.1" +description = "Pytest plugin for controlling remote data access." +optional = true +python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"test\"" +files = [ + {file = "pytest-remotedata-0.4.1.tar.gz", hash = "sha256:05c08bf638cdd1ed66eb01738a1647c3c714737c3ec3abe009d2c1f793b4bb59"}, + {file = "pytest_remotedata-0.4.1-py3-none-any.whl", hash = "sha256:4e840bd8733091c2a84e52528ee2c2a98aa2d4a26376ba20448f211bccd30a35"}, +] + +[package.dependencies] +packaging = "*" +pytest = ">=4.6" + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pyyaml" +version = "6.0.2" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, +] + +[[package]] +name = "redis" +version = "5.2.1" +description = "Python client for Redis database and key-value store" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "redis-5.2.1-py3-none-any.whl", hash = "sha256:ee7e1056b9aea0f04c6c2ed59452947f34c4940ee025f5dd83e6a6418b6989e4"}, + {file = "redis-5.2.1.tar.gz", hash = "sha256:16f2e22dff21d5125e8481515e386711a34cbec50f0e44413dd7d9c060a54e0f"}, +] + +[package.dependencies] +async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} + +[package.extras] +hiredis = ["hiredis (>=3.0.0)"] +ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==23.2.1)", "requests (>=2.31.0)"] + +[[package]] +name = "reproject" +version = "0.14.1" +description = "Reproject astronomical images" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "reproject-0.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4fba2360c2461b69728244bdaa3e359f1e2a14c3c843fdf9c010cfc9f31bc1a3"}, + {file = "reproject-0.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d017226f8595c73234d4579b3d82c8da9d304df3796b0dccc4cc9238d06d1dd6"}, + {file = "reproject-0.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d97e95b3edb3f2340beb64d23827cf16fc1c503558bf8cc323d4b4e7c05a860a"}, + {file = "reproject-0.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17d49c3a5d8a7f1ae5ccec54e56b3ba702570d246ea43300b31a301bcfccc663"}, + {file = "reproject-0.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:1d4cc159115203223008e9c50a92b0869adf6e5e69914692e83af84b76e88bde"}, + {file = "reproject-0.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0c2f2a05f387f5fd2537bb6d0fc9ace95752cef2f884a0e4d0e785f748cfbf95"}, + {file = "reproject-0.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd5c94b498eef401aedc1cd30bee01e91e117439258ffc0eb31cc05fcfee7cf1"}, + {file = "reproject-0.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:249a90ac16ab44b213e947a89871c5dda4e415ca89b5076f9e72d35fb4d83d27"}, + {file = "reproject-0.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f22f58513b9fb0ca1dbf4416677c41ac03dd0fcf1a817927f838d9a2ea531100"}, + {file = "reproject-0.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:4b3d3f01ca73170044bf16eb2cbfc18b57771e5995d7265e16b933517325de04"}, + {file = "reproject-0.14.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a24d303cb9403204685173c327b4855b0d97baccf909182f10ec25fa893ce387"}, + {file = "reproject-0.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9908d0a309a17f4c30ec669c7c4556ce682fa27e977d961c127bfdc44e712568"}, + {file = "reproject-0.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c21813c273cbfa34ae066e8d517ff9b4ce9f34a77a9c770b5f1076d91537f597"}, + {file = "reproject-0.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76a3068299ffc31e40b19cdca33ee56717e68e69aaff0c69af8a6adbb6e98bd6"}, + {file = "reproject-0.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:4402281f9f970037fc67f85117b81def502e048af2a870dc57b471129e894610"}, + {file = "reproject-0.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ee8363149ed0c4281c46c038632e2976d8e7beae696eeed39b21852e562d83bf"}, + {file = "reproject-0.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e002382edeceff798aeb18d6deb27f070b2719c88bde9bf5a9673a2dcb90cd6b"}, + {file = "reproject-0.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d8e842a064d209bcfc25398918ac0a45adb069082ee22d450d70f79b59089e1"}, + {file = "reproject-0.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75aec4132d8e19e09c7853e1a6066b6881a7470b386e7542b44c2d87d57a5f66"}, + {file = "reproject-0.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:540951ea3b083ac15d4bffd1f2d0b8bd5041d870ffffc93fbc6f743d7e6bed39"}, + {file = "reproject-0.14.1.tar.gz", hash = "sha256:53c8ea279b8b557f33a1e430af5e053cd747002440e072bae6ad9302d46be579"}, +] + +[package.dependencies] +astropy = ">=5.0" +astropy-healpix = ">=1.0" +cloudpickle = "*" +dask = {version = ">=2021.8", extras = ["array"]} +fsspec = "*" +numpy = ">=1.23" +scipy = ">=1.9" +zarr = "*" + +[package.extras] +all = ["shapely"] +docs = ["matplotlib", "pyvo", "sphinx-astropy"] +test = ["pytest-astropy"] +testall = ["asdf", "gwcs", "pyvo", "shapely (>=2.0.2)", "sunpy[map] (>=6.0.1)"] + +[[package]] +name = "requests" +version = "2.32.3" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "s3transfer" +version = "0.11.2" +description = "An Amazon S3 Transfer Manager" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "s3transfer-0.11.2-py3-none-any.whl", hash = "sha256:be6ecb39fadd986ef1701097771f87e4d2f821f27f6071c872143884d2950fbc"}, + {file = "s3transfer-0.11.2.tar.gz", hash = "sha256:3b39185cb72f5acc77db1a58b6e25b977f28d20496b6e58d6813d75f464d632f"}, +] + +[package.dependencies] +botocore = ">=1.36.0,<2.0a.0" + +[package.extras] +crt = ["botocore[crt] (>=1.36.0,<2.0a.0)"] + +[[package]] +name = "scikit-image" +version = "0.25.2" +description = "Image processing in Python" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "scikit_image-0.25.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d3278f586793176599df6a4cf48cb6beadae35c31e58dc01a98023af3dc31c78"}, + {file = "scikit_image-0.25.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:5c311069899ce757d7dbf1d03e32acb38bb06153236ae77fcd820fd62044c063"}, + {file = "scikit_image-0.25.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be455aa7039a6afa54e84f9e38293733a2622b8c2fb3362b822d459cc5605e99"}, + {file = "scikit_image-0.25.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4c464b90e978d137330be433df4e76d92ad3c5f46a22f159520ce0fdbea8a09"}, + {file = "scikit_image-0.25.2-cp310-cp310-win_amd64.whl", hash = "sha256:60516257c5a2d2f74387c502aa2f15a0ef3498fbeaa749f730ab18f0a40fd054"}, + {file = "scikit_image-0.25.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f4bac9196fb80d37567316581c6060763b0f4893d3aca34a9ede3825bc035b17"}, + {file = "scikit_image-0.25.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:d989d64ff92e0c6c0f2018c7495a5b20e2451839299a018e0e5108b2680f71e0"}, + {file = "scikit_image-0.25.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2cfc96b27afe9a05bc92f8c6235321d3a66499995675b27415e0d0c76625173"}, + {file = "scikit_image-0.25.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24cc986e1f4187a12aa319f777b36008764e856e5013666a4a83f8df083c2641"}, + {file = "scikit_image-0.25.2-cp311-cp311-win_amd64.whl", hash = "sha256:b4f6b61fc2db6340696afe3db6b26e0356911529f5f6aee8c322aa5157490c9b"}, + {file = "scikit_image-0.25.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8db8dd03663112783221bf01ccfc9512d1cc50ac9b5b0fe8f4023967564719fb"}, + {file = "scikit_image-0.25.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:483bd8cc10c3d8a7a37fae36dfa5b21e239bd4ee121d91cad1f81bba10cfb0ed"}, + {file = "scikit_image-0.25.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d1e80107bcf2bf1291acfc0bf0425dceb8890abe9f38d8e94e23497cbf7ee0d"}, + {file = "scikit_image-0.25.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a17e17eb8562660cc0d31bb55643a4da996a81944b82c54805c91b3fe66f4824"}, + {file = "scikit_image-0.25.2-cp312-cp312-win_amd64.whl", hash = "sha256:bdd2b8c1de0849964dbc54037f36b4e9420157e67e45a8709a80d727f52c7da2"}, + {file = "scikit_image-0.25.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7efa888130f6c548ec0439b1a7ed7295bc10105458a421e9bf739b457730b6da"}, + {file = "scikit_image-0.25.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:dd8011efe69c3641920614d550f5505f83658fe33581e49bed86feab43a180fc"}, + {file = "scikit_image-0.25.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28182a9d3e2ce3c2e251383bdda68f8d88d9fff1a3ebe1eb61206595c9773341"}, + {file = "scikit_image-0.25.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8abd3c805ce6944b941cfed0406d88faeb19bab3ed3d4b50187af55cf24d147"}, + {file = "scikit_image-0.25.2-cp313-cp313-win_amd64.whl", hash = "sha256:64785a8acefee460ec49a354706db0b09d1f325674107d7fa3eadb663fb56d6f"}, + {file = "scikit_image-0.25.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:330d061bd107d12f8d68f1d611ae27b3b813b8cdb0300a71d07b1379178dd4cd"}, + {file = "scikit_image-0.25.2.tar.gz", hash = "sha256:e5a37e6cd4d0c018a7a55b9d601357e3382826d3888c10d0213fc63bff977dde"}, +] + +[package.dependencies] +imageio = ">=2.33,<2.35.0 || >2.35.0" +lazy-loader = ">=0.4" +networkx = ">=3.0" +numpy = ">=1.24" +packaging = ">=21" +pillow = ">=10.1" +scipy = ">=1.11.4" +tifffile = ">=2022.8.12" + +[package.extras] +build = ["Cython (>=3.0.8)", "build (>=1.2.1)", "meson-python (>=0.16)", "ninja (>=1.11.1.1)", "numpy (>=2.0)", "pythran (>=0.16)", "spin (==0.13)"] +data = ["pooch (>=1.6.0)"] +developer = ["ipython", "pre-commit", "tomli ; python_version < \"3.11\""] +docs = ["PyWavelets (>=1.6)", "dask[array] (>=2023.2.0)", "intersphinx-registry (>=0.2411.14)", "ipykernel", "ipywidgets", "kaleido (==0.2.1)", "matplotlib (>=3.7)", "myst-parser", "numpydoc (>=1.7)", "pandas (>=2.0)", "plotly (>=5.20)", "pooch (>=1.6)", "pydata-sphinx-theme (>=0.16)", "pytest-doctestplus", "scikit-learn (>=1.2)", "seaborn (>=0.11)", "sphinx (>=8.0)", "sphinx-copybutton", "sphinx-gallery[parallel] (>=0.18)", "sphinx_design (>=0.5)", "tifffile (>=2022.8.12)"] +optional = ["PyWavelets (>=1.6)", "SimpleITK", "astropy (>=5.0)", "cloudpickle (>=1.1.1)", "dask[array] (>=2023.2.0)", "matplotlib (>=3.7)", "pooch (>=1.6.0)", "pyamg (>=5.2)", "scikit-learn (>=1.2)"] +test = ["asv", "numpydoc (>=1.7)", "pooch (>=1.6.0)", "pytest (>=8)", "pytest-cov (>=2.11.0)", "pytest-doctestplus", "pytest-faulthandler", "pytest-localserver"] + +[[package]] +name = "scipy" +version = "1.15.2" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "scipy-1.15.2-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a2ec871edaa863e8213ea5df811cd600734f6400b4af272e1c011e69401218e9"}, + {file = "scipy-1.15.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:6f223753c6ea76983af380787611ae1291e3ceb23917393079dcc746ba60cfb5"}, + {file = "scipy-1.15.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:ecf797d2d798cf7c838c6d98321061eb3e72a74710e6c40540f0e8087e3b499e"}, + {file = "scipy-1.15.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:9b18aa747da280664642997e65aab1dd19d0c3d17068a04b3fe34e2559196cb9"}, + {file = "scipy-1.15.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87994da02e73549dfecaed9e09a4f9d58a045a053865679aeb8d6d43747d4df3"}, + {file = "scipy-1.15.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69ea6e56d00977f355c0f84eba69877b6df084516c602d93a33812aa04d90a3d"}, + {file = "scipy-1.15.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:888307125ea0c4466287191e5606a2c910963405ce9671448ff9c81c53f85f58"}, + {file = "scipy-1.15.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9412f5e408b397ff5641080ed1e798623dbe1ec0d78e72c9eca8992976fa65aa"}, + {file = "scipy-1.15.2-cp310-cp310-win_amd64.whl", hash = "sha256:b5e025e903b4f166ea03b109bb241355b9c42c279ea694d8864d033727205e65"}, + {file = "scipy-1.15.2-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:92233b2df6938147be6fa8824b8136f29a18f016ecde986666be5f4d686a91a4"}, + {file = "scipy-1.15.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:62ca1ff3eb513e09ed17a5736929429189adf16d2d740f44e53270cc800ecff1"}, + {file = "scipy-1.15.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:4c6676490ad76d1c2894d77f976144b41bd1a4052107902238047fb6a473e971"}, + {file = "scipy-1.15.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:a8bf5cb4a25046ac61d38f8d3c3426ec11ebc350246a4642f2f315fe95bda655"}, + {file = "scipy-1.15.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a8e34cf4c188b6dd004654f88586d78f95639e48a25dfae9c5e34a6dc34547e"}, + {file = "scipy-1.15.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28a0d2c2075946346e4408b211240764759e0fabaeb08d871639b5f3b1aca8a0"}, + {file = "scipy-1.15.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:42dabaaa798e987c425ed76062794e93a243be8f0f20fff6e7a89f4d61cb3d40"}, + {file = "scipy-1.15.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6f5e296ec63c5da6ba6fa0343ea73fd51b8b3e1a300b0a8cae3ed4b1122c7462"}, + {file = "scipy-1.15.2-cp311-cp311-win_amd64.whl", hash = "sha256:597a0c7008b21c035831c39927406c6181bcf8f60a73f36219b69d010aa04737"}, + {file = "scipy-1.15.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c4697a10da8f8765bb7c83e24a470da5797e37041edfd77fd95ba3811a47c4fd"}, + {file = "scipy-1.15.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:869269b767d5ee7ea6991ed7e22b3ca1f22de73ab9a49c44bad338b725603301"}, + {file = "scipy-1.15.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:bad78d580270a4d32470563ea86c6590b465cb98f83d760ff5b0990cb5518a93"}, + {file = "scipy-1.15.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:b09ae80010f52efddb15551025f9016c910296cf70adbf03ce2a8704f3a5ad20"}, + {file = "scipy-1.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a6fd6eac1ce74a9f77a7fc724080d507c5812d61e72bd5e4c489b042455865e"}, + {file = "scipy-1.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b871df1fe1a3ba85d90e22742b93584f8d2b8e6124f8372ab15c71b73e428b8"}, + {file = "scipy-1.15.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:03205d57a28e18dfd39f0377d5002725bf1f19a46f444108c29bdb246b6c8a11"}, + {file = "scipy-1.15.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:601881dfb761311045b03114c5fe718a12634e5608c3b403737ae463c9885d53"}, + {file = "scipy-1.15.2-cp312-cp312-win_amd64.whl", hash = "sha256:e7c68b6a43259ba0aab737237876e5c2c549a031ddb7abc28c7b47f22e202ded"}, + {file = "scipy-1.15.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01edfac9f0798ad6b46d9c4c9ca0e0ad23dbf0b1eb70e96adb9fa7f525eff0bf"}, + {file = "scipy-1.15.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:08b57a9336b8e79b305a143c3655cc5bdbe6d5ece3378578888d2afbb51c4e37"}, + {file = "scipy-1.15.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:54c462098484e7466362a9f1672d20888f724911a74c22ae35b61f9c5919183d"}, + {file = "scipy-1.15.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:cf72ff559a53a6a6d77bd8eefd12a17995ffa44ad86c77a5df96f533d4e6c6bb"}, + {file = "scipy-1.15.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9de9d1416b3d9e7df9923ab23cd2fe714244af10b763975bea9e4f2e81cebd27"}, + {file = "scipy-1.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb530e4794fc8ea76a4a21ccb67dea33e5e0e60f07fc38a49e821e1eae3b71a0"}, + {file = "scipy-1.15.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5ea7ed46d437fc52350b028b1d44e002646e28f3e8ddc714011aaf87330f2f32"}, + {file = "scipy-1.15.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:11e7ad32cf184b74380f43d3c0a706f49358b904fa7d5345f16ddf993609184d"}, + {file = "scipy-1.15.2-cp313-cp313-win_amd64.whl", hash = "sha256:a5080a79dfb9b78b768cebf3c9dcbc7b665c5875793569f48bf0e2b1d7f68f6f"}, + {file = "scipy-1.15.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:447ce30cee6a9d5d1379087c9e474628dab3db4a67484be1b7dc3196bfb2fac9"}, + {file = "scipy-1.15.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:c90ebe8aaa4397eaefa8455a8182b164a6cc1d59ad53f79943f266d99f68687f"}, + {file = "scipy-1.15.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:def751dd08243934c884a3221156d63e15234a3155cf25978b0a668409d45eb6"}, + {file = "scipy-1.15.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:302093e7dfb120e55515936cb55618ee0b895f8bcaf18ff81eca086c17bd80af"}, + {file = "scipy-1.15.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd5b77413e1855351cdde594eca99c1f4a588c2d63711388b6a1f1c01f62274"}, + {file = "scipy-1.15.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d0194c37037707b2afa7a2f2a924cf7bac3dc292d51b6a925e5fcb89bc5c776"}, + {file = "scipy-1.15.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:bae43364d600fdc3ac327db99659dcb79e6e7ecd279a75fe1266669d9a652828"}, + {file = "scipy-1.15.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f031846580d9acccd0044efd1a90e6f4df3a6e12b4b6bd694a7bc03a89892b28"}, + {file = "scipy-1.15.2-cp313-cp313t-win_amd64.whl", hash = "sha256:fe8a9eb875d430d81755472c5ba75e84acc980e4a8f6204d402849234d3017db"}, + {file = "scipy-1.15.2.tar.gz", hash = "sha256:cd58a314d92838f7e6f755c8a2167ead4f27e1fd5c1251fd54289569ef3495ec"}, +] + +[package.dependencies] +numpy = ">=1.23.5,<2.5" + +[package.extras] +dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] +doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.16.5)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.0.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"] +test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + +[[package]] +name = "sep" +version = "1.4.1" +description = "Astronomical source extraction and photometry library" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "sep-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:244c96d339afcca51d77e6a0b97e00844beed430e271edff7c9262ce07ef5a25"}, + {file = "sep-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:07c3b12b9a5cd6e2e12c8bba0984ea5a2a384032da8d8c3b7f729e007bc8c7cb"}, + {file = "sep-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:809d86444d44ea65b9844e89574cbe60cbbf8739ac03f1071f351f9414ec2a74"}, + {file = "sep-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13a4361fd6da55560ec7367f7631f962af64ebb4f466b031181b68aaf2b33152"}, + {file = "sep-1.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abd09579f582eeab4c0f43844b800e667578de36d7e1f23e28f08ea053566a15"}, + {file = "sep-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e52592e686980ff63358301c5efc06e1a7db126b9c9ed6d9b495b0b5acbc8a05"}, + {file = "sep-1.4.1-cp310-cp310-win32.whl", hash = "sha256:4b343ca237fb0af5eb30c95b1644ba4ac14522bcdc8b47bbec004f4dae341098"}, + {file = "sep-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:deb9dae91eeef8307efbc70b84802db55adf29f6b52eb1e9064e04368e93b4eb"}, + {file = "sep-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2f7021958f01709d4e5e028a21516875fa11499466c4418626376491650b5c0b"}, + {file = "sep-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02429878b4aad256af26dd38a9fd8a748b25af42bbbd6c189b42af691958ab17"}, + {file = "sep-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6f3bdd42c99ad68e284c4abeba1f556da14155c8ff439d00401508ab8ceffc67"}, + {file = "sep-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e604c63d97cedfd3f1a68829198b984cae27b8f57795507fd3014683d6bde0fd"}, + {file = "sep-1.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9907b5952b3df7f2d2027cd3fa40c0db329e2a267a799e1db25dd5f04417704"}, + {file = "sep-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dac6777e049c4fad4da987e9626280fbb7a847dcec5968937235b6b40c113296"}, + {file = "sep-1.4.1-cp311-cp311-win32.whl", hash = "sha256:94b16a9c3b81a0c594d25de6ce6ed03c53f361d7321db3e71db76d738140f2c9"}, + {file = "sep-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d90a35c6e9465e89d8d1fa58cae14e88888938ae67250fcbccd1749efdf9af80"}, + {file = "sep-1.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:cb4a251eb17c72d3c1fdf3e3174970ce01f66cd1801e2b45b582ec2819e1b524"}, + {file = "sep-1.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7cd0b77615b44f22a06e20d2ba4ab7a0b713551e4c5eb3fa36a889ced0aa50ab"}, + {file = "sep-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e3a92bd46657a76b46ce3693820e7917f7b5f1232e3127f6e5ecc8d9ae65ac98"}, + {file = "sep-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fc395f7469f2530d2d6175b98cb77b550f7e9effa88f7b9ec9c50650f52a9e9"}, + {file = "sep-1.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e1950885d990813fa1a3538841cfeff8531720873102e70c5999bf89a886bc7"}, + {file = "sep-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93574ada43a6249b32cc78bd6d34e4cb55dac8e82e5febc74112819cd1d7ead5"}, + {file = "sep-1.4.1-cp312-cp312-win32.whl", hash = "sha256:011072fd8827b9bec70a387799afc916ecff3005504fcd0ad7a95f47a3ab3c01"}, + {file = "sep-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:fc52483ab524eb27d4630b8444feaac93f19baf3fdc44becbd3374b1645e330c"}, + {file = "sep-1.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:05109415551332238569cc9420226d815554ed9b4a6623b613bcc281bc84d3dc"}, + {file = "sep-1.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b01c05e21b03154df11737d872683b04fb72eeb11ccf7ab5ed816297608a36e1"}, + {file = "sep-1.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a4f76d04871d2ae3c42d4dbae66b12b390d1828c81a63eb15e987ef95d9de783"}, + {file = "sep-1.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c602100d04196d3a16f71ec17245f5c35b84c0f230eca007306decf4aacbece"}, + {file = "sep-1.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9f70e1fee306d0803823c04f6dfbbb373603897b2551390b919dea36e75988c"}, + {file = "sep-1.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83e7ae07a2f38d9c3f07aa8aa088ef6449bc85c615c312008850390df17ac629"}, + {file = "sep-1.4.1-cp313-cp313-win32.whl", hash = "sha256:66a98d6b98d6f4bb597133397b505787499e9cf3a3230967f5d3867e4f7eb7fd"}, + {file = "sep-1.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:9f6f6fb74cfb92d0fd71ee6b263c20c349f44dfe8e8d1db138b25655f4e67e9b"}, + {file = "sep-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c08cdfcb40e7fdfe86b1549a51eef7e20fade7b123cad5e160005965329a55c2"}, + {file = "sep-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9661f22f8c23c941ea589571973c4f5423c71bf34d6d0f615e2ab470295cae53"}, + {file = "sep-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:604e96b34ea17664cf77ca610179f328e3dcf17e7ed505b1ad5eb61744484f4a"}, + {file = "sep-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78e588ef7f8bf1e1af7f6f2f43526a4d320d1c23bde91cf81c677b5a09f6e533"}, + {file = "sep-1.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54560eea0d93acb73a225e1b12a76eec382ceadbd2f7c8fd76a789edbb7185da"}, + {file = "sep-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7b226ff130c84deaaae7c567026ac3e1b0389a3c217349b4df38b5d22b6a86c"}, + {file = "sep-1.4.1-cp39-cp39-win32.whl", hash = "sha256:1c193f3278ec719412725af353d7c3871f0426ede116d1caf0ede50159293894"}, + {file = "sep-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:b61e82b25a63a51c3b8bb38306aa5dda9f03902be4f583666c98320927b079bf"}, + {file = "sep-1.4.1.tar.gz", hash = "sha256:a0c8324ab66ee716080472cb212e4303e6c3e33b0d43763075b20d4cab793b25"}, +] + +[package.dependencies] +numpy = ">=1.26.4" + +[package.extras] +docs = ["fitsio (>=1.2.1)", "jupyter", "matplotlib (>=3.6)", "myst-parser (>=2.0.0)", "nbsphinx (>=0.9.3)", "numpydoc (>=1.6)", "pandoc (>=2.3)", "sphinx (>=7.2)", "sphinx-astropy[confv2] (>=1.9.1)", "sphinx-copybutton (>=0.5)"] + +[[package]] +name = "setuptools" +version = "75.8.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.9" +groups = ["main"] +markers = "python_version >= \"3.12\" or extra == \"docs\"" +files = [ + {file = "setuptools-75.8.0-py3-none-any.whl", hash = "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3"}, + {file = "setuptools-75.8.0.tar.gz", hash = "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""] +core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.14.*)", "pytest-mypy"] + +[[package]] +name = "six" +version = "1.17.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] +files = [ + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, +] + +[[package]] +name = "snowballstemmer" +version = "2.2.0" +description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +optional = true +python-versions = "*" +groups = ["main"] +markers = "extra == \"docs\"" +files = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] + +[[package]] +name = "sortedcontainers" +version = "2.4.0" +description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" +optional = true +python-versions = "*" +groups = ["main"] +markers = "extra == \"test\"" +files = [ + {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, + {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, +] + +[[package]] +name = "sphinx" +version = "8.1.3" +description = "Python documentation generator" +optional = true +python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"docs\"" +files = [ + {file = "sphinx-8.1.3-py3-none-any.whl", hash = "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2"}, + {file = "sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927"}, +] + +[package.dependencies] +alabaster = ">=0.7.14" +babel = ">=2.13" +colorama = {version = ">=0.4.6", markers = "sys_platform == \"win32\""} +docutils = ">=0.20,<0.22" +imagesize = ">=1.3" +Jinja2 = ">=3.1" +packaging = ">=23.0" +Pygments = ">=2.17" +requests = ">=2.30.0" +snowballstemmer = ">=2.2" +sphinxcontrib-applehelp = ">=1.0.7" +sphinxcontrib-devhelp = ">=1.0.6" +sphinxcontrib-htmlhelp = ">=2.0.6" +sphinxcontrib-jsmath = ">=1.0.1" +sphinxcontrib-qthelp = ">=1.0.6" +sphinxcontrib-serializinghtml = ">=1.1.9" +tomli = {version = ">=2", markers = "python_version < \"3.11\""} + +[package.extras] +docs = ["sphinxcontrib-websupport"] +lint = ["flake8 (>=6.0)", "mypy (==1.11.1)", "pyright (==1.1.384)", "pytest (>=6.0)", "ruff (==0.6.9)", "sphinx-lint (>=0.9)", "tomli (>=2)", "types-Pillow (==10.2.0.20240822)", "types-Pygments (==2.18.0.20240506)", "types-colorama (==0.4.15.20240311)", "types-defusedxml (==0.7.0.20240218)", "types-docutils (==0.21.0.20241005)", "types-requests (==2.32.0.20240914)", "types-urllib3 (==1.26.25.14)"] +test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=8.0)", "setuptools (>=70.0)", "typing_extensions (>=4.9)"] + +[[package]] +name = "sphinx-astropy" +version = "1.9.1" +description = "Sphinx extensions and configuration specific to the Astropy project" +optional = true +python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"docs\"" +files = [ + {file = "sphinx-astropy-1.9.1.tar.gz", hash = "sha256:7931c795f445caee38f98754afd75fe7393db7df2c4dcc860f94a011fb162454"}, + {file = "sphinx_astropy-1.9.1-py3-none-any.whl", hash = "sha256:0a6be6addb511c3d83647763608ef4fb9254dbc25ae04504837b3b1139c4b130"}, +] + +[package.dependencies] +astropy-sphinx-theme = "*" +numpydoc = "*" +packaging = "*" +pillow = "*" +pytest-doctestplus = ">=0.11" +sphinx = ">=3.0.0" +sphinx-automodapi = "*" +sphinx-gallery = "*" +sphinxcontrib-jquery = "*" + +[package.extras] +all = ["astropy"] +confv2 = ["pydata-sphinx-theme", "sphinx-copybutton"] +tests = ["pytest"] + +[[package]] +name = "sphinx-automodapi" +version = "0.18.0" +description = "Sphinx extension for auto-generating API documentation for entire modules" +optional = true +python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"docs\"" +files = [ + {file = "sphinx_automodapi-0.18.0-py3-none-any.whl", hash = "sha256:022860385590768f52d4f6e19abb83b2574772d2721fb4050ecdb6e593a1a440"}, + {file = "sphinx_automodapi-0.18.0.tar.gz", hash = "sha256:7bf9d9a2cb67a5389c51071cfd86674ca3892ca5d5943f95de4553d6f35dddae"}, +] + +[package.dependencies] +sphinx = ">=4" + +[package.extras] +rtd = ["sphinx (<7)", "sphinx-rtd-theme"] +test = ["coverage", "cython", "pytest", "pytest-cov", "setuptools ; python_version >= \"3.12\""] + +[[package]] +name = "sphinx-gallery" +version = "0.19.0" +description = "A Sphinx extension that builds an HTML gallery of examples from any set of Python scripts." +optional = true +python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"docs\"" +files = [ + {file = "sphinx_gallery-0.19.0-py3-none-any.whl", hash = "sha256:4c28751973f81769d5bbbf5e4ebaa0dc49dff8c48eb7f11131eb5f6e4aa25f0e"}, + {file = "sphinx_gallery-0.19.0.tar.gz", hash = "sha256:8400cb5240ad642e28a612fdba0667f725d0505a9be0222d0243de60e8af2eb3"}, +] + +[package.dependencies] +pillow = "*" +sphinx = ">=5" + +[package.extras] +animations = ["sphinxcontrib-video"] +dev = ["absl-py", "graphviz", "intersphinx-registry", "ipython", "joblib", "jupyterlite-sphinx (>=0.17.1)", "lxml", "matplotlib", "numpy", "packaging", "plotly", "pydata-sphinx-theme", "pytest", "pytest-coverage", "seaborn", "sphinxcontrib-video", "statsmodels"] +jupyterlite = ["jupyterlite-sphinx"] +parallel = ["joblib"] +recommender = ["numpy"] +show-api-usage = ["graphviz"] +show-memory = ["memory-profiler"] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "2.0.0" +description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" +optional = true +python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"docs\"" +files = [ + {file = "sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5"}, + {file = "sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1"}, +] + +[package.extras] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] +standalone = ["Sphinx (>=5)"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "2.0.0" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" +optional = true +python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"docs\"" +files = [ + {file = "sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2"}, + {file = "sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad"}, +] + +[package.extras] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] +standalone = ["Sphinx (>=5)"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.1.0" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +optional = true +python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"docs\"" +files = [ + {file = "sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8"}, + {file = "sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9"}, +] + +[package.extras] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] +standalone = ["Sphinx (>=5)"] +test = ["html5lib", "pytest"] + +[[package]] +name = "sphinxcontrib-jquery" +version = "4.1" +description = "Extension to include jQuery on newer Sphinx releases" +optional = true +python-versions = ">=2.7" +groups = ["main"] +markers = "extra == \"docs\"" +files = [ + {file = "sphinxcontrib-jquery-4.1.tar.gz", hash = "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a"}, + {file = "sphinxcontrib_jquery-4.1-py2.py3-none-any.whl", hash = "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae"}, +] + +[package.dependencies] +Sphinx = ">=1.8" + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +description = "A sphinx extension which renders display math in HTML via JavaScript" +optional = true +python-versions = ">=3.5" +groups = ["main"] +markers = "extra == \"docs\"" +files = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] + +[package.extras] +test = ["flake8", "mypy", "pytest"] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "2.0.0" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" +optional = true +python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"docs\"" +files = [ + {file = "sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb"}, + {file = "sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab"}, +] + +[package.extras] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] +standalone = ["Sphinx (>=5)"] +test = ["defusedxml (>=0.7.1)", "pytest"] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "2.0.0" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" +optional = true +python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"docs\"" +files = [ + {file = "sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331"}, + {file = "sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d"}, +] + +[package.extras] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] +standalone = ["Sphinx (>=5)"] +test = ["pytest"] + +[[package]] +name = "sqlalchemy" +version = "2.0.38" +description = "Database Abstraction Library" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "SQLAlchemy-2.0.38-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5e1d9e429028ce04f187a9f522818386c8b076723cdbe9345708384f49ebcec6"}, + {file = "SQLAlchemy-2.0.38-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b87a90f14c68c925817423b0424381f0e16d80fc9a1a1046ef202ab25b19a444"}, + {file = "SQLAlchemy-2.0.38-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:402c2316d95ed90d3d3c25ad0390afa52f4d2c56b348f212aa9c8d072a40eee5"}, + {file = "SQLAlchemy-2.0.38-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6493bc0eacdbb2c0f0d260d8988e943fee06089cd239bd7f3d0c45d1657a70e2"}, + {file = "SQLAlchemy-2.0.38-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0561832b04c6071bac3aad45b0d3bb6d2c4f46a8409f0a7a9c9fa6673b41bc03"}, + {file = "SQLAlchemy-2.0.38-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:49aa2cdd1e88adb1617c672a09bf4ebf2f05c9448c6dbeba096a3aeeb9d4d443"}, + {file = "SQLAlchemy-2.0.38-cp310-cp310-win32.whl", hash = "sha256:64aa8934200e222f72fcfd82ee71c0130a9c07d5725af6fe6e919017d095b297"}, + {file = "SQLAlchemy-2.0.38-cp310-cp310-win_amd64.whl", hash = "sha256:c57b8e0841f3fce7b703530ed70c7c36269c6d180ea2e02e36b34cb7288c50c7"}, + {file = "SQLAlchemy-2.0.38-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bf89e0e4a30714b357f5d46b6f20e0099d38b30d45fa68ea48589faf5f12f62d"}, + {file = "SQLAlchemy-2.0.38-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8455aa60da49cb112df62b4721bd8ad3654a3a02b9452c783e651637a1f21fa2"}, + {file = "SQLAlchemy-2.0.38-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f53c0d6a859b2db58332e0e6a921582a02c1677cc93d4cbb36fdf49709b327b2"}, + {file = "SQLAlchemy-2.0.38-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3c4817dff8cef5697f5afe5fec6bc1783994d55a68391be24cb7d80d2dbc3a6"}, + {file = "SQLAlchemy-2.0.38-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c9cea5b756173bb86e2235f2f871b406a9b9d722417ae31e5391ccaef5348f2c"}, + {file = "SQLAlchemy-2.0.38-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:40e9cdbd18c1f84631312b64993f7d755d85a3930252f6276a77432a2b25a2f3"}, + {file = "SQLAlchemy-2.0.38-cp311-cp311-win32.whl", hash = "sha256:cb39ed598aaf102251483f3e4675c5dd6b289c8142210ef76ba24aae0a8f8aba"}, + {file = "SQLAlchemy-2.0.38-cp311-cp311-win_amd64.whl", hash = "sha256:f9d57f1b3061b3e21476b0ad5f0397b112b94ace21d1f439f2db472e568178ae"}, + {file = "SQLAlchemy-2.0.38-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12d5b06a1f3aeccf295a5843c86835033797fea292c60e72b07bcb5d820e6dd3"}, + {file = "SQLAlchemy-2.0.38-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e036549ad14f2b414c725349cce0772ea34a7ab008e9cd67f9084e4f371d1f32"}, + {file = "SQLAlchemy-2.0.38-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee3bee874cb1fadee2ff2b79fc9fc808aa638670f28b2145074538d4a6a5028e"}, + {file = "SQLAlchemy-2.0.38-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e185ea07a99ce8b8edfc788c586c538c4b1351007e614ceb708fd01b095ef33e"}, + {file = "SQLAlchemy-2.0.38-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b79ee64d01d05a5476d5cceb3c27b5535e6bb84ee0f872ba60d9a8cd4d0e6579"}, + {file = "SQLAlchemy-2.0.38-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:afd776cf1ebfc7f9aa42a09cf19feadb40a26366802d86c1fba080d8e5e74bdd"}, + {file = "SQLAlchemy-2.0.38-cp312-cp312-win32.whl", hash = "sha256:a5645cd45f56895cfe3ca3459aed9ff2d3f9aaa29ff7edf557fa7a23515a3725"}, + {file = "SQLAlchemy-2.0.38-cp312-cp312-win_amd64.whl", hash = "sha256:1052723e6cd95312f6a6eff9a279fd41bbae67633415373fdac3c430eca3425d"}, + {file = "SQLAlchemy-2.0.38-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ecef029b69843b82048c5b347d8e6049356aa24ed644006c9a9d7098c3bd3bfd"}, + {file = "SQLAlchemy-2.0.38-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c8bcad7fc12f0cc5896d8e10fdf703c45bd487294a986903fe032c72201596b"}, + {file = "SQLAlchemy-2.0.38-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a0ef3f98175d77180ffdc623d38e9f1736e8d86b6ba70bff182a7e68bed7727"}, + {file = "SQLAlchemy-2.0.38-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b0ac78898c50e2574e9f938d2e5caa8fe187d7a5b69b65faa1ea4648925b096"}, + {file = "SQLAlchemy-2.0.38-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9eb4fa13c8c7a2404b6a8e3772c17a55b1ba18bc711e25e4d6c0c9f5f541b02a"}, + {file = "SQLAlchemy-2.0.38-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5dba1cdb8f319084f5b00d41207b2079822aa8d6a4667c0f369fce85e34b0c86"}, + {file = "SQLAlchemy-2.0.38-cp313-cp313-win32.whl", hash = "sha256:eae27ad7580529a427cfdd52c87abb2dfb15ce2b7a3e0fc29fbb63e2ed6f8120"}, + {file = "SQLAlchemy-2.0.38-cp313-cp313-win_amd64.whl", hash = "sha256:b335a7c958bc945e10c522c069cd6e5804f4ff20f9a744dd38e748eb602cbbda"}, + {file = "SQLAlchemy-2.0.38-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:40310db77a55512a18827488e592965d3dec6a3f1e3d8af3f8243134029daca3"}, + {file = "SQLAlchemy-2.0.38-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d3043375dd5bbcb2282894cbb12e6c559654c67b5fffb462fda815a55bf93f7"}, + {file = "SQLAlchemy-2.0.38-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70065dfabf023b155a9c2a18f573e47e6ca709b9e8619b2e04c54d5bcf193178"}, + {file = "SQLAlchemy-2.0.38-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:c058b84c3b24812c859300f3b5abf300daa34df20d4d4f42e9652a4d1c48c8a4"}, + {file = "SQLAlchemy-2.0.38-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0398361acebb42975deb747a824b5188817d32b5c8f8aba767d51ad0cc7bb08d"}, + {file = "SQLAlchemy-2.0.38-cp37-cp37m-win32.whl", hash = "sha256:a2bc4e49e8329f3283d99840c136ff2cd1a29e49b5624a46a290f04dff48e079"}, + {file = "SQLAlchemy-2.0.38-cp37-cp37m-win_amd64.whl", hash = "sha256:9cd136184dd5f58892f24001cdce986f5d7e96059d004118d5410671579834a4"}, + {file = "SQLAlchemy-2.0.38-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:665255e7aae5f38237b3a6eae49d2358d83a59f39ac21036413fab5d1e810578"}, + {file = "SQLAlchemy-2.0.38-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:92f99f2623ff16bd4aaf786ccde759c1f676d39c7bf2855eb0b540e1ac4530c8"}, + {file = "SQLAlchemy-2.0.38-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa498d1392216fae47eaf10c593e06c34476ced9549657fca713d0d1ba5f7248"}, + {file = "SQLAlchemy-2.0.38-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9afbc3909d0274d6ac8ec891e30210563b2c8bdd52ebbda14146354e7a69373"}, + {file = "SQLAlchemy-2.0.38-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:57dd41ba32430cbcc812041d4de8d2ca4651aeefad2626921ae2a23deb8cd6ff"}, + {file = "SQLAlchemy-2.0.38-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3e35d5565b35b66905b79ca4ae85840a8d40d31e0b3e2990f2e7692071b179ca"}, + {file = "SQLAlchemy-2.0.38-cp38-cp38-win32.whl", hash = "sha256:f0d3de936b192980209d7b5149e3c98977c3810d401482d05fb6d668d53c1c63"}, + {file = "SQLAlchemy-2.0.38-cp38-cp38-win_amd64.whl", hash = "sha256:3868acb639c136d98107c9096303d2d8e5da2880f7706f9f8c06a7f961961149"}, + {file = "SQLAlchemy-2.0.38-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:07258341402a718f166618470cde0c34e4cec85a39767dce4e24f61ba5e667ea"}, + {file = "SQLAlchemy-2.0.38-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a826f21848632add58bef4f755a33d45105d25656a0c849f2dc2df1c71f6f50"}, + {file = "SQLAlchemy-2.0.38-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:386b7d136919bb66ced64d2228b92d66140de5fefb3c7df6bd79069a269a7b06"}, + {file = "SQLAlchemy-2.0.38-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f2951dc4b4f990a4b394d6b382accb33141d4d3bd3ef4e2b27287135d6bdd68"}, + {file = "SQLAlchemy-2.0.38-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8bf312ed8ac096d674c6aa9131b249093c1b37c35db6a967daa4c84746bc1bc9"}, + {file = "SQLAlchemy-2.0.38-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6db316d6e340f862ec059dc12e395d71f39746a20503b124edc255973977b728"}, + {file = "SQLAlchemy-2.0.38-cp39-cp39-win32.whl", hash = "sha256:c09a6ea87658695e527104cf857c70f79f14e9484605e205217aae0ec27b45fc"}, + {file = "SQLAlchemy-2.0.38-cp39-cp39-win_amd64.whl", hash = "sha256:12f5c9ed53334c3ce719155424dc5407aaa4f6cadeb09c5b627e06abb93933a1"}, + {file = "SQLAlchemy-2.0.38-py3-none-any.whl", hash = "sha256:63178c675d4c80def39f1febd625a6333f44c0ba269edd8a468b156394b27753"}, + {file = "sqlalchemy-2.0.38.tar.gz", hash = "sha256:e5a4d82bdb4bf1ac1285a68eab02d253ab73355d9f0fe725a97e1e0fa689decb"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "python_version < \"3.14\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} +typing-extensions = ">=4.6.0" + +[package.extras] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] +aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx_oracle (>=8)"] +oracle-oracledb = ["oracledb (>=1.0.1)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] +pymysql = ["pymysql"] +sqlcipher = ["sqlcipher3_binary"] + +[[package]] +name = "sympy" +version = "1.13.1" +description = "Computer algebra system (CAS) in Python" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "sympy-1.13.1-py3-none-any.whl", hash = "sha256:db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8"}, + {file = "sympy-1.13.1.tar.gz", hash = "sha256:9cebf7e04ff162015ce31c9c6c9144daa34a93bd082f54fd8f12deca4f47515f"}, +] + +[package.dependencies] +mpmath = ">=1.1.0,<1.4" + +[package.extras] +dev = ["hypothesis (>=6.70.0)", "pytest (>=7.1.0)"] + +[[package]] +name = "tabulate" +version = "0.9.0" +description = "Pretty-print tabular data" +optional = true +python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"docs\"" +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 = "9.0.0" +description = "Retry code until it succeeds" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "tenacity-9.0.0-py3-none-any.whl", hash = "sha256:93de0c98785b27fcf659856aa9f54bfbd399e29969b0621bc7f762bd441b4539"}, + {file = "tenacity-9.0.0.tar.gz", hash = "sha256:807f37ca97d62aa361264d497b0e31e92b8027044942bfa756160d908320d73b"}, +] + +[package.extras] +doc = ["reno", "sphinx"] +test = ["pytest", "tornado (>=4.5)", "typeguard"] + +[[package]] +name = "tifffile" +version = "2025.2.18" +description = "Read and write TIFF files" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "tifffile-2025.2.18-py3-none-any.whl", hash = "sha256:54b36c4d5e5b8d8920134413edfe5a7cfb1c7617bb50cddf7e2772edb7149043"}, + {file = "tifffile-2025.2.18.tar.gz", hash = "sha256:8d731789e691b468746c1615d989bc550ac93cf753e9210865222e90a5a95d11"}, +] + +[package.dependencies] +numpy = "*" + +[package.extras] +all = ["defusedxml", "fsspec", "imagecodecs (>=2024.12.30)", "lxml", "matplotlib", "zarr (<3)"] +codecs = ["imagecodecs (>=2024.12.30)"] +plot = ["matplotlib"] +test = ["cmapfile", "czifile", "dask", "defusedxml", "fsspec", "imagecodecs", "lfdfiles", "lxml", "ndtiff", "oiffile", "psdtags", "pytest", "roifile", "xarray", "zarr (<3)"] +xml = ["defusedxml", "lxml"] +zarr = ["fsspec", "zarr (<3)"] + +[[package]] +name = "tomli" +version = "2.2.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.8" +groups = ["main"] +markers = "python_version < \"3.11\" or extra == \"test\" and python_full_version <= \"3.11.0a6\"" +files = [ + {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, + {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, + {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, + {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, + {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, + {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, + {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, + {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, + {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, +] + +[[package]] +name = "toolz" +version = "1.0.0" +description = "List processing tools and functional utilities" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "toolz-1.0.0-py3-none-any.whl", hash = "sha256:292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236"}, + {file = "toolz-1.0.0.tar.gz", hash = "sha256:2c86e3d9a04798ac556793bced838816296a2f085017664e4995cb40a1047a02"}, +] + +[[package]] +name = "torch" +version = "2.6.0" +description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" +optional = false +python-versions = ">=3.9.0" +groups = ["main"] +files = [ + {file = "torch-2.6.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:6860df13d9911ac158f4c44031609700e1eba07916fff62e21e6ffa0a9e01961"}, + {file = "torch-2.6.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:c4f103a49830ce4c7561ef4434cc7926e5a5fe4e5eb100c19ab36ea1e2b634ab"}, + {file = "torch-2.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:56eeaf2ecac90da5d9e35f7f35eb286da82673ec3c582e310a8d1631a1c02341"}, + {file = "torch-2.6.0-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:09e06f9949e1a0518c5b09fe95295bc9661f219d9ecb6f9893e5123e10696628"}, + {file = "torch-2.6.0-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:7979834102cd5b7a43cc64e87f2f3b14bd0e1458f06e9f88ffa386d07c7446e1"}, + {file = "torch-2.6.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:ccbd0320411fe1a3b3fec7b4d3185aa7d0c52adac94480ab024b5c8f74a0bf1d"}, + {file = "torch-2.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:46763dcb051180ce1ed23d1891d9b1598e07d051ce4c9d14307029809c4d64f7"}, + {file = "torch-2.6.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:94fc63b3b4bedd327af588696559f68c264440e2503cc9e6954019473d74ae21"}, + {file = "torch-2.6.0-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:2bb8987f3bb1ef2675897034402373ddfc8f5ef0e156e2d8cfc47cacafdda4a9"}, + {file = "torch-2.6.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:b789069020c5588c70d5c2158ac0aa23fd24a028f34a8b4fcb8fcb4d7efcf5fb"}, + {file = "torch-2.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:7e1448426d0ba3620408218b50aa6ada88aeae34f7a239ba5431f6c8774b1239"}, + {file = "torch-2.6.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:9a610afe216a85a8b9bc9f8365ed561535c93e804c2a317ef7fabcc5deda0989"}, + {file = "torch-2.6.0-cp313-cp313-manylinux1_x86_64.whl", hash = "sha256:4874a73507a300a5d089ceaff616a569e7bb7c613c56f37f63ec3ffac65259cf"}, + {file = "torch-2.6.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:a0d5e1b9874c1a6c25556840ab8920569a7a4137afa8a63a32cee0bc7d89bd4b"}, + {file = "torch-2.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:510c73251bee9ba02ae1cb6c9d4ee0907b3ce6020e62784e2d7598e0cfa4d6cc"}, + {file = "torch-2.6.0-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:ff96f4038f8af9f7ec4231710ed4549da1bdebad95923953a25045dcf6fd87e2"}, + {file = "torch-2.6.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:9ea955317cfcd3852b1402b62af258ce735c2edeee42ca9419b6bc889e5ae053"}, + {file = "torch-2.6.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:bb2c6c3e65049f081940f5ab15c9136c7de40d3f01192541c920a07c7c585b7e"}, + {file = "torch-2.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:683410f97984103148e31b38a8631acf31c3034c020c0f4d26171e7626d8317a"}, + {file = "torch-2.6.0-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:265f70de5fd45b864d924b64be1797f86e76c8e48a02c2a3a6fc7ec247d2226c"}, +] + +[package.dependencies] +filelock = "*" +fsspec = "*" +jinja2 = "*" +networkx = "*" +nvidia-cublas-cu12 = {version = "12.4.5.8", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-cupti-cu12 = {version = "12.4.127", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-nvrtc-cu12 = {version = "12.4.127", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-runtime-cu12 = {version = "12.4.127", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cudnn-cu12 = {version = "9.1.0.70", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cufft-cu12 = {version = "11.2.1.3", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-curand-cu12 = {version = "10.3.5.147", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusolver-cu12 = {version = "11.6.1.9", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusparse-cu12 = {version = "12.3.1.170", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusparselt-cu12 = {version = "0.6.2", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nccl-cu12 = {version = "2.21.5", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nvjitlink-cu12 = {version = "12.4.127", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nvtx-cu12 = {version = "12.4.127", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +setuptools = {version = "*", markers = "python_version >= \"3.12\""} +sympy = {version = "1.13.1", markers = "python_version >= \"3.9\""} +triton = {version = "3.2.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +typing-extensions = ">=4.10.0" + +[package.extras] +opt-einsum = ["opt-einsum (>=3.3)"] +optree = ["optree (>=0.13.0)"] + +[[package]] +name = "tqdm" +version = "4.67.1" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, + {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"] +discord = ["requests"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "triton" +version = "3.2.0" +description = "A language and compiler for custom Deep Learning operations" +optional = false +python-versions = "*" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +files = [ + {file = "triton-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3e54983cd51875855da7c68ec05c05cf8bb08df361b1d5b69e05e40b0c9bd62"}, + {file = "triton-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8009a1fb093ee8546495e96731336a33fb8856a38e45bb4ab6affd6dbc3ba220"}, + {file = "triton-3.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d9b215efc1c26fa7eefb9a157915c92d52e000d2bf83e5f69704047e63f125c"}, + {file = "triton-3.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5dfa23ba84541d7c0a531dfce76d8bcd19159d50a4a8b14ad01e91734a5c1b0"}, + {file = "triton-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30ceed0eff2c4a73b14eb63e052992f44bbdf175f3fad21e1ac8097a772de7ee"}, +] + +[package.extras] +build = ["cmake (>=3.20)", "lit"] +tests = ["autopep8", "flake8", "isort", "llnl-hatchet", "numpy", "pytest", "scipy (>=1.7.1)"] +tutorials = ["matplotlib", "pandas", "tabulate"] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, +] + +[[package]] +name = "tzdata" +version = "2025.1" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +groups = ["main"] +files = [ + {file = "tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639"}, + {file = "tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694"}, +] + +[[package]] +name = "tzlocal" +version = "5.3" +description = "tzinfo object for the local timezone" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "tzlocal-5.3-py3-none-any.whl", hash = "sha256:3814135a1bb29763c6e4f08fd6e41dbb435c7a60bfbb03270211bcc537187d8c"}, + {file = "tzlocal-5.3.tar.gz", hash = "sha256:2fafbfc07e9d8b49ade18f898d6bcd37ae88ce3ad6486842a2e4f03af68323d2"}, +] + +[package.dependencies] +tzdata = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +devenv = ["check-manifest", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"] + +[[package]] +name = "urllib3" +version = "2.3.0" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, + {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "vine" +version = "5.1.0" +description = "Python promises." +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "vine-5.1.0-py3-none-any.whl", hash = "sha256:40fdf3c48b2cfe1c38a49e9ae2da6fda88e4794c810050a728bd7413811fb1dc"}, + {file = "vine-5.1.0.tar.gz", hash = "sha256:8b62e981d35c41049211cf62a0a1242d8c1ee9bd15bb196ce38aefd6799e61e0"}, +] + +[[package]] +name = "wcwidth" +version = "0.2.13" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, +] + +[[package]] +name = "zarr" +version = "2.18.3" +description = "An implementation of chunked, compressed, N-dimensional arrays for Python" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "zarr-2.18.3-py3-none-any.whl", hash = "sha256:b1f7dfd2496f436745cdd4c7bcf8d3b4bc1dceef5fdd0d589c87130d842496dd"}, + {file = "zarr-2.18.3.tar.gz", hash = "sha256:2580d8cb6dd84621771a10d31c4d777dca8a27706a1a89b29f42d2d37e2df5ce"}, +] + +[package.dependencies] +asciitree = "*" +fasteners = {version = "*", markers = "sys_platform != \"emscripten\""} +numcodecs = ">=0.10.0" +numpy = ">=1.24" + +[package.extras] +docs = ["numcodecs[msgpack]", "numpydoc", "pydata-sphinx-theme", "sphinx", "sphinx-automodapi", "sphinx-copybutton", "sphinx-design", "sphinx-issues"] +jupyter = ["ipytree (>=0.2.2)", "ipywidgets (>=8.0.0)", "notebook"] + +[[package]] +name = "zipp" +version = "3.21.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.9" +groups = ["main"] +markers = "python_version < \"3.12\"" +files = [ + {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, + {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["big-O", "importlib-resources ; python_version < \"3.9\"", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +type = ["pytest-mypy"] + +[extras] +docs = ["sphinx-astropy"] +test = ["coverage", "pytest", "pytest-astropy"] + +[metadata] +lock-version = "2.1" +python-versions = ">=3.10,<4" +content-hash = "2f43f767ade1411dd7a09c29445c011c23c4ca0a8be07777be7fd0d7df93b829" diff --git a/pyproject.toml b/pyproject.toml index b7bb6a4ed..2629e0f0c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,7 @@ build-backend = "poetry.core.masonry.api" [project] name = "lco-banzai" -python = ">=3.10,<4" +requires-python = ">=3.10,<4" version = "1.20.2" description = "Python data reduction package for LCOGT data" authors = [ @@ -63,6 +63,19 @@ docs = [ "Source" = "https://github.com/lcogt/banzai" "Docs" = "https://banzai.readthedocs.io/en/latest/" +[tool.poetry] +packages = [ + { include = "banzai" } +] + +[[tool.poetry.source]] +name = "pytorch_cpu" +url = "https://download.pytorch.org/whl/cpu" +priority = "explicit" + +[tool.poetry.dependencies] +torch = { source = "pytorch_cpu" } + [tool.setuptools.packages.find] include = ["banzai*"] From e970bdb5449b9916e8509da65a56403511228b62 Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Fri, 21 Feb 2025 11:06:49 -0500 Subject: [PATCH 09/46] Install the cpu only version of pytorch to keep the docker image much smaller. --- Dockerfile | 2 +- poetry.lock | 263 ++++++++++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 23 ++++- 3 files changed, 281 insertions(+), 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index ad139c495..736991df5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,7 +12,7 @@ RUN apt-get -y update && apt-get -y install gcc && \ COPY pyproject.toml poetry.lock /lco/banzai/ -RUN poetry install --directory=/lco/banzai --no-root --no-cache +RUN poetry install --directory=/lco/banzai -E cpu --no-root --no-cache COPY . /lco/banzai diff --git a/poetry.lock b/poetry.lock index 346e0f4de..9a6a1fdab 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1534,6 +1534,19 @@ developer = ["pre-commit (>=3.3)", "tomli ; python_version < \"3.11\""] doc = ["intersphinx-registry", "matplotlib (>=3.5)", "numpy (>=1.22)", "pydata-sphinx-theme (>=0.13.3)", "sphinx (>=7)"] test = ["matplotlib", "pytest", "pytest-cov"] +[[package]] +name = "nvidia-cublas-cu12" +version = "12.1.3.1" +description = "CUBLAS native runtime libraries" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and sys_platform != \"darwin\"" +files = [ + {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:ee53ccca76a6fc08fb9701aa95b6ceb242cdaab118c3bb152af4e579af792728"}, + {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-win_amd64.whl", hash = "sha256:2b964d60e8cf11b5e1073d179d85fa340c120e99b3067558f3cf98dd69d02906"}, +] + [[package]] name = "nvidia-cublas-cu12" version = "12.4.5.8" @@ -1548,6 +1561,19 @@ files = [ {file = "nvidia_cublas_cu12-12.4.5.8-py3-none-win_amd64.whl", hash = "sha256:5a796786da89203a0657eda402bcdcec6180254a8ac22d72213abc42069522dc"}, ] +[[package]] +name = "nvidia-cuda-cupti-cu12" +version = "12.1.105" +description = "CUDA profiling tools runtime libs." +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and sys_platform != \"darwin\"" +files = [ + {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:e54fde3983165c624cb79254ae9818a456eb6e87a7fd4d56a2352c24ee542d7e"}, + {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:bea8236d13a0ac7190bd2919c3e8e6ce1e402104276e6f9694479e48bb0eb2a4"}, +] + [[package]] name = "nvidia-cuda-cupti-cu12" version = "12.4.127" @@ -1562,6 +1588,19 @@ files = [ {file = "nvidia_cuda_cupti_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:5688d203301ab051449a2b1cb6690fbe90d2b372f411521c86018b950f3d7922"}, ] +[[package]] +name = "nvidia-cuda-nvrtc-cu12" +version = "12.1.105" +description = "NVRTC native runtime libraries" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and sys_platform != \"darwin\"" +files = [ + {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:339b385f50c309763ca65456ec75e17bbefcbbf2893f462cb8b90584cd27a1c2"}, + {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:0a98a522d9ff138b96c010a65e145dc1b4850e9ecb75a0172371793752fd46ed"}, +] + [[package]] name = "nvidia-cuda-nvrtc-cu12" version = "12.4.127" @@ -1576,6 +1615,19 @@ files = [ {file = "nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:a961b2f1d5f17b14867c619ceb99ef6fcec12e46612711bcec78eb05068a60ec"}, ] +[[package]] +name = "nvidia-cuda-runtime-cu12" +version = "12.1.105" +description = "CUDA Runtime native Libraries" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and sys_platform != \"darwin\"" +files = [ + {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:6e258468ddf5796e25f1dc591a31029fa317d97a0a94ed93468fc86301d61e40"}, + {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:dfb46ef84d73fababab44cf03e3b83f80700d27ca300e537f85f636fac474344"}, +] + [[package]] name = "nvidia-cuda-runtime-cu12" version = "12.4.127" @@ -1606,6 +1658,19 @@ files = [ [package.dependencies] nvidia-cublas-cu12 = "*" +[[package]] +name = "nvidia-cufft-cu12" +version = "11.0.2.54" +description = "CUFFT native runtime libraries" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and sys_platform != \"darwin\"" +files = [ + {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl", hash = "sha256:794e3948a1aa71fd817c3775866943936774d1c14e7628c74f6f7417224cdf56"}, + {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-win_amd64.whl", hash = "sha256:d9ac353f78ff89951da4af698f80870b1534ed69993f10a4cf1d96f21357e253"}, +] + [[package]] name = "nvidia-cufft-cu12" version = "11.2.1.3" @@ -1623,6 +1688,19 @@ files = [ [package.dependencies] nvidia-nvjitlink-cu12 = "*" +[[package]] +name = "nvidia-curand-cu12" +version = "10.3.2.106" +description = "CURAND native runtime libraries" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and sys_platform != \"darwin\"" +files = [ + {file = "nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:9d264c5036dde4e64f1de8c50ae753237c12e0b1348738169cd0f8a536c0e1e0"}, + {file = "nvidia_curand_cu12-10.3.2.106-py3-none-win_amd64.whl", hash = "sha256:75b6b0c574c0037839121317e17fd01f8a69fd2ef8e25853d826fec30bdba74a"}, +] + [[package]] name = "nvidia-curand-cu12" version = "10.3.5.147" @@ -1637,6 +1715,24 @@ files = [ {file = "nvidia_curand_cu12-10.3.5.147-py3-none-win_amd64.whl", hash = "sha256:f307cc191f96efe9e8f05a87096abc20d08845a841889ef78cb06924437f6771"}, ] +[[package]] +name = "nvidia-cusolver-cu12" +version = "11.4.5.107" +description = "CUDA solver native runtime libraries" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and sys_platform != \"darwin\"" +files = [ + {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl", hash = "sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd"}, + {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-win_amd64.whl", hash = "sha256:74e0c3a24c78612192a74fcd90dd117f1cf21dea4822e66d89e8ea80e3cd2da5"}, +] + +[package.dependencies] +nvidia-cublas-cu12 = "*" +nvidia-cusparse-cu12 = "*" +nvidia-nvjitlink-cu12 = "*" + [[package]] name = "nvidia-cusolver-cu12" version = "11.6.1.9" @@ -1656,6 +1752,22 @@ nvidia-cublas-cu12 = "*" nvidia-cusparse-cu12 = "*" nvidia-nvjitlink-cu12 = "*" +[[package]] +name = "nvidia-cusparse-cu12" +version = "12.1.0.106" +description = "CUSPARSE native runtime libraries" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and sys_platform != \"darwin\"" +files = [ + {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c"}, + {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-win_amd64.whl", hash = "sha256:b798237e81b9719373e8fae8d4f091b70a0cf09d9d85c95a557e11df2d8e9a5a"}, +] + +[package.dependencies] +nvidia-nvjitlink-cu12 = "*" + [[package]] name = "nvidia-cusparse-cu12" version = "12.3.1.170" @@ -1713,6 +1825,33 @@ files = [ {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:fd9020c501d27d135f983c6d3e244b197a7ccad769e34df53a42e276b0e25fa1"}, ] +[[package]] +name = "nvidia-nvjitlink-cu12" +version = "12.8.61" +description = "Nvidia JIT LTO Library" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and sys_platform != \"darwin\"" +files = [ + {file = "nvidia_nvjitlink_cu12-12.8.61-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:45fd79f2ae20bd67e8bc411055939049873bfd8fac70ff13bd4865e0b9bdab17"}, + {file = "nvidia_nvjitlink_cu12-12.8.61-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9b80ecab31085dda3ce3b41d043be0ec739216c3fc633b8abe212d5a30026df0"}, + {file = "nvidia_nvjitlink_cu12-12.8.61-py3-none-win_amd64.whl", hash = "sha256:1166a964d25fdc0eae497574d38824305195a5283324a21ccb0ce0c802cbf41c"}, +] + +[[package]] +name = "nvidia-nvtx-cu12" +version = "12.1.105" +description = "NVIDIA Tools Extension" +optional = false +python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and sys_platform != \"darwin\"" +files = [ + {file = "nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:dc21cf308ca5691e7c04d962e213f8a4aa9bbfa23d95412f452254c2caeb09e5"}, + {file = "nvidia_nvtx_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:65f4d98982b31b60026e0e6de73fbdfc09d08a96f4656dd3665ca616a11e1e82"}, +] + [[package]] name = "nvidia-nvtx-cu12" version = "12.4.127" @@ -3229,6 +3368,56 @@ files = [ {file = "toolz-1.0.0.tar.gz", hash = "sha256:2c86e3d9a04798ac556793bced838816296a2f085017664e4995cb40a1047a02"}, ] +[[package]] +name = "torch" +version = "2.5.1+cu121" +description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" +optional = false +python-versions = ">=3.8.0" +groups = ["main"] +markers = "sys_platform != \"darwin\"" +files = [ + {file = "torch-2.5.1+cu121-cp310-cp310-linux_x86_64.whl", hash = "sha256:92af92c569de5da937dd1afb45ecfdd598ec1254cf2e49e3d698cb24d71aae14"}, + {file = "torch-2.5.1+cu121-cp310-cp310-win_amd64.whl", hash = "sha256:9b22d6d98aa56f9317902dec0e066814a6edba1aada90110ceea2bb0678df22f"}, + {file = "torch-2.5.1+cu121-cp311-cp311-linux_x86_64.whl", hash = "sha256:c8ab8c92eab928a93c483f83ca8c63f13dafc10fc93ad90ed2dcb7c82ea50410"}, + {file = "torch-2.5.1+cu121-cp311-cp311-win_amd64.whl", hash = "sha256:4bcee18f00c43c815efad8efaa3bca584ffdc8d2cd35ef4c44c814f2739d9191"}, + {file = "torch-2.5.1+cu121-cp312-cp312-linux_x86_64.whl", hash = "sha256:222be02548c2e74a21a8fbc8e5b8d2eef9f9faee865d70385d2eb1b9aabcbc76"}, + {file = "torch-2.5.1+cu121-cp312-cp312-win_amd64.whl", hash = "sha256:473d76257636c66b22cbfac6f616d6b522ef3d3473c13decb1afda22a7b059eb"}, + {file = "torch-2.5.1+cu121-cp313-cp313-linux_x86_64.whl", hash = "sha256:1bfe18b79b0ff9be9383257a66c3f84621ce5f384f02c0a7c79503583d6ffd4b"}, + {file = "torch-2.5.1+cu121-cp39-cp39-linux_x86_64.whl", hash = "sha256:3c96b2ec4723e7d97259964ee73e2d6a2bace42511a49005b083ea7be1a0b0ac"}, + {file = "torch-2.5.1+cu121-cp39-cp39-win_amd64.whl", hash = "sha256:dc4249c520a6e9b1555e46bd70586a7cf33012800a51acb58a0c51464e3a786a"}, +] + +[package.dependencies] +filelock = "*" +fsspec = "*" +jinja2 = "*" +networkx = "*" +nvidia-cublas-cu12 = {version = "12.1.3.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-cupti-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-nvrtc-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-runtime-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cudnn-cu12 = {version = "9.1.0.70", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cufft-cu12 = {version = "11.0.2.54", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-curand-cu12 = {version = "10.3.2.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusolver-cu12 = {version = "11.4.5.107", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusparse-cu12 = {version = "12.1.0.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nccl-cu12 = {version = "2.21.5", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nvtx-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +setuptools = {version = "*", markers = "python_version >= \"3.12\""} +sympy = {version = "1.13.1", markers = "python_version >= \"3.9\""} +triton = {version = "3.1.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.13\""} +typing-extensions = ">=4.8.0" + +[package.extras] +opt-einsum = ["opt-einsum (>=3.3)"] +optree = ["optree (>=0.12.0)"] + +[package.source] +type = "legacy" +url = "https://download.pytorch.org/whl/cu121" +reference = "pytorch-cuda" + [[package]] name = "torch" version = "2.6.0" @@ -3286,6 +3475,52 @@ typing-extensions = ">=4.10.0" opt-einsum = ["opt-einsum (>=3.3)"] optree = ["optree (>=0.13.0)"] +[[package]] +name = "torch" +version = "2.6.0+cpu" +description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" +optional = false +python-versions = ">=3.9.0" +groups = ["main"] +markers = "sys_platform != \"darwin\"" +files = [ + {file = "torch-2.6.0+cpu-cp310-cp310-linux_x86_64.whl", hash = "sha256:35a9e78b7e4096968b54c1a198687b981569c50ae93e661aa430f9fd208da102"}, + {file = "torch-2.6.0+cpu-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:90832f4d118c566b8652a2196ac695fc1f14cf420db27b5a1b41c7eaaf2141e9"}, + {file = "torch-2.6.0+cpu-cp310-cp310-win_amd64.whl", hash = "sha256:6e22f0b13db8d53e55bcb3b46c9dd4b6676d1c44051b56753e745cec3075b333"}, + {file = "torch-2.6.0+cpu-cp311-cp311-linux_x86_64.whl", hash = "sha256:5b6ae523bfb67088a17ca7734d131548a2e60346c622621e4248ed09dd0790cc"}, + {file = "torch-2.6.0+cpu-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:d3dab9fb0294f268aec28e8aaba834e9d006b90a50db5bc2fe2191a9d48c6084"}, + {file = "torch-2.6.0+cpu-cp311-cp311-win_amd64.whl", hash = "sha256:24c9d3d13b9ea769dd7bd5c11cfa1fc463fd7391397156565484565ca685d908"}, + {file = "torch-2.6.0+cpu-cp312-cp312-linux_x86_64.whl", hash = "sha256:59e78aa0c690f70734e42670036d6b541930b8eabbaa18d94e090abf14cc4d91"}, + {file = "torch-2.6.0+cpu-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:318290e8924353c61b125cdc8768d15208704e279e7757c113b9620740deca98"}, + {file = "torch-2.6.0+cpu-cp312-cp312-win_amd64.whl", hash = "sha256:4027d982eb2781c93825ab9527f17fbbb12dbabf422298e4b954be60016f87d8"}, + {file = "torch-2.6.0+cpu-cp313-cp313-linux_x86_64.whl", hash = "sha256:e70ee2e37ad27a90201d101a41c2e10df7cf15a9ebd17c084f54cf2518c57bdf"}, + {file = "torch-2.6.0+cpu-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:b5e7e8d561b263b5ad8049736281cd12c78e51e7bc1a913fd4098fd0e0b96347"}, + {file = "torch-2.6.0+cpu-cp313-cp313-win_amd64.whl", hash = "sha256:b436a6c62d086dc5b32f5721b59f0ca8ad3bf9de09ee9b5b83dbf1e7a7e22c60"}, + {file = "torch-2.6.0+cpu-cp313-cp313t-linux_x86_64.whl", hash = "sha256:fb34d6cc4e6e20e66d74852c3d84e0301dc5e1a7c822076ef288886f978390f0"}, + {file = "torch-2.6.0+cpu-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:7cac05af909ee1c5c2915e8f3efaa1ea015e7e414be0ff53071402b9e4f3c7df"}, + {file = "torch-2.6.0+cpu-cp39-cp39-linux_x86_64.whl", hash = "sha256:b68274aeb4047ba8c73e903f0621e2a4adb54ad5282b0845689c3e1dcd2e2546"}, + {file = "torch-2.6.0+cpu-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:2ab9c6b3d6eea506bda9b82a0155e974d8ef8e38b417589d144568b4fa59afe1"}, + {file = "torch-2.6.0+cpu-cp39-cp39-win_amd64.whl", hash = "sha256:e4a85b58ed455915ee66809ca45e0190a76d652d7e6210b72f53a0219459613b"}, +] + +[package.dependencies] +filelock = "*" +fsspec = "*" +jinja2 = "*" +networkx = "*" +setuptools = {version = "*", markers = "python_version >= \"3.12\""} +sympy = {version = "1.13.1", markers = "python_version >= \"3.9\""} +typing-extensions = ">=4.10.0" + +[package.extras] +opt-einsum = ["opt-einsum (>=3.3)"] +optree = ["optree (>=0.13.0)"] + +[package.source] +type = "legacy" +url = "https://download.pytorch.org/whl/cpu" +reference = "pytorch-cpu" + [[package]] name = "tqdm" version = "4.67.1" @@ -3308,6 +3543,30 @@ notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] +[[package]] +name = "triton" +version = "3.1.0" +description = "A language and compiler for custom Deep Learning operations" +optional = false +python-versions = "*" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.13\" and sys_platform != \"darwin\"" +files = [ + {file = "triton-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b0dd10a925263abbe9fa37dcde67a5e9b2383fc269fdf59f5657cac38c5d1d8"}, + {file = "triton-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f34f6e7885d1bf0eaaf7ba875a5f0ce6f3c13ba98f9503651c1e6dc6757ed5c"}, + {file = "triton-3.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8182f42fd8080a7d39d666814fa36c5e30cc00ea7eeeb1a2983dbb4c99a0fdc"}, + {file = "triton-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dadaca7fc24de34e180271b5cf864c16755702e9f63a16f62df714a8099126a"}, + {file = "triton-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aafa9a20cd0d9fee523cd4504aa7131807a864cd77dcf6efe7e981f18b8c6c11"}, +] + +[package.dependencies] +filelock = "*" + +[package.extras] +build = ["cmake (>=3.20)", "lit"] +tests = ["autopep8", "flake8", "isort", "llnl-hatchet", "numpy", "pytest", "scipy (>=1.7.1)"] +tutorials = ["matplotlib", "pandas", "tabulate"] + [[package]] name = "triton" version = "3.2.0" @@ -3457,10 +3716,12 @@ test = ["big-O", "importlib-resources ; python_version < \"3.9\"", "jaraco.funct type = ["pytest-mypy"] [extras] +cpu = ["torch"] +cuda = ["torch"] docs = ["sphinx-astropy"] test = ["coverage", "pytest", "pytest-astropy"] [metadata] lock-version = "2.1" python-versions = ">=3.10,<4" -content-hash = "2f43f767ade1411dd7a09c29445c011c23c4ca0a8be07777be7fd0d7df93b829" +content-hash = "ef9f01001f56986cc10ee36b02bc44ae2cd344397d0a66e4e5a36c8e46007d9d" diff --git a/pyproject.toml b/pyproject.toml index 2629e0f0c..affe51411 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -58,23 +58,36 @@ test = [ docs = [ "sphinx-astropy" ] +cpu = ["torch"] +cuda = ["torch"] [project.urls] "Source" = "https://github.com/lcogt/banzai" "Docs" = "https://banzai.readthedocs.io/en/latest/" + [tool.poetry] packages = [ { include = "banzai" } ] +[tool.poetry.dependencies] +torch = [ + { version = "^2.3", source = "pypi", markers = "sys_platform=='darwin'" }, + { version = "^2.3", source = "pytorch-cpu", markers = "sys_platform!='darwin' and extra!='cuda'" }, + { version = "^2.3", source = "pytorch-cuda", markers = "sys_platform!='darwin' and extra=='cuda'" } +] + + [[tool.poetry.source]] -name = "pytorch_cpu" -url = "https://download.pytorch.org/whl/cpu" -priority = "explicit" + name = "pytorch-cuda" + priority = "explicit" + url = "https://download.pytorch.org/whl/cu121" -[tool.poetry.dependencies] -torch = { source = "pytorch_cpu" } +[[tool.poetry.source]] + name = "pytorch-cpu" + priority = "explicit" + url = "https://download.pytorch.org/whl/cpu" [tool.setuptools.packages.find] include = ["banzai*"] From efc633e59275e1107826e0b7d6eb7697ba795a6b Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Fri, 21 Feb 2025 19:29:55 -0500 Subject: [PATCH 10/46] Removed tox. Poetry now manages all deps and the matrix stuff is all GH actions. --- .github/workflows/codestyle.yaml | 24 +++++ .github/workflows/coverage.yaml | 24 +++++ .github/workflows/docs.yaml | 25 +++++ .github/workflows/e2e.yaml | 8 +- .github/workflows/unit-tests.yml | 82 +++++----------- Dockerfile | 2 +- banzai/tests/e2e-k8s.yaml | 7 +- .../templates/db-instrument-update.yaml | 1 + helm-chart/banzai/templates/listener.yaml | 5 + .../banzai/templates/workers-large.yaml | 1 + helm-chart/banzai/templates/workers.yaml | 1 + pyproject.toml | 1 + tox.ini | 94 ------------------- 13 files changed, 118 insertions(+), 157 deletions(-) create mode 100644 .github/workflows/codestyle.yaml create mode 100644 .github/workflows/coverage.yaml create mode 100644 .github/workflows/docs.yaml delete mode 100644 tox.ini diff --git a/.github/workflows/codestyle.yaml b/.github/workflows/codestyle.yaml new file mode 100644 index 000000000..ceb97cd26 --- /dev/null +++ b/.github/workflows/codestyle.yaml @@ -0,0 +1,24 @@ +name: Python CI + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + build: + runs-on: ubuntu-latest # Or macos-latest if needed + + steps: + - uses: actions/checkout@v3 + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.12' # Specify your desired version + - name: Install Poetry + run: pip install poetry + - name: Set up project + run: poetry install -E cpu -E style + - name: Code Style + run: poetry pycodestyle banzai --count --max-line-length=120 diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml new file mode 100644 index 000000000..2324e0904 --- /dev/null +++ b/.github/workflows/coverage.yaml @@ -0,0 +1,24 @@ +name: Python CI + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + build: + runs-on: ubuntu-latest # Or macos-latest if needed + + steps: + - uses: actions/checkout@v3 + - name: Set up + uses: actions/setup-python@v4 + with: + python-version: '3.12' # Specify your desired version + - name: Install Poetry + run: pip install poetry + - name: Set up project + run: poetry install -E cpu -E test + - name: Run coverage + run: poetry run --with test pytest --pyargs banzai.tests --cov banzai --cov-config="setup.cfg" diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml new file mode 100644 index 000000000..472199c1a --- /dev/null +++ b/.github/workflows/docs.yaml @@ -0,0 +1,25 @@ +name: Python CI + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + build: + runs-on: ubuntu-latest # Or macos-latest if needed + + steps: + - uses: actions/checkout@v3 + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.12' # Specify your desired version + - name: Install dependencies + run: pip install poetry + - name: Set up project + run: poetry install -E cpu -E test + - name: Build Docs + run: poetry sphinx-build -W -b html . _build/html + \ No newline at end of file diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index b0e45f348..318a6c597 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -48,7 +48,7 @@ jobs: set +e export START=$(date -u +'%Y-%m-%dT%H:%M:%SZ') - kubectl exec banzai-e2e-test -c banzai-listener -- pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-master-bias.xml -m master_bias + kubectl exec banzai-e2e-test -c banzai-listener -- poetry pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-master-bias.xml -m master_bias EXIT_CODE=$? # Always print logs even if (especially if?) the reduction fails @@ -62,7 +62,7 @@ jobs: set +e export START=$(date -u +'%Y-%m-%dT%H:%M:%SZ') - kubectl exec banzai-e2e-test -c banzai-listener -- pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-master-dark.xml -m master_dark + kubectl exec banzai-e2e-test -c banzai-listener -- poetry pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-master-dark.xml -m master_dark EXIT_CODE=$? # Always print logs even if (especially if?) the reduction fails @@ -76,7 +76,7 @@ jobs: set +e export START=$(date -u +'%Y-%m-%dT%H:%M:%SZ') - kubectl exec banzai-e2e-test -c banzai-listener -- pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-master-flat.xml -m master_flat + kubectl exec banzai-e2e-test -c banzai-listener -- poetry pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-master-flat.xml -m master_flat EXIT_CODE=$? # Always print logs even if (especially if?) the reduction fails @@ -90,7 +90,7 @@ jobs: set +e export START=$(date -u +'%Y-%m-%dT%H:%M:%SZ') - kubectl exec banzai-e2e-test -c banzai-listener -- pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-science-files.xml -m science_files + kubectl exec banzai-e2e-test -c banzai-listener -- poetry pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-science-files.xml -m science_files EXIT_CODE=$? # Always print logs even if (especially if?) the reduction fails diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index 0585afa43..4d463b28d 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -1,68 +1,38 @@ name: Build/Test on: - # Run this workflow for pushes on all branches push: + branches: [main] + pull_request: + branches: [main] jobs: - tests: - name: ${{ matrix.name }} (${{ matrix.os }}, ${{ matrix.toxenv }}) - runs-on: ${{ matrix.os }} + test: strategy: - fail-fast: false matrix: + os: [ ubuntu-latest, macos-latest ] + python-version: ['3.10', '3.11', '3.12', '3.13'] include: - - - name: Documentation build - os: ubuntu-latest - python-version: 3.12 - toxenv: build_docs - - - name: Python 3.12 with minimal dependencies - os: ubuntu-latest - python-version: '3.12' - toxenv: py12-test - - - name: Python 3.10 with minimal dependencies - os: ubuntu-latest - python-version: '3.10' - toxenv: py310-test - - - name: Python 3.11 with minimal dependencies - os: ubuntu-latest - python-version: '3.11' - toxenv: py311-test - - - name: Python 3.12 with minimal dependencies - os: ubuntu-latest + - os: ubuntu-latest python-version: '3.10' - toxenv: py310-test - - - name: Python 3.13 with minimal dependencies - os: ubuntu-latest + - os: ubuntu-latest python-version: '3.11' - toxenv: py311-test - - - name: Code style checks - os: ubuntu-latest - python-version: 3.12 - toxenv: codestyle - + - os: ubuntu-latest + python-version: '3.12' + - os: ubuntu-latest + python-version: '3.13' + - os: macos-latest + python-version: '3.12' + + runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v2 - with: - fetch-depth: 0 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 - with: - python-version: ${{ matrix.python-version }} - - name: Install dependencies - run: | - python -m pip install --upgrade pip - python -m pip install tox - - name: Install graphviz dependency - if: "endsWith(matrix.toxenv, 'build_docs')" - run: sudo apt-get -y install graphviz - - name: Run tests - run: | - tox -e ${{ matrix.toxenv }} + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + - name: Install Poetry + run: pip install poetry + - name: Set up project + run: poetry install -E cpu -E test + - name: Run tests + run: poetry run --with test pytest --pyargs banzai.tests -m "not e2e" diff --git a/Dockerfile b/Dockerfile index 736991df5..a73e4de58 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,7 +16,7 @@ RUN poetry install --directory=/lco/banzai -E cpu --no-root --no-cache COPY . /lco/banzai -RUN poetry install --directory /lco/banzai --no-cache +RUN poetry install --directory /lco/banzai -E cpu --no-cache USER archive diff --git a/banzai/tests/e2e-k8s.yaml b/banzai/tests/e2e-k8s.yaml index a1350c7ab..0c5583bd6 100644 --- a/banzai/tests/e2e-k8s.yaml +++ b/banzai/tests/e2e-k8s.yaml @@ -85,6 +85,7 @@ spec: - name: REFERENCE_CATALOG_URL value: "http://phot-catalog.lco.gtn/" command: + - poetry - celery - -A - banzai @@ -104,7 +105,7 @@ spec: command: - /bin/sh - -c - - "celery -A banzai status | grep -q '@celery-worker:.*OK'" + - "poetry celery -A banzai status | grep -q '@celery-worker:.*OK'" initialDelaySeconds: 5 periodSeconds: 1 timeoutSeconds: 10 @@ -149,6 +150,7 @@ spec: - name: REFERENCE_CATALOG_URL value: "http://phot-catalog.lco.gtn/" command: + - poetry - celery - -A - banzai @@ -168,7 +170,7 @@ spec: command: - /bin/sh - -c - - 'celery -A banzai status | grep -q "large-celery-worker:.*OK"' + - 'poetry celery -A banzai status | grep -q "large-celery-worker:.*OK"' initialDelaySeconds: 5 periodSeconds: 1 timeoutSeconds: 10 @@ -211,6 +213,7 @@ spec: - name: "CELERY_LARGE_TASK_QUEUE_NAME" value: "e2e_large_task_queue" command: + - poetry - banzai_run_realtime_pipeline - --db-address=$(DB_ADDRESS) - --fpack diff --git a/helm-chart/banzai/templates/db-instrument-update.yaml b/helm-chart/banzai/templates/db-instrument-update.yaml index 710662673..6d3ecac2b 100644 --- a/helm-chart/banzai/templates/db-instrument-update.yaml +++ b/helm-chart/banzai/templates/db-instrument-update.yaml @@ -39,6 +39,7 @@ spec: cpu: "1" memory: "1Gi" command: + - "poetry" - "banzai_update_db" - "--db-address=$(DB_ADDRESS)" - "--configdb-address=$(CONFIGDB_URL)" diff --git a/helm-chart/banzai/templates/listener.yaml b/helm-chart/banzai/templates/listener.yaml index 866ffaaa0..51f1a895a 100644 --- a/helm-chart/banzai/templates/listener.yaml +++ b/helm-chart/banzai/templates/listener.yaml @@ -33,6 +33,7 @@ spec: securityContext: {{- toYaml .Values.securityContext | nindent 12 }} command: + - "poetry" - "banzai_create_db" - "--db-address=$(DB_ADDRESS)" # Populate the instruments table @@ -52,6 +53,7 @@ spec: securityContext: {{- toYaml .Values.securityContext | nindent 12 }} command: + - "poetry" - "banzai_update_db" - "--db-address=$(DB_ADDRESS)" - "--configdb-address={{ .Values.configdb_url }}" @@ -71,6 +73,7 @@ spec: securityContext: {{- toYaml .Values.securityContext | nindent 12 }} command: + - "poetry" - "banzai_populate_bpms" - "--db-address=$(DB_ADDRESS)" # create the db if it doesn't exist and populate the bpms in the db. @@ -91,6 +94,7 @@ spec: securityContext: {{- toYaml .Values.securityContext | nindent 12 }} command: + - "poetry" - "banzai_run_realtime_pipeline" - "--post-to-archive" - "--post-to-opensearch" @@ -121,6 +125,7 @@ spec: securityContext: {{- toYaml .Values.securityContext | nindent 12 }} command: + - "poetry" - "banzai_automate_stack_calibrations" - "--post-to-archive" - "--post-to-opensearch" diff --git a/helm-chart/banzai/templates/workers-large.yaml b/helm-chart/banzai/templates/workers-large.yaml index 9e0f88e3c..de7d16241 100644 --- a/helm-chart/banzai/templates/workers-large.yaml +++ b/helm-chart/banzai/templates/workers-large.yaml @@ -31,6 +31,7 @@ spec: securityContext: {{- toYaml .Values.securityContext | nindent 12 }} command: + - "poetry" - "celery" - "-A" - "banzai" diff --git a/helm-chart/banzai/templates/workers.yaml b/helm-chart/banzai/templates/workers.yaml index bce385533..a588ba8f5 100644 --- a/helm-chart/banzai/templates/workers.yaml +++ b/helm-chart/banzai/templates/workers.yaml @@ -31,6 +31,7 @@ spec: securityContext: {{- toYaml .Values.securityContext | nindent 12 }} command: + - "poetry" - "celery" - "-A" - "banzai" diff --git a/pyproject.toml b/pyproject.toml index affe51411..1a5dab6d9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -60,6 +60,7 @@ docs = [ ] cpu = ["torch"] cuda = ["torch"] +style = ["pycodestyle"] [project.urls] "Source" = "https://github.com/lcogt/banzai" diff --git a/tox.ini b/tox.ini deleted file mode 100644 index c32bd7277..000000000 --- a/tox.ini +++ /dev/null @@ -1,94 +0,0 @@ -[tox] -envlist = - py{310,311,312,313}-test{,-alldeps}{,-cov} - py{310,311,312,313}-test-numpy{124,125,126,20,21} - py{310,311,312,313}-test-astropy{43,53,61,70} - build_docs - linkcheck - codestyle -requires = - setuptools >= 30.3.0 - pip >= 19.3.1 - extension_helpers -isolated_build = true - -[testenv] -# Pass through the following environment variables which may be needed for the CI -passenv = HOME,WINDIR,LC_ALL,LC_CTYPE,CC,CI,TRAVIS - -# Run the tests in a temporary directory to make sure that we don't import -# this package from the source tree -changedir = .tmp/{envname} - -# tox environments are constructed with so-called 'factors' (or terms) -# separated by hyphens, e.g. test-devdeps-cov. Lines below starting with factor: -# will only take effect if that factor is included in the environment name. To -# see a list of example environments that can be run, along with a description, -# run: -# -# tox -l -v -# -description = - run tests - alldeps: with all optional dependencies - devdeps: with the latest developer version of key dependencies - oldestdeps: with the oldest supported version of key dependencies - cov: and test coverage - numpy124: with numpy 1.24.* - numpy125: with numpy 1.24.* - numpy126: with numpy 1.24.* - numpy20: with numpy 2.0.* - numpy21: with numpy 2.1.* - astropy43: with astropy 4.3.* - astropy53: with astropy 5.3.* - astropy43: with astropy 6.1.* - astropy43: with astropy 7.0.* - -# The following provides some specific pinnings for key packages -deps = - numpy124: numpy==1.24.* - numpy125: numpy==1.25.* - numpy126: numpy==1.26.* - numpy20: numpy==2.0.* - numpy21: numpy==2.1.* - - astropy43: astropy==4.3.* - astropy53: astropy==5.3.* - astropy61: astropy==6.1.* - astropy70: astropy==7.0.* - -# The following indicates which extras_require from setup.cfg will be installed -extras = - test - alldeps: all - -commands = - pip freeze - !cov: pytest --pyargs banzai.tests -m "not e2e" "{toxinidir}/docs" {posargs} - cov: pytest --pyargs banzai.tests "{toxinidir}/docs" --cov banzai --cov-config="{toxinidir}/setup.cfg" {posargs} - -[testenv:build_docs] -changedir = docs -description = invoke sphinx-build to build the HTML docs -extras = docs -commands = - pip freeze - sphinx-build -W -b html . _build/html - -[testenv:linkcheck] -changedir = docs -description = check the links in the HTML docs -extras = docs -commands = - pip freeze - sphinx-build -W -b linkcheck . _build/html - -[testenv:codestyle] -skip_install = true -changedir = . -description = check code style, e.g. with pycodestyle -deps = pycodestyle -commands = pycodestyle banzai --count - -[flake8] -max-line-length = 120 From 1f4d10c291c0b0c7ba000917fc129fcb11837e90 Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Fri, 21 Feb 2025 19:34:00 -0500 Subject: [PATCH 11/46] Updated poetry.lock. --- poetry.lock | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/poetry.lock b/poetry.lock index 9a6a1fdab..4d70a1b0f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -245,18 +245,18 @@ files = [ [[package]] name = "boto3" -version = "1.36.25" +version = "1.36.26" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "boto3-1.36.25-py3-none-any.whl", hash = "sha256:41fb90a516995946563ec91b9d891e2516c58617e9556d5e86dfa62da3fdebe6"}, - {file = "boto3-1.36.25.tar.gz", hash = "sha256:a057c19adffb48737c192bdb10f9d85e0d9dcecd21327f51520c15db9022a835"}, + {file = "boto3-1.36.26-py3-none-any.whl", hash = "sha256:f67d014a7c5a3cd540606d64d7cb9eec3600cf42acab1ac0518df9751ae115e2"}, + {file = "boto3-1.36.26.tar.gz", hash = "sha256:523b69457eee55ac15aa707c0e768b2a45ca1521f95b2442931090633ec72458"}, ] [package.dependencies] -botocore = ">=1.36.25,<1.37.0" +botocore = ">=1.36.26,<1.37.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.11.0,<0.12.0" @@ -265,14 +265,14 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.36.25" +version = "1.36.26" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "botocore-1.36.25-py3-none-any.whl", hash = "sha256:04c8ff03531e8d92baa8c98d1850bdf01668a805467f4222b65e5325f94aa8af"}, - {file = "botocore-1.36.25.tar.gz", hash = "sha256:3b0a857d2621c336fb82a36cb6da4b6e062d346451ac46d110b074e5e5fd7cfc"}, + {file = "botocore-1.36.26-py3-none-any.whl", hash = "sha256:4e3f19913887a58502e71ef8d696fe7eaa54de7813ff73390cd5883f837dfa6e"}, + {file = "botocore-1.36.26.tar.gz", hash = "sha256:4a63bcef7ecf6146fd3a61dc4f9b33b7473b49bdaf1770e9aaca6eee0c9eab62"}, ] [package.dependencies] @@ -2268,6 +2268,19 @@ files = [ {file = "psycopg2_binary-2.9.10-cp39-cp39-win_amd64.whl", hash = "sha256:30e34c4e97964805f715206c7b789d54a78b70f3ff19fbe590104b71c45600e5"}, ] +[[package]] +name = "pycodestyle" +version = "2.12.1" +description = "Python style guide checker" +optional = true +python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"style\"" +files = [ + {file = "pycodestyle-2.12.1-py2.py3-none-any.whl", hash = "sha256:46f0fb92069a7c28ab7bb558f05bfc0110dac69a0cd23c61ea0040283a9d78b3"}, + {file = "pycodestyle-2.12.1.tar.gz", hash = "sha256:6838eae08bbce4f6accd5d5572075c63626a15ee3e6f842df996bf62f6d73521"}, +] + [[package]] name = "pyerfa" version = "2.0.1.5" @@ -3719,9 +3732,10 @@ type = ["pytest-mypy"] cpu = ["torch"] cuda = ["torch"] docs = ["sphinx-astropy"] +style = ["pycodestyle"] test = ["coverage", "pytest", "pytest-astropy"] [metadata] lock-version = "2.1" python-versions = ">=3.10,<4" -content-hash = "ef9f01001f56986cc10ee36b02bc44ae2cd344397d0a66e4e5a36c8e46007d9d" +content-hash = "59b58f1ab5a805c7c2b124f18f8958949564b0ab6a08b68bb422144ce2e6454e" From 22b46b4888ab8c08d905911f0d8faf3545acbb6b Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Fri, 21 Feb 2025 19:39:28 -0500 Subject: [PATCH 12/46] More github actions fixes. --- .github/workflows/coverage.yaml | 2 +- .github/workflows/unit-tests.yml | 35 +++++++++++++++++--------------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml index 2324e0904..b643f5cbf 100644 --- a/.github/workflows/coverage.yaml +++ b/.github/workflows/coverage.yaml @@ -21,4 +21,4 @@ jobs: - name: Set up project run: poetry install -E cpu -E test - name: Run coverage - run: poetry run --with test pytest --pyargs banzai.tests --cov banzai --cov-config="setup.cfg" + run: poetry run pytest --pyargs banzai.tests --cov banzai --cov-config="setup.cfg" diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index 4d463b28d..4d9b56168 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -7,24 +7,11 @@ on: branches: [main] jobs: - test: + linuxtest: + runs-on: ubuntu-latest strategy: matrix: - os: [ ubuntu-latest, macos-latest ] python-version: ['3.10', '3.11', '3.12', '3.13'] - include: - - os: ubuntu-latest - python-version: '3.10' - - os: ubuntu-latest - python-version: '3.11' - - os: ubuntu-latest - python-version: '3.12' - - os: ubuntu-latest - python-version: '3.13' - - os: macos-latest - python-version: '3.12' - - runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v3 - uses: actions/setup-python@v4 @@ -35,4 +22,20 @@ jobs: - name: Set up project run: poetry install -E cpu -E test - name: Run tests - run: poetry run --with test pytest --pyargs banzai.tests -m "not e2e" + run: poetry run pytest --pyargs banzai.tests -m "not e2e" + macos: # New macOS job + runs-on: macos-latest + strategy: + matrix: + python-version: ['3.12'] + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + - name: Install Poetry + run: pip install poetry + - name: Set up project + run: poetry install -E cpu -E test + - name: Run tests + run: poetry run pytest --pyargs banzai.tests -m "not e2e" From fcd4b7e15b78de33ebdc8f0cf7afa940a562e73a Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Mon, 24 Feb 2025 12:00:34 -0500 Subject: [PATCH 13/46] More poetry fun to get cython to build. --- build.py | 36 +++++ ez_setup.py | 414 ------------------------------------------------- poetry.lock | 33 ++-- pyproject.toml | 10 +- setup.py | 76 --------- 5 files changed, 62 insertions(+), 507 deletions(-) create mode 100644 build.py delete mode 100644 ez_setup.py delete mode 100755 setup.py diff --git a/build.py b/build.py new file mode 100644 index 000000000..e694ef6de --- /dev/null +++ b/build.py @@ -0,0 +1,36 @@ +from __future__ import annotations + +import os +import shutil + +from pathlib import Path + +from extension_helpers import get_extensions +import os +from setuptools import Distribution +from setuptools.command.build_ext import build_ext + +def build() -> None: + ext_modules = get_extensions() + + distribution = Distribution({ + "name": "package", + "ext_modules": ext_modules + }) + cmd = build_ext(distribution) + cmd.ensure_finalized() + cmd.run() + + # Copy built extensions back to the project + for output in cmd.get_outputs(): + output = Path(output) + relative_extension = output.relative_to(cmd.build_lib) + + shutil.copyfile(output, relative_extension) + mode = os.stat(relative_extension).st_mode + mode |= (mode & 0o444) >> 2 + os.chmod(relative_extension, mode) + + +if __name__ == "__main__": + build() diff --git a/ez_setup.py b/ez_setup.py deleted file mode 100644 index 800c31ef6..000000000 --- a/ez_setup.py +++ /dev/null @@ -1,414 +0,0 @@ -#!/usr/bin/env python - -""" -Setuptools bootstrapping installer. - -Maintained at https://github.com/pypa/setuptools/tree/bootstrap. - -Run this script to install or upgrade setuptools. - -This method is DEPRECATED. Check https://github.com/pypa/setuptools/issues/581 for more details. -""" - -import os -import shutil -import sys -import tempfile -import zipfile -import optparse -import subprocess -import platform -import textwrap -import contextlib - -from distutils import log - -try: - from urllib.request import urlopen -except ImportError: - from urllib2 import urlopen - -try: - from site import USER_SITE -except ImportError: - USER_SITE = None - -# 33.1.1 is the last version that supports setuptools self upgrade/installation. -DEFAULT_VERSION = "33.1.1" -DEFAULT_URL = "https://pypi.io/packages/source/s/setuptools/" -DEFAULT_SAVE_DIR = os.curdir -DEFAULT_DEPRECATION_MESSAGE = "ez_setup.py is deprecated and when using it setuptools will be pinned to {0} since it's the last version that supports setuptools self upgrade/installation, check https://github.com/pypa/setuptools/issues/581 for more info; use pip to install setuptools" - -MEANINGFUL_INVALID_ZIP_ERR_MSG = 'Maybe {0} is corrupted, delete it and try again.' - -log.warn(DEFAULT_DEPRECATION_MESSAGE.format(DEFAULT_VERSION)) - - -def _python_cmd(*args): - """ - Execute a command. - - Return True if the command succeeded. - """ - args = (sys.executable,) + args - return subprocess.call(args) == 0 - - -def _install(archive_filename, install_args=()): - """Install Setuptools.""" - with archive_context(archive_filename): - # installing - log.warn('Installing Setuptools') - if not _python_cmd('setup.py', 'install', *install_args): - log.warn('Something went wrong during the installation.') - log.warn('See the error message above.') - # exitcode will be 2 - return 2 - - -def _build_egg(egg, archive_filename, to_dir): - """Build Setuptools egg.""" - with archive_context(archive_filename): - # building an egg - log.warn('Building a Setuptools egg in %s', to_dir) - _python_cmd('setup.py', '-q', 'bdist_egg', '--dist-dir', to_dir) - # returning the result - log.warn(egg) - if not os.path.exists(egg): - raise IOError('Could not build the egg.') - - -class ContextualZipFile(zipfile.ZipFile): - - """Supplement ZipFile class to support context manager for Python 2.6.""" - - def __enter__(self): - return self - - def __exit__(self, type, value, traceback): - self.close() - - def __new__(cls, *args, **kwargs): - """Construct a ZipFile or ContextualZipFile as appropriate.""" - if hasattr(zipfile.ZipFile, '__exit__'): - return zipfile.ZipFile(*args, **kwargs) - return super(ContextualZipFile, cls).__new__(cls) - - -@contextlib.contextmanager -def archive_context(filename): - """ - Unzip filename to a temporary directory, set to the cwd. - - The unzipped target is cleaned up after. - """ - tmpdir = tempfile.mkdtemp() - log.warn('Extracting in %s', tmpdir) - old_wd = os.getcwd() - try: - os.chdir(tmpdir) - try: - with ContextualZipFile(filename) as archive: - archive.extractall() - except zipfile.BadZipfile as err: - if not err.args: - err.args = ('', ) - err.args = err.args + ( - MEANINGFUL_INVALID_ZIP_ERR_MSG.format(filename), - ) - raise - - # going in the directory - subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0]) - os.chdir(subdir) - log.warn('Now working in %s', subdir) - yield - - finally: - os.chdir(old_wd) - shutil.rmtree(tmpdir) - - -def _do_download(version, download_base, to_dir, download_delay): - """Download Setuptools.""" - py_desig = 'py{sys.version_info[0]}.{sys.version_info[1]}'.format(sys=sys) - tp = 'setuptools-{version}-{py_desig}.egg' - egg = os.path.join(to_dir, tp.format(**locals())) - if not os.path.exists(egg): - archive = download_setuptools(version, download_base, - to_dir, download_delay) - _build_egg(egg, archive, to_dir) - sys.path.insert(0, egg) - - # Remove previously-imported pkg_resources if present (see - # https://bitbucket.org/pypa/setuptools/pull-request/7/ for details). - if 'pkg_resources' in sys.modules: - _unload_pkg_resources() - - import setuptools - setuptools.bootstrap_install_from = egg - - -def use_setuptools( - version=DEFAULT_VERSION, download_base=DEFAULT_URL, - to_dir=DEFAULT_SAVE_DIR, download_delay=15): - """ - Ensure that a setuptools version is installed. - - Return None. Raise SystemExit if the requested version - or later cannot be installed. - """ - to_dir = os.path.abspath(to_dir) - - # prior to importing, capture the module state for - # representative modules. - rep_modules = 'pkg_resources', 'setuptools' - imported = set(sys.modules).intersection(rep_modules) - - try: - import pkg_resources - pkg_resources.require("setuptools>=" + version) - # a suitable version is already installed - return - except ImportError: - # pkg_resources not available; setuptools is not installed; download - pass - except pkg_resources.DistributionNotFound: - # no version of setuptools was found; allow download - pass - except pkg_resources.VersionConflict as VC_err: - if imported: - _conflict_bail(VC_err, version) - - # otherwise, unload pkg_resources to allow the downloaded version to - # take precedence. - del pkg_resources - _unload_pkg_resources() - - return _do_download(version, download_base, to_dir, download_delay) - - -def _conflict_bail(VC_err, version): - """ - Setuptools was imported prior to invocation, so it is - unsafe to unload it. Bail out. - """ - conflict_tmpl = textwrap.dedent(""" - The required version of setuptools (>={version}) is not available, - and can't be installed while this script is running. Please - install a more recent version first, using - 'easy_install -U setuptools'. - - (Currently using {VC_err.args[0]!r}) - """) - msg = conflict_tmpl.format(**locals()) - sys.stderr.write(msg) - sys.exit(2) - - -def _unload_pkg_resources(): - sys.meta_path = [ - importer - for importer in sys.meta_path - if importer.__class__.__module__ != 'pkg_resources.extern' - ] - del_modules = [ - name for name in sys.modules - if name.startswith('pkg_resources') - ] - for mod_name in del_modules: - del sys.modules[mod_name] - - -def _clean_check(cmd, target): - """ - Run the command to download target. - - If the command fails, clean up before re-raising the error. - """ - try: - subprocess.check_call(cmd) - except subprocess.CalledProcessError: - if os.access(target, os.F_OK): - os.unlink(target) - raise - - -def download_file_powershell(url, target): - """ - Download the file at url to target using Powershell. - - Powershell will validate trust. - Raise an exception if the command cannot complete. - """ - target = os.path.abspath(target) - ps_cmd = ( - "[System.Net.WebRequest]::DefaultWebProxy.Credentials = " - "[System.Net.CredentialCache]::DefaultCredentials; " - '(new-object System.Net.WebClient).DownloadFile("%(url)s", "%(target)s")' - % locals() - ) - cmd = [ - 'powershell', - '-Command', - ps_cmd, - ] - _clean_check(cmd, target) - - -def has_powershell(): - """Determine if Powershell is available.""" - if platform.system() != 'Windows': - return False - cmd = ['powershell', '-Command', 'echo test'] - with open(os.path.devnull, 'wb') as devnull: - try: - subprocess.check_call(cmd, stdout=devnull, stderr=devnull) - except Exception: - return False - return True -download_file_powershell.viable = has_powershell - - -def download_file_curl(url, target): - cmd = ['curl', url, '--location', '--silent', '--output', target] - _clean_check(cmd, target) - - -def has_curl(): - cmd = ['curl', '--version'] - with open(os.path.devnull, 'wb') as devnull: - try: - subprocess.check_call(cmd, stdout=devnull, stderr=devnull) - except Exception: - return False - return True -download_file_curl.viable = has_curl - - -def download_file_wget(url, target): - cmd = ['wget', url, '--quiet', '--output-document', target] - _clean_check(cmd, target) - - -def has_wget(): - cmd = ['wget', '--version'] - with open(os.path.devnull, 'wb') as devnull: - try: - subprocess.check_call(cmd, stdout=devnull, stderr=devnull) - except Exception: - return False - return True -download_file_wget.viable = has_wget - - -def download_file_insecure(url, target): - """Use Python to download the file, without connection authentication.""" - src = urlopen(url) - try: - # Read all the data in one block. - data = src.read() - finally: - src.close() - - # Write all the data in one block to avoid creating a partial file. - with open(target, "wb") as dst: - dst.write(data) -download_file_insecure.viable = lambda: True - - -def get_best_downloader(): - downloaders = ( - download_file_powershell, - download_file_curl, - download_file_wget, - download_file_insecure, - ) - viable_downloaders = (dl for dl in downloaders if dl.viable()) - return next(viable_downloaders, None) - - -def download_setuptools( - version=DEFAULT_VERSION, download_base=DEFAULT_URL, - to_dir=DEFAULT_SAVE_DIR, delay=15, - downloader_factory=get_best_downloader): - """ - Download setuptools from a specified location and return its filename. - - `version` should be a valid setuptools version number that is available - as an sdist for download under the `download_base` URL (which should end - with a '/'). `to_dir` is the directory where the egg will be downloaded. - `delay` is the number of seconds to pause before an actual download - attempt. - - ``downloader_factory`` should be a function taking no arguments and - returning a function for downloading a URL to a target. - """ - # making sure we use the absolute path - to_dir = os.path.abspath(to_dir) - zip_name = "setuptools-%s.zip" % version - url = download_base + zip_name - saveto = os.path.join(to_dir, zip_name) - if not os.path.exists(saveto): # Avoid repeated downloads - log.warn("Downloading %s", url) - downloader = downloader_factory() - downloader(url, saveto) - return os.path.realpath(saveto) - - -def _build_install_args(options): - """ - Build the arguments to 'python setup.py install' on the setuptools package. - - Returns list of command line arguments. - """ - return ['--user'] if options.user_install else [] - - -def _parse_args(): - """Parse the command line for options.""" - parser = optparse.OptionParser() - parser.add_option( - '--user', dest='user_install', action='store_true', default=False, - help='install in user site package') - parser.add_option( - '--download-base', dest='download_base', metavar="URL", - default=DEFAULT_URL, - help='alternative URL from where to download the setuptools package') - parser.add_option( - '--insecure', dest='downloader_factory', action='store_const', - const=lambda: download_file_insecure, default=get_best_downloader, - help='Use internal, non-validating downloader' - ) - parser.add_option( - '--version', help="Specify which version to download", - default=DEFAULT_VERSION, - ) - parser.add_option( - '--to-dir', - help="Directory to save (and re-use) package", - default=DEFAULT_SAVE_DIR, - ) - options, args = parser.parse_args() - # positional arguments are ignored - return options - - -def _download_args(options): - """Return args for download_setuptools function from cmdline args.""" - return dict( - version=options.version, - download_base=options.download_base, - downloader_factory=options.downloader_factory, - to_dir=options.to_dir, - ) - - -def main(): - """Install or upgrade setuptools and EasyInstall.""" - options = _parse_args() - archive = download_setuptools(**_download_args(options)) - return _install(archive, _build_install_args(options)) - -if __name__ == '__main__': - sys.exit(main()) diff --git a/poetry.lock b/poetry.lock index 4d70a1b0f..e21c815c5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1030,15 +1030,15 @@ test = ["objgraph", "psutil"] [[package]] name = "hypothesis" -version = "6.126.0" +version = "6.127.1" description = "A library for property-based testing" optional = true python-versions = ">=3.9" groups = ["main"] markers = "extra == \"test\"" files = [ - {file = "hypothesis-6.126.0-py3-none-any.whl", hash = "sha256:323c58a773482a2b4ba4e35202560cfcba45e8a8e09e7ffb83c0f9bac5b544da"}, - {file = "hypothesis-6.126.0.tar.gz", hash = "sha256:648b6215ee0468fa85eaee9dceb5b7766a5861c20ee4801bd904a2c02f1a6c9b"}, + {file = "hypothesis-6.127.1-py3-none-any.whl", hash = "sha256:6600a03dfe5406bee9a74eb0b92f0aa40b5b7f3df84ae6bc2a564edc3bb6168b"}, + {file = "hypothesis-6.127.1.tar.gz", hash = "sha256:9cf339b28e5c394f811eaa43023a118e7c4d384102b7b06bab91b6d06cc0437f"}, ] [package.dependencies] @@ -1554,7 +1554,7 @@ description = "CUBLAS native runtime libraries" optional = false python-versions = ">=3" groups = ["main"] -markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and sys_platform == \"darwin\"" files = [ {file = "nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0f8aa1706812e00b9f19dfe0cdb3999b092ccb8ca168c0db5b8ea712456fd9b3"}, {file = "nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl", hash = "sha256:2fc8da60df463fdefa81e323eef2e36489e1c94335b5358bcb38360adf75ac9b"}, @@ -1581,7 +1581,7 @@ description = "CUDA profiling tools runtime libs." optional = false python-versions = ">=3" groups = ["main"] -markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and sys_platform == \"darwin\"" files = [ {file = "nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:79279b35cf6f91da114182a5ce1864997fd52294a87a16179ce275773799458a"}, {file = "nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:9dec60f5ac126f7bb551c055072b69d85392b13311fcc1bcda2202d172df30fb"}, @@ -1608,7 +1608,7 @@ description = "NVRTC native runtime libraries" optional = false python-versions = ">=3" groups = ["main"] -markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and sys_platform == \"darwin\"" files = [ {file = "nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0eedf14185e04b76aa05b1fea04133e59f465b6f960c0cbf4e37c3cb6b0ea198"}, {file = "nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a178759ebb095827bd30ef56598ec182b85547f1508941a3d560eb7ea1fbf338"}, @@ -1635,7 +1635,7 @@ description = "CUDA Runtime native Libraries" optional = false python-versions = ">=3" groups = ["main"] -markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and sys_platform == \"darwin\"" files = [ {file = "nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:961fe0e2e716a2a1d967aab7caee97512f71767f852f67432d572e36cb3a11f3"}, {file = "nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:64403288fa2136ee8e467cdc9c9427e0434110899d07c779f25b5c068934faa5"}, @@ -1678,7 +1678,7 @@ description = "CUFFT native runtime libraries" optional = false python-versions = ">=3" groups = ["main"] -markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and sys_platform == \"darwin\"" files = [ {file = "nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5dad8008fc7f92f5ddfa2101430917ce2ffacd86824914c82e28990ad7f00399"}, {file = "nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f083fc24912aa410be21fa16d157fed2055dab1cc4b6934a0e03cba69eb242b9"}, @@ -1708,7 +1708,7 @@ description = "CURAND native runtime libraries" optional = false python-versions = ">=3" groups = ["main"] -markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and sys_platform == \"darwin\"" files = [ {file = "nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1f173f09e3e3c76ab084aba0de819c49e56614feae5c12f69883f4ae9bb5fad9"}, {file = "nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a88f583d4e0bb643c49743469964103aa59f7f708d862c3ddb0fc07f851e3b8b"}, @@ -1740,7 +1740,7 @@ description = "CUDA solver native runtime libraries" optional = false python-versions = ">=3" groups = ["main"] -markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and sys_platform == \"darwin\"" files = [ {file = "nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_aarch64.whl", hash = "sha256:d338f155f174f90724bbde3758b7ac375a70ce8e706d70b018dd3375545fc84e"}, {file = "nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:19e33fa442bcfd085b3086c4ebf7e8debc07cfe01e11513cc6d332fd918ac260"}, @@ -1775,7 +1775,7 @@ description = "CUSPARSE native runtime libraries" optional = false python-versions = ">=3" groups = ["main"] -markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and sys_platform == \"darwin\"" files = [ {file = "nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9d32f62896231ebe0480efd8a7f702e143c98cfaa0e8a76df3386c1ba2b54df3"}, {file = "nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ea4f11a2904e2a8dc4b1833cc1b5181cde564edd0d5cd33e3c168eff2d1863f1"}, @@ -1792,7 +1792,7 @@ description = "NVIDIA cuSPARSELt" optional = false python-versions = "*" groups = ["main"] -markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and sys_platform == \"darwin\"" files = [ {file = "nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:067a7f6d03ea0d4841c85f0c6f1991c5dda98211f6302cb83a4ab234ee95bef8"}, {file = "nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:df2c24502fd76ebafe7457dbc4716b2fec071aabaed4fb7691a201cde03704d9"}, @@ -1818,7 +1818,7 @@ description = "Nvidia JIT LTO Library" optional = false python-versions = ">=3" groups = ["main"] -markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and sys_platform == \"darwin\"" files = [ {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4abe7fef64914ccfa909bc2ba39739670ecc9e820c83ccc7a6ed414122599b83"}, {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57"}, @@ -1859,7 +1859,7 @@ description = "NVIDIA Tools Extension" optional = false python-versions = ">=3" groups = ["main"] -markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and sys_platform == \"darwin\"" files = [ {file = "nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7959ad635db13edf4fc65c06a6e9f9e55fc2f92596db928d169c0bb031e88ef3"}, {file = "nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:781e950d9b9f60d8241ccea575b32f5105a5baf4c2351cab5256a24869f12a1a"}, @@ -3438,6 +3438,7 @@ description = "Tensors and Dynamic neural networks in Python with strong GPU acc optional = false python-versions = ">=3.9.0" groups = ["main"] +markers = "sys_platform == \"darwin\"" files = [ {file = "torch-2.6.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:6860df13d9911ac158f4c44031609700e1eba07916fff62e21e6ffa0a9e01961"}, {file = "torch-2.6.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:c4f103a49830ce4c7561ef4434cc7926e5a5fe4e5eb100c19ab36ea1e2b634ab"}, @@ -3587,7 +3588,7 @@ description = "A language and compiler for custom Deep Learning operations" optional = false python-versions = "*" groups = ["main"] -markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\"" +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and sys_platform == \"darwin\"" files = [ {file = "triton-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3e54983cd51875855da7c68ec05c05cf8bb08df361b1d5b69e05e40b0c9bd62"}, {file = "triton-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8009a1fb093ee8546495e96731336a33fb8856a38e45bb4ab6affd6dbc3ba220"}, @@ -3738,4 +3739,4 @@ test = ["coverage", "pytest", "pytest-astropy"] [metadata] lock-version = "2.1" python-versions = ">=3.10,<4" -content-hash = "59b58f1ab5a805c7c2b124f18f8958949564b0ab6a08b68bb422144ce2e6454e" +content-hash = "e2fd2c81fe296d6bd96347eac78b3c9bde29c8fdb454cea12d67867bf685184b" diff --git a/pyproject.toml b/pyproject.toml index 1a5dab6d9..be558581c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,7 @@ [build-system] requires = ["poetry-core>=2.0.0,<3.0.0", - "cython"] + "cython", "extension-helpers", + "numpy>=1.24"] build-backend = "poetry.core.masonry.api" @@ -47,6 +48,7 @@ dependencies = [ "cosmic-conn>=0.2.8", "alembic", "mock", + 'torch' ] [project.optional-dependencies] @@ -71,6 +73,9 @@ style = ["pycodestyle"] packages = [ { include = "banzai" } ] +include = [ + { path = "**/*.so", format = "wheel" }, +] [tool.poetry.dependencies] torch = [ @@ -90,6 +95,9 @@ torch = [ priority = "explicit" url = "https://download.pytorch.org/whl/cpu" +[tool.poetry.build] +script = "build.py" + [tool.setuptools.packages.find] include = ["banzai*"] diff --git a/setup.py b/setup.py deleted file mode 100755 index 9e223edbd..000000000 --- a/setup.py +++ /dev/null @@ -1,76 +0,0 @@ -# #!/usr/bin/env python -import os -import sys -from extension_helpers import get_extensions - -__requires__ = ['pip >= 19.3.1'] - -from setuptools import setup - -# First provide helpful messages if contributors try and run legacy commands -# for tests or docs. - -TEST_HELP = """ -Note: running tests is no longer done using 'python setup.py test'. Instead -you will need to run: - - tox -e test - -If you don't already have tox installed, you can install it with: - - pip install tox - -If you only want to run part of the test suite, you can also use pytest -directly with:: - - pip install -e .[test] - pytest - -For more information, see: - - http://docs.astropy.org/en/latest/development/testguide.html#running-tests -""" - -if 'test' in sys.argv: - print(TEST_HELP) - sys.exit(1) - -DOCS_HELP = """ -Note: building the documentation is no longer done using -'python setup.py build_docs'. Instead you will need to run: - - tox -e build_docs - -If you don't already have tox installed, you can install it with: - - pip install tox - -You can also build the documentation with Sphinx directly using:: - - pip install -e .[docs] - cd docs - make html - -For more information, see: - - http://docs.astropy.org/en/latest/install.html#builddocs -""" - -if 'build_docs' in sys.argv or 'build_sphinx' in sys.argv: - print(DOCS_HELP) - sys.exit(1) - -VERSION_TEMPLATE = """ -# Note that we need to fall back to the hard-coded version if either -# setuptools_scm can't be imported or setuptools_scm can't determine the -# version, so we catch the generic 'Exception'. -try: - from setuptools_scm import get_version - version = get_version(root='..', relative_to=__file__) -except Exception: - version = '{version}' -""".lstrip() - -setup(use_scm_version={'write_to': os.path.join('banzai', 'version.py'), - 'write_to_template': VERSION_TEMPLATE}, - ext_modules=get_extensions()) From 9ac0c9fb7b85f61ab9130ce207bfa2418714e0eb Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Mon, 24 Feb 2025 12:29:08 -0500 Subject: [PATCH 14/46] Removed deprecated pkg_resources. --- banzai/tests/test_end_to_end.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/banzai/tests/test_end_to_end.py b/banzai/tests/test_end_to_end.py index 0beeddb77..d89fce91e 100644 --- a/banzai/tests/test_end_to_end.py +++ b/banzai/tests/test_end_to_end.py @@ -16,8 +16,8 @@ from banzai.utils import file_utils from banzai.tests.utils import FakeResponse, get_min_and_max_dates, FakeContext from astropy.io import fits, ascii -import pkg_resources from banzai.logs import get_logger +import importlib.resouces # TODO: Mock out AWS calls here # TODO: Mock out archived fits queue structure as well @@ -27,9 +27,9 @@ app.conf.update(CELERY_TASK_ALWAYS_EAGER=True) TEST_PACKAGE = 'banzai.tests' -TEST_FRAMES = ascii.read(pkg_resources.resource_filename(TEST_PACKAGE, 'data/test_data.dat')) +TEST_FRAMES = ascii.read(os.path.join(importlib.resources.files(TEST_PACKAGE), 'data/test_data.dat')) -PRECAL_FRAMES = ascii.read(pkg_resources.resource_filename(TEST_PACKAGE, 'data/test_precals.dat')) +PRECAL_FRAMES = ascii.read(os.path.join(importlib.resources.files(TEST_PACKAGE), 'data/test_precals.dat')) DATA_ROOT = os.path.join(os.sep, 'archive', 'engineering') # Use the LCO filenaming convention to infer the sites @@ -38,7 +38,7 @@ DAYS_OBS = set([os.path.join(frame[:3], frame.split('-')[1], frame.split('-')[2]) for frame in TEST_FRAMES['filename']]) -CONFIGDB_FILENAME = pkg_resources.resource_filename(TEST_PACKAGE, 'data/configdb_example.json') +CONFIGDB_FILENAME = os.path.join(importlib.resources.files(TEST_PACKAGE), 'data/configdb_example.json') def celery_join(): @@ -165,9 +165,9 @@ def observation_portal_side_effect(*args, **kwargs): site = kwargs['params']['site'] start = datetime.strftime(parse(kwargs['params']['start_after']).replace(tzinfo=None).date(), '%Y%m%d') filename = 'test_obs_portal_response_{site}_{start}.json'.format(site=site, start=start) - filename = pkg_resources.resource_filename(TEST_PACKAGE, 'data/{filename}'.format(filename=filename)) + filename = os.path.join(importlib.resources.files(TEST_PACKAGE), 'data/{filename}'.format(filename=filename)) if not os.path.exists(filename): - filename = pkg_resources.resource_filename(TEST_PACKAGE, 'data/test_obs_portal_null.json') + filename = os.path.join(importlib.resources.files(TEST_PACKAGE), 'data/test_obs_portal_null.json') return FakeResponse(filename) From a9747d352e28e953d66eda5234c8666afdbcc1a0 Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Mon, 24 Feb 2025 12:31:19 -0500 Subject: [PATCH 15/46] Typo fix. --- banzai/tests/test_end_to_end.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/banzai/tests/test_end_to_end.py b/banzai/tests/test_end_to_end.py index d89fce91e..6280d3e9f 100644 --- a/banzai/tests/test_end_to_end.py +++ b/banzai/tests/test_end_to_end.py @@ -17,7 +17,7 @@ from banzai.tests.utils import FakeResponse, get_min_and_max_dates, FakeContext from astropy.io import fits, ascii from banzai.logs import get_logger -import importlib.resouces +import importlib.resources # TODO: Mock out AWS calls here # TODO: Mock out archived fits queue structure as well From 0648a90ed553c345431adf4a86da40d482db4450 Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Mon, 24 Feb 2025 14:42:10 -0500 Subject: [PATCH 16/46] Change user that runs docker commands to try to deal with poetry. --- Dockerfile | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index a73e4de58..097648a48 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,18 +10,18 @@ RUN apt-get -y update && apt-get -y install gcc && \ apt-get autoclean && \ rm -rf /var/lib/apt/lists/* -COPY pyproject.toml poetry.lock /lco/banzai/ +USER archive -RUN poetry install --directory=/lco/banzai -E cpu --no-root --no-cache +ENV HOME=/home/archive -COPY . /lco/banzai +WORKDIR /home/archive -RUN poetry install --directory /lco/banzai -E cpu --no-cache +COPY --chown=10087:10000 pyproject.toml poetry.lock /lco/banzai/ -USER archive +RUN poetry install --directory=/lco/banzai -E cpu --no-root --no-cache -ENV HOME=/home/archive +COPY --chown=10087:10000 . /lco/banzai -WORKDIR /home/archive +RUN poetry install --directory /lco/banzai -E cpu --no-cache RUN cp /lco/banzai/pytest.ini /home/archive/pytest.ini From e18433248c2525d7f960483c5cf1b7fb898309c3 Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Mon, 24 Feb 2025 14:49:10 -0500 Subject: [PATCH 17/46] Updates to work with python 3.13 --- banzai/__init__.py | 4 +- poetry.lock | 332 ++++++++++++++++++--------------------------- pyproject.toml | 2 +- 3 files changed, 135 insertions(+), 203 deletions(-) diff --git a/banzai/__init__.py b/banzai/__init__.py index d6077d4f9..f0f6185a1 100755 --- a/banzai/__init__.py +++ b/banzai/__init__.py @@ -3,10 +3,8 @@ # Packages may add whatever they like to this file, but # should keep this content at the top. # ---------------------------------------------------------------------------- -from ._astropy_init import * # noqa import banzai.logs # noqa: F401 # ---------------------------------------------------------------------------- -if not _ASTROPY_SETUP_: # noqa - from banzai import utils +from banzai import utils __all__ = ['utils'] diff --git a/poetry.lock b/poetry.lock index e21c815c5..6844afc83 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,15 +2,15 @@ [[package]] name = "alabaster" -version = "1.0.0" +version = "0.7.16" description = "A light, configurable Sphinx theme" optional = true -python-versions = ">=3.10" +python-versions = ">=3.9" groups = ["main"] markers = "extra == \"docs\"" files = [ - {file = "alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b"}, - {file = "alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e"}, + {file = "alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92"}, + {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"}, ] [[package]] @@ -89,55 +89,57 @@ files = [ [[package]] name = "astropy" -version = "5.3.4" +version = "6.1.7" description = "Astronomy and astrophysics core library" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["main"] files = [ - {file = "astropy-5.3.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6c63abc95d094cd3062e32c1ebf80c07502e4f3094b1e276458db5ce6b6a2"}, - {file = "astropy-5.3.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e85871ec762fc7eab2f7e716c97dad1b3c546bb75941ea7fae6c8eadd51f0bf8"}, - {file = "astropy-5.3.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e82fdad3417b70af381945aa42fdae0f11bc9aaf94b95027b1e24379bf847d6"}, - {file = "astropy-5.3.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbce56f46ec1051fd67a5e2244e5f2e08599a176fe524c0bee2294c62be317b3"}, - {file = "astropy-5.3.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a489c2322136b76a43208e3e9b5a7947a7fd624a10e49d2909b94f12b624da06"}, - {file = "astropy-5.3.4-cp310-cp310-win32.whl", hash = "sha256:c713695e39f5a874705bc3bd262c5d218890e3e7c43f0b6c0b5e7d46bdff527c"}, - {file = "astropy-5.3.4-cp310-cp310-win_amd64.whl", hash = "sha256:2576579befb0674cdfd18f5cc138c919a109c6886a25aa3d8ed8ab4e4607c581"}, - {file = "astropy-5.3.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4ce096dde6b86a87aa84aec4198732ec379fbb7649af66a96f85b96d17214c2a"}, - {file = "astropy-5.3.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:830fb4b19c36bf8092fdd74ecf9df5b78c6435bf571c5e09b7f644875148a058"}, - {file = "astropy-5.3.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a707c534408d26d90014a1938af883f6cbf43a3dd78df8bb9a191d275c09f8d"}, - {file = "astropy-5.3.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0bb2b9b93bc879bcd032931e7fc07c3a3de6f9546fed17f0f12974e0ffc83e0"}, - {file = "astropy-5.3.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1fa4437fe8d1e103f14cb1cb4e8449c93ae4190b5e9fd97e9c61a5155de9af0d"}, - {file = "astropy-5.3.4-cp311-cp311-win32.whl", hash = "sha256:c656c7fd3d862bcb9d3c4a87b8e9488d0c351b4edf348410c09a26641b9d4731"}, - {file = "astropy-5.3.4-cp311-cp311-win_amd64.whl", hash = "sha256:4c4971abae8e3ddfb8f40447d78aaf24e6ce44b976b3874770ff533609050366"}, - {file = "astropy-5.3.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:887db411555692fb1858ae305f87fd2ff42a021b68c78abbf3fa1fc64641e895"}, - {file = "astropy-5.3.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e4033d7a6bd2da38b83ec65f7282dfeb2641f2b2d41b1cd392cdbe3d6f8abfff"}, - {file = "astropy-5.3.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2cc6503b79d4fb61ca80e1d37dd609fabca6d2e0124e17f831cc08c2e6ff75e"}, - {file = "astropy-5.3.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f3f9fe1d76d151428a8d2bc7d50f4a47ae6e7141c11880a3ad259ac7b906b03"}, - {file = "astropy-5.3.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6e0f7ecbb2a8acb3eace99bcaca30dd1ce001e6f4750a009fd9cc3b8d1b49c58"}, - {file = "astropy-5.3.4-cp312-cp312-win32.whl", hash = "sha256:d915e6370315a1a6a40c2576e77d0063f48cc3b5f8873087cad8ad19dd429d19"}, - {file = "astropy-5.3.4-cp312-cp312-win_amd64.whl", hash = "sha256:69f5a3789a8a4cb00815630b63f950be629a983896dc1aba92566ccc7937a77d"}, - {file = "astropy-5.3.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d5d1a1be788344f11a94a5356c1a25b4d45f1736b740edb4d8e3a272b872a8fa"}, - {file = "astropy-5.3.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ae59e4d41461ad96a2573bc51408000a7b4f90dce2bad07646fa6409a12a5a74"}, - {file = "astropy-5.3.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4c4d3a14e8e3a33208683331b16a721ab9f9493ed998d34533532fdaeaa3642"}, - {file = "astropy-5.3.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f58f53294f07cd3f9173bb113ad60d2cd823501c99251891936202fed76681"}, - {file = "astropy-5.3.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f79400dc6641bb0202a8998cfb08ad1afe197818e27c946491a292e2ffd16a1b"}, - {file = "astropy-5.3.4-cp39-cp39-win32.whl", hash = "sha256:fd0baa7621d03aa74bb8ba673d7955381d15aed4f30dc2a56654560401fc3aca"}, - {file = "astropy-5.3.4-cp39-cp39-win_amd64.whl", hash = "sha256:9ed6116d07de02183d966e9a5dabc86f6fd3d86cc3e1e8b9feef89fd757be8a6"}, - {file = "astropy-5.3.4.tar.gz", hash = "sha256:d490f7e2faac2ccc01c9244202d629154259af8a979104ced89dc4ace4e6f1d8"}, -] - -[package.dependencies] -numpy = ">=1.21,<2" + {file = "astropy-6.1.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:be954c5f7707a089609053665aeb76493b79e5c4753c39486761bc6d137bf040"}, + {file = "astropy-6.1.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b5e48df5ab2e3e521e82a7233a4b1159d071e64e6cbb76c45415dc68d3b97af1"}, + {file = "astropy-6.1.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55c78252633c644361e2f7092d71f80ef9c2e6649f08d97711d9f19af514aedc"}, + {file = "astropy-6.1.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:985e5e74489d23f1a11953b6b283fccde3f46cb6c68fee4f7228e5f6d8350ba9"}, + {file = "astropy-6.1.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:dc2ea28ed41a3d92c39b1481d9c5be016ae58d68f144f3fd8cecffe503525bab"}, + {file = "astropy-6.1.7-cp310-cp310-win32.whl", hash = "sha256:4e4badadd8dfa5dca08fd86e9a50a3a91af321975859f5941579e6b7ce9ba199"}, + {file = "astropy-6.1.7-cp310-cp310-win_amd64.whl", hash = "sha256:8d7f6727689288ee08fc0a4a297fc7e8089d01718321646bd00fea0906ad63dc"}, + {file = "astropy-6.1.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:09edca01276ee63f7b2ff511da9bfb432068ba3242e27ef27d76e5a171087b7e"}, + {file = "astropy-6.1.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:072f62a67992393beb016dc80bee8fb994fda9aa69e945f536ed8ac0e51291e6"}, + {file = "astropy-6.1.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2706156d3646f9c9a7fc810475d8ab0df4c717beefa8326552576a0f8ddca20"}, + {file = "astropy-6.1.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fcd99e627692f8e58bb3097d330bfbd109a22e00dab162a67f203b0a0601ad2c"}, + {file = "astropy-6.1.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b0ebbcb637b2e9bcb73011f2b7890d7a3f5a41b66ccaad7c28f065e81e28f0b2"}, + {file = "astropy-6.1.7-cp311-cp311-win32.whl", hash = "sha256:192b12ede49cd828362ab1a6ede2367fe203f4d851804ec22fa92e009a524281"}, + {file = "astropy-6.1.7-cp311-cp311-win_amd64.whl", hash = "sha256:3cac64bcdf570c947019bd2bc96711eeb2c7763afe192f18c9551e52a6c296b2"}, + {file = "astropy-6.1.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f2a8bcbb1306052cc38c9eed2c9331bfafe2582b499a7321946abf74b26eb256"}, + {file = "astropy-6.1.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:eaf88878684f9d31aff36475c90d101f4cff22fdd4fd50098d9950fd56994df7"}, + {file = "astropy-6.1.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb8cd231e53556e4eebe0393ea95a8cea6b2ff4187c95ac4ff8b17e7a8da823"}, + {file = "astropy-6.1.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ad36334d138a4f71d6fdcf225a98ad1dad6c343da4362d5a47a71f5c9da3ca9"}, + {file = "astropy-6.1.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dd731c526869d0c68507be7b31dd10871b7c44d310bb5495476505560c83cd33"}, + {file = "astropy-6.1.7-cp312-cp312-win32.whl", hash = "sha256:662bacd7ae42561e038cbd85eea3b749308cf3575611a745b60f034d3350c97a"}, + {file = "astropy-6.1.7-cp312-cp312-win_amd64.whl", hash = "sha256:5b4d02a98a0bf91ff7fd4ef0bd0ecca83c9497338cb88b61ec9f971350688222"}, + {file = "astropy-6.1.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fbeaf04427987c0c6fa2e579eb40011802b06fba6b3a7870e082d5c693564e1b"}, + {file = "astropy-6.1.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ab6e88241a14185b9404b02246329185b70292984aa0616b20a0628dfe4f4ebb"}, + {file = "astropy-6.1.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0529c75565feaabb629946806b4763ae7b02069aeff4c3b56a69e8a9e638500"}, + {file = "astropy-6.1.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c5ec347631da77573fc729ba04e5d89a3bc94500bf6037152a2d0f9965ae1ce"}, + {file = "astropy-6.1.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc496f87aaccaa5c6624acc985b8770f039c5bbe74b120c8ed7bad3698e24e1b"}, + {file = "astropy-6.1.7-cp313-cp313-win32.whl", hash = "sha256:b1e01d534383c038dbf8664b964fa4ea818c7419318830d3c732c750c64115c6"}, + {file = "astropy-6.1.7-cp313-cp313-win_amd64.whl", hash = "sha256:af08cf2b0368f1ea585eb26a55d99a2de9e9b0bd30aba84b5329059c3ec33590"}, + {file = "astropy-6.1.7.tar.gz", hash = "sha256:a405ac186306b6cb152e6df2f7444ab8bd764e4127d7519da1b3ae4dd65357ef"}, +] + +[package.dependencies] +astropy-iers-data = ">=0.2024.10.28.0.34.7" +numpy = ">=1.23" packaging = ">=19.0" -pyerfa = ">=2.0" +pyerfa = ">=2.0.1.1" PyYAML = ">=3.13" [package.extras] -all = ["asdf (>=2.10.0)", "beautifulsoup4", "bleach", "bottleneck", "certifi", "dask[array]", "fsspec[http] (>=2022.8.2)", "h5py", "html5lib", "ipython (>=4.2)", "jplephem", "matplotlib (>=3.3,!=3.4.0,!=3.5.2)", "mpmath", "pandas", "pre-commit", "pyarrow (>=5.0.0)", "pytest (>=7.0,<8)", "pytz", "s3fs (>=2022.8.2)", "scipy (>=1.5)", "sortedcontainers", "typing-extensions (>=3.10.0.1)"] -docs = ["Jinja2 (>=3.0)", "matplotlib (>=3.3,!=3.4.0,!=3.5.2)", "pytest (>=7.0,<8)", "scipy (>=1.3)", "sphinx", "sphinx-astropy (>=1.6)", "sphinx-changelog (>=1.2.0)"] -recommended = ["matplotlib (>=3.3,!=3.4.0,!=3.5.2)", "scipy (>=1.5)"] -test = ["pytest (>=7.0,<8)", "pytest-astropy (>=0.10)", "pytest-astropy-header (>=0.2.1)", "pytest-doctestplus (>=0.12)", "pytest-xdist"] -test-all = ["coverage[toml]", "ipython (>=4.2)", "objgraph", "pytest (>=7.0,<8)", "pytest-astropy (>=0.10)", "pytest-astropy-header (>=0.2.1)", "pytest-doctestplus (>=0.12)", "pytest-xdist", "sgp4 (>=2.3)", "skyfield (>=1.20)"] +all = ["asdf-astropy (>=0.3)", "astropy[recommended]", "astropy[typing]", "beautifulsoup4", "bleach", "bottleneck", "certifi", "dask[array]", "fsspec[http] (>=2023.4.0)", "h5py", "html5lib", "ipython (>=4.2)", "jplephem", "mpmath", "pandas", "pre-commit", "pyarrow (>=7.0.0)", "pytest (>=7.0)", "pytz", "s3fs (>=2023.4.0)", "sortedcontainers"] +docs = ["Jinja2 (>=3.1.3)", "astropy[recommended]", "matplotlib (>=3.9.1)", "numpy (<2.0)", "pytest (>=7.0)", "sphinx", "sphinx-astropy[confv2] (>=1.9.1)", "sphinx-changelog (>=1.2.0)", "sphinx_design", "sphinxcontrib-globalsubs (>=0.1.1)", "tomli ; python_version < \"3.11\""] +recommended = ["matplotlib (>=3.5.0,!=3.5.2)", "scipy (>=1.8)"] +test = ["pytest (>=7.0)", "pytest-astropy (>=0.10)", "pytest-astropy-header (>=0.2.1)", "pytest-doctestplus (>=0.12)", "pytest-xdist", "threadpoolctl"] +test-all = ["array-api-strict", "astropy[test]", "coverage[toml]", "ipython (>=4.2)", "objgraph", "sgp4 (>=2.3)", "skyfield (>=1.20)"] +typing = ["typing_extensions (>=4.0.0)"] [[package]] name = "astropy-healpix" @@ -165,6 +167,22 @@ numpy = ">=1.25" docs = ["matplotlib", "sphinx-astropy"] test = ["hypothesis", "pytest-astropy"] +[[package]] +name = "astropy-iers-data" +version = "0.2025.2.24.0.34.4" +description = "IERS Earth Rotation and Leap Second tables for the astropy core package" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "astropy_iers_data-0.2025.2.24.0.34.4-py3-none-any.whl", hash = "sha256:be8b3b75b09b1aa1d22de9b5243854e00d19936aca6d8f64466d16197c04bb28"}, + {file = "astropy_iers_data-0.2025.2.24.0.34.4.tar.gz", hash = "sha256:fce62431ce38129d166360f59563f506fbe37b2d1df5e0038a4ad0b0277274f7"}, +] + +[package.extras] +docs = ["pytest"] +test = ["hypothesis", "pytest", "pytest-remotedata"] + [[package]] name = "astropy-sphinx-theme" version = "1.1" @@ -407,106 +425,19 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.4.1" +version = "2.0.12" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false -python-versions = ">=3.7" +python-versions = ">=3.5.0" groups = ["main"] files = [ - {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"}, - {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"}, - {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, + {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, + {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, ] +[package.extras] +unicode-backport = ["unicodedata2"] + [[package]] name = "click" version = "8.1.8" @@ -1868,39 +1799,42 @@ files = [ [[package]] name = "ocs-archive" -version = "0.4.0" +version = "0.2.9" description = "Base library for the science archive and ingester of an observatory control system" optional = false -python-versions = ">=3.8" +python-versions = ">=3.6" groups = ["main"] files = [ - {file = "ocs_archive-0.4.0-py3-none-any.whl", hash = "sha256:8f27186bcc938e664904f5d71b7ee338b5a2614cd278d9e2ac6a4f3bd1021368"}, - {file = "ocs_archive-0.4.0.tar.gz", hash = "sha256:ba2846b6294edfb0566397749c22153309eb711c40f788bef9ac926521bc3349"}, + {file = "ocs_archive-0.2.9-py3-none-any.whl", hash = "sha256:c59b0a70e3a3a1afc94650cd4fb3ddc18d927ae576773947ffc5e8bd28a2eabf"}, + {file = "ocs_archive-0.2.9.tar.gz", hash = "sha256:a6127eb817ef9b29c69dca79cf3242792fc8d29294195d4f7c35af55a5a8992d"}, ] [package.dependencies] -astropy = ">=3,<6" -boto3 = ">=1,<2" -python-dateutil = ">=2,<3" -requests = ">=2,<3" +astropy = "*" +boto3 = "*" +python-dateutil = "*" +requests = "2.26.0" + +[package.extras] +tests = ["pytest", "responses (==0.16.0)"] [[package]] name = "ocs-ingester" -version = "3.1.0" +version = "3.0.4" description = "Ingest frames into the science archive of an observatory control system" optional = false -python-versions = ">=3.7" +python-versions = ">=3.6" groups = ["main"] files = [ - {file = "ocs_ingester-3.1.0-py3-none-any.whl", hash = "sha256:5c017e1c56414c9beedc3b5cfe17540f6fc2acd67dfd2fcfd102cc05eaa15273"}, - {file = "ocs_ingester-3.1.0.tar.gz", hash = "sha256:d97772525640c7378003b2a82190543316df9c759cc52264ededce057ef3f3c5"}, + {file = "ocs-ingester-3.0.4.tar.gz", hash = "sha256:c52d0c94fd3a758a067d796d7407bff5e558d7929d1a1adc76e70740b4221de1"}, + {file = "ocs_ingester-3.0.4-py3-none-any.whl", hash = "sha256:0c94eae94c4e388537695f5e5a4cfcda70237a2144f41337722b9ae3f7e424d0"}, ] [package.dependencies] astropy = "*" boto3 = "*" lcogt-logging = "*" -ocs-archive = "0.4.0" +ocs-archive = "0.2.9" opentsdb-python-metrics = ">=0.2.0" python-dateutil = "*" requests = "*" @@ -1910,28 +1844,29 @@ tests = ["pytest"] [[package]] name = "opensearch-py" -version = "2.8.0" +version = "2.6.0" description = "Python client for OpenSearch" optional = false python-versions = "<4,>=3.8" groups = ["main"] files = [ - {file = "opensearch_py-2.8.0-py3-none-any.whl", hash = "sha256:52c60fdb5d4dcf6cce3ee746c13b194529b0161e0f41268b98ab8f1624abe2fa"}, - {file = "opensearch_py-2.8.0.tar.gz", hash = "sha256:6598df0bc7a003294edd0ba88a331e0793acbb8c910c43edf398791e3b2eccda"}, + {file = "opensearch_py-2.6.0-py2.py3-none-any.whl", hash = "sha256:b6e78b685dd4e9c016d7a4299cf1de69e299c88322e3f81c716e6e23fe5683c1"}, + {file = "opensearch_py-2.6.0.tar.gz", hash = "sha256:0b7c27e8ed84c03c99558406927b6161f186a72502ca6d0325413d8e5523ba96"}, ] [package.dependencies] -certifi = ">=2024.07.04" +certifi = ">=2022.12.07" Events = "*" python-dateutil = "*" -requests = ">=2.32.0,<3.0.0" -urllib3 = {version = ">=1.26.19,<2.2.0 || >2.2.0,<2.2.1 || >2.2.1,<3", markers = "python_version >= \"3.10\""} +requests = ">=2.4.0,<3.0.0" +six = "*" +urllib3 = {version = ">=1.26.18,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""} [package.extras] async = ["aiohttp (>=3.9.4,<4)"] -develop = ["black (>=24.3.0)", "botocore", "coverage (<8.0.0)", "jinja2", "myst_parser", "pytest (>=3.0.0)", "pytest-cov", "pytest-mock (<4.0.0)", "pytz", "pyyaml", "requests (>=2.0.0,<3.0.0)", "sphinx", "sphinx_copybutton", "sphinx_rtd_theme"] -docs = ["aiohttp (>=3.9.4,<4)", "myst_parser", "sphinx", "sphinx_copybutton", "sphinx_rtd_theme"] -kerberos = ["requests_kerberos"] +develop = ["black (>=24.3.0)", "botocore", "coverage (<8.0.0)", "jinja2", "mock", "myst-parser", "pytest (>=3.0.0)", "pytest-cov", "pytest-mock (<4.0.0)", "pytz", "pyyaml", "requests (>=2.0.0,<3.0.0)", "sphinx", "sphinx-copybutton", "sphinx-rtd-theme"] +docs = ["aiohttp (>=3.9.4,<4)", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-rtd-theme"] +kerberos = ["requests-kerberos"] [[package]] name = "opentsdb-http-client" @@ -2654,25 +2589,25 @@ testall = ["asdf", "gwcs", "pyvo", "shapely (>=2.0.2)", "sunpy[map] (>=6.0.1)"] [[package]] name = "requests" -version = "2.32.3" +version = "2.26.0" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.8" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" groups = ["main"] files = [ - {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, - {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, + {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, + {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, ] [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" +charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} +idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} +urllib3 = ">=1.21.1,<1.27" [package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton ; sys_platform == \"win32\" and python_version == \"2.7\""] +use-chardet-on-py3 = ["chardet (>=3.0.2,<5)"] [[package]] name = "s3transfer" @@ -2925,40 +2860,40 @@ files = [ [[package]] name = "sphinx" -version = "8.1.3" +version = "7.3.7" description = "Python documentation generator" optional = true -python-versions = ">=3.10" +python-versions = ">=3.9" groups = ["main"] markers = "extra == \"docs\"" files = [ - {file = "sphinx-8.1.3-py3-none-any.whl", hash = "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2"}, - {file = "sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927"}, + {file = "sphinx-7.3.7-py3-none-any.whl", hash = "sha256:413f75440be4cacf328f580b4274ada4565fb2187d696a84970c23f77b64d8c3"}, + {file = "sphinx-7.3.7.tar.gz", hash = "sha256:a4a7db75ed37531c05002d56ed6948d4c42f473a36f46e1382b0bd76ca9627bc"}, ] [package.dependencies] -alabaster = ">=0.7.14" -babel = ">=2.13" -colorama = {version = ">=0.4.6", markers = "sys_platform == \"win32\""} -docutils = ">=0.20,<0.22" +alabaster = ">=0.7.14,<0.8.0" +babel = ">=2.9" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +docutils = ">=0.18.1,<0.22" imagesize = ">=1.3" -Jinja2 = ">=3.1" -packaging = ">=23.0" -Pygments = ">=2.17" -requests = ">=2.30.0" -snowballstemmer = ">=2.2" -sphinxcontrib-applehelp = ">=1.0.7" -sphinxcontrib-devhelp = ">=1.0.6" -sphinxcontrib-htmlhelp = ">=2.0.6" -sphinxcontrib-jsmath = ">=1.0.1" -sphinxcontrib-qthelp = ">=1.0.6" +Jinja2 = ">=3.0" +packaging = ">=21.0" +Pygments = ">=2.14" +requests = ">=2.25.0" +snowballstemmer = ">=2.0" +sphinxcontrib-applehelp = "*" +sphinxcontrib-devhelp = "*" +sphinxcontrib-htmlhelp = ">=2.0.0" +sphinxcontrib-jsmath = "*" +sphinxcontrib-qthelp = "*" sphinxcontrib-serializinghtml = ">=1.1.9" tomli = {version = ">=2", markers = "python_version < \"3.11\""} [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=6.0)", "mypy (==1.11.1)", "pyright (==1.1.384)", "pytest (>=6.0)", "ruff (==0.6.9)", "sphinx-lint (>=0.9)", "tomli (>=2)", "types-Pillow (==10.2.0.20240822)", "types-Pygments (==2.18.0.20240506)", "types-colorama (==0.4.15.20240311)", "types-defusedxml (==0.7.0.20240218)", "types-docutils (==0.21.0.20241005)", "types-requests (==2.32.0.20240914)", "types-urllib3 (==1.26.25.14)"] -test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=8.0)", "setuptools (>=70.0)", "typing_extensions (>=4.9)"] +lint = ["flake8 (>=3.5.0)", "importlib_metadata", "mypy (==1.9.0)", "pytest (>=6.0)", "ruff (==0.3.7)", "sphinx-lint", "tomli", "types-docutils", "types-requests"] +test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=6.0)", "setuptools (>=67.0)"] [[package]] name = "sphinx-astropy" @@ -3646,21 +3581,20 @@ devenv = ["check-manifest", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3) [[package]] name = "urllib3" -version = "2.3.0" +version = "1.26.20" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.9" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" groups = ["main"] files = [ - {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, - {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, + {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, + {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, ] [package.extras] -brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] -h2 = ["h2 (>=4,<5)"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] +brotli = ["brotli (==1.0.9) ; os_name != \"nt\" and python_version < \"3\" and platform_python_implementation == \"CPython\"", "brotli (>=1.0.9) ; python_version >= \"3\" and platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; (os_name != \"nt\" or python_version >= \"3\") and platform_python_implementation != \"CPython\"", "brotlipy (>=0.6.0) ; os_name == \"nt\" and python_version < \"3\""] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress ; python_version == \"2.7\"", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "vine" @@ -3739,4 +3673,4 @@ test = ["coverage", "pytest", "pytest-astropy"] [metadata] lock-version = "2.1" python-versions = ">=3.10,<4" -content-hash = "e2fd2c81fe296d6bd96347eac78b3c9bde29c8fdb454cea12d67867bf685184b" +content-hash = "e0bc4698288bbfeffc070fd414cb1ecb0a55b6300ce3e58a10b5cd9588e7da6e" diff --git a/pyproject.toml b/pyproject.toml index be558581c..435dca825 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,7 +22,7 @@ classifiers = [ "Operating System :: OS Independent" ] dependencies = [ - "astropy>=4.0", + "astropy>=6.0", "scipy", "sqlalchemy>=1.3.0b1", "logutils", From 75f89b6588a4ba27f7f66672059f6d0a185c8a65 Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Mon, 24 Feb 2025 15:08:54 -0500 Subject: [PATCH 18/46] Took poetry installs out of a virtual env to make the paths work. --- Dockerfile | 12 +++++++----- banzai/__init__.py | 7 +++++++ .../banzai/templates/db-instrument-update.yaml | 1 - helm-chart/banzai/templates/listener.yaml | 5 ----- helm-chart/banzai/templates/workers-large.yaml | 1 - helm-chart/banzai/templates/workers.yaml | 1 - 6 files changed, 14 insertions(+), 13 deletions(-) diff --git a/Dockerfile b/Dockerfile index 097648a48..d7eb2dee5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,11 +10,7 @@ RUN apt-get -y update && apt-get -y install gcc && \ apt-get autoclean && \ rm -rf /var/lib/apt/lists/* -USER archive - -ENV HOME=/home/archive - -WORKDIR /home/archive +RUN poetry config virtualenvs.create false COPY --chown=10087:10000 pyproject.toml poetry.lock /lco/banzai/ @@ -25,3 +21,9 @@ COPY --chown=10087:10000 . /lco/banzai RUN poetry install --directory /lco/banzai -E cpu --no-cache RUN cp /lco/banzai/pytest.ini /home/archive/pytest.ini + +USER archive + +ENV HOME=/home/archive + +WORKDIR /home/archive diff --git a/banzai/__init__.py b/banzai/__init__.py index f0f6185a1..1ceac38b6 100755 --- a/banzai/__init__.py +++ b/banzai/__init__.py @@ -6,5 +6,12 @@ import banzai.logs # noqa: F401 # ---------------------------------------------------------------------------- +try: + import importlib.metadata as metadata +except ImportError: + import importlib_metadata as metadata # For older Python + +__version__ = metadata.version("lco-banzai") + from banzai import utils __all__ = ['utils'] diff --git a/helm-chart/banzai/templates/db-instrument-update.yaml b/helm-chart/banzai/templates/db-instrument-update.yaml index 6d3ecac2b..710662673 100644 --- a/helm-chart/banzai/templates/db-instrument-update.yaml +++ b/helm-chart/banzai/templates/db-instrument-update.yaml @@ -39,7 +39,6 @@ spec: cpu: "1" memory: "1Gi" command: - - "poetry" - "banzai_update_db" - "--db-address=$(DB_ADDRESS)" - "--configdb-address=$(CONFIGDB_URL)" diff --git a/helm-chart/banzai/templates/listener.yaml b/helm-chart/banzai/templates/listener.yaml index 51f1a895a..866ffaaa0 100644 --- a/helm-chart/banzai/templates/listener.yaml +++ b/helm-chart/banzai/templates/listener.yaml @@ -33,7 +33,6 @@ spec: securityContext: {{- toYaml .Values.securityContext | nindent 12 }} command: - - "poetry" - "banzai_create_db" - "--db-address=$(DB_ADDRESS)" # Populate the instruments table @@ -53,7 +52,6 @@ spec: securityContext: {{- toYaml .Values.securityContext | nindent 12 }} command: - - "poetry" - "banzai_update_db" - "--db-address=$(DB_ADDRESS)" - "--configdb-address={{ .Values.configdb_url }}" @@ -73,7 +71,6 @@ spec: securityContext: {{- toYaml .Values.securityContext | nindent 12 }} command: - - "poetry" - "banzai_populate_bpms" - "--db-address=$(DB_ADDRESS)" # create the db if it doesn't exist and populate the bpms in the db. @@ -94,7 +91,6 @@ spec: securityContext: {{- toYaml .Values.securityContext | nindent 12 }} command: - - "poetry" - "banzai_run_realtime_pipeline" - "--post-to-archive" - "--post-to-opensearch" @@ -125,7 +121,6 @@ spec: securityContext: {{- toYaml .Values.securityContext | nindent 12 }} command: - - "poetry" - "banzai_automate_stack_calibrations" - "--post-to-archive" - "--post-to-opensearch" diff --git a/helm-chart/banzai/templates/workers-large.yaml b/helm-chart/banzai/templates/workers-large.yaml index de7d16241..9e0f88e3c 100644 --- a/helm-chart/banzai/templates/workers-large.yaml +++ b/helm-chart/banzai/templates/workers-large.yaml @@ -31,7 +31,6 @@ spec: securityContext: {{- toYaml .Values.securityContext | nindent 12 }} command: - - "poetry" - "celery" - "-A" - "banzai" diff --git a/helm-chart/banzai/templates/workers.yaml b/helm-chart/banzai/templates/workers.yaml index a588ba8f5..bce385533 100644 --- a/helm-chart/banzai/templates/workers.yaml +++ b/helm-chart/banzai/templates/workers.yaml @@ -31,7 +31,6 @@ spec: securityContext: {{- toYaml .Values.securityContext | nindent 12 }} command: - - "poetry" - "celery" - "-A" - "banzai" From fb2c66178c5102438ddd61fc632d883c892510e0 Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Mon, 24 Feb 2025 16:19:55 -0500 Subject: [PATCH 19/46] More fixes to e2e tests. --- .github/workflows/e2e.yaml | 8 ++++---- banzai/tests/e2e-k8s.yaml | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index 318a6c597..b0e45f348 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -48,7 +48,7 @@ jobs: set +e export START=$(date -u +'%Y-%m-%dT%H:%M:%SZ') - kubectl exec banzai-e2e-test -c banzai-listener -- poetry pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-master-bias.xml -m master_bias + kubectl exec banzai-e2e-test -c banzai-listener -- pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-master-bias.xml -m master_bias EXIT_CODE=$? # Always print logs even if (especially if?) the reduction fails @@ -62,7 +62,7 @@ jobs: set +e export START=$(date -u +'%Y-%m-%dT%H:%M:%SZ') - kubectl exec banzai-e2e-test -c banzai-listener -- poetry pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-master-dark.xml -m master_dark + kubectl exec banzai-e2e-test -c banzai-listener -- pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-master-dark.xml -m master_dark EXIT_CODE=$? # Always print logs even if (especially if?) the reduction fails @@ -76,7 +76,7 @@ jobs: set +e export START=$(date -u +'%Y-%m-%dT%H:%M:%SZ') - kubectl exec banzai-e2e-test -c banzai-listener -- poetry pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-master-flat.xml -m master_flat + kubectl exec banzai-e2e-test -c banzai-listener -- pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-master-flat.xml -m master_flat EXIT_CODE=$? # Always print logs even if (especially if?) the reduction fails @@ -90,7 +90,7 @@ jobs: set +e export START=$(date -u +'%Y-%m-%dT%H:%M:%SZ') - kubectl exec banzai-e2e-test -c banzai-listener -- poetry pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-science-files.xml -m science_files + kubectl exec banzai-e2e-test -c banzai-listener -- pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-science-files.xml -m science_files EXIT_CODE=$? # Always print logs even if (especially if?) the reduction fails diff --git a/banzai/tests/e2e-k8s.yaml b/banzai/tests/e2e-k8s.yaml index 0c5583bd6..08907174a 100644 --- a/banzai/tests/e2e-k8s.yaml +++ b/banzai/tests/e2e-k8s.yaml @@ -105,7 +105,7 @@ spec: command: - /bin/sh - -c - - "poetry celery -A banzai status | grep -q '@celery-worker:.*OK'" + - "celery -A banzai status | grep -q '@celery-worker:.*OK'" initialDelaySeconds: 5 periodSeconds: 1 timeoutSeconds: 10 @@ -170,7 +170,7 @@ spec: command: - /bin/sh - -c - - 'poetry celery -A banzai status | grep -q "large-celery-worker:.*OK"' + - 'celery -A banzai status | grep -q "large-celery-worker:.*OK"' initialDelaySeconds: 5 periodSeconds: 1 timeoutSeconds: 10 From 0fe5e4398d81037b2fa7a1722fa3c43087a1608e Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Mon, 24 Feb 2025 16:31:48 -0500 Subject: [PATCH 20/46] more e2e fixes. --- banzai/tests/e2e-k8s.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/banzai/tests/e2e-k8s.yaml b/banzai/tests/e2e-k8s.yaml index 08907174a..a1350c7ab 100644 --- a/banzai/tests/e2e-k8s.yaml +++ b/banzai/tests/e2e-k8s.yaml @@ -85,7 +85,6 @@ spec: - name: REFERENCE_CATALOG_URL value: "http://phot-catalog.lco.gtn/" command: - - poetry - celery - -A - banzai @@ -150,7 +149,6 @@ spec: - name: REFERENCE_CATALOG_URL value: "http://phot-catalog.lco.gtn/" command: - - poetry - celery - -A - banzai @@ -213,7 +211,6 @@ spec: - name: "CELERY_LARGE_TASK_QUEUE_NAME" value: "e2e_large_task_queue" command: - - poetry - banzai_run_realtime_pipeline - --db-address=$(DB_ADDRESS) - --fpack From aa845268d985f8e3801923d6d00179f5f5c128b2 Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Mon, 24 Feb 2025 17:39:26 -0500 Subject: [PATCH 21/46] Added the ps command to the docker container. --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index d7eb2dee5..830174ec2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ RUN mkdir /home/archive && /usr/sbin/groupadd -g 10000 "domainusers" \ RUN pip install poetry --no-cache -RUN apt-get -y update && apt-get -y install gcc && \ +RUN apt-get -y update && apt-get -y install gcc procps && \ apt-get autoclean && \ rm -rf /var/lib/apt/lists/* From eb65f569c178ac0f3b67e9f2a1cc69f619f6364d Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Tue, 25 Feb 2025 08:56:35 -0500 Subject: [PATCH 22/46] Fixes to broken tests. --- .github/workflows/codestyle.yaml | 4 ++-- .github/workflows/coverage.yaml | 4 ++-- .github/workflows/docs.yaml | 6 +++--- .gitignore | 2 +- .rtd-environment.yml | 12 ------------ ...e26cc50_migration_of_past_data_for_blockid_.py | 2 +- ...71_add_calibrations_block_info_proposal_id_.py | 2 +- build.py | 2 +- readthedocs.yml | 15 ++++++++++----- 9 files changed, 21 insertions(+), 28 deletions(-) delete mode 100644 .rtd-environment.yml diff --git a/.github/workflows/codestyle.yaml b/.github/workflows/codestyle.yaml index ceb97cd26..39aef0154 100644 --- a/.github/workflows/codestyle.yaml +++ b/.github/workflows/codestyle.yaml @@ -1,4 +1,4 @@ -name: Python CI +name: Code Style on: push: @@ -21,4 +21,4 @@ jobs: - name: Set up project run: poetry install -E cpu -E style - name: Code Style - run: poetry pycodestyle banzai --count --max-line-length=120 + run: poetry run pycodestyle --count --max-line-length=120 diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml index b643f5cbf..24e092498 100644 --- a/.github/workflows/coverage.yaml +++ b/.github/workflows/coverage.yaml @@ -1,4 +1,4 @@ -name: Python CI +name: Coverage on: push: @@ -21,4 +21,4 @@ jobs: - name: Set up project run: poetry install -E cpu -E test - name: Run coverage - run: poetry run pytest --pyargs banzai.tests --cov banzai --cov-config="setup.cfg" + run: poetry run pytest --pyargs banzai.tests -m "not e2e" --cov banzai --cov-config="setup.cfg" diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index 472199c1a..542cfb8af 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -1,4 +1,4 @@ -name: Python CI +name: Docs on: push: @@ -19,7 +19,7 @@ jobs: - name: Install dependencies run: pip install poetry - name: Set up project - run: poetry install -E cpu -E test + run: poetry install -E cpu -E docs - name: Build Docs - run: poetry sphinx-build -W -b html . _build/html + run: poetry run sphinx-build -W -b html docs docs/_build/html \ No newline at end of file diff --git a/.gitignore b/.gitignore index edb2cfdc2..a2c42dec3 100644 --- a/.gitignore +++ b/.gitignore @@ -19,7 +19,7 @@ a.out */version.py */cython_version.py htmlcov -.coverage +.coverage* MANIFEST .ipynb_checkpoints env diff --git a/.rtd-environment.yml b/.rtd-environment.yml deleted file mode 100644 index 31332c449..000000000 --- a/.rtd-environment.yml +++ /dev/null @@ -1,12 +0,0 @@ -name: banzai - -channels: - - astropy - -dependencies: - - astropy - - Cython - - matplotlib - - numpy -# - pip: -# - dependency_from_pip diff --git a/alembic/migrations/versions/51b98e26cc50_migration_of_past_data_for_blockid_.py b/alembic/migrations/versions/51b98e26cc50_migration_of_past_data_for_blockid_.py index b5ab10125..ac616d737 100644 --- a/alembic/migrations/versions/51b98e26cc50_migration_of_past_data_for_blockid_.py +++ b/alembic/migrations/versions/51b98e26cc50_migration_of_past_data_for_blockid_.py @@ -48,7 +48,7 @@ def upgrade() -> None: request_results = requests.get(f'https://archive-api.lco.global/frames/{row.frameid}', headers=auth_header) request_results = request_results.json() else: - params = {'basename_exact': basename, 'start': parse_date(row.dateobs) - datetime.timedelta(days=1), + params = {'basename_exact': basename, 'start': parse_date(row.dateobs) - datetime.timedelta(days=1), 'end': parse_date(row.dateobs) + datetime.timedelta(days=1)} request_results = requests.get('https://archive-api.lco.global/frames/', params=params, headers=auth_header) if len(request_results.json()['results']) == 0: diff --git a/alembic/migrations/versions/8e35c490a971_add_calibrations_block_info_proposal_id_.py b/alembic/migrations/versions/8e35c490a971_add_calibrations_block_info_proposal_id_.py index 1724339d5..ba8dbd19f 100644 --- a/alembic/migrations/versions/8e35c490a971_add_calibrations_block_info_proposal_id_.py +++ b/alembic/migrations/versions/8e35c490a971_add_calibrations_block_info_proposal_id_.py @@ -1,7 +1,7 @@ """Add calibrations block info, proposal id, and public date to CalibrationImage Revision ID: 8e35c490a971 -Revises: +Revises: Create Date: 2025-01-31 12:19:03.407606 """ diff --git a/build.py b/build.py index e694ef6de..2bab8798c 100644 --- a/build.py +++ b/build.py @@ -12,7 +12,7 @@ def build() -> None: ext_modules = get_extensions() - + distribution = Distribution({ "name": "package", "ext_modules": ext_modules diff --git a/readthedocs.yml b/readthedocs.yml index 1d6abea84..066f07da8 100644 --- a/readthedocs.yml +++ b/readthedocs.yml @@ -1,11 +1,16 @@ version: 2 -conda: - environment: .rtd-environment.yml +build: + os: ubuntu-22.04 + tools: + python: "3.10" python: install: - method: pip - path: . - extra_requirements: - - docs +commands: + pre_build: + - pip install poetry + - poetry install -E docs --no-root + build: + - poetry run sphinx-build -b html docs/ _build/html From 251e9bb146ecd54a568869b8c868101685c29259 Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Tue, 25 Feb 2025 15:06:01 -0500 Subject: [PATCH 23/46] Added a comment to the dockerfile. --- Dockerfile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 830174ec2..396bdf6f3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,6 @@ FROM python:3.12-slim +# Make a non-privledged user to run the pipeline RUN mkdir /home/archive && /usr/sbin/groupadd -g 10000 "domainusers" \ && /usr/sbin/useradd -g 10000 -d /home/archive -M -N -u 10087 archive \ && chown -R archive:domainusers /home/archive @@ -12,11 +13,11 @@ RUN apt-get -y update && apt-get -y install gcc procps && \ RUN poetry config virtualenvs.create false -COPY --chown=10087:10000 pyproject.toml poetry.lock /lco/banzai/ +COPY pyproject.toml poetry.lock /lco/banzai/ RUN poetry install --directory=/lco/banzai -E cpu --no-root --no-cache -COPY --chown=10087:10000 . /lco/banzai +COPY . /lco/banzai RUN poetry install --directory /lco/banzai -E cpu --no-cache From d6972510b6df5135b1ad05406718f08cf90652bb Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Tue, 25 Feb 2025 15:14:16 -0500 Subject: [PATCH 24/46] Attempt at a fix for readthedocs. --- readthedocs.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readthedocs.yml b/readthedocs.yml index 066f07da8..002c5471f 100644 --- a/readthedocs.yml +++ b/readthedocs.yml @@ -3,11 +3,11 @@ version: 2 build: os: ubuntu-22.04 tools: - python: "3.10" + python: "3.12" python: install: - - method: pip + - method: [] commands: pre_build: - pip install poetry From bc249e35600f2c4a8eca476120a34d2bd5b74787 Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Tue, 25 Feb 2025 15:27:17 -0500 Subject: [PATCH 25/46] Attempt at a fix for readthedocs. --- readthedocs.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/readthedocs.yml b/readthedocs.yml index 002c5471f..722e2080b 100644 --- a/readthedocs.yml +++ b/readthedocs.yml @@ -5,9 +5,6 @@ build: tools: python: "3.12" -python: - install: - - method: [] commands: pre_build: - pip install poetry From 008674045e4b88b2a2186e0f4eb03f366a9c62a0 Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Tue, 25 Feb 2025 15:38:42 -0500 Subject: [PATCH 26/46] Added path to sphinx config for readthedocs. --- CHANGES.md | 1 + readthedocs.yml | 3 +++ 2 files changed, 4 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 16723385a..8d8e4c58f 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,7 @@ ------------------- - Bugfix to logging on reduction stopped - Updated the alembic scripts because the migration was taking too long +- Dependencies and package build are now managed by poetry 1.20.1 (2025-02-05) ------------------- diff --git a/readthedocs.yml b/readthedocs.yml index 722e2080b..1039cbeed 100644 --- a/readthedocs.yml +++ b/readthedocs.yml @@ -5,6 +5,9 @@ build: tools: python: "3.12" +sphinx: + configuration: docs/conf.py + commands: pre_build: - pip install poetry From 167f3dcbd8d89470df5ce5984c236bb46ba62ef0 Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Tue, 25 Feb 2025 15:49:47 -0500 Subject: [PATCH 27/46] Attempt at a fix for readthedocs. --- readthedocs.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/readthedocs.yml b/readthedocs.yml index 1039cbeed..9b984567f 100644 --- a/readthedocs.yml +++ b/readthedocs.yml @@ -4,13 +4,12 @@ build: os: ubuntu-22.04 tools: python: "3.12" + jobs: + pre_build: + - pip install poetry + - poetry install -E docs --no-root + build: + - poetry run sphinx-build -b html docs/ _build/html sphinx: configuration: docs/conf.py - -commands: - pre_build: - - pip install poetry - - poetry install -E docs --no-root - build: - - poetry run sphinx-build -b html docs/ _build/html From 7e72308bf4ad8a52ef67ebfb48b3d0f9c6a47c89 Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Tue, 25 Feb 2025 15:52:15 -0500 Subject: [PATCH 28/46] Attempt at a fix for readthedocs. --- readthedocs.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/readthedocs.yml b/readthedocs.yml index 9b984567f..34197ae47 100644 --- a/readthedocs.yml +++ b/readthedocs.yml @@ -1,15 +1,15 @@ version: 2 +sphinx: + configuration: docs/conf.py + build: os: ubuntu-22.04 tools: python: "3.12" jobs: - pre_build: + pre_install: - pip install poetry - poetry install -E docs --no-root build: - poetry run sphinx-build -b html docs/ _build/html - -sphinx: - configuration: docs/conf.py From b8acbbcb7918e023b6f6180c7c331bb0e63cea64 Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Tue, 25 Feb 2025 15:54:15 -0500 Subject: [PATCH 29/46] Attempt at a fix for readthedocs. --- readthedocs.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/readthedocs.yml b/readthedocs.yml index 34197ae47..1f5306ea5 100644 --- a/readthedocs.yml +++ b/readthedocs.yml @@ -11,5 +11,7 @@ build: pre_install: - pip install poetry - poetry install -E docs --no-root - build: - - poetry run sphinx-build -b html docs/ _build/html + +commands: + build: + - poetry run sphinx-build -b html docs/ _build/html From 55d69bf9aa31d2c6defdd631c1c36307e9afd084 Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Tue, 25 Feb 2025 15:57:00 -0500 Subject: [PATCH 30/46] Attempt at a fix for readthedocs. --- readthedocs.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/readthedocs.yml b/readthedocs.yml index 1f5306ea5..7f237559c 100644 --- a/readthedocs.yml +++ b/readthedocs.yml @@ -11,7 +11,6 @@ build: pre_install: - pip install poetry - poetry install -E docs --no-root - -commands: - build: - - poetry run sphinx-build -b html docs/ _build/html + commands: + build: + - poetry run sphinx-build -b html docs/ _build/html From e95a055b6c5b8f37f1a79876fa29f77dc0ad031b Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Tue, 25 Feb 2025 15:57:50 -0500 Subject: [PATCH 31/46] Attempt at a fix for readthedocs. --- readthedocs.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/readthedocs.yml b/readthedocs.yml index 7f237559c..07e8a5cdd 100644 --- a/readthedocs.yml +++ b/readthedocs.yml @@ -12,5 +12,4 @@ build: - pip install poetry - poetry install -E docs --no-root commands: - build: - poetry run sphinx-build -b html docs/ _build/html From bdd2e4dc97c7c5b4ba534cfca0af6b2319ca25a1 Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Tue, 25 Feb 2025 15:58:33 -0500 Subject: [PATCH 32/46] Attempt at a fix for readthedocs. --- readthedocs.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/readthedocs.yml b/readthedocs.yml index 07e8a5cdd..3d8ef44b8 100644 --- a/readthedocs.yml +++ b/readthedocs.yml @@ -7,9 +7,7 @@ build: os: ubuntu-22.04 tools: python: "3.12" - jobs: - pre_install: - - pip install poetry - - poetry install -E docs --no-root commands: - - poetry run sphinx-build -b html docs/ _build/html + - pip install poetry + - poetry install -E docs --no-root + - poetry run sphinx-build -b html docs/ _build/html From eec149b5f7ddccf7c6bd92545a341d38403de19e Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Tue, 25 Feb 2025 15:59:51 -0500 Subject: [PATCH 33/46] Attempt at a fix for readthedocs. --- readthedocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readthedocs.yml b/readthedocs.yml index 3d8ef44b8..d032d17eb 100644 --- a/readthedocs.yml +++ b/readthedocs.yml @@ -9,5 +9,5 @@ build: python: "3.12" commands: - pip install poetry - - poetry install -E docs --no-root + - poetry install -E docs - poetry run sphinx-build -b html docs/ _build/html From b8843f0d499fa9580b67fa55c9a9dce232d5e79a Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Tue, 25 Feb 2025 16:01:49 -0500 Subject: [PATCH 34/46] Attempt at a fix for readthedocs. --- readthedocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readthedocs.yml b/readthedocs.yml index d032d17eb..e1ee2e5ba 100644 --- a/readthedocs.yml +++ b/readthedocs.yml @@ -10,4 +10,4 @@ build: commands: - pip install poetry - poetry install -E docs - - poetry run sphinx-build -b html docs/ _build/html + - poetry run sphinx-build -b html $READTHEDOCS_OUTPUT/html/ From dd56aa0b69d43a70ecfb1be6cde5f4874e6a00cb Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Tue, 25 Feb 2025 16:03:54 -0500 Subject: [PATCH 35/46] Attempt at a fix for readthedocs. --- readthedocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readthedocs.yml b/readthedocs.yml index e1ee2e5ba..41296e64c 100644 --- a/readthedocs.yml +++ b/readthedocs.yml @@ -10,4 +10,4 @@ build: commands: - pip install poetry - poetry install -E docs - - poetry run sphinx-build -b html $READTHEDOCS_OUTPUT/html/ + - poetry run sphinx-build -b html ${READTHEDOCS_OUTPUT}/html/ From d9af071e301da2032cb67a8f86b12861b3e7158d Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Tue, 25 Feb 2025 16:05:31 -0500 Subject: [PATCH 36/46] Attempt at a fix for readthedocs. --- readthedocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readthedocs.yml b/readthedocs.yml index 41296e64c..8028690df 100644 --- a/readthedocs.yml +++ b/readthedocs.yml @@ -10,4 +10,4 @@ build: commands: - pip install poetry - poetry install -E docs - - poetry run sphinx-build -b html ${READTHEDOCS_OUTPUT}/html/ + - poetry run sphinx-build -b html docs/ ${READTHEDOCS_OUTPUT}/html/ From d822dd01c55d04904099c71a63b54c945b1128fb Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Wed, 26 Feb 2025 14:10:21 -0500 Subject: [PATCH 37/46] Fixes to logging when an exception happens. Added a token so we stop getting rate limited by the archive. --- .github/workflows/e2e.yaml | 2 ++ banzai/stages.py | 4 ++-- banzai/tests/e2e-k8s.yaml | 13 +++++++++++++ banzai/utils/fits_utils.py | 9 +++++++++ 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index b0e45f348..1e5c7bb76 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -34,6 +34,8 @@ jobs: kind load docker-image banzai:test-latest - name: Start banzai + env: + AUTH_TOKEN: ${{ secrets.ArchiveAuthToken }} run: | cat banzai/tests/e2e-k8s.yaml diff --git a/banzai/stages.py b/banzai/stages.py index 4f7b136ea..8f704afae 100755 --- a/banzai/stages.py +++ b/banzai/stages.py @@ -56,9 +56,9 @@ def run(self, images): logger.error(logs.format_exception()) if isinstance(image_set, Iterable): for image in image_set: - logger.error('Reduction stopped', extra_tags={'filename': image}) + logger.error('Reduction stopped', image=image) else: - logger.error('Reduction stopped', extra_tags={'filename': image}) + logger.error('Reduction stopped', image=image) return processed_images diff --git a/banzai/tests/e2e-k8s.yaml b/banzai/tests/e2e-k8s.yaml index a1350c7ab..fae59ef92 100644 --- a/banzai/tests/e2e-k8s.yaml +++ b/banzai/tests/e2e-k8s.yaml @@ -84,6 +84,11 @@ spec: value: "e2e_task_queue" - name: REFERENCE_CATALOG_URL value: "http://phot-catalog.lco.gtn/" + - name: AUTH_TOKEN + valueFrom: + fieldRef: + fieldPath: hostEnv['AUTH_TOKEN'] + command: - celery - -A @@ -148,6 +153,10 @@ spec: value: "e2e_large_task_queue" - name: REFERENCE_CATALOG_URL value: "http://phot-catalog.lco.gtn/" + - name: AUTH_TOKEN + valueFrom: + fieldRef: + fieldPath: hostEnv['AUTH_TOKEN'] command: - celery - -A @@ -210,6 +219,10 @@ spec: value: "http://phot-catalog.lco.gtn/" - name: "CELERY_LARGE_TASK_QUEUE_NAME" value: "e2e_large_task_queue" + - name: AUTH_TOKEN + valueFrom: + fieldRef: + fieldPath: hostEnv['AUTH_TOKEN'] command: - banzai_run_realtime_pipeline - --db-address=$(DB_ADDRESS) diff --git a/banzai/utils/fits_utils.py b/banzai/utils/fits_utils.py index c12775518..41ac3d8ab 100755 --- a/banzai/utils/fits_utils.py +++ b/banzai/utils/fits_utils.py @@ -104,6 +104,15 @@ def download_from_s3(file_info, context, is_raw_frame=False): url = f'{context.ARCHIVE_FRAME_URL}/{frame_id}/?include_related_frames=false' archive_auth_header = context.ARCHIVE_AUTH_HEADER response = requests.get(url, headers=archive_auth_header).json() + try: + response.raise_fot_status() + except requests.exceptions.HTTPError as e: + message = 'Error downloading file from archive.' + if int(response.status_code) == 429: + message =+ ' Rate limited.' + logger.error(message, extra_tags={'filename': file_info.get('filename'), + 'attempt_number': download_from_s3.statistics['attempt_number']}) + raise e buffer = io.BytesIO() buffer.write(requests.get(response['url'], stream=True).content) buffer.seek(0) From 794403278c1fb53440d19144d5a23d0f64a6bf2f Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Wed, 26 Feb 2025 14:13:00 -0500 Subject: [PATCH 38/46] Style fix. --- banzai/utils/fits_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/banzai/utils/fits_utils.py b/banzai/utils/fits_utils.py index 41ac3d8ab..a52929886 100755 --- a/banzai/utils/fits_utils.py +++ b/banzai/utils/fits_utils.py @@ -104,7 +104,7 @@ def download_from_s3(file_info, context, is_raw_frame=False): url = f'{context.ARCHIVE_FRAME_URL}/{frame_id}/?include_related_frames=false' archive_auth_header = context.ARCHIVE_AUTH_HEADER response = requests.get(url, headers=archive_auth_header).json() - try: + try: response.raise_fot_status() except requests.exceptions.HTTPError as e: message = 'Error downloading file from archive.' From 9a631c20cb9aeea90f635455a54d6eede510245a Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Fri, 28 Feb 2025 12:15:03 -0500 Subject: [PATCH 39/46] Restructured k8s deployment of e2e tests to add an auth token. --- .github/workflows/e2e.yaml | 45 ++-- banzai/tests/e2e-k8s.yaml | 248 -------------------- banzai/tests/k8s/e2e-k8s.yaml | 341 ++++++++++++++++++++++++++++ banzai/tests/k8s/kustomization.yaml | 55 +++++ 4 files changed, 426 insertions(+), 263 deletions(-) delete mode 100644 banzai/tests/e2e-k8s.yaml create mode 100644 banzai/tests/k8s/e2e-k8s.yaml create mode 100644 banzai/tests/k8s/kustomization.yaml diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index 1e5c7bb76..263904f94 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -34,27 +34,35 @@ jobs: kind load docker-image banzai:test-latest - name: Start banzai - env: - AUTH_TOKEN: ${{ secrets.ArchiveAuthToken }} run: | - cat banzai/tests/e2e-k8s.yaml + kubectl create secret generic auth-token-secret --from-literal=auth-token=${{ secrets.ArchiveAuthToken }} # Deploy banzai stack - kubectl apply -f banzai/tests/e2e-k8s.yaml + kubectl apply -k banzai/tests/k8s # Wait for banzai to be ready - kubectl wait --for=condition=Ready --timeout=60m pod/banzai-e2e-test + kubectl wait --for=condition=Ready --timeout=60m pods -l group=banzai-e2e-test + + LISTENER_POD=$(kubectl get pods -l app=banzai-listener-deployment -o jsonpath='{.items[0].metadata.name}') + echo "LISTENER_POD=${LISTENER_POD}" >> $GITHUB_ENV + WORKERS_POD=$(kubectl get pods -l app=banzai-celery-workers-deployment -o jsonpath='{.items[0].metadata.name}') + echo "WORKERS_POD=${WORKERS_POD}" >> $GITHUB_ENV + + LARGE_WORKERS_POD=$(kubectl get pods -l app=banzai-large-celery-workers-deployment -o jsonpath='{.items[0].metadata.name}') + echo "LARGE_WORKERS_POD=${LARGE_WORKERS_POD}" >> $GITHUB_ENV + - name: Test Super Bias Creation run: | set +e export START=$(date -u +'%Y-%m-%dT%H:%M:%SZ') - - kubectl exec banzai-e2e-test -c banzai-listener -- pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-master-bias.xml -m master_bias + kubectl exec ${LISTENER_POD} -c banzai-listener -- pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-master-bias.xml -m master_bias EXIT_CODE=$? # Always print logs even if (especially if?) the reduction fails - kubectl logs banzai-e2e-test --since-time=$START --all-containers --prefix=true + kubectl logs ${LISTENER_POD} --since-time=$START --all-containers --prefix=true + kubectl logs ${WORKERS_POD} --since-time=$START --all-containers --prefix=true + kubectl logs ${LARGE_WORKERS_POD} --since-time=$START --all-containers --prefix=true # Exit with the captured status so the job properly fails or succeeds exit $EXIT_CODE @@ -64,11 +72,13 @@ jobs: set +e export START=$(date -u +'%Y-%m-%dT%H:%M:%SZ') - kubectl exec banzai-e2e-test -c banzai-listener -- pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-master-dark.xml -m master_dark + kubectl exec ${LISTENER_POD} -c banzai-listener -- pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-master-dark.xml -m master_dark EXIT_CODE=$? # Always print logs even if (especially if?) the reduction fails - kubectl logs banzai-e2e-test --since-time=$START --all-containers --prefix=true + kubectl logs ${LISTENER_POD} --since-time=$START --all-containers --prefix=true + kubectl logs ${WORKERS_POD} --since-time=$START --all-containers --prefix=true + kubectl logs ${LARGE_WORKERS_POD} --since-time=$START --all-containers --prefix=true # Exit with the captured status so the job properly fails or succeeds exit $EXIT_CODE @@ -78,11 +88,13 @@ jobs: set +e export START=$(date -u +'%Y-%m-%dT%H:%M:%SZ') - kubectl exec banzai-e2e-test -c banzai-listener -- pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-master-flat.xml -m master_flat + kubectl exec ${LISTENER_POD} -c banzai-listener -- pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-master-flat.xml -m master_flat EXIT_CODE=$? # Always print logs even if (especially if?) the reduction fails - kubectl logs banzai-e2e-test --since-time=$START --all-containers --prefix=true + kubectl logs ${LISTENER_POD} --since-time=$START --all-containers --prefix=true + kubectl logs ${WORKERS_POD} --since-time=$START --all-containers --prefix=true + kubectl logs ${LARGE_WORKERS_POD} --since-time=$START --all-containers --prefix=true # Exit with the captured status so the job properly fails or succeeds exit $EXIT_CODE @@ -92,15 +104,18 @@ jobs: set +e export START=$(date -u +'%Y-%m-%dT%H:%M:%SZ') - kubectl exec banzai-e2e-test -c banzai-listener -- pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-science-files.xml -m science_files + kubectl exec ${LISTENER_POD} -c banzai-listener -- pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-science-files.xml -m science_files EXIT_CODE=$? # Always print logs even if (especially if?) the reduction fails - kubectl logs banzai-e2e-test --since-time=$START --all-containers --prefix=true + kubectl logs ${LISTENER_POD} --since-time=$START --all-containers --prefix=true + kubectl logs ${WORKERS_POD} --since-time=$START --all-containers --prefix=true + kubectl logs ${LARGE_WORKERS_POD} --since-time=$START --all-containers --prefix=true # Exit with the captured status so the job properly fails or succeeds exit $EXIT_CODE - name: Cleanup run: | - kubectl delete pod banzai-e2e-test + kubectl delete service --selector=group=banzai-e2e-test + kubectl delete deployment --selector=group=banzai-e2e-test diff --git a/banzai/tests/e2e-k8s.yaml b/banzai/tests/e2e-k8s.yaml deleted file mode 100644 index fae59ef92..000000000 --- a/banzai/tests/e2e-k8s.yaml +++ /dev/null @@ -1,248 +0,0 @@ -apiVersion: v1 -kind: Pod -metadata: - name: banzai-e2e-test - labels: - app.kubernetes.io/name: banzai -spec: - # Create some empty directories to be mounted within the Pod - volumes: - - name: banzai-data - emptyDir: - sizeLimit: 10Gi - securityContext: - fsGroup: 10000 - - containers: - - name: banzai-redis - image: redis:5.0.3 - imagePullPolicy: IfNotPresent - resources: - requests: - cpu: 0.1 - memory: 512Mi - limits: - cpu: 1 - memory: 512Mi - readinessProbe: - exec: - command: - - /bin/sh - - -c - - 'redis-cli ping | grep -q "PONG"' - initialDelaySeconds: 5 - periodSeconds: 1 - - name: banzai-fits-exchange - image: rabbitmq:3.12.3 - imagePullPolicy: IfNotPresent - resources: - requests: - cpu: 1 - memory: 512Mi - limits: - cpu: 4 - memory: 512Mi - readinessProbe: - exec: - command: - - rabbitmq-diagnostics - - "-q" - - ping - initialDelaySeconds: 5 - periodSeconds: 1 - timeoutSeconds: 10 - - name: banzai-celery-workers - image: banzai:test-latest - imagePullPolicy: IfNotPresent - volumeMounts: - - name: banzai-data - mountPath: /archive/engineering - subPath: engineering - readOnly: false - env: - - name: DB_ADDRESS - value: "sqlite:////archive/engineering/test.db?timeout=30" - - name: RETRY_DELAY - value: "0" - - name: TASK_HOST - value: "redis://localhost:6379/0" - - name: BANZAI_WORKER_LOGLEVEL - value: debug - - name: CALIBRATE_PROPOSAL_ID - value: "calibrate" - - name: OBSERVATION_PORTAL_URL - value: "http://internal-observation-portal.lco.gtn/api/observations/" - - name: API_ROOT - value: "https://archive-api.lco.global/" - - name: OMP_NUM_THREADS - value: "1" - - name: FITS_EXCHANGE - value: "fits_files" - - name: OPENTSDB_PYTHON_METRICS_TEST_MODE - value: "1" - - name: CELERY_TASK_QUEUE_NAME - value: "e2e_task_queue" - - name: REFERENCE_CATALOG_URL - value: "http://phot-catalog.lco.gtn/" - - name: AUTH_TOKEN - valueFrom: - fieldRef: - fieldPath: hostEnv['AUTH_TOKEN'] - - command: - - celery - - -A - - banzai - - worker - - --hostname - - "banzai-celery-worker" - - --concurrency - - "4" - - -l - - "info" - - "-Q" - - "$(CELERY_TASK_QUEUE_NAME)" - - "-n" - - "celery-worker" - readinessProbe: - exec: - command: - - /bin/sh - - -c - - "celery -A banzai status | grep -q '@celery-worker:.*OK'" - initialDelaySeconds: 5 - periodSeconds: 1 - timeoutSeconds: 10 - resources: - requests: - cpu: 4 - memory: 6Gi - limits: - cpu: 8 - memory: 6Gi - - name: banzai-large-celery-workers - image: banzai:test-latest - imagePullPolicy: IfNotPresent - volumeMounts: - - name: banzai-data - mountPath: /archive/engineering - subPath: engineering - readOnly: false - env: - - name: DB_ADDRESS - value: "sqlite:////archive/engineering/test.db?timeout=30" - - name: RETRY_DELAY - value: "0" - - name: TASK_HOST - value: "redis://localhost:6379/0" - - name: BANZAI_WORKER_LOGLEVEL - value: debug - - name: CALIBRATE_PROPOSAL_ID - value: "calibrate" - - name: OBSERVATION_PORTAL_URL - value: "http://internal-observation-portal.lco.gtn/api/observations/" - - name: API_ROOT - value: "https://archive-api.lco.global/" - - name: OMP_NUM_THREADS - value: "2" - - name: FITS_EXCHANGE - value: "fits_files" - - name: OPENTSDB_PYTHON_METRICS_TEST_MODE - value: "1" - - name: CELERY_TASK_QUEUE_NAME - value: "e2e_large_task_queue" - - name: REFERENCE_CATALOG_URL - value: "http://phot-catalog.lco.gtn/" - - name: AUTH_TOKEN - valueFrom: - fieldRef: - fieldPath: hostEnv['AUTH_TOKEN'] - command: - - celery - - -A - - banzai - - worker - - --hostname - - "banzai-celery-worker" - - --concurrency - - "1" - - -l - - "info" - - "-Q" - - "$(CELERY_TASK_QUEUE_NAME)" - - "-n" - - "large-celery-worker" - readinessProbe: - exec: - command: - - /bin/sh - - -c - - 'celery -A banzai status | grep -q "large-celery-worker:.*OK"' - initialDelaySeconds: 5 - periodSeconds: 1 - timeoutSeconds: 10 - resources: - requests: - cpu: 2 - memory: 8Gi - limits: - cpu: 3 - memory: 8Gi - - name: banzai-listener - image: banzai:test-latest - imagePullPolicy: IfNotPresent - volumeMounts: - - name: banzai-data - mountPath: /archive/engineering - subPath: engineering - readOnly: false - env: - - name: DB_ADDRESS - value: "sqlite:////archive/engineering/test.db?timeout=30" - - name: FITS_BROKER - value: "localhost" - - name: TASK_HOST - value: "redis://localhost:6379/0" - - name: CALIBRATE_PROPOSAL_ID - value: "calibrate" - - name: OBSERVATION_PORTAL_URL - value: "http://internal-observation-portal.lco.gtn/api/observations/" - - name: API_ROOT - value: "https://archive-api.lco.global/" - - name: FITS_EXCHANGE - value: "fits_files" - - name: OPENTSDB_PYTHON_METRICS_TEST_MODE - value: "1" - - name: CELERY_TASK_QUEUE_NAME - value: "e2e_task_queue" - - name: REFERENCE_CATALOG_URL - value: "http://phot-catalog.lco.gtn/" - - name: "CELERY_LARGE_TASK_QUEUE_NAME" - value: "e2e_large_task_queue" - - name: AUTH_TOKEN - valueFrom: - fieldRef: - fieldPath: hostEnv['AUTH_TOKEN'] - command: - - banzai_run_realtime_pipeline - - --db-address=$(DB_ADDRESS) - - --fpack - - --broker-url=localhost - resources: - requests: - cpu: 0.1 - memory: 1Gi - limits: - cpu: 1 - memory: 1Gi - readinessProbe: - exec: - command: - - /bin/sh - - -c - - 'ps -u archive | grep -q "banzai_run_real"' - initialDelaySeconds: 5 - periodSeconds: 1 - timeoutSeconds: 10 - dnsPolicy: ClusterFirst - restartPolicy: Never diff --git a/banzai/tests/k8s/e2e-k8s.yaml b/banzai/tests/k8s/e2e-k8s.yaml new file mode 100644 index 000000000..a253a0c08 --- /dev/null +++ b/banzai/tests/k8s/e2e-k8s.yaml @@ -0,0 +1,341 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: banzai-redis-deployment + labels: + app: banzai-redis + group: banzai-e2e-test +spec: + replicas: 1 + selector: + matchLabels: + app: banzai-redis + template: + metadata: + labels: + app: banzai-redis + spec: + securityContext: + fsGroup: 10000 + containers: + - name: banzai-redis + image: redis:5.0.3 + imagePullPolicy: IfNotPresent + resources: + requests: + cpu: 0.1 + memory: 512Mi + limits: + cpu: 1 + memory: 512Mi + readinessProbe: + exec: + command: + - /bin/sh + - -c + - 'redis-cli ping | grep -q "PONG"' + initialDelaySeconds: 5 + periodSeconds: 1 + +--- +apiVersion: v1 +kind: Service +metadata: + name: banzai-redis + labels: + app: banzai-redis + group: banzai-e2e-test +spec: + selector: + app: banzai-redis + ports: + - port: 6379 + targetPort: 6379 + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: banzai-fits-exchange-deployment + labels: + app: banzai-fits-exchange + group: banzai-e2e-test +spec: + replicas: 1 + selector: + matchLabels: + app: banzai-fits-exchange + template: + metadata: + labels: + app: banzai-fits-exchange + spec: + securityContext: + fsGroup: 10000 + containers: + - name: banzai-fits-exchange + image: rabbitmq:3.12.3 + imagePullPolicy: IfNotPresent + resources: + requests: + cpu: 1 + memory: 512Mi + limits: + cpu: 4 + memory: 512Mi + readinessProbe: + exec: + command: + - rabbitmq-diagnostics + - "-q" + - ping + initialDelaySeconds: 5 + periodSeconds: 1 + timeoutSeconds: 10 +--- +apiVersion: v1 +kind: Service +metadata: + name: banzai-fits-exchange + labels: + app: banzai-fits-exchange + group: banzai-e2e-test +spec: + selector: + app: banzai-fits-exchange + ports: + - port: 5672 + targetPort: 5672 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: banzai-celery-workers-deployment + labels: + app: banzai-celery-workers + group: banzai-e2e-test +spec: + replicas: 1 + selector: + matchLabels: + app: banzai-celery-workers + template: + metadata: + labels: + app: banzai-celery-workers + spec: + restartPolicy: Always + securityContext: + fsGroup: 10000 + containers: + - name: banzai-celery-workers + image: banzai:test-latest + imagePullPolicy: IfNotPresent + env: + - name: DB_ADDRESS + value: "sqlite:////archive/engineering/test.db?timeout=30" + - name: RETRY_DELAY + value: "0" + - name: TASK_HOST + value: "redis://banzai-redis:6379/0" # Adjust if needed + - name: BANZAI_WORKER_LOGLEVEL + value: debug + - name: CALIBRATE_PROPOSAL_ID + value: "calibrate" + - name: OBSERVATION_PORTAL_URL + value: "http://internal-observation-portal.lco.gtn/api/observations/" + - name: API_ROOT + value: "https://archive-api.lco.global/" + - name: OMP_NUM_THREADS + value: "1" + - name: FITS_EXCHANGE + value: "fits_files" + - name: OPENTSDB_PYTHON_METRICS_TEST_MODE + value: "1" + - name: CELERY_TASK_QUEUE_NAME + value: "e2e_task_queue" + - name: REFERENCE_CATALOG_URL + value: "http://phot-catalog.lco.gtn/" + command: + - celery + - -A + - banzai + - worker + - --hostname + - "banzai-celery-worker" + - --concurrency + - "4" + - -l + - "info" + - "-Q" + - "$(CELERY_TASK_QUEUE_NAME)" + - "-n" + - "celery-worker" + readinessProbe: + exec: + command: + - /bin/sh + - -c + - "celery -A banzai status | grep -q '@celery-worker:.*OK'" + initialDelaySeconds: 5 + periodSeconds: 1 + timeoutSeconds: 10 + resources: + requests: + cpu: 4 + memory: 6Gi + limits: + cpu: 8 + memory: 6Gi + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: banzai-large-celery-workers-deployment + labels: + app: banzai-large-celery-workers + group: banzai-e2e-test +spec: + replicas: 1 + selector: + matchLabels: + app: banzai-large-celery-workers + template: + metadata: + labels: + app: banzai-large-celery-workers + spec: + restartPolicy: Always + securityContext: + fsGroup: 10000 + containers: + - name: banzai-large-celery-workers + image: banzai:test-latest + imagePullPolicy: IfNotPresent + env: + - name: DB_ADDRESS + value: "sqlite:////archive/engineering/test.db?timeout=30" + - name: RETRY_DELAY + value: "0" + - name: TASK_HOST + value: "redis://banzai-redis:6379/0" # Adjust if needed + - name: BANZAI_WORKER_LOGLEVEL + value: debug + - name: CALIBRATE_PROPOSAL_ID + value: "calibrate" + - name: OBSERVATION_PORTAL_URL + value: "http://internal-observation-portal.lco.gtn/api/observations/" + - name: API_ROOT + value: "https://archive-api.lco.global/" + - name: OMP_NUM_THREADS + value: "2" + - name: FITS_EXCHANGE + value: "fits_files" + - name: OPENTSDB_PYTHON_METRICS_TEST_MODE + value: "1" + - name: CELERY_TASK_QUEUE_NAME + value: "e2e_large_task_queue" + - name: REFERENCE_CATALOG_URL + value: "http://phot-catalog.lco.gtn/" + command: + - celery + - -A + - banzai + - worker + - --hostname + - "banzai-celery-worker" + - --concurrency + - "1" + - -l + - "info" + - "-Q" + - "$(CELERY_TASK_QUEUE_NAME)" + - "-n" + - "large-celery-worker" + readinessProbe: + exec: + command: + - /bin/sh + - -c + - 'celery -A banzai status | grep -q "large-celery-worker:.*OK"' + initialDelaySeconds: 5 + periodSeconds: 1 + timeoutSeconds: 10 + resources: + requests: + cpu: 2 + memory: 8Gi + limits: + cpu: 3 + memory: 8Gi + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: banzai-listener-deployment + labels: + app: banzai-listener + group: banzai-e2e-test +spec: + replicas: 1 + selector: + matchLabels: + app: banzai-listener + template: + metadata: + labels: + app: banzai-listener + spec: + restartPolicy: Always + securityContext: + fsGroup: 10000 + containers: + - name: banzai-listener + image: banzai:test-latest + imagePullPolicy: IfNotPresent + env: + - name: DB_ADDRESS + value: "sqlite:////archive/engineering/test.db?timeout=30" + - name: FITS_BROKER + value: "banzai-fits-exchange" + - name: TASK_HOST + value: "redis://banzai-redis:6379/0" + - name: CALIBRATE_PROPOSAL_ID + value: "calibrate" + - name: OBSERVATION_PORTAL_URL + value: "http://internal-observation-portal.lco.gtn/api/observations/" + - name: API_ROOT + value: "https://archive-api.lco.global/" + - name: FITS_EXCHANGE + value: "fits_files" + - name: OPENTSDB_PYTHON_METRICS_TEST_MODE + value: "1" + - name: CELERY_TASK_QUEUE_NAME + value: "e2e_task_queue" + - name: REFERENCE_CATALOG_URL + value: "http://phot-catalog.lco.gtn/" + - name: CELERY_LARGE_TASK_QUEUE_NAME + value: "e2e_large_task_queue" + command: + - banzai_run_realtime_pipeline + - --db-address=$(DB_ADDRESS) + - --fpack + - --broker-url=banzai-fits-exchange + resources: + requests: + cpu: 0.1 + memory: 1Gi + limits: + cpu: 1 + memory: 1Gi + readinessProbe: + exec: + command: + - /bin/sh + - -c + - 'ps -u archive | grep -q "banzai_run_real"' + initialDelaySeconds: 5 + periodSeconds: 1 + timeoutSeconds: 10 diff --git a/banzai/tests/k8s/kustomization.yaml b/banzai/tests/k8s/kustomization.yaml new file mode 100644 index 000000000..2cb4aa4ef --- /dev/null +++ b/banzai/tests/k8s/kustomization.yaml @@ -0,0 +1,55 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +resources: + - e2e-k8s.yaml + +patches: + - patch: |- + apiVersion: apps/v1 + kind: Deployment + metadata: + name: banzai-listener-deployment + spec: + template: + spec: + containers: + - name: banzai-listener + env: + - name: AUTH_TOKEN + valueFrom: + secretKeyRef: + name: auth-token-secret + key: auth-token + - patch: |- + apiVersion: apps/v1 + kind: Deployment + metadata: + name: banzai-celery-workers-deployment + spec: + template: + spec: + containers: + - name: banzai-celery-workers + env: + - name: AUTH_TOKEN + valueFrom: + secretKeyRef: + name: auth-token-secret + key: auth-token + - patch: |- + apiVersion: apps/v1 + kind: Deployment + metadata: + name: banzai-large-celery-workers-deployment + spec: + template: + spec: + containers: + - name: banzai-large-celery-workers + env: + - name: AUTH_TOKEN + valueFrom: + secretKeyRef: + name: auth-token-secret + key: auth-token From 372eb7a7dffef57e9e5d06b3c1fb71cbae2889ef Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Fri, 28 Feb 2025 12:47:56 -0500 Subject: [PATCH 40/46] Fixes to gh action labels. --- .github/workflows/e2e.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index 263904f94..3b8e08290 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -43,13 +43,13 @@ jobs: # Wait for banzai to be ready kubectl wait --for=condition=Ready --timeout=60m pods -l group=banzai-e2e-test - LISTENER_POD=$(kubectl get pods -l app=banzai-listener-deployment -o jsonpath='{.items[0].metadata.name}') + LISTENER_POD=$(kubectl get pods -l app=banzai-listener -o jsonpath='{.items[0].metadata.name}') echo "LISTENER_POD=${LISTENER_POD}" >> $GITHUB_ENV - WORKERS_POD=$(kubectl get pods -l app=banzai-celery-workers-deployment -o jsonpath='{.items[0].metadata.name}') + WORKERS_POD=$(kubectl get pods -l app=banzai-celery-workers -o jsonpath='{.items[0].metadata.name}') echo "WORKERS_POD=${WORKERS_POD}" >> $GITHUB_ENV - LARGE_WORKERS_POD=$(kubectl get pods -l app=banzai-large-celery-workers-deployment -o jsonpath='{.items[0].metadata.name}') + LARGE_WORKERS_POD=$(kubectl get pods -l app=banzai-large-celery-workers -o jsonpath='{.items[0].metadata.name}') echo "LARGE_WORKERS_POD=${LARGE_WORKERS_POD}" >> $GITHUB_ENV - name: Test Super Bias Creation From 02b572916d0c99f4cdccfacfb2ff2f85cf9af76d Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Fri, 28 Feb 2025 13:55:12 -0500 Subject: [PATCH 41/46] Added labels to make sure resources get selected. --- banzai/tests/k8s/e2e-k8s.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/banzai/tests/k8s/e2e-k8s.yaml b/banzai/tests/k8s/e2e-k8s.yaml index a253a0c08..ae2b9673f 100644 --- a/banzai/tests/k8s/e2e-k8s.yaml +++ b/banzai/tests/k8s/e2e-k8s.yaml @@ -14,6 +14,7 @@ spec: metadata: labels: app: banzai-redis + group: banzai-e2e-test spec: securityContext: fsGroup: 10000 @@ -69,6 +70,7 @@ spec: metadata: labels: app: banzai-fits-exchange + group: banzai-e2e-test spec: securityContext: fsGroup: 10000 @@ -123,6 +125,7 @@ spec: metadata: labels: app: banzai-celery-workers + group: banzai-e2e-test spec: restartPolicy: Always securityContext: @@ -205,6 +208,7 @@ spec: metadata: labels: app: banzai-large-celery-workers + group: banzai-e2e-test spec: restartPolicy: Always securityContext: @@ -287,6 +291,7 @@ spec: metadata: labels: app: banzai-listener + group: banzai-e2e-test spec: restartPolicy: Always securityContext: From 997fbf5dc2852dc5651ebfa94e0223269a2186a3 Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Fri, 28 Feb 2025 14:18:02 -0500 Subject: [PATCH 42/46] Added timeouts to readiness probes --- banzai/tests/k8s/e2e-k8s.yaml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/banzai/tests/k8s/e2e-k8s.yaml b/banzai/tests/k8s/e2e-k8s.yaml index ae2b9673f..e870d3443 100644 --- a/banzai/tests/k8s/e2e-k8s.yaml +++ b/banzai/tests/k8s/e2e-k8s.yaml @@ -37,6 +37,7 @@ spec: - 'redis-cli ping | grep -q "PONG"' initialDelaySeconds: 5 periodSeconds: 1 + timeoutSeconds: 60 --- apiVersion: v1 @@ -93,7 +94,7 @@ spec: - ping initialDelaySeconds: 5 periodSeconds: 1 - timeoutSeconds: 10 + timeoutSeconds: 60 --- apiVersion: v1 kind: Service @@ -182,7 +183,7 @@ spec: - "celery -A banzai status | grep -q '@celery-worker:.*OK'" initialDelaySeconds: 5 periodSeconds: 1 - timeoutSeconds: 10 + timeoutSeconds: 60 resources: requests: cpu: 4 @@ -265,7 +266,7 @@ spec: - 'celery -A banzai status | grep -q "large-celery-worker:.*OK"' initialDelaySeconds: 5 periodSeconds: 1 - timeoutSeconds: 10 + timeoutSeconds: 60 resources: requests: cpu: 2 @@ -343,4 +344,4 @@ spec: - 'ps -u archive | grep -q "banzai_run_real"' initialDelaySeconds: 5 periodSeconds: 1 - timeoutSeconds: 10 + timeoutSeconds: 60 From 6d66dac3bb2013f2971234f82f9c42a3f677439a Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Fri, 28 Feb 2025 14:46:07 -0500 Subject: [PATCH 43/46] Added a pvc now that e2e tests are split across pods. --- banzai/tests/k8s/e2e-k8s.yaml | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/banzai/tests/k8s/e2e-k8s.yaml b/banzai/tests/k8s/e2e-k8s.yaml index e870d3443..6ed0999b0 100644 --- a/banzai/tests/k8s/e2e-k8s.yaml +++ b/banzai/tests/k8s/e2e-k8s.yaml @@ -1,3 +1,16 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: banzai-shared-pvc + labels: + group: banzai-e2e-test +spec: + accessModes: + - ReadWriteMany + resources: + requests: + storage: 10Gi +--- apiVersion: apps/v1 kind: Deployment metadata: @@ -131,10 +144,17 @@ spec: restartPolicy: Always securityContext: fsGroup: 10000 + volumes: + - name: banzai-shared-volume + persistentVolumeClaim: + claimName: banzai-shared-pvc containers: - name: banzai-celery-workers image: banzai:test-latest imagePullPolicy: IfNotPresent + volumeMounts: + - name: banzai-shared-volume + mountPath: /archive env: - name: DB_ADDRESS value: "sqlite:////archive/engineering/test.db?timeout=30" @@ -214,10 +234,17 @@ spec: restartPolicy: Always securityContext: fsGroup: 10000 + volumes: + - name: banzai-shared-volume + persistentVolumeClaim: + claimName: banzai-shared-pvc containers: - name: banzai-large-celery-workers image: banzai:test-latest imagePullPolicy: IfNotPresent + volumeMounts: + - name: banzai-shared-volume + mountPath: /archive env: - name: DB_ADDRESS value: "sqlite:////archive/engineering/test.db?timeout=30" @@ -297,10 +324,17 @@ spec: restartPolicy: Always securityContext: fsGroup: 10000 + volumes: + - name: banzai-shared-volume + persistentVolumeClaim: + claimName: banzai-shared-pvc containers: - name: banzai-listener image: banzai:test-latest imagePullPolicy: IfNotPresent + volumeMounts: + - name: banzai-shared-volume + mountPath: /archive env: - name: DB_ADDRESS value: "sqlite:////archive/engineering/test.db?timeout=30" From d453a423c8a783733edb2b5d2c006bdb0bc0c933 Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Fri, 28 Feb 2025 17:33:52 -0500 Subject: [PATCH 44/46] Revert to single pod architecture because shared pvcs don't really work in kind. --- .github/workflows/e2e.yaml | 45 +-- banzai/tests/k8s/e2e-k8s.yaml | 607 +++++++++++----------------- banzai/tests/k8s/kustomization.yaml | 70 ++-- 3 files changed, 274 insertions(+), 448 deletions(-) diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index 3b8e08290..e247fc628 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -41,28 +41,19 @@ jobs: kubectl apply -k banzai/tests/k8s # Wait for banzai to be ready - kubectl wait --for=condition=Ready --timeout=60m pods -l group=banzai-e2e-test - - LISTENER_POD=$(kubectl get pods -l app=banzai-listener -o jsonpath='{.items[0].metadata.name}') - echo "LISTENER_POD=${LISTENER_POD}" >> $GITHUB_ENV - - WORKERS_POD=$(kubectl get pods -l app=banzai-celery-workers -o jsonpath='{.items[0].metadata.name}') - echo "WORKERS_POD=${WORKERS_POD}" >> $GITHUB_ENV - - LARGE_WORKERS_POD=$(kubectl get pods -l app=banzai-large-celery-workers -o jsonpath='{.items[0].metadata.name}') - echo "LARGE_WORKERS_POD=${LARGE_WORKERS_POD}" >> $GITHUB_ENV + kubectl wait --for=condition=Ready --timeout=60m pod/banzai-e2e-test - name: Test Super Bias Creation run: | set +e export START=$(date -u +'%Y-%m-%dT%H:%M:%SZ') - kubectl exec ${LISTENER_POD} -c banzai-listener -- pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-master-bias.xml -m master_bias + kubectl exec banzai-e2e-test -c banzai-listener -- pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-master-bias.xml -m master_bias EXIT_CODE=$? # Always print logs even if (especially if?) the reduction fails - kubectl logs ${LISTENER_POD} --since-time=$START --all-containers --prefix=true - kubectl logs ${WORKERS_POD} --since-time=$START --all-containers --prefix=true - kubectl logs ${LARGE_WORKERS_POD} --since-time=$START --all-containers --prefix=true + kubectl logs banzai-e2e-test -c banzai-listener --since-time=$START --prefix=true + kubectl logs banzai-e2e-test -c banzai-celery-workers --since-time=$START --prefix=true + kubectl logs banzai-e2e-test -c banzai-large-celery-workers --since-time=$START --prefix=true # Exit with the captured status so the job properly fails or succeeds exit $EXIT_CODE @@ -72,14 +63,14 @@ jobs: set +e export START=$(date -u +'%Y-%m-%dT%H:%M:%SZ') - kubectl exec ${LISTENER_POD} -c banzai-listener -- pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-master-dark.xml -m master_dark + kubectl exec banzai-e2e-test -c banzai-listener -- pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-master-dark.xml -m master_dark EXIT_CODE=$? # Always print logs even if (especially if?) the reduction fails - kubectl logs ${LISTENER_POD} --since-time=$START --all-containers --prefix=true - kubectl logs ${WORKERS_POD} --since-time=$START --all-containers --prefix=true - kubectl logs ${LARGE_WORKERS_POD} --since-time=$START --all-containers --prefix=true - + kubectl logs banzai-e2e-test -c banzai-listener --since-time=$START --prefix=true + kubectl logs banzai-e2e-test -c banzai-celery-workers --since-time=$START --prefix=true + kubectl logs banzai-e2e-test -c banzai-large-celery-workers --since-time=$START --prefix=true + # Exit with the captured status so the job properly fails or succeeds exit $EXIT_CODE @@ -88,13 +79,13 @@ jobs: set +e export START=$(date -u +'%Y-%m-%dT%H:%M:%SZ') - kubectl exec ${LISTENER_POD} -c banzai-listener -- pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-master-flat.xml -m master_flat + kubectl exec banzai-e2e-test -c banzai-listener -- pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-master-flat.xml -m master_flat EXIT_CODE=$? # Always print logs even if (especially if?) the reduction fails - kubectl logs ${LISTENER_POD} --since-time=$START --all-containers --prefix=true - kubectl logs ${WORKERS_POD} --since-time=$START --all-containers --prefix=true - kubectl logs ${LARGE_WORKERS_POD} --since-time=$START --all-containers --prefix=true + kubectl logs banzai-e2e-test -c banzai-listener --since-time=$START --prefix=true + kubectl logs banzai-e2e-test -c banzai-celery-workers --since-time=$START --prefix=true + kubectl logs banzai-e2e-test -c banzai-large-celery-workers --since-time=$START --prefix=true # Exit with the captured status so the job properly fails or succeeds exit $EXIT_CODE @@ -104,13 +95,13 @@ jobs: set +e export START=$(date -u +'%Y-%m-%dT%H:%M:%SZ') - kubectl exec ${LISTENER_POD} -c banzai-listener -- pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-science-files.xml -m science_files + kubectl exec banzai-e2e-test -c banzai-listener -- pytest -s --pyargs banzai --durations=0 --junitxml=/archive/engineering/pytest-science-files.xml -m science_files EXIT_CODE=$? # Always print logs even if (especially if?) the reduction fails - kubectl logs ${LISTENER_POD} --since-time=$START --all-containers --prefix=true - kubectl logs ${WORKERS_POD} --since-time=$START --all-containers --prefix=true - kubectl logs ${LARGE_WORKERS_POD} --since-time=$START --all-containers --prefix=true + kubectl logs banzai-e2e-test -c banzai-listener --since-time=$START --prefix=true + kubectl logs banzai-e2e-test -c banzai-celery-workers --since-time=$START --prefix=true + kubectl logs banzai-e2e-test -c banzai-large-celery-workers --since-time=$START --prefix=true # Exit with the captured status so the job properly fails or succeeds exit $EXIT_CODE diff --git a/banzai/tests/k8s/e2e-k8s.yaml b/banzai/tests/k8s/e2e-k8s.yaml index 6ed0999b0..3f89916c5 100644 --- a/banzai/tests/k8s/e2e-k8s.yaml +++ b/banzai/tests/k8s/e2e-k8s.yaml @@ -1,381 +1,236 @@ apiVersion: v1 -kind: PersistentVolumeClaim +kind: Pod metadata: - name: banzai-shared-pvc + name: banzai-e2e-test labels: - group: banzai-e2e-test + app.kubernetes.io/name: banzai spec: - accessModes: - - ReadWriteMany - resources: - requests: - storage: 10Gi ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: banzai-redis-deployment - labels: - app: banzai-redis - group: banzai-e2e-test -spec: - replicas: 1 - selector: - matchLabels: - app: banzai-redis - template: - metadata: - labels: - app: banzai-redis - group: banzai-e2e-test - spec: - securityContext: - fsGroup: 10000 - containers: - - name: banzai-redis - image: redis:5.0.3 - imagePullPolicy: IfNotPresent - resources: - requests: - cpu: 0.1 - memory: 512Mi - limits: - cpu: 1 - memory: 512Mi - readinessProbe: - exec: - command: - - /bin/sh - - -c - - 'redis-cli ping | grep -q "PONG"' - initialDelaySeconds: 5 - periodSeconds: 1 - timeoutSeconds: 60 - ---- -apiVersion: v1 -kind: Service -metadata: - name: banzai-redis - labels: - app: banzai-redis - group: banzai-e2e-test -spec: - selector: - app: banzai-redis - ports: - - port: 6379 - targetPort: 6379 - ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: banzai-fits-exchange-deployment - labels: - app: banzai-fits-exchange - group: banzai-e2e-test -spec: - replicas: 1 - selector: - matchLabels: - app: banzai-fits-exchange - template: - metadata: - labels: - app: banzai-fits-exchange - group: banzai-e2e-test - spec: - securityContext: - fsGroup: 10000 - containers: - - name: banzai-fits-exchange - image: rabbitmq:3.12.3 - imagePullPolicy: IfNotPresent - resources: - requests: - cpu: 1 - memory: 512Mi - limits: - cpu: 4 - memory: 512Mi - readinessProbe: - exec: - command: - - rabbitmq-diagnostics - - "-q" - - ping - initialDelaySeconds: 5 - periodSeconds: 1 - timeoutSeconds: 60 ---- -apiVersion: v1 -kind: Service -metadata: - name: banzai-fits-exchange - labels: - app: banzai-fits-exchange - group: banzai-e2e-test -spec: - selector: - app: banzai-fits-exchange - ports: - - port: 5672 - targetPort: 5672 ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: banzai-celery-workers-deployment - labels: - app: banzai-celery-workers - group: banzai-e2e-test -spec: - replicas: 1 - selector: - matchLabels: - app: banzai-celery-workers - template: - metadata: - labels: - app: banzai-celery-workers - group: banzai-e2e-test - spec: - restartPolicy: Always - securityContext: - fsGroup: 10000 - volumes: - - name: banzai-shared-volume - persistentVolumeClaim: - claimName: banzai-shared-pvc - containers: - - name: banzai-celery-workers - image: banzai:test-latest - imagePullPolicy: IfNotPresent - volumeMounts: - - name: banzai-shared-volume - mountPath: /archive - env: - - name: DB_ADDRESS - value: "sqlite:////archive/engineering/test.db?timeout=30" - - name: RETRY_DELAY - value: "0" - - name: TASK_HOST - value: "redis://banzai-redis:6379/0" # Adjust if needed - - name: BANZAI_WORKER_LOGLEVEL - value: debug - - name: CALIBRATE_PROPOSAL_ID - value: "calibrate" - - name: OBSERVATION_PORTAL_URL - value: "http://internal-observation-portal.lco.gtn/api/observations/" - - name: API_ROOT - value: "https://archive-api.lco.global/" - - name: OMP_NUM_THREADS - value: "1" - - name: FITS_EXCHANGE - value: "fits_files" - - name: OPENTSDB_PYTHON_METRICS_TEST_MODE - value: "1" - - name: CELERY_TASK_QUEUE_NAME - value: "e2e_task_queue" - - name: REFERENCE_CATALOG_URL - value: "http://phot-catalog.lco.gtn/" - command: - - celery - - -A - - banzai - - worker - - --hostname - - "banzai-celery-worker" - - --concurrency - - "4" - - -l - - "info" - - "-Q" - - "$(CELERY_TASK_QUEUE_NAME)" - - "-n" - - "celery-worker" - readinessProbe: - exec: - command: - - /bin/sh - - -c - - "celery -A banzai status | grep -q '@celery-worker:.*OK'" - initialDelaySeconds: 5 - periodSeconds: 1 - timeoutSeconds: 60 - resources: - requests: - cpu: 4 - memory: 6Gi - limits: - cpu: 8 - memory: 6Gi + # Create some empty directories to be mounted within the Pod + volumes: + - name: banzai-data + emptyDir: + sizeLimit: 10Gi + securityContext: + fsGroup: 10000 ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: banzai-large-celery-workers-deployment - labels: - app: banzai-large-celery-workers - group: banzai-e2e-test -spec: - replicas: 1 - selector: - matchLabels: - app: banzai-large-celery-workers - template: - metadata: - labels: - app: banzai-large-celery-workers - group: banzai-e2e-test - spec: - restartPolicy: Always - securityContext: - fsGroup: 10000 - volumes: - - name: banzai-shared-volume - persistentVolumeClaim: - claimName: banzai-shared-pvc - containers: - - name: banzai-large-celery-workers - image: banzai:test-latest - imagePullPolicy: IfNotPresent - volumeMounts: - - name: banzai-shared-volume - mountPath: /archive - env: - - name: DB_ADDRESS - value: "sqlite:////archive/engineering/test.db?timeout=30" - - name: RETRY_DELAY - value: "0" - - name: TASK_HOST - value: "redis://banzai-redis:6379/0" # Adjust if needed - - name: BANZAI_WORKER_LOGLEVEL - value: debug - - name: CALIBRATE_PROPOSAL_ID - value: "calibrate" - - name: OBSERVATION_PORTAL_URL - value: "http://internal-observation-portal.lco.gtn/api/observations/" - - name: API_ROOT - value: "https://archive-api.lco.global/" - - name: OMP_NUM_THREADS - value: "2" - - name: FITS_EXCHANGE - value: "fits_files" - - name: OPENTSDB_PYTHON_METRICS_TEST_MODE - value: "1" - - name: CELERY_TASK_QUEUE_NAME - value: "e2e_large_task_queue" - - name: REFERENCE_CATALOG_URL - value: "http://phot-catalog.lco.gtn/" - command: - - celery - - -A - - banzai - - worker - - --hostname - - "banzai-celery-worker" - - --concurrency - - "1" - - -l - - "info" - - "-Q" - - "$(CELERY_TASK_QUEUE_NAME)" - - "-n" - - "large-celery-worker" - readinessProbe: - exec: - command: - - /bin/sh - - -c - - 'celery -A banzai status | grep -q "large-celery-worker:.*OK"' - initialDelaySeconds: 5 - periodSeconds: 1 - timeoutSeconds: 60 - resources: - requests: - cpu: 2 - memory: 8Gi - limits: - cpu: 3 - memory: 8Gi - ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: banzai-listener-deployment - labels: - app: banzai-listener - group: banzai-e2e-test -spec: - replicas: 1 - selector: - matchLabels: - app: banzai-listener - template: - metadata: - labels: - app: banzai-listener - group: banzai-e2e-test - spec: - restartPolicy: Always - securityContext: - fsGroup: 10000 - volumes: - - name: banzai-shared-volume - persistentVolumeClaim: - claimName: banzai-shared-pvc - containers: - - name: banzai-listener - image: banzai:test-latest - imagePullPolicy: IfNotPresent - volumeMounts: - - name: banzai-shared-volume - mountPath: /archive - env: - - name: DB_ADDRESS - value: "sqlite:////archive/engineering/test.db?timeout=30" - - name: FITS_BROKER - value: "banzai-fits-exchange" - - name: TASK_HOST - value: "redis://banzai-redis:6379/0" - - name: CALIBRATE_PROPOSAL_ID - value: "calibrate" - - name: OBSERVATION_PORTAL_URL - value: "http://internal-observation-portal.lco.gtn/api/observations/" - - name: API_ROOT - value: "https://archive-api.lco.global/" - - name: FITS_EXCHANGE - value: "fits_files" - - name: OPENTSDB_PYTHON_METRICS_TEST_MODE - value: "1" - - name: CELERY_TASK_QUEUE_NAME - value: "e2e_task_queue" - - name: REFERENCE_CATALOG_URL - value: "http://phot-catalog.lco.gtn/" - - name: CELERY_LARGE_TASK_QUEUE_NAME - value: "e2e_large_task_queue" - command: - - banzai_run_realtime_pipeline - - --db-address=$(DB_ADDRESS) - - --fpack - - --broker-url=banzai-fits-exchange - resources: - requests: - cpu: 0.1 - memory: 1Gi - limits: - cpu: 1 - memory: 1Gi - readinessProbe: - exec: - command: - - /bin/sh - - -c - - 'ps -u archive | grep -q "banzai_run_real"' - initialDelaySeconds: 5 - periodSeconds: 1 - timeoutSeconds: 60 + containers: + - name: banzai-redis + image: redis:5.0.3 + imagePullPolicy: IfNotPresent + resources: + requests: + cpu: 0.1 + memory: 512Mi + limits: + cpu: 1 + memory: 512Mi + readinessProbe: + exec: + command: + - /bin/sh + - -c + - 'redis-cli ping | grep -q "PONG"' + initialDelaySeconds: 5 + periodSeconds: 1 + timeoutSeconds: 60 + - name: banzai-fits-exchange + image: rabbitmq:3.12.3 + imagePullPolicy: IfNotPresent + resources: + requests: + cpu: 1 + memory: 512Mi + limits: + cpu: 4 + memory: 512Mi + readinessProbe: + exec: + command: + - rabbitmq-diagnostics + - "-q" + - ping + initialDelaySeconds: 5 + periodSeconds: 1 + timeoutSeconds: 60 + - name: banzai-celery-workers + image: banzai:test-latest + imagePullPolicy: IfNotPresent + volumeMounts: + - name: banzai-data + mountPath: /archive/engineering + subPath: engineering + readOnly: false + env: + - name: DB_ADDRESS + value: "sqlite:////archive/engineering/test.db?timeout=30" + - name: RETRY_DELAY + value: "0" + - name: TASK_HOST + value: "redis://localhost:6379/0" + - name: BANZAI_WORKER_LOGLEVEL + value: debug + - name: CALIBRATE_PROPOSAL_ID + value: "calibrate" + - name: OBSERVATION_PORTAL_URL + value: "http://internal-observation-portal.lco.gtn/api/observations/" + - name: API_ROOT + value: "https://archive-api.lco.global/" + - name: OMP_NUM_THREADS + value: "1" + - name: FITS_EXCHANGE + value: "fits_files" + - name: OPENTSDB_PYTHON_METRICS_TEST_MODE + value: "1" + - name: CELERY_TASK_QUEUE_NAME + value: "e2e_task_queue" + - name: REFERENCE_CATALOG_URL + value: "http://phot-catalog.lco.gtn/" + command: + - celery + - -A + - banzai + - worker + - --hostname + - "banzai-celery-worker" + - --concurrency + - "4" + - -l + - "info" + - "-Q" + - "$(CELERY_TASK_QUEUE_NAME)" + - "-n" + - "celery-worker" + readinessProbe: + exec: + command: + - /bin/sh + - -c + - "celery -A banzai status | grep -q '@celery-worker:.*OK'" + initialDelaySeconds: 5 + periodSeconds: 1 + timeoutSeconds: 60 + resources: + requests: + cpu: 4 + memory: 6Gi + limits: + cpu: 8 + memory: 6Gi + - name: banzai-large-celery-workers + image: banzai:test-latest + imagePullPolicy: IfNotPresent + volumeMounts: + - name: banzai-data + mountPath: /archive/engineering + subPath: engineering + readOnly: false + env: + - name: DB_ADDRESS + value: "sqlite:////archive/engineering/test.db?timeout=30" + - name: RETRY_DELAY + value: "0" + - name: TASK_HOST + value: "redis://localhost:6379/0" + - name: BANZAI_WORKER_LOGLEVEL + value: debug + - name: CALIBRATE_PROPOSAL_ID + value: "calibrate" + - name: OBSERVATION_PORTAL_URL + value: "http://internal-observation-portal.lco.gtn/api/observations/" + - name: API_ROOT + value: "https://archive-api.lco.global/" + - name: OMP_NUM_THREADS + value: "2" + - name: FITS_EXCHANGE + value: "fits_files" + - name: OPENTSDB_PYTHON_METRICS_TEST_MODE + value: "1" + - name: CELERY_TASK_QUEUE_NAME + value: "e2e_large_task_queue" + - name: REFERENCE_CATALOG_URL + value: "http://phot-catalog.lco.gtn/" + command: + - celery + - -A + - banzai + - worker + - --hostname + - "banzai-celery-worker" + - --concurrency + - "1" + - -l + - "info" + - "-Q" + - "$(CELERY_TASK_QUEUE_NAME)" + - "-n" + - "large-celery-worker" + readinessProbe: + exec: + command: + - /bin/sh + - -c + - 'celery -A banzai status | grep -q "large-celery-worker:.*OK"' + initialDelaySeconds: 5 + periodSeconds: 1 + timeoutSeconds: 60 + resources: + requests: + cpu: 2 + memory: 8Gi + limits: + cpu: 3 + memory: 8Gi + - name: banzai-listener + image: banzai:test-latest + imagePullPolicy: IfNotPresent + volumeMounts: + - name: banzai-data + mountPath: /archive/engineering + subPath: engineering + readOnly: false + env: + - name: DB_ADDRESS + value: "sqlite:////archive/engineering/test.db?timeout=30" + - name: FITS_BROKER + value: "localhost" + - name: TASK_HOST + value: "redis://localhost:6379/0" + - name: CALIBRATE_PROPOSAL_ID + value: "calibrate" + - name: OBSERVATION_PORTAL_URL + value: "http://internal-observation-portal.lco.gtn/api/observations/" + - name: API_ROOT + value: "https://archive-api.lco.global/" + - name: FITS_EXCHANGE + value: "fits_files" + - name: OPENTSDB_PYTHON_METRICS_TEST_MODE + value: "1" + - name: CELERY_TASK_QUEUE_NAME + value: "e2e_task_queue" + - name: REFERENCE_CATALOG_URL + value: "http://phot-catalog.lco.gtn/" + - name: "CELERY_LARGE_TASK_QUEUE_NAME" + value: "e2e_large_task_queue" + command: + - banzai_run_realtime_pipeline + - --db-address=$(DB_ADDRESS) + - --fpack + - --broker-url=localhost + resources: + requests: + cpu: 0.1 + memory: 1Gi + limits: + cpu: 1 + memory: 1Gi + readinessProbe: + exec: + command: + - /bin/sh + - -c + - 'ps -u archive | grep -q "banzai_run_real"' + initialDelaySeconds: 5 + periodSeconds: 1 + timeoutSeconds: 60 + dnsPolicy: ClusterFirst + restartPolicy: Never diff --git a/banzai/tests/k8s/kustomization.yaml b/banzai/tests/k8s/kustomization.yaml index 2cb4aa4ef..005928f35 100644 --- a/banzai/tests/k8s/kustomization.yaml +++ b/banzai/tests/k8s/kustomization.yaml @@ -6,50 +6,30 @@ resources: patches: - patch: |- - apiVersion: apps/v1 - kind: Deployment + apiVersion: v1 + kind: Pod metadata: - name: banzai-listener-deployment + name: banzai-e2e-test spec: - template: - spec: - containers: - - name: banzai-listener - env: - - name: AUTH_TOKEN - valueFrom: - secretKeyRef: - name: auth-token-secret - key: auth-token - - patch: |- - apiVersion: apps/v1 - kind: Deployment - metadata: - name: banzai-celery-workers-deployment - spec: - template: - spec: - containers: - - name: banzai-celery-workers - env: - - name: AUTH_TOKEN - valueFrom: - secretKeyRef: - name: auth-token-secret - key: auth-token - - patch: |- - apiVersion: apps/v1 - kind: Deployment - metadata: - name: banzai-large-celery-workers-deployment - spec: - template: - spec: - containers: - - name: banzai-large-celery-workers - env: - - name: AUTH_TOKEN - valueFrom: - secretKeyRef: - name: auth-token-secret - key: auth-token + containers: + - name: banzai-listener + env: + - name: AUTH_TOKEN + valueFrom: + secretKeyRef: + name: auth-token-secret + key: auth-token + - name: banzai-celery-workers + env: + - name: AUTH_TOKEN + valueFrom: + secretKeyRef: + name: auth-token-secret + key: auth-token + - name: banzai-large-celery-workers + env: + - name: AUTH_TOKEN + valueFrom: + secretKeyRef: + name: auth-token-secret + key: auth-token From 9e7c9555f5aa894c4aabc733c8a786a643ac83eb Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Fri, 28 Feb 2025 18:00:14 -0500 Subject: [PATCH 45/46] Typo fix in raise for status --- banzai/utils/fits_utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/banzai/utils/fits_utils.py b/banzai/utils/fits_utils.py index a52929886..c8f0ac67d 100755 --- a/banzai/utils/fits_utils.py +++ b/banzai/utils/fits_utils.py @@ -103,7 +103,7 @@ def download_from_s3(file_info, context, is_raw_frame=False): else: url = f'{context.ARCHIVE_FRAME_URL}/{frame_id}/?include_related_frames=false' archive_auth_header = context.ARCHIVE_AUTH_HEADER - response = requests.get(url, headers=archive_auth_header).json() + response = requests.get(url, headers=archive_auth_header) try: response.raise_fot_status() except requests.exceptions.HTTPError as e: @@ -114,7 +114,7 @@ def download_from_s3(file_info, context, is_raw_frame=False): 'attempt_number': download_from_s3.statistics['attempt_number']}) raise e buffer = io.BytesIO() - buffer.write(requests.get(response['url'], stream=True).content) + buffer.write(requests.get(response.json()['url'], stream=True).content) buffer.seek(0) return buffer From 01f29cec28ba1ca02900013763981c5b458af4c6 Mon Sep 17 00:00:00 2001 From: Curtis McCully Date: Fri, 28 Feb 2025 18:09:52 -0500 Subject: [PATCH 46/46] typo fix. --- banzai/utils/fits_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/banzai/utils/fits_utils.py b/banzai/utils/fits_utils.py index c8f0ac67d..b20cfa4f1 100755 --- a/banzai/utils/fits_utils.py +++ b/banzai/utils/fits_utils.py @@ -105,7 +105,7 @@ def download_from_s3(file_info, context, is_raw_frame=False): archive_auth_header = context.ARCHIVE_AUTH_HEADER response = requests.get(url, headers=archive_auth_header) try: - response.raise_fot_status() + response.raise_for_status() except requests.exceptions.HTTPError as e: message = 'Error downloading file from archive.' if int(response.status_code) == 429: