From f3e33e368eadc88b21d0355f6de49cb521c2c3d2 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Sun, 9 Mar 2025 14:46:07 +1100 Subject: [PATCH 01/66] Added some logging --- vast_pipeline/daskmanager/manager.py | 1 + vast_pipeline/pipeline/forced_extraction.py | 28 ++++++++++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/vast_pipeline/daskmanager/manager.py b/vast_pipeline/daskmanager/manager.py index 36a093690..b04fc5c93 100644 --- a/vast_pipeline/daskmanager/manager.py +++ b/vast_pipeline/daskmanager/manager.py @@ -60,6 +60,7 @@ def compute(self, collection, **kwargs): def get_n_random_workers(self, n): """Return n random workers from the pool""" + logger.info(f"Getting {n} random workers") return random.sample(list(self.client.scheduler_info()['workers'].keys()), n) def restart(self): diff --git a/vast_pipeline/pipeline/forced_extraction.py b/vast_pipeline/pipeline/forced_extraction.py index 3c3779c3e..7e8379838 100644 --- a/vast_pipeline/pipeline/forced_extraction.py +++ b/vast_pipeline/pipeline/forced_extraction.py @@ -310,7 +310,7 @@ def parallel_extraction( add_mode: bool, p_run_path: str, io_workers: List[str], -) -> pd.DataFrame: +) -> dd.DataFrame: """ Parallelize forced extraction with Dask @@ -348,6 +348,9 @@ def parallel_extraction( 'source_tmp_id', 'ra', 'dec', 'image', 'flux_peak', 'island_id', 'component_id', 'name', 'flux_int', 'flux_int_err' """ + + logger.info("Starting parallel extraction") + # explode the lists in 'img_diff' column (this will make a copy of the df) # NOTE: Need to persist here since Dask loses futures after all the # previous merges. Ideally this should be removed and we only persist at the @@ -369,6 +372,8 @@ def parallel_extraction( .persist() ) + logger.info("Generated out df") + # drop the source for which we would have no hope of detecting max_snr = out["flux_peak"].values / out["image_rms_min"].values out = out.loc[max_snr > min_sigma].reset_index(drop=True) @@ -386,6 +391,8 @@ def parallel_extraction( out = out.drop(["image_rms_min", "detection"], axis=1).rename( columns={"image": "image_name"} ) + logger.info("Dropped low S/N detections") + # get the unique images to extract from unique_images_to_extract = out["image_name"].unique().compute().tolist() @@ -412,6 +419,7 @@ def parallel_extraction( .merge(df_images[df_cols], on="id", how="left") .to_delayed() ) + logger.info("Generated delayed measurements_parquet_Data") # Create a list of dataframes containing the relevant data from out per image # This generates a list of delayed futures that will only compute at the next persist. @@ -427,13 +435,18 @@ def parallel_extraction( cluster_threshold=cluster_threshold, allow_nan=allow_nan) for image_df, meas_data in image_data_list ] + logger.info("Generated forced extraction delayed") # Persist at this point uning the number of io workers. # df_out will contain the forced extraction measurments per image. # df_out should be sorted and partitioned by image at this point. df_out = dd.from_delayed(func_d).persist(workers=io_workers) + + logger.info("Persisted forced extraction df") del out, func_d, df_per_image, measurements_parquet_data + + wait(df_out) return df_out @@ -631,7 +644,7 @@ def forced_extraction( The `sources_df` with the extracted sources added. The total number of forced measurements present in the run. """ - logger.info("Starting force extraction step.") + logger.info("Starting forced extraction step.") timer = StopWatch() @@ -661,6 +674,8 @@ def forced_extraction( .values(*tuple(cols)) ) ).set_index("name") + + logger.debug("Made images_df") # | name | id | measurements_path | path | noise_path | # |:------------------------------|---------:|:--------------------|:-------------|:-------------| @@ -683,8 +698,12 @@ def forced_extraction( # Explode out the img_diff column. extr_df = extr_df.explode("img_diff").reset_index() total_to_extract = extr_df.shape[0] + + logger.debug("Exploded out img_diff column") + logger.info(f"Total to extract: {total_to_extract}") if add_mode: + logger.info("Running in add mode...") # If we are adding images to the run we assume that monitoring was # also performed before (enforced by the pre-run checks) so now we # only want to force extract in three situations: @@ -710,17 +729,20 @@ def forced_extraction( ) timer.reset() + logger.info("Starting parallel extraction...") extr_df = parallel_extraction( extr_df, images_df, sources_df[['source', 'image', 'flux_peak']], min_sigma, edge_buffer, cluster_threshold, allow_nan, add_mode, p_run.path, io_workers ) + logger.info("Completed parallel extraction step.") # Dask needs type metadata for map_partitions sources_meta = dd.utils.make_meta(sources_df).drop(['epoch', 'interim_ns', 'interim_ew'], axis=1) # Get expected database measurements schema columns = read_schema(images_df.iloc[0]["measurements_path"]).names + logger.info("Starting save and upload...") extr_df = extr_df.map_partitions(save_and_upload_forced_df, p_run_path=p_run.path, p_run_id=p_run.id, @@ -733,7 +755,7 @@ def forced_extraction( enforce_metadata=False, meta=sources_meta) - + logger.info("Finished save and upload") # Calculate epoch column for extr_df if sources_df['epoch'].dtype == 'object': extr_df["epoch"] = "FORCED" From d84704417334b0bebfed1d4d464e1cb1532efc34 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Sun, 9 Mar 2025 15:09:09 +1100 Subject: [PATCH 02/66] Added dashboard stuff --- vast_pipeline/daskmanager/manager.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/vast_pipeline/daskmanager/manager.py b/vast_pipeline/daskmanager/manager.py index b04fc5c93..c4b7a054f 100644 --- a/vast_pipeline/daskmanager/manager.py +++ b/vast_pipeline/daskmanager/manager.py @@ -16,7 +16,9 @@ def _start_cluster(): n_workers=int(s.DASK_NUM_WORKERS), threads_per_worker=s.DASK_THREADS_PER_WORKER, host=s.DASK_SCHEDULER_HOST, - scheduler_port=int(s.DASK_SCHEDULER_PORT) + scheduler_port=int(s.DASK_SCHEDULER_PORT), + dashboard_address="0.0.0.0:8787", # Expose Dask dashboard externally + dashboard_kwargs={"base_url": "/dask"} # Ensure correct routing for static files ) client = Client(cluster) logger.info('Connected to local Dask Cluster') From 59c07e3bbaa3ced06ef9f8fc45e05a1e00a664d4 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Sun, 9 Mar 2025 15:57:08 +1100 Subject: [PATCH 03/66] Fixed manager? --- vast_pipeline/daskmanager/manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vast_pipeline/daskmanager/manager.py b/vast_pipeline/daskmanager/manager.py index c4b7a054f..7cb8e516f 100644 --- a/vast_pipeline/daskmanager/manager.py +++ b/vast_pipeline/daskmanager/manager.py @@ -18,7 +18,7 @@ def _start_cluster(): host=s.DASK_SCHEDULER_HOST, scheduler_port=int(s.DASK_SCHEDULER_PORT), dashboard_address="0.0.0.0:8787", # Expose Dask dashboard externally - dashboard_kwargs={"base_url": "/dask"} # Ensure correct routing for static files + service_kwargs={'dashboard': {"base_url": "/dask"}} # Ensure correct routing for static files ) client = Client(cluster) logger.info('Connected to local Dask Cluster') From e8baebb607bcfedc17133a9280c7a805aba894eb Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Sun, 9 Mar 2025 16:29:57 +1100 Subject: [PATCH 04/66] Remove base_url --- vast_pipeline/daskmanager/manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vast_pipeline/daskmanager/manager.py b/vast_pipeline/daskmanager/manager.py index 7cb8e516f..5b9731e71 100644 --- a/vast_pipeline/daskmanager/manager.py +++ b/vast_pipeline/daskmanager/manager.py @@ -18,7 +18,7 @@ def _start_cluster(): host=s.DASK_SCHEDULER_HOST, scheduler_port=int(s.DASK_SCHEDULER_PORT), dashboard_address="0.0.0.0:8787", # Expose Dask dashboard externally - service_kwargs={'dashboard': {"base_url": "/dask"}} # Ensure correct routing for static files + #service_kwargs={'dashboard': {"base_url": "/dask"}} # Ensure correct routing for static files ) client = Client(cluster) logger.info('Connected to local Dask Cluster') From b89e996e19185f8c4654baf3a20aa02f27937ff5 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Mon, 10 Mar 2025 09:47:45 +1100 Subject: [PATCH 05/66] More dask dashboard fiddling --- vast_pipeline/daskmanager/manager.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vast_pipeline/daskmanager/manager.py b/vast_pipeline/daskmanager/manager.py index 5b9731e71..f801c1f41 100644 --- a/vast_pipeline/daskmanager/manager.py +++ b/vast_pipeline/daskmanager/manager.py @@ -17,8 +17,8 @@ def _start_cluster(): threads_per_worker=s.DASK_THREADS_PER_WORKER, host=s.DASK_SCHEDULER_HOST, scheduler_port=int(s.DASK_SCHEDULER_PORT), - dashboard_address="0.0.0.0:8787", # Expose Dask dashboard externally - #service_kwargs={'dashboard': {"base_url": "/dask"}} # Ensure correct routing for static files + dashboard_address=":8787", # Expose Dask dashboard externally + service_kwargs={'dashboard': {"base_url": "/dask"}} # Ensure correct routing for static files ) client = Client(cluster) logger.info('Connected to local Dask Cluster') From 97413229f6c0292ae764122716b6c877f25eecdf Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Tue, 11 Mar 2025 11:13:46 +1100 Subject: [PATCH 06/66] More faff --- vast_pipeline/daskmanager/manager.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/vast_pipeline/daskmanager/manager.py b/vast_pipeline/daskmanager/manager.py index f801c1f41..26d90fb19 100644 --- a/vast_pipeline/daskmanager/manager.py +++ b/vast_pipeline/daskmanager/manager.py @@ -12,13 +12,17 @@ def _start_cluster(): logger.info('Starting local Dask Cluster') + logger.info(f"n_workers: {s.DASK_NUM_WORKERS}") + logger.info(f"threads_per_worker: {s.DASK_THREADS_PER_WORKER}") + logger.info(f"scheduler_host: {s.DASK_SCHEDULER_HOST}") + logger.info(f"scheduler_port: {s.DASK_SCHEDULER_PORT}") cluster = LocalCluster( n_workers=int(s.DASK_NUM_WORKERS), threads_per_worker=s.DASK_THREADS_PER_WORKER, host=s.DASK_SCHEDULER_HOST, scheduler_port=int(s.DASK_SCHEDULER_PORT), dashboard_address=":8787", # Expose Dask dashboard externally - service_kwargs={'dashboard': {"base_url": "/dask"}} # Ensure correct routing for static files + #service_kwargs={'dashboard': {"base_url": "/dask"}} # Ensure correct routing for static files ) client = Client(cluster) logger.info('Connected to local Dask Cluster') From 6b611e1f5ede7afebac008006a935e7f521f83d3 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Tue, 11 Mar 2025 11:29:19 +1100 Subject: [PATCH 07/66] More fiddling --- vast_pipeline/daskmanager/manager.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/vast_pipeline/daskmanager/manager.py b/vast_pipeline/daskmanager/manager.py index 26d90fb19..63a4e4ac7 100644 --- a/vast_pipeline/daskmanager/manager.py +++ b/vast_pipeline/daskmanager/manager.py @@ -46,12 +46,10 @@ def __init__(self, skip_connect: bool = False): else: try: logger.info('Attempting to connect to existing Dask Cluster') - self.client = Client( - f'{s.DASK_SCHEDULER_HOST}:{s.DASK_SCHEDULER_PORT}', - ) + client_up = f'{s.DASK_SCHEDULER_HOST}:{s.DASK_SCHEDULER_PORT}' + self.client = Client(client_ip) self.dedicated_client = False - logger.info('Connected to Dask Cluster at %s:%s', - s.DASK_SCHEDULER_HOST, s.DASK_SCHEDULER_PORT) + logger.info('Connected to Dask Cluster at %s',client_ip) except Exception: logger.warning('Could not connect to Dask Cluster - starting locally instead') self.client = _start_cluster() From 3474499f2d58390aeb542f64481db5278f86c2ec Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Tue, 11 Mar 2025 17:44:17 +1100 Subject: [PATCH 08/66] Explicitly collect garbage --- vast_pipeline/pipeline/loading.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vast_pipeline/pipeline/loading.py b/vast_pipeline/pipeline/loading.py index 2283f388b..441c917af 100644 --- a/vast_pipeline/pipeline/loading.py +++ b/vast_pipeline/pipeline/loading.py @@ -1,5 +1,6 @@ import os import logging +import gc import numpy as np import pandas as pd import dask.dataframe as dd @@ -197,6 +198,7 @@ def make_upload_images( measurements.to_parquet(img.measurements_path, index=False) del measurements, image, band, img + gc.collect() logger.info("Total images upload/loading time: %.2f seconds", timer.reset_init()) From bd57bdbfd13c02caf31cf5eda3cb64f9b658c4b2 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Tue, 11 Mar 2025 18:11:47 +1100 Subject: [PATCH 09/66] Fixed dodgy client load --- vast_pipeline/daskmanager/manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vast_pipeline/daskmanager/manager.py b/vast_pipeline/daskmanager/manager.py index 63a4e4ac7..ce892fda1 100644 --- a/vast_pipeline/daskmanager/manager.py +++ b/vast_pipeline/daskmanager/manager.py @@ -46,7 +46,7 @@ def __init__(self, skip_connect: bool = False): else: try: logger.info('Attempting to connect to existing Dask Cluster') - client_up = f'{s.DASK_SCHEDULER_HOST}:{s.DASK_SCHEDULER_PORT}' + client_ip = f'{s.DASK_SCHEDULER_HOST}:{s.DASK_SCHEDULER_PORT}' self.client = Client(client_ip) self.dedicated_client = False logger.info('Connected to Dask Cluster at %s',client_ip) From 7c3585c43b3d10047f43050f7e76fee562f1373b Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Tue, 11 Mar 2025 20:42:33 +1100 Subject: [PATCH 10/66] Added objgraph --- poetry.lock | 1163 ++++++++++------------------- pyproject.toml | 1 + vast_pipeline/pipeline/loading.py | 4 + 3 files changed, 409 insertions(+), 759 deletions(-) diff --git a/poetry.lock b/poetry.lock index ea24cd64a..55c32a0be 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.0.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "appdirs" @@ -6,8 +6,6 @@ version = "1.4.4" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false python-versions = "*" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, @@ -19,8 +17,6 @@ version = "3.8.1" description = "ASGI specs, helper code, and adapters" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47"}, {file = "asgiref-3.8.1.tar.gz", hash = "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590"}, @@ -31,39 +27,37 @@ tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] [[package]] name = "astropy" -version = "7.0.0" +version = "7.0.1" description = "Astronomy and astrophysics core library" optional = false python-versions = ">=3.11" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "astropy-7.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0ada206f13b1e9c9c07ae0fce55e3090d694c555107c23c30b271a58fea1732b"}, - {file = "astropy-7.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5f5657a1443421b0ab8ae6afa85fc7934f5e384648b7acef21aca5918acfca8"}, - {file = "astropy-7.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b47d7af967e51dc612fd8440ed65ad371c0c2bbf5d739ef4aa147bcd2fbe6b13"}, - {file = "astropy-7.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74c6df5c68cc4acb86e343db6d4b96419d585c7ba5fd41fe3023f47ee9f5dbc9"}, - {file = "astropy-7.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9fcfb92043994dfbd1a267b893398aab8f680b0587b4333dacbfa034a3159aa0"}, - {file = "astropy-7.0.0-cp311-cp311-win32.whl", hash = "sha256:1ad4483712effdd691c085e7b58805c01a54cebf8f4c6955973ceccd60bd36ed"}, - {file = "astropy-7.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:f8a00fcb30c2317b111d8b6a99eb60a81e8292c24dce65e986ee4610ea16b8d2"}, - {file = "astropy-7.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b103516dd54a90f9b9652dff3dd47ad6d43436c61ed800023943a562b7ea9712"}, - {file = "astropy-7.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3ced126597ea2d2876a341821d76ba20fb895c2eef117b447b6b3182993794df"}, - {file = "astropy-7.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:733be30f52e7ed5ace7fc5ab9bbfbf1f2f604661682141f177ea356893b58cc4"}, - {file = "astropy-7.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14bb14bce6e7cc41066037d8a168b26a5fe6722a9201e9fae8da22a4c34c8780"}, - {file = "astropy-7.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5c14ca39b607af23273ee2b86cecee782a4feb4220b8f7a93b1dc3fe07582779"}, - {file = "astropy-7.0.0-cp312-cp312-win32.whl", hash = "sha256:6f2ee5872b0fffd8b9c4d9ce9af51c69f24cdad0d2f4fffbabfcfd4debd303f8"}, - {file = "astropy-7.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:62d62d3603bb8b243f6bac21f02341f963418ccf6f299be1d45d8c3918e64c91"}, - {file = "astropy-7.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0e5adeb8f955242da5cb4fe58df2f1483d81c10b2b73f089c91fc87dd3b63e1e"}, - {file = "astropy-7.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:31614b6451436163eed3744b90edd89dd357bf223c482fa944e627be86a47349"}, - {file = "astropy-7.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7b28a144165e4e7f4f0467fb6d8ed079f320fc99969a907614d98b18c7cea99"}, - {file = "astropy-7.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db36b632989060ce4f7c3058ffc860af38df5c8ee7ee7ef2daad1f441c416c12"}, - {file = "astropy-7.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c6a14810e596b9d437fbfe40733d61afccc9d4b7b9f7504228ba492f545d197f"}, - {file = "astropy-7.0.0-cp313-cp313-win32.whl", hash = "sha256:446931f9c260294ddc8646684ab2413e1a5eb14dcd4ff1e8a0532fa143b0844e"}, - {file = "astropy-7.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:7ecaaeeb017cceb02512d5505c43e162b3e26d951cece2b021e786f4c0af17a7"}, - {file = "astropy-7.0.0.tar.gz", hash = "sha256:e92d7c9fee86eb3df8714e5dd41bbf9f163d343e1a183d95bf6bd09e4313c940"}, +files = [ + {file = "astropy-7.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b16c5e3cd30ecedc79401a931eaeae3b9f2fc17f19ea26693c6c424cda74bd0e"}, + {file = "astropy-7.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11c680207674a53afd603addf5640809bb670f72e9f9a6f023b862040ba7e100"}, + {file = "astropy-7.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e930aa618a1df80ecc38ecc594ca1e7508909c79c4b1145e9e91e8695fd163c"}, + {file = "astropy-7.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b4831c5b8a8e6c62afc095d9f65e6c023f058821c1fcc829adc2d941090cd2a"}, + {file = "astropy-7.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2245f23020db2382f187a880dd903f1d4747cbdce6af8f299bc6d4f256b382bf"}, + {file = "astropy-7.0.1-cp311-cp311-win32.whl", hash = "sha256:91bec2ac62f759300279fd98f3baf2fe33082729045d80c231948d6df0cceacc"}, + {file = "astropy-7.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:0ae8960fe690f62672afff723d5e7d25ccd054c941c3ded96471d4d62563864e"}, + {file = "astropy-7.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b075f4b8034a3e40d417c079232f1adb613a40e3b8d7cebdb05278666bfeb3ca"}, + {file = "astropy-7.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:71bb61871859635653e0530ca152c379882473ff4aabf2484a848ead94efe248"}, + {file = "astropy-7.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1692857a3f21cecadefe89e4371e9c5a2d03e80173f4bb01dcbe3e3213ad1303"}, + {file = "astropy-7.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062f9dc6549884699c551310a21434ff650c9a1cb6c0eea9476ead456f8a8500"}, + {file = "astropy-7.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9cd02ef44007e0d6f27f0136410253a64b1ae56a2333c7071fd775c6feea8e12"}, + {file = "astropy-7.0.1-cp312-cp312-win32.whl", hash = "sha256:ba9c09cb1ba9c126b40cbbbe9273b4e6f2b0403d268f64a15ed976f77754372b"}, + {file = "astropy-7.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:02259457097a3bad3e50975d67bd7586753b2a69d680f071be5c8da439e0f2c4"}, + {file = "astropy-7.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:012e4331535dae6f43ddf86295b05e711e1ff6dec7af9d77a887ef08e6cef60d"}, + {file = "astropy-7.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0785533096b5682148ab79b077ab0e17f254be17c9fa12cb7789b8109044fe95"}, + {file = "astropy-7.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5949792533238a601597574ac85599f0fab2db2480e0121c58121d808626698f"}, + {file = "astropy-7.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a367d334b789934b975565be470eb1043b3419508bd8e15a882775925e30d2ce"}, + {file = "astropy-7.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:43c6dac6454e1056649268e79c3f595ecf079ad762936c6ce5c738ee1cff53de"}, + {file = "astropy-7.0.1-cp313-cp313-win32.whl", hash = "sha256:b458e4ac2466cb8bfeb0a9ed1fa7e96a9955d03902c1e5ce4ec8881bdfefaf4a"}, + {file = "astropy-7.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:8ffb20105eeec84f6bd8bbde4a86686a8f78424c3c46b6021fbf816e40dd8960"}, + {file = "astropy-7.0.1.tar.gz", hash = "sha256:392feeb443b2437cd4c2e0641a65e0f15ba791e148e9b1e5ed7de7dfcb38e460"}, ] [package.dependencies] -astropy-iers-data = ">=0.2024.10.28.0.34.7" +astropy-iers-data = ">=0.2025.1.31.12.41.4" numpy = ">=1.23.2" packaging = ">=22.0.0" pyerfa = ">=2.0.1.1" @@ -83,15 +77,13 @@ typing = ["pandas-stubs (>=2.0)"] [[package]] name = "astropy-iers-data" -version = "0.2025.1.27.0.32.44" +version = "0.2025.3.3.0.34.45" description = "IERS Earth Rotation and Leap Second tables for the astropy core package" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "astropy_iers_data-0.2025.1.27.0.32.44-py3-none-any.whl", hash = "sha256:3e445ad9699787c6b907f71aaeff7ccc21f702d822dcf2dbf72020186f7e800e"}, - {file = "astropy_iers_data-0.2025.1.27.0.32.44.tar.gz", hash = "sha256:c03c3a7cb18d6419e3e64c197e0388854d111abea0328ea1ecabb19af6b44709"}, + {file = "astropy_iers_data-0.2025.3.3.0.34.45-py3-none-any.whl", hash = "sha256:5c8762ec79dbc67e220d8b1cdf15e1d94a954f57750a5682023f385d41732f66"}, + {file = "astropy_iers_data-0.2025.3.3.0.34.45.tar.gz", hash = "sha256:22ce2349ee288b09cb4cc13a6e015a3c8d4ace66ed2eae49b42119d943f6d5e8"}, ] [package.extras] @@ -104,8 +96,6 @@ version = "0.4.7" description = "Functions and classes to access online astronomical data resources" optional = false python-versions = ">=3.7" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "astroquery-0.4.7-py3-none-any.whl", hash = "sha256:dfa8ca46ca0a983f66e9547c774601b331770242f9f6245df5e603f795d75540"}, {file = "astroquery-0.4.7.tar.gz", hash = "sha256:047fbacb0a4faec4cdb62675e919c244c1c35e661044fcbb6c9a933331747ec9"}, @@ -131,8 +121,6 @@ version = "3.0.0" description = "Annotate AST trees with source code positions" optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"}, {file = "asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7"}, @@ -148,8 +136,6 @@ version = "25.1.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a"}, {file = "attrs-25.1.0.tar.gz", hash = "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e"}, @@ -169,8 +155,6 @@ version = "24.4.2" description = "WebSocket client & server library, WAMP real-time framework" optional = false python-versions = ">=3.9" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "autobahn-24.4.2-py2.py3-none-any.whl", hash = "sha256:c56a2abe7ac78abbfb778c02892d673a4de58fd004d088cd7ab297db25918e81"}, {file = "autobahn-24.4.2.tar.gz", hash = "sha256:a2d71ef1b0cf780b6d11f8b205fd2c7749765e65795f2ea7d823796642ee92c9"}, @@ -200,8 +184,6 @@ version = "24.8.1" description = "Self-service finite-state machines for the programmer on the go." optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "Automat-24.8.1-py3-none-any.whl", hash = "sha256:bf029a7bc3da1e2c24da2343e7598affaa9f10bf0ab63ff808566ce90551e02a"}, {file = "automat-24.8.1.tar.gz", hash = "sha256:b34227cf63f6325b8ad2399ede780675083e439b20c323d376373d8ee6306d88"}, @@ -212,19 +194,17 @@ visualize = ["Twisted (>=16.1.1)", "graphviz (>0.5.1)"] [[package]] name = "babel" -version = "2.16.0" +version = "2.17.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, - {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, + {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 = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] +dev = ["backports.zoneinfo", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata"] [[package]] name = "backports-tarfile" @@ -232,8 +212,6 @@ version = "1.2.0" description = "Backport of CPython tarfile module" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\"" files = [ {file = "backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34"}, {file = "backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991"}, @@ -243,21 +221,38 @@ files = [ docs = ["furo", "jaraco.packaging (>=9.3)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] testing = ["jaraco.test", "pytest (!=8.0.*)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)"] +[[package]] +name = "backrefs" +version = "5.8" +description = "A wrapper around re and regex that adds additional back references." +optional = false +python-versions = ">=3.9" +files = [ + {file = "backrefs-5.8-py310-none-any.whl", hash = "sha256:c67f6638a34a5b8730812f5101376f9d41dc38c43f1fdc35cb54700f6ed4465d"}, + {file = "backrefs-5.8-py311-none-any.whl", hash = "sha256:2e1c15e4af0e12e45c8701bd5da0902d326b2e200cafcd25e49d9f06d44bb61b"}, + {file = "backrefs-5.8-py312-none-any.whl", hash = "sha256:bbef7169a33811080d67cdf1538c8289f76f0942ff971222a16034da88a73486"}, + {file = "backrefs-5.8-py313-none-any.whl", hash = "sha256:e3a63b073867dbefd0536425f43db618578528e3896fb77be7141328642a1585"}, + {file = "backrefs-5.8-py39-none-any.whl", hash = "sha256:a66851e4533fb5b371aa0628e1fee1af05135616b86140c9d787a2ffdf4b8fdc"}, + {file = "backrefs-5.8.tar.gz", hash = "sha256:2cab642a205ce966af3dd4b38ee36009b31fa9502a35fd61d59ccc116e40a6bd"}, +] + +[package.extras] +extras = ["regex"] + [[package]] name = "beautifulsoup4" -version = "4.12.3" +version = "4.13.3" description = "Screen-scraping library" optional = false -python-versions = ">=3.6.0" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +python-versions = ">=3.7.0" files = [ - {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, - {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, + {file = "beautifulsoup4-4.13.3-py3-none-any.whl", hash = "sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16"}, + {file = "beautifulsoup4-4.13.3.tar.gz", hash = "sha256:1bd32405dacc920b42b83ba01644747ed77456a65760e285fbc47633ceddaf8b"}, ] [package.dependencies] soupsieve = ">1.2" +typing-extensions = ">=4.0.0" [package.extras] cchardet = ["cchardet"] @@ -272,8 +267,6 @@ version = "20.8b1" description = "The uncompromising code formatter." optional = false python-versions = ">=3.6" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, ] @@ -298,8 +291,6 @@ version = "6.2.0" description = "An easy safelist-based HTML-sanitizing tool." optional = false python-versions = ">=3.9" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e"}, {file = "bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f"}, @@ -317,8 +308,6 @@ version = "3.6.2" description = "Interactive plots and applications in the browser from Python" optional = false python-versions = ">=3.10" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "bokeh-3.6.2-py3-none-any.whl", hash = "sha256:fddc4b91f8b40178c0e3e83dfcc33886d7803a3a1f041a840834255e435a18c2"}, {file = "bokeh-3.6.2.tar.gz", hash = "sha256:2f3043d9ecb3d5dc2e8c0ebf8ad55727617188d4e534f3e7208b36357e352396"}, @@ -337,15 +326,13 @@ xyzservices = ">=2021.09.1" [[package]] name = "certifi" -version = "2024.12.14" +version = "2025.1.31" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" -groups = ["main", "dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, - {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, + {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, + {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, ] [[package]] @@ -354,8 +341,6 @@ version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" and platform_python_implementation != \"PyPy\" or python_version >= \"3.12\" and platform_python_implementation != \"PyPy\"" files = [ {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, @@ -435,8 +420,6 @@ version = "3.0.5" description = "Brings async, event-driven capabilities to Django. Django 2.2 and up only." optional = false python-versions = ">=3.7" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "channels-3.0.5-py3-none-any.whl", hash = "sha256:3813b8025bf85509769793aca720e6c3b1c5bde1cb253a961252bf0242b60a26"}, {file = "channels-3.0.5.tar.gz", hash = "sha256:a3dc3339cc033e7c2afe083fb3dedf74fc5009815967e317e080e7bfdc92ea26"}, @@ -456,8 +439,6 @@ 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", "dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" 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"}, @@ -559,8 +540,6 @@ version = "8.1.8" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" -groups = ["main", "dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, @@ -575,8 +554,6 @@ version = "3.1.1" description = "Pickler class to extend the standard pickle.Pickler functionality" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "cloudpickle-3.1.1-py3-none-any.whl", hash = "sha256:c8c5a44295039331ee9dad40ba100a9c7297b6f988e50e87ccdf3765a668350e"}, {file = "cloudpickle-3.1.1.tar.gz", hash = "sha256:b216fa8ae4019d5482a8ac3c95d8f6346115d8835911fd4aefd1a445e4242c64"}, @@ -588,12 +565,10 @@ 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", "dev"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -markers = {main = "python_version == \"3.11\" and platform_system == \"Windows\" or python_version >= \"3.12\" and platform_system == \"Windows\"", dev = "python_version == \"3.11\" or python_version >= \"3.12\""} [[package]] name = "colorcet" @@ -601,8 +576,6 @@ version = "2.0.6" description = "Collection of perceptually uniform colormaps" optional = false python-versions = ">=2.7" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "colorcet-2.0.6-py2.py3-none-any.whl", hash = "sha256:4c203d31b50a1cdd2f5dcb2f59be8b6d459de1cf74a85611215ebc25994aa261"}, {file = "colorcet-2.0.6.tar.gz", hash = "sha256:efa44b6f4078261e62d0039c76aba17ac8d3ebaf0bc2291a111aee3905313433"}, @@ -626,8 +599,6 @@ version = "23.10.4" description = "Symbolic constants in Python" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "constantly-23.10.4-py3-none-any.whl", hash = "sha256:3fd9b4d1c3dc1ec9757f3c52aef7e53ad9323dbe39f51dfd4c43853b68dfa3f9"}, {file = "constantly-23.10.4.tar.gz", hash = "sha256:aa92b70a33e2ac0bb33cd745eb61776594dc48764b06c35e0efd050b7f1c7cbd"}, @@ -639,8 +610,6 @@ version = "1.3.1" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false python-versions = ">=3.10" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "contourpy-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a045f341a77b77e1c5de31e74e966537bba9f3c4099b35bf4c2e3939dd54cdab"}, {file = "contourpy-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:500360b77259914f7805af7462e41f9cb7ca92ad38e9f94d6c8641b089338124"}, @@ -714,8 +683,6 @@ version = "2024.10" description = "Bootstrap4 template pack for django-crispy-forms" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "crispy-bootstrap4-2024.10.tar.gz", hash = "sha256:503e8922b0f3b5262a6fdf303a3a94eb2a07514812f1ca130b88f7c02dd25e2b"}, {file = "crispy_bootstrap4-2024.10-py3-none-any.whl", hash = "sha256:138a97884044ae4c4799c80595b36c42066e4e933431e2e971611e251c84f96c"}, @@ -727,42 +694,46 @@ django-crispy-forms = ">=2.3" [[package]] name = "cryptography" -version = "44.0.0" +version = "44.0.2" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = "!=3.9.0,!=3.9.1,>=3.7" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "cryptography-44.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:84111ad4ff3f6253820e6d3e58be2cc2a00adb29335d4cacb5ab4d4d34f2a123"}, - {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15492a11f9e1b62ba9d73c210e2416724633167de94607ec6069ef724fad092"}, - {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831c3c4d0774e488fdc83a1923b49b9957d33287de923d58ebd3cec47a0ae43f"}, - {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:761817a3377ef15ac23cd7834715081791d4ec77f9297ee694ca1ee9c2c7e5eb"}, - {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b"}, - {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543"}, - {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:60eb32934076fa07e4316b7b2742fa52cbb190b42c2df2863dbc4230a0a9b385"}, - {file = "cryptography-44.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ed3534eb1090483c96178fcb0f8893719d96d5274dfde98aa6add34614e97c8e"}, - {file = "cryptography-44.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f3f6fdfa89ee2d9d496e2c087cebef9d4fcbb0ad63c40e821b39f74bf48d9c5e"}, - {file = "cryptography-44.0.0-cp37-abi3-win32.whl", hash = "sha256:eb33480f1bad5b78233b0ad3e1b0be21e8ef1da745d8d2aecbb20671658b9053"}, - {file = "cryptography-44.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:abc998e0c0eee3c8a1904221d3f67dcfa76422b23620173e28c11d3e626c21bd"}, - {file = "cryptography-44.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:660cb7312a08bc38be15b696462fa7cc7cd85c3ed9c576e81f4dc4d8b2b31591"}, - {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1923cb251c04be85eec9fda837661c67c1049063305d6be5721643c22dd4e2b7"}, - {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:404fdc66ee5f83a1388be54300ae978b2efd538018de18556dde92575e05defc"}, - {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c5eb858beed7835e5ad1faba59e865109f3e52b3783b9ac21e7e47dc5554e289"}, - {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f53c2c87e0fb4b0c00fa9571082a057e37690a8f12233306161c8f4b819960b7"}, - {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c"}, - {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9abcc2e083cbe8dde89124a47e5e53ec38751f0d7dfd36801008f316a127d7ba"}, - {file = "cryptography-44.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d2436114e46b36d00f8b72ff57e598978b37399d2786fd39793c36c6d5cb1c64"}, - {file = "cryptography-44.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285"}, - {file = "cryptography-44.0.0-cp39-abi3-win32.whl", hash = "sha256:eca27345e1214d1b9f9490d200f9db5a874479be914199194e746c893788d417"}, - {file = "cryptography-44.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede"}, - {file = "cryptography-44.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:37d76e6863da3774cd9db5b409a9ecfd2c71c981c38788d3fcfaf177f447b731"}, - {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:f677e1268c4e23420c3acade68fac427fffcb8d19d7df95ed7ad17cdef8404f4"}, - {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f5e7cb1e5e56ca0933b4873c0220a78b773b24d40d186b6738080b73d3d0a756"}, - {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:8b3e6eae66cf54701ee7d9c83c30ac0a1e3fa17be486033000f2a73a12ab507c"}, - {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:be4ce505894d15d5c5037167ffb7f0ae90b7be6f2a98f9a5c3442395501c32fa"}, - {file = "cryptography-44.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:62901fb618f74d7d81bf408c8719e9ec14d863086efe4185afd07c352aee1d2c"}, - {file = "cryptography-44.0.0.tar.gz", hash = "sha256:cd4e834f340b4293430701e772ec543b0fbe6c2dea510a5286fe0acabe153a02"}, +files = [ + {file = "cryptography-44.0.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7"}, + {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1"}, + {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc821e161ae88bfe8088d11bb39caf2916562e0a2dc7b6d56714a48b784ef0bb"}, + {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3c00b6b757b32ce0f62c574b78b939afab9eecaf597c4d624caca4f9e71e7843"}, + {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7bdcd82189759aba3816d1f729ce42ffded1ac304c151d0a8e89b9996ab863d5"}, + {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:4973da6ca3db4405c54cd0b26d328be54c7747e89e284fcff166132eb7bccc9c"}, + {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4e389622b6927d8133f314949a9812972711a111d577a5d1f4bee5e58736b80a"}, + {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:f514ef4cd14bb6fb484b4a60203e912cfcb64f2ab139e88c2274511514bf7308"}, + {file = "cryptography-44.0.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1bc312dfb7a6e5d66082c87c34c8a62176e684b6fe3d90fcfe1568de675e6688"}, + {file = "cryptography-44.0.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b721b8b4d948b218c88cb8c45a01793483821e709afe5f622861fc6182b20a7"}, + {file = "cryptography-44.0.2-cp37-abi3-win32.whl", hash = "sha256:51e4de3af4ec3899d6d178a8c005226491c27c4ba84101bfb59c901e10ca9f79"}, + {file = "cryptography-44.0.2-cp37-abi3-win_amd64.whl", hash = "sha256:c505d61b6176aaf982c5717ce04e87da5abc9a36a5b39ac03905c4aafe8de7aa"}, + {file = "cryptography-44.0.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8e0ddd63e6bf1161800592c71ac794d3fb8001f2caebe0966e77c5234fa9efc3"}, + {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81276f0ea79a208d961c433a947029e1a15948966658cf6710bbabb60fcc2639"}, + {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a1e657c0f4ea2a23304ee3f964db058c9e9e635cc7019c4aa21c330755ef6fd"}, + {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6210c05941994290f3f7f175a4a57dbbb2afd9273657614c506d5976db061181"}, + {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1c3572526997b36f245a96a2b1713bf79ce99b271bbcf084beb6b9b075f29ea"}, + {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b042d2a275c8cee83a4b7ae30c45a15e6a4baa65a179a0ec2d78ebb90e4f6699"}, + {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:d03806036b4f89e3b13b6218fefea8d5312e450935b1a2d55f0524e2ed7c59d9"}, + {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:c7362add18b416b69d58c910caa217f980c5ef39b23a38a0880dfd87bdf8cd23"}, + {file = "cryptography-44.0.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:8cadc6e3b5a1f144a039ea08a0bdb03a2a92e19c46be3285123d32029f40a922"}, + {file = "cryptography-44.0.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6f101b1f780f7fc613d040ca4bdf835c6ef3b00e9bd7125a4255ec574c7916e4"}, + {file = "cryptography-44.0.2-cp39-abi3-win32.whl", hash = "sha256:3dc62975e31617badc19a906481deacdeb80b4bb454394b4098e3f2525a488c5"}, + {file = "cryptography-44.0.2-cp39-abi3-win_amd64.whl", hash = "sha256:5f6f90b72d8ccadb9c6e311c775c8305381db88374c65fa1a68250aa8a9cb3a6"}, + {file = "cryptography-44.0.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:af4ff3e388f2fa7bff9f7f2b31b87d5651c45731d3e8cfa0944be43dff5cfbdb"}, + {file = "cryptography-44.0.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:0529b1d5a0105dd3731fa65680b45ce49da4d8115ea76e9da77a875396727b41"}, + {file = "cryptography-44.0.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:7ca25849404be2f8e4b3c59483d9d3c51298a22c1c61a0e84415104dacaf5562"}, + {file = "cryptography-44.0.2-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:268e4e9b177c76d569e8a145a6939eca9a5fec658c932348598818acf31ae9a5"}, + {file = "cryptography-44.0.2-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:9eb9d22b0a5d8fd9925a7764a054dca914000607dff201a24c791ff5c799e1fa"}, + {file = "cryptography-44.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2bf7bf75f7df9715f810d1b038870309342bff3069c5bd8c6b96128cb158668d"}, + {file = "cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:909c97ab43a9c0c0b0ada7a1281430e4e5ec0458e6d9244c0e821bbf152f061d"}, + {file = "cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:96e7a5e9d6e71f9f4fca8eebfd603f8e86c5225bb18eb621b2c1e50b290a9471"}, + {file = "cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d1b3031093a366ac767b3feb8bcddb596671b3aaff82d4050f984da0c248b615"}, + {file = "cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:04abd71114848aa25edb28e225ab5f268096f44cf0127f3d36975bdf1bdf3390"}, + {file = "cryptography-44.0.2.tar.gz", hash = "sha256:c63454aa261a0cf0c5b4718349629793e9e634993538db841165b3df74f37ec0"}, ] [package.dependencies] @@ -775,7 +746,7 @@ nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2)"] pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] sdist = ["build (>=1.0.0)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi (>=2024)", "cryptography-vectors (==44.0.0)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] +test = ["certifi (>=2024)", "cryptography-vectors (==44.0.2)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] test-randomorder = ["pytest-randomly"] [[package]] @@ -784,8 +755,6 @@ version = "0.9.5" description = "A python port of YUI CSS Compressor" optional = false python-versions = "*" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "csscompressor-0.9.5.tar.gz", hash = "sha256:afa22badbcf3120a4f392e4d22f9fff485c044a1feda4a950ecc5eba9dd31a05"}, ] @@ -796,8 +765,6 @@ version = "0.12.1" description = "Composable style cycles" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, @@ -813,8 +780,6 @@ version = "3.0.2" description = "Django ASGI (HTTP/WebSocket) server" optional = false python-versions = ">=3.6" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "daphne-3.0.2-py3-none-any.whl", hash = "sha256:a9af943c79717bc52fe64a3c236ae5d3adccc8b5be19c881b442d2c3db233393"}, {file = "daphne-3.0.2.tar.gz", hash = "sha256:76ffae916ba3aa66b46996c14fa713e46004788167a4873d647544e750e0e99f"}, @@ -830,22 +795,20 @@ tests = ["hypothesis (==4.23)", "pytest (>=3.10,<4.0)", "pytest-asyncio (>=0.8,< [[package]] name = "dask" -version = "2025.1.0" +version = "2025.2.0" description = "Parallel PyData with Task Scheduling" optional = false python-versions = ">=3.10" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "dask-2025.1.0-py3-none-any.whl", hash = "sha256:db86220c8d19bdf464cbe11a87a2c8f5d537acf586bb02eed6d61a302af5c2fd"}, - {file = "dask-2025.1.0.tar.gz", hash = "sha256:bb807586ff20f0f59f3d36fe34eb4a95f75a1aae2a775b521de6dd53727d2063"}, + {file = "dask-2025.2.0-py3-none-any.whl", hash = "sha256:f0fdeef6ceb0a06569d456c9e704f220f7f54e80f3a6ea42ab98cea6bc642b6e"}, + {file = "dask-2025.2.0.tar.gz", hash = "sha256:89c87125d04d28141eaccc4794164ce9098163fd22d8ad943db48f8d4c815460"}, ] [package.dependencies] bokeh = {version = ">=3.1.0", optional = true, markers = "extra == \"diagnostics\""} click = ">=8.1" cloudpickle = ">=3.0.0" -distributed = {version = "2025.1.0", optional = true, markers = "extra == \"distributed\""} +distributed = {version = "2025.2.0", optional = true, markers = "extra == \"distributed\""} fsspec = ">=2021.09.0" importlib_metadata = {version = ">=4.13.0", markers = "python_version < \"3.12\""} jinja2 = {version = ">=2.10.3", optional = true, markers = "extra == \"diagnostics\""} @@ -854,10 +817,7 @@ numpy = {version = ">=1.24", optional = true, markers = "extra == \"array\""} packaging = ">=20.0" pandas = {version = ">=2.0", optional = true, markers = "extra == \"dataframe\""} partd = ">=1.4.0" -pyarrow = [ - {version = ">=14.0.1", optional = true, markers = "extra == \"complete\""}, - {version = ">=14.0.1", optional = true, markers = "extra == \"dataframe\""}, -] +pyarrow = {version = ">=14.0.1", optional = true, markers = "extra == \"dataframe\""} pyyaml = ">=5.3.1" toolz = ">=0.10.0" @@ -866,7 +826,7 @@ 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.1.0)"] +distributed = ["distributed (==2025.2.0)"] test = ["pandas[test]", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytest-rerunfailures", "pytest-timeout", "pytest-xdist"] [[package]] @@ -875,8 +835,6 @@ version = "0.17.0" description = "Data visualization toolchain based on aggregating into a grid" optional = false python-versions = ">=3.9" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "datashader-0.17.0-py3-none-any.whl", hash = "sha256:39421ff999294913e63d41954af955a5dece5d0c55d8fce1426043d70b22d07a"}, {file = "datashader-0.17.0.tar.gz", hash = "sha256:571aaea639e62222ba2fc49a530cffb3b1b183b6ec8ca8054978e01d2de79440"}, @@ -901,15 +859,13 @@ tests = ["pytest"] [[package]] name = "decorator" -version = "5.1.1" +version = "5.2.1" description = "Decorators for Humans" optional = false -python-versions = ">=3.5" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +python-versions = ">=3.8" files = [ - {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, - {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, + {file = "decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"}, + {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"}, ] [[package]] @@ -918,8 +874,6 @@ version = "0.7.1" description = "XML bomb protection for Python stdlib modules" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, @@ -931,8 +885,6 @@ version = "0.3.9" description = "serialize all of Python" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, @@ -944,21 +896,19 @@ profile = ["gprof2dot (>=2022.7.29)"] [[package]] name = "distributed" -version = "2025.1.0" +version = "2025.2.0" description = "Distributed scheduler for Dask" optional = false python-versions = ">=3.10" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "distributed-2025.1.0-py3-none-any.whl", hash = "sha256:0b9c0ebcab8fe25322d71d04deb6d8ed8c7bbfd1521d1906d5d71bf82eee5ae3"}, - {file = "distributed-2025.1.0.tar.gz", hash = "sha256:8924c49adae0fc8532b464e94bdfea979c08c67835bafb5f315f33cc0ab14dd3"}, + {file = "distributed-2025.2.0-py3-none-any.whl", hash = "sha256:368462084be47092d0a835f6c64c9b852da64dc88302b76d5f93bd5131228c67"}, + {file = "distributed-2025.2.0.tar.gz", hash = "sha256:84e8e3a9290db805250cd8f0b46416b8e3e32c8088ffa778d8a21ea1e2c1cac3"}, ] [package.dependencies] click = ">=8.0" cloudpickle = ">=3.0.0" -dask = "2025.1.0" +dask = "2025.2.0" jinja2 = ">=2.10.3" locket = ">=1.0.0" msgpack = ">=1.0.2" @@ -974,15 +924,13 @@ zict = ">=3.0.0" [[package]] name = "django" -version = "5.1.5" +version = "5.1.7" description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." optional = false python-versions = ">=3.10" -groups = ["main", "dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "Django-5.1.5-py3-none-any.whl", hash = "sha256:c46eb936111fffe6ec4bc9930035524a8be98ec2f74d8a0ff351226a3e52f459"}, - {file = "Django-5.1.5.tar.gz", hash = "sha256:19bbca786df50b9eca23cee79d495facf55c8f5c54c529d9bf1fe7b5ea086af3"}, + {file = "Django-5.1.7-py3-none-any.whl", hash = "sha256:1323617cb624add820cb9611cdcc788312d250824f92ca6048fda8625514af2b"}, + {file = "Django-5.1.7.tar.gz", hash = "sha256:30de4ee43a98e5d3da36a9002f287ff400b43ca51791920bfb35f6917bfe041c"}, ] [package.dependencies] @@ -1000,8 +948,6 @@ version = "2.3" description = "Best way to have Django DRY forms" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "django_crispy_forms-2.3-py3-none-any.whl", hash = "sha256:efc4c31e5202bbec6af70d383a35e12fc80ea769d464fb0e7fe21768bb138a20"}, {file = "django_crispy_forms-2.3.tar.gz", hash = "sha256:2db17ae08527201be1273f0df789e5f92819e23dd28fec69cffba7f3762e1a38"}, @@ -1016,8 +962,6 @@ version = "3.8.1" description = "A configurable set of panels that display various debug information about the current request/response." optional = false python-versions = ">=3.7" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "django_debug_toolbar-3.8.1-py3-none-any.whl", hash = "sha256:879f8a4672d41621c06a4d322dcffa630fc4df056cada6e417ed01db0e5e0478"}, {file = "django_debug_toolbar-3.8.1.tar.gz", hash = "sha256:24ef1a7d44d25e60d7951e378454c6509bf536dce7e7d9d36e7c387db499bc27"}, @@ -1033,8 +977,6 @@ version = "0.12.0" description = "A package that allows you to utilize 12factor inspired environment variables to configure your Django application." optional = false python-versions = "<4,>=3.9" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "django_environ-0.12.0-py2.py3-none-any.whl", hash = "sha256:92fb346a158abda07ffe6eb23135ce92843af06ecf8753f43adf9d2366dcc0ca"}, {file = "django_environ-0.12.0.tar.gz", hash = "sha256:227dc891453dd5bde769c3449cf4a74b6f2ee8f7ab2361c93a07068f4179041a"}, @@ -1051,8 +993,6 @@ version = "3.2.3" description = "Extensions for Django" optional = false python-versions = ">=3.6" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "django-extensions-3.2.3.tar.gz", hash = "sha256:44d27919d04e23b3f40231c4ab7af4e61ce832ef46d610cc650d53e68328410a"}, {file = "django_extensions-3.2.3-py3-none-any.whl", hash = "sha256:9600b7562f79a92cbf1fde6403c04fee314608fefbb595502e34383ae8203401"}, @@ -1067,8 +1007,6 @@ version = "3.2" description = "Pickled object field for Django" optional = false python-versions = ">=3" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "django-picklefield-3.2.tar.gz", hash = "sha256:aa463f5d79d497dbe789f14b45180f00a51d0d670067d0729f352a3941cdfa4d"}, {file = "django_picklefield-3.2-py3-none-any.whl", hash = "sha256:e9a73539d110f69825d9320db18bcb82e5189ff48dbed41821c026a20497764c"}, @@ -1086,8 +1024,6 @@ version = "2.7.6" description = "Quickly import and export delimited data with Django support for PostgreSQL’s COPY command" optional = false python-versions = "*" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "django_postgres_copy-2.7.6-py2.py3-none-any.whl", hash = "sha256:7ea73f638b1a46c9b040d327d35f30090d64b7049254beaf64750b9e5c41d6f1"}, {file = "django_postgres_copy-2.7.6.tar.gz", hash = "sha256:8bc0774f9a07ed7251af5cf1e2bb3b7cc9b5b5c7a2d736cbd6a03e1b5fdd47ad"}, @@ -1099,8 +1035,6 @@ version = "1.7.6" description = "A multiprocessing distributed task queue for Django" optional = false python-versions = "<4,>=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "django_q2-1.7.6-py3-none-any.whl", hash = "sha256:9060f4d68e1f3a8a748e0ebd0bd83c8c24bc13036105035873faab9d85b0e8f6"}, {file = "django_q2-1.7.6.tar.gz", hash = "sha256:5210b121573cf65b97d495dbebefe6cfac394d8c0aec9ca2117e8e56e2fda17d"}, @@ -1121,8 +1055,6 @@ version = "1.9.0" description = "Mypy stubs for Django" optional = false python-versions = ">=3.6" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "django-stubs-1.9.0.tar.gz", hash = "sha256:664843091636a917faf5256d028476559dc360fdef9050b6df87ab61b21607bf"}, {file = "django_stubs-1.9.0-py3-none-any.whl", hash = "sha256:59c9f81af64d214b1954eaf90f037778c8d2b9c2de946a3cda177fefcf588fbd"}, @@ -1139,15 +1071,13 @@ typing-extensions = "*" [[package]] name = "django-stubs-ext" -version = "5.1.2" +version = "5.1.3" description = "Monkey-patching and extensions for django-stubs" optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "django_stubs_ext-5.1.2-py3-none-any.whl", hash = "sha256:6c559214538d6a26f631ca638ddc3251a0a891d607de8ce01d23d3201ad8ad6c"}, - {file = "django_stubs_ext-5.1.2.tar.gz", hash = "sha256:421c0c3025a68e3ab8e16f065fad9ba93335ecefe2dd92a0cff97a665680266c"}, + {file = "django_stubs_ext-5.1.3-py3-none-any.whl", hash = "sha256:64561fbc53e963cc1eed2c8eb27e18b8e48dcb90771205180fe29fc8a59e55fd"}, + {file = "django_stubs_ext-5.1.3.tar.gz", hash = "sha256:3e60f82337f0d40a362f349bf15539144b96e4ceb4dbd0239be1cd71f6a74ad0"}, ] [package.dependencies] @@ -1160,8 +1090,6 @@ version = "2.1.0" description = "Fabulous Tagging for Django" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "django_tagulous-2.1.0-py3-none-any.whl", hash = "sha256:5ebba5a51f049f6df5f9d2a30eef431c0bf7cd35758aa0a42fc3351be4d239cd"}, {file = "django_tagulous-2.1.0.tar.gz", hash = "sha256:f629b54ad720052092785b0dce056dc6a68c7b63f8126075af9c25848b250bfd"}, @@ -1176,8 +1104,6 @@ version = "3.15.2" description = "Web APIs for Django, made easy." optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "djangorestframework-3.15.2-py3-none-any.whl", hash = "sha256:2b8871b062ba1aefc2de01f773875441a961fefbf79f5eed1e32b2f096944b20"}, {file = "djangorestframework-3.15.2.tar.gz", hash = "sha256:36fe88cd2d6c6bec23dca9804bab2ba5517a8bb9d8f47ebc68981b56840107ad"}, @@ -1192,8 +1118,6 @@ version = "0.7.2" description = "Seamless integration between Django REST framework and Datatables (https://datatables.net)" optional = false python-versions = "*" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "djangorestframework_datatables-0.7.2-py2.py3-none-any.whl", hash = "sha256:fd5747b1e3d0bfb84713a975394dd4d879b57ee8bc66cc0f97566fa67f4406f4"}, {file = "djangorestframework_datatables-0.7.2.tar.gz", hash = "sha256:d7953968088ceb14968621a0c0a83d2f39ec1cda24b5ebe1240f3c9619bc7129"}, @@ -1208,8 +1132,6 @@ version = "2.2.0" description = "Get the currently executing AST node of a frame, and other information" optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa"}, {file = "executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755"}, @@ -1224,8 +1146,6 @@ version = "3.9.2" description = "the modular source code checker: pep8 pyflakes and co" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"}, {file = "flake8-3.9.2.tar.gz", hash = "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b"}, @@ -1238,63 +1158,61 @@ pyflakes = ">=2.3.0,<2.4.0" [[package]] name = "fonttools" -version = "4.55.7" +version = "4.56.0" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "fonttools-4.55.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c2680a3e6e2e2d104a7ea81fb89323e1a9122c23b03d6569d0768887d0d76e69"}, - {file = "fonttools-4.55.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a7831d16c95b60866772a15fdcc03772625c4bb6d858e0ad8ef3d6e48709b2ef"}, - {file = "fonttools-4.55.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:833927d089e6585019f2c85e3f8f7d87733e3fe81cd704ebaca7afa27e2e7113"}, - {file = "fonttools-4.55.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7858dc6823296a053d85b831fa8428781c6c6f06fca44582bf7b6b2ff32a9089"}, - {file = "fonttools-4.55.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:05568a66b090ed9d79aefdce2ceb180bb64fc856961deaedc29f5ad51355ce2c"}, - {file = "fonttools-4.55.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2dbc08e227fbeb716776905a7bd3c4fc62c8e37c8ef7d481acd10cb5fde12222"}, - {file = "fonttools-4.55.7-cp310-cp310-win32.whl", hash = "sha256:6eb93cbba484a463b5ee83f7dd3211905f27a3871d20d90fb72de84c6c5056e3"}, - {file = "fonttools-4.55.7-cp310-cp310-win_amd64.whl", hash = "sha256:7ff8e606f905048dc91a55a06d994b68065bf35752ae199df54a9bf30013dcaa"}, - {file = "fonttools-4.55.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:916e1d926823b4b3b3815c59fc79f4ed670696fdd5fd9a5e690a0503eef38f79"}, - {file = "fonttools-4.55.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b89da448e0073408d7b2c44935f9fdae4fdc93644899f99f6102ef883ecf083c"}, - {file = "fonttools-4.55.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:087ace2d06894ccdb03e6975d05da6bb9cec0c689b2a9983c059880e33a1464a"}, - {file = "fonttools-4.55.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:775ed0700ee6f781436641f18a0c61b1846a8c1aecae6da6b395c4417e2cb567"}, - {file = "fonttools-4.55.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9ec71d0cc0242899f87e4c230ed0b22c7b8681f288fb80e3d81c2c54c5bd2c79"}, - {file = "fonttools-4.55.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d4b1c5939c0521525f45522823508e6fad21175bca978583688ea3b3736e6625"}, - {file = "fonttools-4.55.7-cp311-cp311-win32.whl", hash = "sha256:23df0f1003abaf8a435543f59583fc247e7ae1b047ee2263510e0654a5f207e0"}, - {file = "fonttools-4.55.7-cp311-cp311-win_amd64.whl", hash = "sha256:82163d58b43eff6e2025a25c32905fdb9042a163cc1ff82dab393e7ffc77a7d5"}, - {file = "fonttools-4.55.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:12e81d44f762156d28b5c93a6b65d98ed73678be45b22546de8ed29736c3cb96"}, - {file = "fonttools-4.55.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c26445a7be689f8b70df7d5d2e2c85ec4407bdb769902a23dd45ac44f767575d"}, - {file = "fonttools-4.55.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2cbafedb9462be7cf68c66b6ca1d8309842fe36b729f1b1969595f5d660e5c2"}, - {file = "fonttools-4.55.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4bde87985012adbd7559bc363d802fb335e92a07ff86a76cf02bebb0b8566d1"}, - {file = "fonttools-4.55.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:69ed0660750993150f7c4d966c0c1ffaa0385f23ccef85c2ff108062d80dd7ea"}, - {file = "fonttools-4.55.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3098355e7a7b5ac48d5dc29684a65271187b865b85675033958b57c40364ee34"}, - {file = "fonttools-4.55.7-cp312-cp312-win32.whl", hash = "sha256:ee7aa8bb716318e3d835ef473978e22b7a39c0f1b3b08cc0b0ee1bba6f73bc1e"}, - {file = "fonttools-4.55.7-cp312-cp312-win_amd64.whl", hash = "sha256:e696d6e2baf4cc57ded34bb87e5d3a9e4da9732f3d9e8e2c6db0746e57a6dc0b"}, - {file = "fonttools-4.55.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e10c7fb80cdfdc32244514cbea0906e9f53e3cc80d64d3389da09502fd999b55"}, - {file = "fonttools-4.55.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1101976c703ff4008a928fc3fef42caf06d035bfc4614230d7e797cbe356feb0"}, - {file = "fonttools-4.55.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e6dffe9cbcd163ef617fab1f81682e4d1629b7a5b9c5e598274dc2d03e88bcd"}, - {file = "fonttools-4.55.7-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77e5115a425d53be6e31cd0fe9210f62a488bccf81eb113ab5dd7f4fa88e4d81"}, - {file = "fonttools-4.55.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f0c45eae32d090763820756b18322a70571dada3f1cbe003debc37a9c35bc260"}, - {file = "fonttools-4.55.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fd4ebc475d43f3de2b26e0cf551eff92c24e22d1aee03dc1b33adb52fc2e6cb2"}, - {file = "fonttools-4.55.7-cp313-cp313-win32.whl", hash = "sha256:371197de1283cc99f5f10eb91496520eb0e2d079312d014fd6cef9e802174c6a"}, - {file = "fonttools-4.55.7-cp313-cp313-win_amd64.whl", hash = "sha256:418ece624fbc04e199f58398ffef3eaad645baba65434871b09eb7350a3a346b"}, - {file = "fonttools-4.55.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3976db357484bf4cb533dfd0d1a444b38ad06062458715ebf21e38c71aff325d"}, - {file = "fonttools-4.55.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:30c3501328363b73a90acc8a722dd199c993f2c4369ea16886128d94e91897ec"}, - {file = "fonttools-4.55.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0899cd23967950e7b902ea75af06cfe5f59ac71eb38e98a774c9e596790e6aa"}, - {file = "fonttools-4.55.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f669910b64d27750398f6c56c651367d4954b05c86ff067af1c9949e109cf1e2"}, - {file = "fonttools-4.55.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:1d4be8354c245c00aecfc90f5d3da8606226f0ac22e1cb0837b39139e4c2df85"}, - {file = "fonttools-4.55.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:9074a2848ea5b607377e16998dfcf90cf5eb614d0c388541b9782d5cc038e149"}, - {file = "fonttools-4.55.7-cp38-cp38-win32.whl", hash = "sha256:5ff0daf8b2e0612e5761fed2e4a2f54eff9d9ec0aeb4091c9f3666f9a118325e"}, - {file = "fonttools-4.55.7-cp38-cp38-win_amd64.whl", hash = "sha256:0ed25d7b5fa4ae6a805c2a9cc0e5307d45cbb3b8e155584fe932d0f3b6a997bf"}, - {file = "fonttools-4.55.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8ef5ee98fc320c158e4e459a5ee40d1ac3728d4ce11c3c8dfd854aa0aa5c042f"}, - {file = "fonttools-4.55.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:09740feed51f9ed816aebf5d82071b7fecf693ac3a7e0fc8ea433f5dc3bd92f5"}, - {file = "fonttools-4.55.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3d19ea483b3cd8833e9e2ee8115f3d2044d55d3743d84f9c23b48b52d7516d8"}, - {file = "fonttools-4.55.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c135c91d47351b84893fb6fcbb8f178eba14f7cb195850264c0675c85e4238b6"}, - {file = "fonttools-4.55.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bee4920ebeb540849bc3555d871e2a8487e39ce8263c281f74d5b6d44d2bf1df"}, - {file = "fonttools-4.55.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f3b63648600dd0081bdd6856a86d014a7f1d2d11c3c974542f866478d832e103"}, - {file = "fonttools-4.55.7-cp39-cp39-win32.whl", hash = "sha256:d4bd27f0fa5120aaa39f76de5768959bc97300e0f59a3160d466b51436a38aea"}, - {file = "fonttools-4.55.7-cp39-cp39-win_amd64.whl", hash = "sha256:c665df9c9d99937a5bf807bace1c0c95bd13f55de8c82aaf9856b868dcbfe5d9"}, - {file = "fonttools-4.55.7-py3-none-any.whl", hash = "sha256:3304dfcf9ca204dd0ef691a287bd851ddd8e8250108658c0677c3fdfec853a20"}, - {file = "fonttools-4.55.7.tar.gz", hash = "sha256:6899e3d97225a8218f525e9754da0376e1c62953a0d57a76c5abaada51e0d140"}, +files = [ + {file = "fonttools-4.56.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:331954d002dbf5e704c7f3756028e21db07097c19722569983ba4d74df014000"}, + {file = "fonttools-4.56.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8d1613abd5af2f93c05867b3a3759a56e8bf97eb79b1da76b2bc10892f96ff16"}, + {file = "fonttools-4.56.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:705837eae384fe21cee5e5746fd4f4b2f06f87544fa60f60740007e0aa600311"}, + {file = "fonttools-4.56.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc871904a53a9d4d908673c6faa15689874af1c7c5ac403a8e12d967ebd0c0dc"}, + {file = "fonttools-4.56.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:38b947de71748bab150259ee05a775e8a0635891568e9fdb3cdd7d0e0004e62f"}, + {file = "fonttools-4.56.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:86b2a1013ef7a64d2e94606632683f07712045ed86d937c11ef4dde97319c086"}, + {file = "fonttools-4.56.0-cp310-cp310-win32.whl", hash = "sha256:133bedb9a5c6376ad43e6518b7e2cd2f866a05b1998f14842631d5feb36b5786"}, + {file = "fonttools-4.56.0-cp310-cp310-win_amd64.whl", hash = "sha256:17f39313b649037f6c800209984a11fc256a6137cbe5487091c6c7187cae4685"}, + {file = "fonttools-4.56.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7ef04bc7827adb7532be3d14462390dd71287644516af3f1e67f1e6ff9c6d6df"}, + {file = "fonttools-4.56.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ffda9b8cd9cb8b301cae2602ec62375b59e2e2108a117746f12215145e3f786c"}, + {file = "fonttools-4.56.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e993e8db36306cc3f1734edc8ea67906c55f98683d6fd34c3fc5593fdbba4c"}, + {file = "fonttools-4.56.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:003548eadd674175510773f73fb2060bb46adb77c94854af3e0cc5bc70260049"}, + {file = "fonttools-4.56.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd9825822e7bb243f285013e653f6741954d8147427aaa0324a862cdbf4cbf62"}, + {file = "fonttools-4.56.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b23d30a2c0b992fb1c4f8ac9bfde44b5586d23457759b6cf9a787f1a35179ee0"}, + {file = "fonttools-4.56.0-cp311-cp311-win32.whl", hash = "sha256:47b5e4680002ae1756d3ae3b6114e20aaee6cc5c69d1e5911f5ffffd3ee46c6b"}, + {file = "fonttools-4.56.0-cp311-cp311-win_amd64.whl", hash = "sha256:14a3e3e6b211660db54ca1ef7006401e4a694e53ffd4553ab9bc87ead01d0f05"}, + {file = "fonttools-4.56.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d6f195c14c01bd057bc9b4f70756b510e009c83c5ea67b25ced3e2c38e6ee6e9"}, + {file = "fonttools-4.56.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fa760e5fe8b50cbc2d71884a1eff2ed2b95a005f02dda2fa431560db0ddd927f"}, + {file = "fonttools-4.56.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d54a45d30251f1d729e69e5b675f9a08b7da413391a1227781e2a297fa37f6d2"}, + {file = "fonttools-4.56.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:661a8995d11e6e4914a44ca7d52d1286e2d9b154f685a4d1f69add8418961563"}, + {file = "fonttools-4.56.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9d94449ad0a5f2a8bf5d2f8d71d65088aee48adbe45f3c5f8e00e3ad861ed81a"}, + {file = "fonttools-4.56.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f59746f7953f69cc3290ce2f971ab01056e55ddd0fb8b792c31a8acd7fee2d28"}, + {file = "fonttools-4.56.0-cp312-cp312-win32.whl", hash = "sha256:bce60f9a977c9d3d51de475af3f3581d9b36952e1f8fc19a1f2254f1dda7ce9c"}, + {file = "fonttools-4.56.0-cp312-cp312-win_amd64.whl", hash = "sha256:300c310bb725b2bdb4f5fc7e148e190bd69f01925c7ab437b9c0ca3e1c7cd9ba"}, + {file = "fonttools-4.56.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f20e2c0dfab82983a90f3d00703ac0960412036153e5023eed2b4641d7d5e692"}, + {file = "fonttools-4.56.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f36a0868f47b7566237640c026c65a86d09a3d9ca5df1cd039e30a1da73098a0"}, + {file = "fonttools-4.56.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62b4c6802fa28e14dba010e75190e0e6228513573f1eeae57b11aa1a39b7e5b1"}, + {file = "fonttools-4.56.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a05d1f07eb0a7d755fbe01fee1fd255c3a4d3730130cf1bfefb682d18fd2fcea"}, + {file = "fonttools-4.56.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0073b62c3438cf0058488c002ea90489e8801d3a7af5ce5f7c05c105bee815c3"}, + {file = "fonttools-4.56.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e2cad98c94833465bcf28f51c248aaf07ca022efc6a3eba750ad9c1e0256d278"}, + {file = "fonttools-4.56.0-cp313-cp313-win32.whl", hash = "sha256:d0cb73ccf7f6d7ca8d0bc7ea8ac0a5b84969a41c56ac3ac3422a24df2680546f"}, + {file = "fonttools-4.56.0-cp313-cp313-win_amd64.whl", hash = "sha256:62cc1253827d1e500fde9dbe981219fea4eb000fd63402283472d38e7d8aa1c6"}, + {file = "fonttools-4.56.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3fd3fccb7b9adaaecfa79ad51b759f2123e1aba97f857936ce044d4f029abd71"}, + {file = "fonttools-4.56.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:193b86e9f769320bc98ffdb42accafb5d0c8c49bd62884f1c0702bc598b3f0a2"}, + {file = "fonttools-4.56.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e81c1cc80c1d8bf071356cc3e0e25071fbba1c75afc48d41b26048980b3c771"}, + {file = "fonttools-4.56.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9270505a19361e81eecdbc2c251ad1e1a9a9c2ad75fa022ccdee533f55535dc"}, + {file = "fonttools-4.56.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:53f5e9767978a4daf46f28e09dbeb7d010319924ae622f7b56174b777258e5ba"}, + {file = "fonttools-4.56.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:9da650cb29bc098b8cfd15ef09009c914b35c7986c8fa9f08b51108b7bc393b4"}, + {file = "fonttools-4.56.0-cp38-cp38-win32.whl", hash = "sha256:965d0209e6dbdb9416100123b6709cb13f5232e2d52d17ed37f9df0cc31e2b35"}, + {file = "fonttools-4.56.0-cp38-cp38-win_amd64.whl", hash = "sha256:654ac4583e2d7c62aebc6fc6a4c6736f078f50300e18aa105d87ce8925cfac31"}, + {file = "fonttools-4.56.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ca7962e8e5fc047cc4e59389959843aafbf7445b6c08c20d883e60ced46370a5"}, + {file = "fonttools-4.56.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1af375734018951c31c0737d04a9d5fd0a353a0253db5fbed2ccd44eac62d8c"}, + {file = "fonttools-4.56.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:442ad4122468d0e47d83bc59d0e91b474593a8c813839e1872e47c7a0cb53b10"}, + {file = "fonttools-4.56.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cf4f8d2a30b454ac682e12c61831dcb174950c406011418e739de592bbf8f76"}, + {file = "fonttools-4.56.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:96a4271f63a615bcb902b9f56de00ea225d6896052c49f20d0c91e9f43529a29"}, + {file = "fonttools-4.56.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6c1d38642ca2dddc7ae992ef5d026e5061a84f10ff2b906be5680ab089f55bb8"}, + {file = "fonttools-4.56.0-cp39-cp39-win32.whl", hash = "sha256:2d351275f73ebdd81dd5b09a8b8dac7a30f29a279d41e1c1192aedf1b6dced40"}, + {file = "fonttools-4.56.0-cp39-cp39-win_amd64.whl", hash = "sha256:d6ca96d1b61a707ba01a43318c9c40aaf11a5a568d1e61146fafa6ab20890793"}, + {file = "fonttools-4.56.0-py3-none-any.whl", hash = "sha256:1088182f68c303b50ca4dc0c82d42083d176cba37af1937e1a976a31149d4d14"}, + {file = "fonttools-4.56.0.tar.gz", hash = "sha256:a114d1567e1a1586b7e9e7fc2ff686ca542a82769a296cef131e4c4af51e58f4"}, ] [package.extras] @@ -1317,8 +1235,6 @@ version = "0.2.0" description = "Simple forced photometry on FITS images with optional source clustering." optional = false python-versions = "*" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [] develop = false @@ -1337,15 +1253,13 @@ resolved_reference = "6652dec9326437fc68961f87e04b451ae33f7871" [[package]] name = "fsspec" -version = "2024.12.0" +version = "2025.2.0" description = "File-system specification" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "fsspec-2024.12.0-py3-none-any.whl", hash = "sha256:b520aed47ad9804237ff878b504267a3b0b441e97508bd6d2d8774e3db85cee2"}, - {file = "fsspec-2024.12.0.tar.gz", hash = "sha256:670700c977ed2fb51e0d9f9253177ed20cbde4a3e5c0283cc5385b5870c8533f"}, + {file = "fsspec-2025.2.0-py3-none-any.whl", hash = "sha256:9de2ad9ce1f85e1931858535bc882543171d197001a0a5eb2ddc04f1781ab95b"}, + {file = "fsspec-2025.2.0.tar.gz", hash = "sha256:1c24b16eaa0a1798afa0337aa0db9b256718ab2a89c425371f5628d22c3b6afd"}, ] [package.extras] @@ -1372,7 +1286,7 @@ 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-expr", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"] +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"] @@ -1382,8 +1296,6 @@ version = "24.11.1" description = "Coroutine-based network library" optional = true python-versions = ">=3.9" -groups = ["main"] -markers = "python_version == \"3.11\" and extra == \"prod\" or python_version >= \"3.12\" and extra == \"prod\"" files = [ {file = "gevent-24.11.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:92fe5dfee4e671c74ffaa431fd7ffd0ebb4b339363d24d0d944de532409b935e"}, {file = "gevent-24.11.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7bfcfe08d038e1fa6de458891bca65c1ada6d145474274285822896a858c870"}, @@ -1444,8 +1356,6 @@ version = "2.1.0" description = "Copy your docs directly to the gh-pages branch." optional = false python-versions = "*" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, @@ -1463,8 +1373,6 @@ version = "4.0.12" description = "Git Object Database" optional = false python-versions = ">=3.7" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf"}, {file = "gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571"}, @@ -1479,8 +1387,6 @@ version = "3.1.44" description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110"}, {file = "gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269"}, @@ -1499,8 +1405,6 @@ version = "3.1.1" description = "Lightweight in-process concurrent programming" optional = false python-versions = ">=3.7" -groups = ["main"] -markers = "python_version == \"3.11\" and extra == \"prod\" and platform_python_implementation == \"CPython\" or python_version == \"3.11\" 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\") or python_version >= \"3.12\" and extra == \"prod\" and platform_python_implementation == \"CPython\" or python_version >= \"3.12\" 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"}, @@ -1583,15 +1487,13 @@ test = ["objgraph", "psutil"] [[package]] name = "griffe" -version = "1.5.5" +version = "1.6.0" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false python-versions = ">=3.9" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "griffe-1.5.5-py3-none-any.whl", hash = "sha256:2761b1e8876c6f1f9ab1af274df93ea6bbadd65090de5f38f4cb5cc84897c7dd"}, - {file = "griffe-1.5.5.tar.gz", hash = "sha256:35ee5b38b93d6a839098aad0f92207e6ad6b70c3e8866c08ca669275b8cba585"}, + {file = "griffe-1.6.0-py3-none-any.whl", hash = "sha256:9f1dfe035d4715a244ed2050dfbceb05b1f470809ed4f6bb10ece5a7302f8dd1"}, + {file = "griffe-1.6.0.tar.gz", hash = "sha256:eb5758088b9c73ad61c7ac014f3cdfb4c57b5c2fcbfca69996584b702aefa354"}, ] [package.dependencies] @@ -1603,8 +1505,6 @@ version = "20.1.0" description = "WSGI HTTP Server for UNIX" optional = true python-versions = ">=3.5" -groups = ["main"] -markers = "python_version == \"3.11\" and extra == \"prod\" or python_version >= \"3.12\" and extra == \"prod\"" files = [ {file = "gunicorn-20.1.0-py3-none-any.whl", hash = "sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e"}, {file = "gunicorn-20.1.0.tar.gz", hash = "sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8"}, @@ -1621,15 +1521,13 @@ tornado = ["tornado (>=0.2)"] [[package]] name = "holoviews" -version = "1.20.0" +version = "1.20.1" description = "A high-level plotting API for the PyData ecosystem built on HoloViews." optional = false python-versions = ">=3.9" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "holoviews-1.20.0-py3-none-any.whl", hash = "sha256:dc810b6790e1dd2c90f16406b292e08db10efa377b2554e46755a130e12044c5"}, - {file = "holoviews-1.20.0.tar.gz", hash = "sha256:29d183045fafa3d846deda999d9687b99b8abdc1a8c06712e54afa576bb02b3e"}, + {file = "holoviews-1.20.1-py3-none-any.whl", hash = "sha256:479b43cacc0f150cf55d3fd51cc019354b42adbb715708d04d8f7aaf5d4466e9"}, + {file = "holoviews-1.20.1.tar.gz", hash = "sha256:f4ad8c6533d9ac918a762cb6ba8e7508f55525f9dfa447b8806da66272badceb"}, ] [package.dependencies] @@ -1652,8 +1550,6 @@ version = "1.1" description = "HTML parser based on the WHATWG HTML specification" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, @@ -1675,8 +1571,6 @@ version = "0.1.13" description = "An HTML Minifier" optional = false python-versions = "*" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "htmlmin2-0.1.13-py3-none-any.whl", hash = "sha256:75609f2a42e64f7ce57dbff28a39890363bde9e7e5885db633317efbdf8c79a2"}, ] @@ -1687,8 +1581,6 @@ version = "21.0.0" description = "A featureful, immutable, and correct URL for Python." optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "hyperlink-21.0.0-py2.py3-none-any.whl", hash = "sha256:e6b14c37ecb73e89c77d78cdb4c2cc8f3fb59a885c5b3f819ff4ed80f25af1b4"}, {file = "hyperlink-21.0.0.tar.gz", hash = "sha256:427af957daa58bc909471c6c40f74c5450fa123dd093fc53efd2e91d2705a56b"}, @@ -1703,8 +1595,6 @@ version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" -groups = ["main", "dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -1719,8 +1609,6 @@ version = "8.6.1" description = "Read metadata from Python packages" optional = false python-versions = ">=3.9" -groups = ["main"] -markers = "python_version == \"3.11\"" 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"}, @@ -1744,8 +1632,6 @@ version = "24.7.2" description = "A small library that versions your Python projects." optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "incremental-24.7.2-py3-none-any.whl", hash = "sha256:8cb2c3431530bec48ad70513931a760f446ad6c25e8333ca5d95e24b0ed7b8fe"}, {file = "incremental-24.7.2.tar.gz", hash = "sha256:fb4f1d47ee60efe87d4f6f0ebb5f70b9760db2b2574c59c8e8912be4ebd464c9"}, @@ -1763,8 +1649,6 @@ version = "0.13.13" description = "IPython-enabled pdb" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "ipdb-0.13.13-py3-none-any.whl", hash = "sha256:45529994741c4ab6d2388bfa5d7b725c2cf7fe9deffabdb8a6113aa5ed449ed4"}, {file = "ipdb-0.13.13.tar.gz", hash = "sha256:e3ac6018ef05126d442af680aad863006ec19d02290561ac88b8b1c0b0cfc726"}, @@ -1776,15 +1660,13 @@ ipython = {version = ">=7.31.1", markers = "python_version >= \"3.11\""} [[package]] name = "ipython" -version = "8.31.0" +version = "8.33.0" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.10" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "ipython-8.31.0-py3-none-any.whl", hash = "sha256:46ec58f8d3d076a61d128fe517a51eb730e3aaf0c184ea8c17d16e366660c6a6"}, - {file = "ipython-8.31.0.tar.gz", hash = "sha256:b6a2274606bec6166405ff05e54932ed6e5cfecaca1fc05f2cacde7bb074d70b"}, + {file = "ipython-8.33.0-py3-none-any.whl", hash = "sha256:aa5b301dfe1eaf0167ff3238a6825f810a029c9dad9d3f1597f30bd5ff65cc44"}, + {file = "ipython-8.33.0.tar.gz", hash = "sha256:4c3e36a6dfa9e8e3702bd46f3df668624c975a22ff340e96ea7277afbd76217d"}, ] [package.dependencies] @@ -1819,8 +1701,6 @@ version = "3.4.0" description = "Utility functions for Python class constructs" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790"}, {file = "jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd"}, @@ -1839,8 +1719,6 @@ version = "6.0.1" description = "Useful decorators and context managers" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4"}, {file = "jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3"}, @@ -1859,8 +1737,6 @@ version = "4.1.0" description = "Functools like those found in stdlib" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "jaraco.functools-4.1.0-py3-none-any.whl", hash = "sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649"}, {file = "jaraco_functools-4.1.0.tar.gz", hash = "sha256:70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d"}, @@ -1883,8 +1759,6 @@ version = "0.19.2" description = "An autocompletion tool for Python that can be used for text editors." optional = false python-versions = ">=3.6" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, @@ -1900,32 +1774,28 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] [[package]] name = "jeepney" -version = "0.8.0" +version = "0.9.0" description = "Low-level, pure Python DBus protocol wrapper." optional = false python-versions = ">=3.7" -groups = ["main"] -markers = "python_version == \"3.11\" and sys_platform == \"linux\" or python_version >= \"3.12\" and sys_platform == \"linux\"" files = [ - {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, - {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, + {file = "jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683"}, + {file = "jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732"}, ] [package.extras] test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] -trio = ["async_generator", "trio"] +trio = ["trio"] [[package]] name = "jinja2" -version = "3.1.5" +version = "3.1.6" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" -groups = ["main", "dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, - {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, + {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, + {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, ] [package.dependencies] @@ -1940,8 +1810,6 @@ version = "3.0.1" description = "JavaScript minifier." optional = false python-versions = "*" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "jsmin-3.0.1.tar.gz", hash = "sha256:c0959a121ef94542e807a674142606f7e90214a2b3d1eb17300244bbb5cc2bfc"}, ] @@ -1952,8 +1820,6 @@ version = "25.6.0" description = "Store and access your passwords safely." optional = false python-versions = ">=3.9" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "keyring-25.6.0-py3-none-any.whl", hash = "sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd"}, {file = "keyring-25.6.0.tar.gz", hash = "sha256:0b39998aa941431eb3d9b0d4b2460bc773b9df6fed7621c2dfb291a7e0187a66"}, @@ -1983,8 +1849,6 @@ version = "1.4.8" description = "A fast implementation of the Cassowary constraint solver" optional = false python-versions = ">=3.10" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db"}, {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b"}, @@ -2074,8 +1938,6 @@ version = "0.5" description = "Markdown extension to wrap images in lightbox/lightgallery" optional = false python-versions = "*" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "lightgallery-0.5-py2.py3-none-any.whl", hash = "sha256:9f14d5986aff5c4e0ef17d85f85488b9f2295b904556c71f1db99e3378a6cbc6"}, {file = "lightgallery-0.5.tar.gz", hash = "sha256:3063ba855fc96fe6b9c978845052d3e837095a55277fe1982be5748f7cb4085c"}, @@ -2090,8 +1952,6 @@ version = "2.0.3" description = "Links recognition library with FULL unicode support." optional = false python-versions = ">=3.7" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "linkify-it-py-2.0.3.tar.gz", hash = "sha256:68cda27e162e9215c17d786649d1da0021a451bdc436ef9e0fa0ba5234b9b048"}, {file = "linkify_it_py-2.0.3-py3-none-any.whl", hash = "sha256:6bcbc417b0ac14323382aef5c5192c0075bf8a9d6b41820a2b66371eac6b6d79"}, @@ -2112,8 +1972,6 @@ version = "0.43.0" description = "lightweight wrapper around basic LLVM functionality" optional = false python-versions = ">=3.9" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "llvmlite-0.43.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a289af9a1687c6cf463478f0fa8e8aa3b6fb813317b0d70bf1ed0759eab6f761"}, {file = "llvmlite-0.43.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d4fd101f571a31acb1559ae1af30f30b1dc4b3186669f92ad780e17c81e91bc"}, @@ -2144,8 +2002,6 @@ 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"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "locket-1.0.0-py2.py3-none-any.whl", hash = "sha256:b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3"}, {file = "locket-1.0.0.tar.gz", hash = "sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632"}, @@ -2157,8 +2013,6 @@ version = "4.4.3" description = "LZ4 Bindings for Python" optional = false python-versions = ">=3.9" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "lz4-4.4.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1ebf23ffd36b32b980f720a81990fcfdeadacafe7498fbeff7a8e058259d4e58"}, {file = "lz4-4.4.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8fe3caea61427057a9e3697c69b2403510fdccfca4483520d02b98ffae74531e"}, @@ -2204,8 +2058,6 @@ version = "3.7" description = "Python implementation of John Gruber's Markdown." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"}, {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"}, @@ -2221,8 +2073,6 @@ version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, @@ -2247,8 +2097,6 @@ version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.9" -groups = ["main", "dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" 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"}, @@ -2315,47 +2163,45 @@ files = [ [[package]] name = "matplotlib" -version = "3.10.0" +version = "3.10.1" description = "Python plotting package" optional = false python-versions = ">=3.10" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "matplotlib-3.10.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2c5829a5a1dd5a71f0e31e6e8bb449bc0ee9dbfb05ad28fc0c6b55101b3a4be6"}, - {file = "matplotlib-3.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2a43cbefe22d653ab34bb55d42384ed30f611bcbdea1f8d7f431011a2e1c62e"}, - {file = "matplotlib-3.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:607b16c8a73943df110f99ee2e940b8a1cbf9714b65307c040d422558397dac5"}, - {file = "matplotlib-3.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01d2b19f13aeec2e759414d3bfe19ddfb16b13a1250add08d46d5ff6f9be83c6"}, - {file = "matplotlib-3.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e6c6461e1fc63df30bf6f80f0b93f5b6784299f721bc28530477acd51bfc3d1"}, - {file = "matplotlib-3.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:994c07b9d9fe8d25951e3202a68c17900679274dadfc1248738dcfa1bd40d7f3"}, - {file = "matplotlib-3.10.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:fd44fc75522f58612ec4a33958a7e5552562b7705b42ef1b4f8c0818e304a363"}, - {file = "matplotlib-3.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c58a9622d5dbeb668f407f35f4e6bfac34bb9ecdcc81680c04d0258169747997"}, - {file = "matplotlib-3.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:845d96568ec873be63f25fa80e9e7fae4be854a66a7e2f0c8ccc99e94a8bd4ef"}, - {file = "matplotlib-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5439f4c5a3e2e8eab18e2f8c3ef929772fd5641876db71f08127eed95ab64683"}, - {file = "matplotlib-3.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4673ff67a36152c48ddeaf1135e74ce0d4bce1bbf836ae40ed39c29edf7e2765"}, - {file = "matplotlib-3.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:7e8632baebb058555ac0cde75db885c61f1212e47723d63921879806b40bec6a"}, - {file = "matplotlib-3.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4659665bc7c9b58f8c00317c3c2a299f7f258eeae5a5d56b4c64226fca2f7c59"}, - {file = "matplotlib-3.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d44cb942af1693cced2604c33a9abcef6205601c445f6d0dc531d813af8a2f5a"}, - {file = "matplotlib-3.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a994f29e968ca002b50982b27168addfd65f0105610b6be7fa515ca4b5307c95"}, - {file = "matplotlib-3.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b0558bae37f154fffda54d779a592bc97ca8b4701f1c710055b609a3bac44c8"}, - {file = "matplotlib-3.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:503feb23bd8c8acc75541548a1d709c059b7184cde26314896e10a9f14df5f12"}, - {file = "matplotlib-3.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:c40ba2eb08b3f5de88152c2333c58cee7edcead0a2a0d60fcafa116b17117adc"}, - {file = "matplotlib-3.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96f2886f5c1e466f21cc41b70c5a0cd47bfa0015eb2d5793c88ebce658600e25"}, - {file = "matplotlib-3.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:12eaf48463b472c3c0f8dbacdbf906e573013df81a0ab82f0616ea4b11281908"}, - {file = "matplotlib-3.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fbbabc82fde51391c4da5006f965e36d86d95f6ee83fb594b279564a4c5d0d2"}, - {file = "matplotlib-3.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad2e15300530c1a94c63cfa546e3b7864bd18ea2901317bae8bbf06a5ade6dcf"}, - {file = "matplotlib-3.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3547d153d70233a8496859097ef0312212e2689cdf8d7ed764441c77604095ae"}, - {file = "matplotlib-3.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:c55b20591ced744aa04e8c3e4b7543ea4d650b6c3c4b208c08a05b4010e8b442"}, - {file = "matplotlib-3.10.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9ade1003376731a971e398cc4ef38bb83ee8caf0aee46ac6daa4b0506db1fd06"}, - {file = "matplotlib-3.10.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:95b710fea129c76d30be72c3b38f330269363fbc6e570a5dd43580487380b5ff"}, - {file = "matplotlib-3.10.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cdbaf909887373c3e094b0318d7ff230b2ad9dcb64da7ade654182872ab2593"}, - {file = "matplotlib-3.10.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d907fddb39f923d011875452ff1eca29a9e7f21722b873e90db32e5d8ddff12e"}, - {file = "matplotlib-3.10.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3b427392354d10975c1d0f4ee18aa5844640b512d5311ef32efd4dd7db106ede"}, - {file = "matplotlib-3.10.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5fd41b0ec7ee45cd960a8e71aea7c946a28a0b8a4dcee47d2856b2af051f334c"}, - {file = "matplotlib-3.10.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:81713dd0d103b379de4516b861d964b1d789a144103277769238c732229d7f03"}, - {file = "matplotlib-3.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:359f87baedb1f836ce307f0e850d12bb5f1936f70d035561f90d41d305fdacea"}, - {file = "matplotlib-3.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae80dc3a4add4665cf2faa90138384a7ffe2a4e37c58d83e115b54287c4f06ef"}, - {file = "matplotlib-3.10.0.tar.gz", hash = "sha256:b886d02a581b96704c9d1ffe55709e49b4d2d52709ccebc4be42db856e511278"}, +files = [ + {file = "matplotlib-3.10.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ff2ae14910be903f4a24afdbb6d7d3a6c44da210fc7d42790b87aeac92238a16"}, + {file = "matplotlib-3.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0721a3fd3d5756ed593220a8b86808a36c5031fce489adb5b31ee6dbb47dd5b2"}, + {file = "matplotlib-3.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0673b4b8f131890eb3a1ad058d6e065fb3c6e71f160089b65f8515373394698"}, + {file = "matplotlib-3.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e875b95ac59a7908978fe307ecdbdd9a26af7fa0f33f474a27fcf8c99f64a19"}, + {file = "matplotlib-3.10.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2589659ea30726284c6c91037216f64a506a9822f8e50592d48ac16a2f29e044"}, + {file = "matplotlib-3.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:a97ff127f295817bc34517255c9db6e71de8eddaab7f837b7d341dee9f2f587f"}, + {file = "matplotlib-3.10.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:057206ff2d6ab82ff3e94ebd94463d084760ca682ed5f150817b859372ec4401"}, + {file = "matplotlib-3.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a144867dd6bf8ba8cb5fc81a158b645037e11b3e5cf8a50bd5f9917cb863adfe"}, + {file = "matplotlib-3.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56c5d9fcd9879aa8040f196a235e2dcbdf7dd03ab5b07c0696f80bc6cf04bedd"}, + {file = "matplotlib-3.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f69dc9713e4ad2fb21a1c30e37bd445d496524257dfda40ff4a8efb3604ab5c"}, + {file = "matplotlib-3.10.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4c59af3e8aca75d7744b68e8e78a669e91ccbcf1ac35d0102a7b1b46883f1dd7"}, + {file = "matplotlib-3.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:11b65088c6f3dae784bc72e8d039a2580186285f87448babb9ddb2ad0082993a"}, + {file = "matplotlib-3.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:66e907a06e68cb6cfd652c193311d61a12b54f56809cafbed9736ce5ad92f107"}, + {file = "matplotlib-3.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b4bb156abb8fa5e5b2b460196f7db7264fc6d62678c03457979e7d5254b7be"}, + {file = "matplotlib-3.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1985ad3d97f51307a2cbfc801a930f120def19ba22864182dacef55277102ba6"}, + {file = "matplotlib-3.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c96f2c2f825d1257e437a1482c5a2cf4fee15db4261bd6fc0750f81ba2b4ba3d"}, + {file = "matplotlib-3.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35e87384ee9e488d8dd5a2dd7baf471178d38b90618d8ea147aced4ab59c9bea"}, + {file = "matplotlib-3.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:cfd414bce89cc78a7e1d25202e979b3f1af799e416010a20ab2b5ebb3a02425c"}, + {file = "matplotlib-3.10.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c42eee41e1b60fd83ee3292ed83a97a5f2a8239b10c26715d8a6172226988d7b"}, + {file = "matplotlib-3.10.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4f0647b17b667ae745c13721602b540f7aadb2a32c5b96e924cd4fea5dcb90f1"}, + {file = "matplotlib-3.10.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa3854b5f9473564ef40a41bc922be978fab217776e9ae1545c9b3a5cf2092a3"}, + {file = "matplotlib-3.10.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e496c01441be4c7d5f96d4e40f7fca06e20dcb40e44c8daa2e740e1757ad9e6"}, + {file = "matplotlib-3.10.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5d45d3f5245be5b469843450617dcad9af75ca50568acf59997bed9311131a0b"}, + {file = "matplotlib-3.10.1-cp313-cp313-win_amd64.whl", hash = "sha256:8e8e25b1209161d20dfe93037c8a7f7ca796ec9aa326e6e4588d8c4a5dd1e473"}, + {file = "matplotlib-3.10.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:19b06241ad89c3ae9469e07d77efa87041eac65d78df4fcf9cac318028009b01"}, + {file = "matplotlib-3.10.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:01e63101ebb3014e6e9f80d9cf9ee361a8599ddca2c3e166c563628b39305dbb"}, + {file = "matplotlib-3.10.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f06bad951eea6422ac4e8bdebcf3a70c59ea0a03338c5d2b109f57b64eb3972"}, + {file = "matplotlib-3.10.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3dfb036f34873b46978f55e240cff7a239f6c4409eac62d8145bad3fc6ba5a3"}, + {file = "matplotlib-3.10.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dc6ab14a7ab3b4d813b88ba957fc05c79493a037f54e246162033591e770de6f"}, + {file = "matplotlib-3.10.1-cp313-cp313t-win_amd64.whl", hash = "sha256:bc411ebd5889a78dabbc457b3fa153203e22248bfa6eedc6797be5df0164dbf9"}, + {file = "matplotlib-3.10.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:648406f1899f9a818cef8c0231b44dcfc4ff36f167101c3fd1c9151f24220fdc"}, + {file = "matplotlib-3.10.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:02582304e352f40520727984a5a18f37e8187861f954fea9be7ef06569cf85b4"}, + {file = "matplotlib-3.10.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3809916157ba871bcdd33d3493acd7fe3037db5daa917ca6e77975a94cef779"}, + {file = "matplotlib-3.10.1.tar.gz", hash = "sha256:e8d2d0e3881b129268585bf4765ad3ee73a4591d77b9a18c214ac7e3a79fb2ba"}, ] [package.dependencies] @@ -2378,8 +2224,6 @@ version = "0.1.7" description = "Inline Matplotlib backend for Jupyter" optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, @@ -2394,8 +2238,6 @@ version = "0.6.1" description = "McCabe checker, plugin for flake8" optional = false python-versions = "*" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, @@ -2407,8 +2249,6 @@ version = "0.4.2" description = "Collection of plugins for markdown-it-py" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636"}, {file = "mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5"}, @@ -2428,8 +2268,6 @@ version = "0.1.2" description = "Markdown URL utilities" optional = false python-versions = ">=3.7" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, @@ -2441,8 +2279,6 @@ version = "1.3.4" description = "A deep merge function for 🐍." optional = false python-versions = ">=3.6" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, @@ -2454,8 +2290,6 @@ version = "1.1.2" description = "Manage multiple versions of your MkDocs-powered documentation" optional = false python-versions = "*" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "mike-1.1.2-py3-none-any.whl", hash = "sha256:4c307c28769834d78df10f834f57f810f04ca27d248f80a75f49c6fa2d1527ca"}, {file = "mike-1.1.2.tar.gz", hash = "sha256:56c3f1794c2d0b5fdccfa9b9487beb013ca813de2e3ad0744724e9d34d40b77b"}, @@ -2477,8 +2311,6 @@ version = "1.6.1" description = "Project documentation with Markdown." optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e"}, {file = "mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2"}, @@ -2505,15 +2337,13 @@ min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-imp [[package]] name = "mkdocs-autorefs" -version = "1.3.0" +version = "1.4.0" description = "Automatically link across pages in MkDocs." optional = false python-versions = ">=3.9" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "mkdocs_autorefs-1.3.0-py3-none-any.whl", hash = "sha256:d180f9778a04e78b7134e31418f238bba56f56d6a8af97873946ff661befffb3"}, - {file = "mkdocs_autorefs-1.3.0.tar.gz", hash = "sha256:6867764c099ace9025d6ac24fd07b85a98335fbd30107ef01053697c8f46db61"}, + {file = "mkdocs_autorefs-1.4.0-py3-none-any.whl", hash = "sha256:bad19f69655878d20194acd0162e29a89c3f7e6365ffe54e72aa3fd1072f240d"}, + {file = "mkdocs_autorefs-1.4.0.tar.gz", hash = "sha256:a9c0aa9c90edbce302c09d050a3c4cb7c76f8b7b2c98f84a7a05f53d00392156"}, ] [package.dependencies] @@ -2527,8 +2357,6 @@ version = "0.5.0" description = "MkDocs plugin to programmatically generate documentation pages during the build" optional = false python-versions = ">=3.7" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "mkdocs_gen_files-0.5.0-py3-none-any.whl", hash = "sha256:7ac060096f3f40bd19039e7277dd3050be9a453c8ac578645844d4d91d7978ea"}, {file = "mkdocs_gen_files-0.5.0.tar.gz", hash = "sha256:4c7cf256b5d67062a788f6b1d035e157fc1a9498c2399be9af5257d4ff4d19bc"}, @@ -2543,8 +2371,6 @@ version = "0.2.0" description = "MkDocs extension that lists all dependencies according to a mkdocs.yml file" optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134"}, {file = "mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c"}, @@ -2557,43 +2383,35 @@ pyyaml = ">=5.1" [[package]] name = "mkdocs-git-revision-date-localized-plugin" -version = "1.3.0" +version = "1.4.1" description = "Mkdocs plugin that enables displaying the localized date of the last git modification of a markdown file." optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "mkdocs_git_revision_date_localized_plugin-1.3.0-py3-none-any.whl", hash = "sha256:c99377ee119372d57a9e47cff4e68f04cce634a74831c06bc89b33e456e840a1"}, - {file = "mkdocs_git_revision_date_localized_plugin-1.3.0.tar.gz", hash = "sha256:439e2f14582204050a664c258861c325064d97cdc848c541e48bb034a6c4d0cb"}, + {file = "mkdocs_git_revision_date_localized_plugin-1.4.1-py3-none-any.whl", hash = "sha256:bb1eca7f156e0c8a587167662923d76efed7f7e0c06b84471aa5ae72a744a434"}, + {file = "mkdocs_git_revision_date_localized_plugin-1.4.1.tar.gz", hash = "sha256:364d7c4c45c4f333c750e34bc298ac685a7a8bf9b7b52890d52b2f90f1812c4b"}, ] [package.dependencies] babel = ">=2.7.0" -GitPython = "*" +gitpython = ">=3.1.44" mkdocs = ">=1.0" -pytz = "*" - -[package.extras] -all = ["GitPython", "babel (>=2.7.0)", "click", "codecov", "mkdocs (>=1.0)", "mkdocs-gen-files", "mkdocs-git-authors-plugin", "mkdocs-material", "mkdocs-static-i18n", "pytest", "pytest-cov", "pytz"] -base = ["GitPython", "babel (>=2.7.0)", "mkdocs (>=1.0)", "pytz"] -dev = ["click", "codecov", "mkdocs-gen-files", "mkdocs-git-authors-plugin", "mkdocs-material", "mkdocs-static-i18n", "pytest", "pytest-cov"] +pytz = ">=2025.1" [[package]] name = "mkdocs-material" -version = "9.5.50" +version = "9.6.7" description = "Documentation that simply works" optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "mkdocs_material-9.5.50-py3-none-any.whl", hash = "sha256:f24100f234741f4d423a9d672a909d859668a4f404796be3cf035f10d6050385"}, - {file = "mkdocs_material-9.5.50.tar.gz", hash = "sha256:ae5fe16f3d7c9ccd05bb6916a7da7420cf99a9ce5e33debd9d40403a090d5825"}, + {file = "mkdocs_material-9.6.7-py3-none-any.whl", hash = "sha256:8a159e45e80fcaadd9fbeef62cbf928569b93df954d4dc5ba76d46820caf7b47"}, + {file = "mkdocs_material-9.6.7.tar.gz", hash = "sha256:3e2c1fceb9410056c2d91f334a00cdea3215c28750e00c691c1e46b2a33309b4"}, ] [package.dependencies] babel = ">=2.10,<3.0" +backrefs = ">=5.7.post1,<6.0" colorama = ">=0.4,<1.0" jinja2 = ">=3.0,<4.0" markdown = ">=3.2,<4.0" @@ -2602,7 +2420,6 @@ mkdocs-material-extensions = ">=1.3,<2.0" paginate = ">=0.5,<1.0" pygments = ">=2.16,<3.0" pymdown-extensions = ">=10.2,<11.0" -regex = ">=2022.4" requests = ">=2.26,<3.0" [package.extras] @@ -2616,8 +2433,6 @@ version = "1.3.1" description = "Extension pack for Python Markdown and MkDocs Material." optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"}, {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, @@ -2629,8 +2444,6 @@ version = "0.8.0" description = "An MkDocs plugin to minify HTML, JS or CSS files prior to being written to disk" optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "mkdocs-minify-plugin-0.8.0.tar.gz", hash = "sha256:bc11b78b8120d79e817308e2b11539d790d21445eb63df831e393f76e52e753d"}, {file = "mkdocs_minify_plugin-0.8.0-py3-none-any.whl", hash = "sha256:5fba1a3f7bd9a2142c9954a6559a57e946587b21f133165ece30ea145c66aee6"}, @@ -2648,8 +2461,6 @@ version = "0.27.0" description = "Automatic documentation from sources, for MkDocs." optional = false python-versions = ">=3.9" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "mkdocstrings-0.27.0-py3-none-any.whl", hash = "sha256:6ceaa7ea830770959b55a16203ac63da24badd71325b96af950e59fd37366332"}, {file = "mkdocstrings-0.27.0.tar.gz", hash = "sha256:16adca6d6b0a1f9e0c07ff0b02ced8e16f228a9d65a37c063ec4c14d7b76a657"}, @@ -2677,8 +2488,6 @@ version = "1.13.0" description = "A Python handler for mkdocstrings." optional = false python-versions = ">=3.9" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "mkdocstrings_python-1.13.0-py3-none-any.whl", hash = "sha256:b88bbb207bab4086434743849f8e796788b373bd32e7bfefbf8560ac45d88f97"}, {file = "mkdocstrings_python-1.13.0.tar.gz", hash = "sha256:2dbd5757e8375b9720e81db16f52f1856bf59905428fd7ef88005d1370e2f64c"}, @@ -2695,8 +2504,6 @@ version = "10.6.0" description = "More routines for operating on iterables, beyond itertools" optional = false python-versions = ">=3.9" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "more-itertools-10.6.0.tar.gz", hash = "sha256:2cd7fad1009c31cc9fb6a035108509e6547547a7a738374f10bd49a09eb3ee3b"}, {file = "more_itertools-10.6.0-py3-none-any.whl", hash = "sha256:6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89"}, @@ -2708,8 +2515,6 @@ version = "1.1.0" description = "MessagePack serializer" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ad442d527a7e358a469faf43fda45aaf4ac3249c8310a82f0ccff9164e5dccd"}, {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:74bed8f63f8f14d75eec75cf3d04ad581da6b914001b474a5d3cd3372c8cc27d"}, @@ -2783,8 +2588,6 @@ version = "1.0.0" description = "Multiple dispatch" optional = false python-versions = "*" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "multipledispatch-1.0.0-py3-none-any.whl", hash = "sha256:0c53cd8b077546da4e48869f49b13164bebafd0c2a5afceb6bb6a316e7fb46e4"}, {file = "multipledispatch-1.0.0.tar.gz", hash = "sha256:5c839915465c68206c3e9c473357908216c28383b425361e5d144594bf85a7e0"}, @@ -2796,8 +2599,6 @@ version = "0.910" description = "Optional static typing for Python" optional = false python-versions = ">=3.5" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "mypy-0.910-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:a155d80ea6cee511a3694b108c4494a39f42de11ee4e61e72bc424c490e46457"}, {file = "mypy-0.910-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:b94e4b785e304a04ea0828759172a15add27088520dc7e49ceade7834275bedb"}, @@ -2839,8 +2640,6 @@ version = "0.4.4" description = "Experimental type system extensions for programs checked with the mypy typechecker." optional = false python-versions = ">=2.7" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "mypy_extensions-0.4.4.tar.gz", hash = "sha256:c8b707883a96efe9b4bb3aaf0dcc07e7e217d7d8368eec4db4049ee9e142f4fd"}, ] @@ -2851,8 +2650,6 @@ version = "2.8.8" description = "Python package for creating and manipulating graphs and networks" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "networkx-2.8.8-py3-none-any.whl", hash = "sha256:e435dfa75b1d7195c7b8378c3859f0445cd88c6b0375c181ed66823a9ceb7524"}, {file = "networkx-2.8.8.tar.gz", hash = "sha256:230d388117af870fce5647a3c52401fcf753e94720e6ea6b4197a5355648885e"}, @@ -2871,8 +2668,6 @@ version = "0.60.0" description = "compiling Python code using LLVM" optional = false python-versions = ">=3.9" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "numba-0.60.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d761de835cd38fb400d2c26bb103a2726f548dc30368853121d66201672e651"}, {file = "numba-0.60.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:159e618ef213fba758837f9837fb402bbe65326e60ba0633dbe6c7f274d42c1b"}, @@ -2907,8 +2702,6 @@ version = "2.0.2" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece"}, {file = "numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04"}, @@ -2963,8 +2756,6 @@ version = "3.2.2" description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" optional = false python-versions = ">=3.6" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, @@ -2975,14 +2766,26 @@ rsa = ["cryptography (>=3.0.0)"] signals = ["blinker (>=1.4.0)"] signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] +[[package]] +name = "objgraph" +version = "3.6.2" +description = "Draws Python object reference graphs with graphviz" +optional = false +python-versions = ">=3.7" +files = [ + {file = "objgraph-3.6.2-py3-none-any.whl", hash = "sha256:8114c97712291c3ba30d882406a384d0a7651b307ea9a06e0d83836ccde85e15"}, + {file = "objgraph-3.6.2.tar.gz", hash = "sha256:00b9f2f40f7422e3c7f45a61c4dafdaf81f03ff0649d6eaec866f01030e51ad8"}, +] + +[package.extras] +ipython = ["graphviz"] + [[package]] name = "packaging" version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, @@ -2994,8 +2797,6 @@ version = "0.5.7" description = "Divides large result sets into pages for easier browsing" optional = false python-versions = "*" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591"}, {file = "paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945"}, @@ -3011,8 +2812,6 @@ version = "2.2.3" description = "Powerful data structures for data analysis, time series, and statistics" optional = false python-versions = ">=3.9" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"}, {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"}, @@ -3094,15 +2893,13 @@ xml = ["lxml (>=4.9.2)"] [[package]] name = "panel" -version = "1.6.0" +version = "1.6.1" description = "The powerful data exploration & web app framework for Python." optional = false python-versions = ">=3.10" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "panel-1.6.0-py3-none-any.whl", hash = "sha256:75f806155dfd8ac1bbc3012626ad4e17c82f0169eb9a0fbed64f47b3139836a3"}, - {file = "panel-1.6.0.tar.gz", hash = "sha256:6dd27b3dc7d161a08327b02b0c6dde5fa09bed56bb6ce479c56fca94d4f3308e"}, + {file = "panel-1.6.1-py3-none-any.whl", hash = "sha256:3ddbfed586c72ccdd83ab6bdf8af56e464b9f50f72afadddbe4eeaec409dc61d"}, + {file = "panel-1.6.1.tar.gz", hash = "sha256:75f95701f03f6b64d00d69a5369c3f521126e697fb855e717816c4a02ddbfd57"}, ] [package.dependencies] @@ -3133,8 +2930,6 @@ version = "2.2.0" description = "Make your Python code clearer and more reliable by declaring Parameters." optional = false python-versions = ">=3.9" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "param-2.2.0-py3-none-any.whl", hash = "sha256:777f8c7b66ab820b70ea5ad09faaa6818308220caae89da3b5c5f359faa72a5e"}, {file = "param-2.2.0.tar.gz", hash = "sha256:2ef63ef7aef37412eeb8ee3a06189a51f69c58c068824ae070baecb5b2abd0b8"}, @@ -3154,8 +2949,6 @@ version = "0.8.4" description = "A Python Parser" optional = false python-versions = ">=3.6" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, @@ -3171,8 +2964,6 @@ version = "1.4.2" description = "Appendable key-value storage" optional = false python-versions = ">=3.9" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "partd-1.4.2-py3-none-any.whl", hash = "sha256:978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f"}, {file = "partd-1.4.2.tar.gz", hash = "sha256:d022c33afbdc8405c226621b015e8067888173d85f7f5ecebb3cafed9a20f02c"}, @@ -3191,8 +2982,6 @@ version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -3204,8 +2993,6 @@ version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." optional = false python-versions = "*" -groups = ["dev"] -markers = "python_version == \"3.11\" and (sys_platform != \"win32\" and sys_platform != \"emscripten\") or python_version >= \"3.12\" and (sys_platform != \"win32\" and sys_platform != \"emscripten\")" files = [ {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, @@ -3220,8 +3007,6 @@ version = "11.1.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.9" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" 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"}, @@ -3306,15 +3091,13 @@ xmp = ["defusedxml"] [[package]] name = "pip" -version = "25.0" +version = "25.0.1" description = "The PyPA recommended tool for installing Python packages." optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "pip-25.0-py3-none-any.whl", hash = "sha256:b6eb97a803356a52b2dd4bb73ba9e65b2ba16caa6bcb25a7497350a4e5859b65"}, - {file = "pip-25.0.tar.gz", hash = "sha256:8e0a97f7b4c47ae4a494560da84775e9e2f671d415d8d828e052efefb206b30b"}, + {file = "pip-25.0.1-py3-none-any.whl", hash = "sha256:c46efd13b6aa8279f33f2864459c8ce587ea6a1a59ee20de055868d8f7688f7f"}, + {file = "pip-25.0.1.tar.gz", hash = "sha256:88f96547ea48b940a3a385494e181e29fb8637898f88d88737c5049780f196ea"}, ] [[package]] @@ -3323,8 +3106,6 @@ version = "5.5.0" description = "pip-tools keeps your pinned dependencies fresh." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "pip-tools-5.5.0.tar.gz", hash = "sha256:cb0108391366b3ef336185097b3c2c0f3fa115b15098dafbda5e78aef70ea114"}, {file = "pip_tools-5.5.0-py2.py3-none-any.whl", hash = "sha256:10841c1e56c234d610d0466447685b9ea4ee4a2c274f858c0ef3c33d9bd0d985"}, @@ -3344,8 +3125,6 @@ version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, @@ -3362,8 +3141,6 @@ version = "3.0.50" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.8.0" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" 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"}, @@ -3378,8 +3155,6 @@ version = "5.9.8" description = "Cross-platform lib for process and system monitoring in Python." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, @@ -3408,8 +3183,6 @@ version = "2.9.10" description = "psycopg2 - Python-PostgreSQL Database Adapter" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "psycopg2-2.9.10-cp310-cp310-win32.whl", hash = "sha256:5df2b672140f95adb453af93a7d669d7a7bf0a56bcd26f1502329166f4a61716"}, {file = "psycopg2-2.9.10-cp310-cp310-win_amd64.whl", hash = "sha256:c6f7b8561225f9e711a9c47087388a97fdc948211c10a4bccbf0ba68ab7b3b5a"}, @@ -3428,8 +3201,6 @@ version = "0.7.0" description = "Run a subprocess in a pseudo terminal" optional = false python-versions = "*" -groups = ["dev"] -markers = "python_version == \"3.11\" and (sys_platform != \"win32\" and sys_platform != \"emscripten\") or python_version >= \"3.12\" and (sys_platform != \"win32\" and sys_platform != \"emscripten\")" files = [ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, @@ -3441,8 +3212,6 @@ version = "0.2.3" description = "Safely evaluate AST nodes without side effects" optional = false python-versions = "*" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, @@ -3457,8 +3226,6 @@ version = "18.1.0" description = "Python library for Apache Arrow" optional = false python-versions = ">=3.9" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "pyarrow-18.1.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:e21488d5cfd3d8b500b3238a6c4b075efabc18f0f6d80b29239737ebd69caa6c"}, {file = "pyarrow-18.1.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:b516dad76f258a702f7ca0250885fc93d1fa5ac13ad51258e39d402bd9e2e1e4"}, @@ -3513,8 +3280,6 @@ version = "0.6.1" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"}, {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, @@ -3526,8 +3291,6 @@ version = "0.4.1" description = "A collection of ASN.1-based protocols modules" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "pyasn1_modules-0.4.1-py3-none-any.whl", hash = "sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd"}, {file = "pyasn1_modules-0.4.1.tar.gz", hash = "sha256:c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c"}, @@ -3542,8 +3305,6 @@ version = "2.7.0" description = "Python style guide checker" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"}, {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"}, @@ -3555,8 +3316,6 @@ version = "2.22" description = "C parser in Python" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" and platform_python_implementation != \"PyPy\" or python_version >= \"3.12\" and platform_python_implementation != \"PyPy\"" files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, @@ -3568,8 +3327,6 @@ version = "0.5.0" description = "Python package common tasks for users (e.g. copy examples, fetch data, ...)" optional = false python-versions = ">=3.7" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "pyct-0.5.0-py2.py3-none-any.whl", hash = "sha256:a4038a8885059ab8cac6f946ea30e0b5e6bdbe0b92b6723f06737035f9d65e8c"}, {file = "pyct-0.5.0.tar.gz", hash = "sha256:dd9f4ac5cbd8e37c352c04036062d3c5f67efec76d404761ef16b0cbf26aa6a0"}, @@ -3590,8 +3347,6 @@ version = "2.0.1.5" description = "Python bindings for ERFA" optional = false python-versions = ">=3.9" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" 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"}, @@ -3619,8 +3374,6 @@ version = "2.3.1" description = "passive checker of Python programs" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "pyflakes-2.3.1-py2.py3-none-any.whl", hash = "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3"}, {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"}, @@ -3632,8 +3385,6 @@ version = "2.19.1" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, @@ -3648,8 +3399,6 @@ version = "1.14" description = "Python interface to Graphviz" optional = false python-versions = ">=3.10" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "pygraphviz-1.14.tar.gz", hash = "sha256:c10df02377f4e39b00ae17c862f4ee7e5767317f1c6b2dfd04cea6acc7fc2bea"}, ] @@ -3660,8 +3409,6 @@ version = "2.10.1" description = "JSON Web Token implementation in Python" optional = false python-versions = ">=3.9" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"}, {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"}, @@ -3675,15 +3422,13 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pymdown-extensions" -version = "10.14.2" +version = "10.14.3" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "pymdown_extensions-10.14.2-py3-none-any.whl", hash = "sha256:f45bc5892410e54fd738ab8ccd736098b7ff0cb27fdb4bf24d0a0c6584bc90e1"}, - {file = "pymdown_extensions-10.14.2.tar.gz", hash = "sha256:7a77b8116dc04193f2c01143760a43387bd9dc4aa05efacb7d838885a7791253"}, + {file = "pymdown_extensions-10.14.3-py3-none-any.whl", hash = "sha256:05e0bee73d64b9c71a4ae17c72abc2f700e8bc8403755a00580b49a4e9f189e9"}, + {file = "pymdown_extensions-10.14.3.tar.gz", hash = "sha256:41e576ce3f5d650be59e900e4ceff231e0aed2a88cf30acaee41e02f063a061b"}, ] [package.dependencies] @@ -3699,8 +3444,6 @@ version = "25.0.0" description = "Python wrapper module around the OpenSSL library" optional = false python-versions = ">=3.7" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "pyOpenSSL-25.0.0-py3-none-any.whl", hash = "sha256:424c247065e46e76a37411b9ab1782541c23bb658bf003772c3405fbaa128e90"}, {file = "pyopenssl-25.0.0.tar.gz", hash = "sha256:cd2cef799efa3936bb08e8ccb9433a575722b9dd986023f1cabc4ae64e9dac16"}, @@ -3720,8 +3463,6 @@ version = "3.2.1" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.9" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1"}, {file = "pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a"}, @@ -3736,8 +3477,6 @@ 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", "dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" 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"}, @@ -3752,8 +3491,6 @@ version = "3.2.0" description = "OpenID support for modern servers and consumers." optional = false python-versions = "*" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "python3-openid-3.2.0.tar.gz", hash = "sha256:33fbf6928f401e0b790151ed2b5290b02545e8775f982485205a066f874aaeaf"}, {file = "python3_openid-3.2.0-py3-none-any.whl", hash = "sha256:6626f771e0417486701e0b4daff762e7212e820ca5b29fcc0d05f6f8736dfa6b"}, @@ -3768,15 +3505,13 @@ postgresql = ["psycopg2"] [[package]] name = "pytz" -version = "2024.2" +version = "2025.1" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" -groups = ["main", "dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, - {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, + {file = "pytz-2025.1-py2.py3-none-any.whl", hash = "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57"}, + {file = "pytz-2025.1.tar.gz", hash = "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e"}, ] [[package]] @@ -3785,8 +3520,6 @@ version = "3.0.4" description = "A JupyterLab extension for rendering HoloViz content." optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "pyviz_comms-3.0.4-py3-none-any.whl", hash = "sha256:a40d17db26ec13cf975809633804e712bd24b473e77388c193c44043f85d0b25"}, {file = "pyviz_comms-3.0.4.tar.gz", hash = "sha256:d70e17555f7262c4884a6b7bc9ca19cb816507a032a334d9cb411b4546caff4c"}, @@ -3802,15 +3535,13 @@ tests = ["flake8", "pytest"] [[package]] name = "pyvo" -version = "1.6" +version = "1.6.1" description = "Astropy affiliated package for accessing Virtual Observatory data and services" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "pyvo-1.6-py3-none-any.whl", hash = "sha256:65740f565ffbe947c2a93aade9be905eaa3b0ab86660bb805e1beb3cc3ff4812"}, - {file = "pyvo-1.6.tar.gz", hash = "sha256:db6ef423e6008eba1ca68459e7e2a91dbc34cbe1bda2f29f64ba57d8df570caa"}, + {file = "pyvo-1.6.1-py3-none-any.whl", hash = "sha256:4260544bd2b81bd0d880acb2c9b8b45bd4a3cbc1b0961d0513d2b821d0ddec77"}, + {file = "pyvo-1.6.1.tar.gz", hash = "sha256:f896717ca9825ad06d34558d8f13c444e249b8c2d2a475507a4635eccdd2cd41"}, ] [package.dependencies] @@ -3828,8 +3559,6 @@ version = "0.2.3" description = "A (partial) reimplementation of pywin32 using ctypes/cffi" optional = false python-versions = ">=3.6" -groups = ["main"] -markers = "python_version == \"3.11\" and sys_platform == \"win32\" or python_version >= \"3.12\" and sys_platform == \"win32\"" files = [ {file = "pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755"}, {file = "pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8"}, @@ -3841,8 +3570,6 @@ version = "6.0.2" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" 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"}, @@ -3905,8 +3632,6 @@ version = "0.1" description = "A custom YAML tag for referencing environment variables in YAML files. " optional = false python-versions = ">=3.6" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, @@ -3921,8 +3646,6 @@ version = "2024.11.6" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, @@ -4026,8 +3749,6 @@ version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -4049,8 +3770,6 @@ version = "2.0.0" description = "OAuthlib authentication support for Requests." optional = false python-versions = ">=3.4" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9"}, {file = "requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36"}, @@ -4069,8 +3788,6 @@ version = "0.18.0" description = "a python refactoring library..." optional = false python-versions = "*" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "rope-0.18.0.tar.gz", hash = "sha256:786b5c38c530d4846aa68a42604f61b4e69a493390e3ca11b88df0fbfdc3ed04"}, ] @@ -4080,53 +3797,57 @@ dev = ["pytest"] [[package]] name = "scipy" -version = "1.15.1" +version = "1.15.2" description = "Fundamental algorithms for scientific computing in Python" optional = false python-versions = ">=3.10" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "scipy-1.15.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:c64ded12dcab08afff9e805a67ff4480f5e69993310e093434b10e85dc9d43e1"}, - {file = "scipy-1.15.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:5b190b935e7db569960b48840e5bef71dc513314cc4e79a1b7d14664f57fd4ff"}, - {file = "scipy-1.15.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:4b17d4220df99bacb63065c76b0d1126d82bbf00167d1730019d2a30d6ae01ea"}, - {file = "scipy-1.15.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:63b9b6cd0333d0eb1a49de6f834e8aeaefe438df8f6372352084535ad095219e"}, - {file = "scipy-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f151e9fb60fbf8e52426132f473221a49362091ce7a5e72f8aa41f8e0da4f25"}, - {file = "scipy-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21e10b1dd56ce92fba3e786007322542361984f8463c6d37f6f25935a5a6ef52"}, - {file = "scipy-1.15.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5dff14e75cdbcf07cdaa1c7707db6017d130f0af9ac41f6ce443a93318d6c6e0"}, - {file = "scipy-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:f82fcf4e5b377f819542fbc8541f7b5fbcf1c0017d0df0bc22c781bf60abc4d8"}, - {file = "scipy-1.15.1-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:5bd8d27d44e2c13d0c1124e6a556454f52cd3f704742985f6b09e75e163d20d2"}, - {file = "scipy-1.15.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:be3deeb32844c27599347faa077b359584ba96664c5c79d71a354b80a0ad0ce0"}, - {file = "scipy-1.15.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:5eb0ca35d4b08e95da99a9f9c400dc9f6c21c424298a0ba876fdc69c7afacedf"}, - {file = "scipy-1.15.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:74bb864ff7640dea310a1377d8567dc2cb7599c26a79ca852fc184cc851954ac"}, - {file = "scipy-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:667f950bf8b7c3a23b4199db24cb9bf7512e27e86d0e3813f015b74ec2c6e3df"}, - {file = "scipy-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395be70220d1189756068b3173853029a013d8c8dd5fd3d1361d505b2aa58fa7"}, - {file = "scipy-1.15.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ce3a000cd28b4430426db2ca44d96636f701ed12e2b3ca1f2b1dd7abdd84b39a"}, - {file = "scipy-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:3fe1d95944f9cf6ba77aa28b82dd6bb2a5b52f2026beb39ecf05304b8392864b"}, - {file = "scipy-1.15.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c09aa9d90f3500ea4c9b393ee96f96b0ccb27f2f350d09a47f533293c78ea776"}, - {file = "scipy-1.15.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:0ac102ce99934b162914b1e4a6b94ca7da0f4058b6d6fd65b0cef330c0f3346f"}, - {file = "scipy-1.15.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:09c52320c42d7f5c7748b69e9f0389266fd4f82cf34c38485c14ee976cb8cb04"}, - {file = "scipy-1.15.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:cdde8414154054763b42b74fe8ce89d7f3d17a7ac5dd77204f0e142cdc9239e9"}, - {file = "scipy-1.15.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c9d8fc81d6a3b6844235e6fd175ee1d4c060163905a2becce8e74cb0d7554ce"}, - {file = "scipy-1.15.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fb57b30f0017d4afa5fe5f5b150b8f807618819287c21cbe51130de7ccdaed2"}, - {file = "scipy-1.15.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:491d57fe89927fa1aafbe260f4cfa5ffa20ab9f1435025045a5315006a91b8f5"}, - {file = "scipy-1.15.1-cp312-cp312-win_amd64.whl", hash = "sha256:900f3fa3db87257510f011c292a5779eb627043dd89731b9c461cd16ef76ab3d"}, - {file = "scipy-1.15.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:100193bb72fbff37dbd0bf14322314fc7cbe08b7ff3137f11a34d06dc0ee6b85"}, - {file = "scipy-1.15.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:2114a08daec64980e4b4cbdf5bee90935af66d750146b1d2feb0d3ac30613692"}, - {file = "scipy-1.15.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:6b3e71893c6687fc5e29208d518900c24ea372a862854c9888368c0b267387ab"}, - {file = "scipy-1.15.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:837299eec3d19b7e042923448d17d95a86e43941104d33f00da7e31a0f715d3c"}, - {file = "scipy-1.15.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82add84e8a9fb12af5c2c1a3a3f1cb51849d27a580cb9e6bd66226195142be6e"}, - {file = "scipy-1.15.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:070d10654f0cb6abd295bc96c12656f948e623ec5f9a4eab0ddb1466c000716e"}, - {file = "scipy-1.15.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:55cc79ce4085c702ac31e49b1e69b27ef41111f22beafb9b49fea67142b696c4"}, - {file = "scipy-1.15.1-cp313-cp313-win_amd64.whl", hash = "sha256:c352c1b6d7cac452534517e022f8f7b8d139cd9f27e6fbd9f3cbd0bfd39f5bef"}, - {file = "scipy-1.15.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0458839c9f873062db69a03de9a9765ae2e694352c76a16be44f93ea45c28d2b"}, - {file = "scipy-1.15.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:af0b61c1de46d0565b4b39c6417373304c1d4f5220004058bdad3061c9fa8a95"}, - {file = "scipy-1.15.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:71ba9a76c2390eca6e359be81a3e879614af3a71dfdabb96d1d7ab33da6f2364"}, - {file = "scipy-1.15.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:14eaa373c89eaf553be73c3affb11ec6c37493b7eaaf31cf9ac5dffae700c2e0"}, - {file = "scipy-1.15.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f735bc41bd1c792c96bc426dece66c8723283695f02df61dcc4d0a707a42fc54"}, - {file = "scipy-1.15.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2722a021a7929d21168830790202a75dbb20b468a8133c74a2c0230c72626b6c"}, - {file = "scipy-1.15.1-cp313-cp313t-win_amd64.whl", hash = "sha256:bc7136626261ac1ed988dca56cfc4ab5180f75e0ee52e58f1e6aa74b5f3eacd5"}, - {file = "scipy-1.15.1.tar.gz", hash = "sha256:033a75ddad1463970c96a88063a1df87ccfddd526437136b6ee81ff0312ebdf6"}, +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] @@ -4143,8 +3864,6 @@ version = "3.3.3" description = "Python bindings to FreeDesktop.org Secret Service API" optional = false python-versions = ">=3.6" -groups = ["main"] -markers = "python_version == \"3.11\" and sys_platform == \"linux\" or python_version >= \"3.12\" and sys_platform == \"linux\"" files = [ {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, @@ -4160,8 +3879,6 @@ version = "24.2.0" description = "Service identity verification for pyOpenSSL & cryptography." optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "service_identity-24.2.0-py3-none-any.whl", hash = "sha256:6b047fbd8a84fd0bb0d55ebce4031e400562b9196e1e0d3e0fe2b8a59f6d4a85"}, {file = "service_identity-24.2.0.tar.gz", hash = "sha256:b8683ba13f0d39c6cd5d625d2c5f65421d6d707b013b375c355751557cbe8e09"}, @@ -4182,15 +3899,13 @@ tests = ["coverage[toml] (>=5.0.2)", "pytest"] [[package]] name = "setuptools" -version = "75.8.0" +version = "75.8.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.9" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "setuptools-75.8.0-py3-none-any.whl", hash = "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3"}, - {file = "setuptools-75.8.0.tar.gz", hash = "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6"}, + {file = "setuptools-75.8.2-py3-none-any.whl", hash = "sha256:558e47c15f1811c1fa7adbd0096669bf76c1d3f433f58324df69f3f5ecac4e8f"}, + {file = "setuptools-75.8.2.tar.gz", hash = "sha256:4880473a969e5f23f2a2be3646b2dfd84af9028716d398e46192f84bc36900d2"}, ] [package.extras] @@ -4208,8 +3923,6 @@ version = "1.0.13" description = "A generator library for concise, unambiguous and URL-safe UUIDs." optional = false python-versions = ">=3.6" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "shortuuid-1.0.13-py3-none-any.whl", hash = "sha256:a482a497300b49b4953e15108a7913244e1bb0d41f9d332f5e9925dba33a3c5a"}, {file = "shortuuid-1.0.13.tar.gz", hash = "sha256:3bb9cf07f606260584b1df46399c0b87dd84773e7b25912b7e391e30797c5e72"}, @@ -4221,8 +3934,6 @@ 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", "dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -4234,8 +3945,6 @@ version = "5.0.2" description = "A pure Python implementation of a sliding window memory map manager" optional = false python-versions = ">=3.7" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e"}, {file = "smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5"}, @@ -4243,37 +3952,36 @@ files = [ [[package]] name = "social-auth-app-django" -version = "5.4.2" +version = "5.4.3" description = "Python Social Authentication, Django integration." optional = false -python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +python-versions = ">=3.9" files = [ - {file = "social-auth-app-django-5.4.2.tar.gz", hash = "sha256:c8832c6cf13da6ad76f5613bcda2647d89ae7cfbc5217fadd13477a3406feaa8"}, - {file = "social_auth_app_django-5.4.2-py3-none-any.whl", hash = "sha256:0c041a31707921aef9a930f143183c65d8c7b364381364a50f3f7c6fcc9d62f6"}, + {file = "social_auth_app_django-5.4.3-py3-none-any.whl", hash = "sha256:db70b972faeb10ee1ec83d0dc7dbd0558d5f5830417bba317b712b10ff58d031"}, + {file = "social_auth_app_django-5.4.3.tar.gz", hash = "sha256:d1f4286d5ca1e512c9b2f686e7ecb2a0128148f1a33d853b69dc07b58508362e"}, ] [package.dependencies] Django = ">=3.2" -social-auth-core = ">=4.4.1" +social-auth-core = ">=4.4,<5.0" + +[package.extras] +dev = ["coverage (>=3.6)"] [[package]] name = "social-auth-core" -version = "4.5.4" +version = "4.5.6" description = "Python social authentication made simple." optional = false -python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +python-versions = ">=3.9" files = [ - {file = "social-auth-core-4.5.4.tar.gz", hash = "sha256:d3dbeb0999ffd0e68aa4bd73f2ac698a18133fd11b3fc890e1366f18c8889fac"}, - {file = "social_auth_core-4.5.4-py3-none-any.whl", hash = "sha256:33cf970a623c442376f9d4a86fb187579e4438649daa5b5be993d05e74d7b2db"}, + {file = "social_auth_core-4.5.6-py3-none-any.whl", hash = "sha256:43114bbc50f99789f7aadfd4943c2e15aee5e2f8c8612ad67fc4115b70b46ee1"}, + {file = "social_auth_core-4.5.6.tar.gz", hash = "sha256:14753d4cf870b820918729ce8a2dfe51f332075528fb13bed908701a8486da80"}, ] [package.dependencies] cryptography = ">=1.4" -defusedxml = ">=0.5.0rc1" +defusedxml = ">=0.5.0" oauthlib = ">=1.0.3" PyJWT = ">=2.7.0" python3-openid = ">=3.0.10" @@ -4281,10 +3989,13 @@ requests = ">=2.9.1" requests-oauthlib = ">=0.6.1" [package.extras] -all = ["cryptography (>=2.1.1)", "python3-saml (>=1.5.0)"] -allpy3 = ["cryptography (>=2.1.1)", "python3-saml (>=1.5.0)"] +all = ["social-auth-core[azuread]", "social-auth-core[google-onetap]", "social-auth-core[saml]", "social-auth-core[shopify]"] +allpy3 = ["social-auth-core[all]"] azuread = ["cryptography (>=2.1.1)"] -saml = ["python3-saml (>=1.5.0)"] +dev = ["coverage (>=3.6)", "flake8 (>=5.0.4)", "httpretty (>=1.1.0,<1.2.0)", "pyright (>=1.1.391)", "pytest (>=4.5)", "pytest-cov (>=2.7.1)", "urllib3 (>=2.2.0,<2.3.0)"] +google-onetap = ["google-auth (>=2.38.0,<2.39.0)"] +saml = ["lxml (>=5.2.1,<5.3.0)", "python3-saml (>=1.5.0)"] +shopify = ["ShopifyAPI"] [[package]] name = "sortedcontainers" @@ -4292,8 +4003,6 @@ version = "2.4.0" description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" optional = false python-versions = "*" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, @@ -4305,8 +4014,6 @@ version = "2.6" description = "A modern CSS selector implementation for Beautiful Soup." optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, @@ -4314,70 +4021,68 @@ files = [ [[package]] name = "sqlalchemy" -version = "2.0.37" +version = "2.0.38" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" -files = [ - {file = "SQLAlchemy-2.0.37-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:da36c3b0e891808a7542c5c89f224520b9a16c7f5e4d6a1156955605e54aef0e"}, - {file = "SQLAlchemy-2.0.37-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e7402ff96e2b073a98ef6d6142796426d705addd27b9d26c3b32dbaa06d7d069"}, - {file = "SQLAlchemy-2.0.37-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6f5d254a22394847245f411a2956976401e84da4288aa70cbcd5190744062c1"}, - {file = "SQLAlchemy-2.0.37-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41296bbcaa55ef5fdd32389a35c710133b097f7b2609d8218c0eabded43a1d84"}, - {file = "SQLAlchemy-2.0.37-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bedee60385c1c0411378cbd4dc486362f5ee88deceea50002772912d798bb00f"}, - {file = "SQLAlchemy-2.0.37-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6c67415258f9f3c69867ec02fea1bf6508153709ecbd731a982442a590f2b7e4"}, - {file = "SQLAlchemy-2.0.37-cp310-cp310-win32.whl", hash = "sha256:650dcb70739957a492ad8acff65d099a9586b9b8920e3507ca61ec3ce650bb72"}, - {file = "SQLAlchemy-2.0.37-cp310-cp310-win_amd64.whl", hash = "sha256:93d1543cd8359040c02b6614421c8e10cd7a788c40047dbc507ed46c29ae5636"}, - {file = "SQLAlchemy-2.0.37-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:78361be6dc9073ed17ab380985d1e45e48a642313ab68ab6afa2457354ff692c"}, - {file = "SQLAlchemy-2.0.37-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b661b49d0cb0ab311a189b31e25576b7ac3e20783beb1e1817d72d9d02508bf5"}, - {file = "SQLAlchemy-2.0.37-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d57bafbab289e147d064ffbd5cca2d7b1394b63417c0636cea1f2e93d16eb9e8"}, - {file = "SQLAlchemy-2.0.37-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fa2c0913f02341d25fb858e4fb2031e6b0813494cca1ba07d417674128ce11b"}, - {file = "SQLAlchemy-2.0.37-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9df21b8d9e5c136ea6cde1c50d2b1c29a2b5ff2b1d610165c23ff250e0704087"}, - {file = "SQLAlchemy-2.0.37-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db18ff6b8c0f1917f8b20f8eca35c28bbccb9f83afa94743e03d40203ed83de9"}, - {file = "SQLAlchemy-2.0.37-cp311-cp311-win32.whl", hash = "sha256:46954173612617a99a64aee103bcd3f078901b9a8dcfc6ae80cbf34ba23df989"}, - {file = "SQLAlchemy-2.0.37-cp311-cp311-win_amd64.whl", hash = "sha256:7b7e772dc4bc507fdec4ee20182f15bd60d2a84f1e087a8accf5b5b7a0dcf2ba"}, - {file = "SQLAlchemy-2.0.37-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2952748ecd67ed3b56773c185e85fc084f6bdcdec10e5032a7c25a6bc7d682ef"}, - {file = "SQLAlchemy-2.0.37-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3151822aa1db0eb5afd65ccfafebe0ef5cda3a7701a279c8d0bf17781a793bb4"}, - {file = "SQLAlchemy-2.0.37-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eaa8039b6d20137a4e02603aba37d12cd2dde7887500b8855356682fc33933f4"}, - {file = "SQLAlchemy-2.0.37-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cdba1f73b64530c47b27118b7053b8447e6d6f3c8104e3ac59f3d40c33aa9fd"}, - {file = "SQLAlchemy-2.0.37-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1b2690456528a87234a75d1a1644cdb330a6926f455403c8e4f6cad6921f9098"}, - {file = "SQLAlchemy-2.0.37-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cf5ae8a9dcf657fd72144a7fd01f243236ea39e7344e579a121c4205aedf07bb"}, - {file = "SQLAlchemy-2.0.37-cp312-cp312-win32.whl", hash = "sha256:ea308cec940905ba008291d93619d92edaf83232ec85fbd514dcb329f3192761"}, - {file = "SQLAlchemy-2.0.37-cp312-cp312-win_amd64.whl", hash = "sha256:635d8a21577341dfe4f7fa59ec394b346da12420b86624a69e466d446de16aff"}, - {file = "SQLAlchemy-2.0.37-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8c4096727193762e72ce9437e2a86a110cf081241919ce3fab8e89c02f6b6658"}, - {file = "SQLAlchemy-2.0.37-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e4fb5ac86d8fe8151966814f6720996430462e633d225497566b3996966b9bdb"}, - {file = "SQLAlchemy-2.0.37-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e56a139bfe136a22c438478a86f8204c1eb5eed36f4e15c4224e4b9db01cb3e4"}, - {file = "SQLAlchemy-2.0.37-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f95fc8e3f34b5f6b3effb49d10ac97c569ec8e32f985612d9b25dd12d0d2e94"}, - {file = "SQLAlchemy-2.0.37-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c505edd429abdfe3643fa3b2e83efb3445a34a9dc49d5f692dd087be966020e0"}, - {file = "SQLAlchemy-2.0.37-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:12b0f1ec623cccf058cf21cb544f0e74656618165b083d78145cafde156ea7b6"}, - {file = "SQLAlchemy-2.0.37-cp313-cp313-win32.whl", hash = "sha256:293f9ade06b2e68dd03cfb14d49202fac47b7bb94bffcff174568c951fbc7af2"}, - {file = "SQLAlchemy-2.0.37-cp313-cp313-win_amd64.whl", hash = "sha256:d70f53a0646cc418ca4853da57cf3ddddbccb8c98406791f24426f2dd77fd0e2"}, - {file = "SQLAlchemy-2.0.37-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:44f569d0b1eb82301b92b72085583277316e7367e038d97c3a1a899d9a05e342"}, - {file = "SQLAlchemy-2.0.37-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2eae3423e538c10d93ae3e87788c6a84658c3ed6db62e6a61bb9495b0ad16bb"}, - {file = "SQLAlchemy-2.0.37-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfff7be361048244c3aa0f60b5e63221c5e0f0e509f4e47b8910e22b57d10ae7"}, - {file = "SQLAlchemy-2.0.37-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:5bc3339db84c5fb9130ac0e2f20347ee77b5dd2596ba327ce0d399752f4fce39"}, - {file = "SQLAlchemy-2.0.37-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:84b9f23b0fa98a6a4b99d73989350a94e4a4ec476b9a7dfe9b79ba5939f5e80b"}, - {file = "SQLAlchemy-2.0.37-cp37-cp37m-win32.whl", hash = "sha256:51bc9cfef83e0ac84f86bf2b10eaccb27c5a3e66a1212bef676f5bee6ef33ebb"}, - {file = "SQLAlchemy-2.0.37-cp37-cp37m-win_amd64.whl", hash = "sha256:8e47f1af09444f87c67b4f1bb6231e12ba6d4d9f03050d7fc88df6d075231a49"}, - {file = "SQLAlchemy-2.0.37-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6b788f14c5bb91db7f468dcf76f8b64423660a05e57fe277d3f4fad7b9dcb7ce"}, - {file = "SQLAlchemy-2.0.37-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:521ef85c04c33009166777c77e76c8a676e2d8528dc83a57836b63ca9c69dcd1"}, - {file = "SQLAlchemy-2.0.37-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75311559f5c9881a9808eadbeb20ed8d8ba3f7225bef3afed2000c2a9f4d49b9"}, - {file = "SQLAlchemy-2.0.37-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cce918ada64c956b62ca2c2af59b125767097ec1dca89650a6221e887521bfd7"}, - {file = "SQLAlchemy-2.0.37-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:9d087663b7e1feabea8c578d6887d59bb00388158e8bff3a76be11aa3f748ca2"}, - {file = "SQLAlchemy-2.0.37-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cf95a60b36997dad99692314c4713f141b61c5b0b4cc5c3426faad570b31ca01"}, - {file = "SQLAlchemy-2.0.37-cp38-cp38-win32.whl", hash = "sha256:d75ead7dd4d255068ea0f21492ee67937bd7c90964c8f3c2bea83c7b7f81b95f"}, - {file = "SQLAlchemy-2.0.37-cp38-cp38-win_amd64.whl", hash = "sha256:74bbd1d0a9bacf34266a7907d43260c8d65d31d691bb2356f41b17c2dca5b1d0"}, - {file = "SQLAlchemy-2.0.37-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:648ec5acf95ad59255452ef759054f2176849662af4521db6cb245263ae4aa33"}, - {file = "SQLAlchemy-2.0.37-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:35bd2df269de082065d4b23ae08502a47255832cc3f17619a5cea92ce478b02b"}, - {file = "SQLAlchemy-2.0.37-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f581d365af9373a738c49e0c51e8b18e08d8a6b1b15cc556773bcd8a192fa8b"}, - {file = "SQLAlchemy-2.0.37-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82df02816c14f8dc9f4d74aea4cb84a92f4b0620235daa76dde002409a3fbb5a"}, - {file = "SQLAlchemy-2.0.37-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:94b564e38b344d3e67d2e224f0aec6ba09a77e4582ced41e7bfd0f757d926ec9"}, - {file = "SQLAlchemy-2.0.37-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:955a2a765aa1bd81aafa69ffda179d4fe3e2a3ad462a736ae5b6f387f78bfeb8"}, - {file = "SQLAlchemy-2.0.37-cp39-cp39-win32.whl", hash = "sha256:03f0528c53ca0b67094c4764523c1451ea15959bbf0a8a8a3096900014db0278"}, - {file = "SQLAlchemy-2.0.37-cp39-cp39-win_amd64.whl", hash = "sha256:4b12885dc85a2ab2b7d00995bac6d967bffa8594123b02ed21e8eb2205a7584b"}, - {file = "SQLAlchemy-2.0.37-py3-none-any.whl", hash = "sha256:a8998bf9f8658bd3839cbc44ddbe982955641863da0c1efe5b00c1ab4f5c16b1"}, - {file = "sqlalchemy-2.0.37.tar.gz", hash = "sha256:12b28d99a9c14eaf4055810df1001557176716de0167b91026e648e65229bffb"}, +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] @@ -4415,8 +4120,6 @@ version = "0.5.3" description = "A non-validating SQL parser." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "sqlparse-0.5.3-py3-none-any.whl", hash = "sha256:cf2196ed3418f3ba5de6af7e82c694a9fbdbfecccdfc72e281548517081f16ca"}, {file = "sqlparse-0.5.3.tar.gz", hash = "sha256:09f67787f56a0b16ecdbde1bfc7f5d9c3371ca683cfeaa8e6ff60b4807ec9272"}, @@ -4432,8 +4135,6 @@ version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" optional = false python-versions = "*" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, @@ -4453,8 +4154,6 @@ version = "1.7.3" description = "Strict, typed YAML parser" optional = false python-versions = ">=3.7.0" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "strictyaml-1.7.3-py3-none-any.whl", hash = "sha256:fb5c8a4edb43bebb765959e420f9b3978d7f1af88c80606c03fb420888f5d1c7"}, {file = "strictyaml-1.7.3.tar.gz", hash = "sha256:22f854a5fcab42b5ddba8030a0e4be51ca89af0267961c8d6cfa86395586c407"}, @@ -4469,8 +4168,6 @@ version = "0.8.10" description = "Pretty-print tabular data" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "tabulate-0.8.10-py3-none-any.whl", hash = "sha256:0ba055423dbaa164b9e456abe7920c5e8ed33fcc16f6d1b2f2d152c8e1e8b4fc"}, {file = "tabulate-0.8.10.tar.gz", hash = "sha256:6c57f3f3dd7ac2782770155f3adb2db0b1a269637e42f27599925e64b114f519"}, @@ -4485,8 +4182,6 @@ version = "3.0.0" description = "Traceback serialization library." optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "tblib-3.0.0-py3-none-any.whl", hash = "sha256:80a6c77e59b55e83911e1e607c649836a69c103963c5f28a46cbeef44acf8129"}, {file = "tblib-3.0.0.tar.gz", hash = "sha256:93622790a0a29e04f0346458face1e144dc4d32f493714c6c3dff82a4adb77e6"}, @@ -4498,8 +4193,6 @@ version = "0.10.2" description = "Python Library for Tom's Obvious, Minimal Language" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, @@ -4511,8 +4204,6 @@ version = "1.0.0" description = "List processing tools and functional utilities" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "toolz-1.0.0-py3-none-any.whl", hash = "sha256:292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236"}, {file = "toolz-1.0.0.tar.gz", hash = "sha256:2c86e3d9a04798ac556793bced838816296a2f085017664e4995cb40a1047a02"}, @@ -4524,8 +4215,6 @@ version = "6.4.2" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1"}, {file = "tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803"}, @@ -4546,8 +4235,6 @@ version = "4.67.1" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, @@ -4569,8 +4256,6 @@ version = "5.14.3" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, @@ -4586,8 +4271,6 @@ version = "24.11.0" description = "An asynchronous networking framework written in Python" optional = false python-versions = ">=3.8.0" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "twisted-24.11.0-py3-none-any.whl", hash = "sha256:fe403076c71f04d5d2d789a755b687c5637ec3bcd3b2b8252d76f2ba65f54261"}, {file = "twisted-24.11.0.tar.gz", hash = "sha256:695d0556d5ec579dcc464d2856b634880ed1319f45b10d19043f2b57eb0115b5"}, @@ -4626,8 +4309,6 @@ version = "23.1.1" description = "Compatibility API between asyncio/Twisted/Trollius" optional = false python-versions = ">=3.7" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "txaio-23.1.1-py2.py3-none-any.whl", hash = "sha256:aaea42f8aad50e0ecfb976130ada140797e9dcb85fad2cf72b0f37f8cefcb490"}, {file = "txaio-23.1.1.tar.gz", hash = "sha256:f9a9216e976e5e3246dfd112ad7ad55ca915606b60b84a757ac769bd404ff704"}, @@ -4644,8 +4325,6 @@ version = "1.5.5" description = "a fork of Python 2 and 3 ast modules with type comment support" optional = false python-versions = ">=3.6" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "typed_ast-1.5.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4bc1efe0ce3ffb74784e06460f01a223ac1f6ab31c6bc0376a21184bf5aabe3b"}, {file = "typed_ast-1.5.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f7a8c46a8b333f71abd61d7ab9255440d4a588f34a21f126bbfc95f6049e686"}, @@ -4692,15 +4371,13 @@ files = [ [[package]] name = "types-pytz" -version = "2024.2.0.20241221" +version = "2025.1.0.20250204" description = "Typing stubs for pytz" optional = false -python-versions = ">=3.8" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" +python-versions = ">=3.9" files = [ - {file = "types_pytz-2024.2.0.20241221-py3-none-any.whl", hash = "sha256:8fc03195329c43637ed4f593663df721fef919b60a969066e22606edf0b53ad5"}, - {file = "types_pytz-2024.2.0.20241221.tar.gz", hash = "sha256:06d7cde9613e9f7504766a0554a270c369434b50e00975b3a4a0f6eed0f2c1a9"}, + {file = "types_pytz-2025.1.0.20250204-py3-none-any.whl", hash = "sha256:32ca4a35430e8b94f6603b35beb7f56c32260ddddd4f4bb305fdf8f92358b87e"}, + {file = "types_pytz-2025.1.0.20250204.tar.gz", hash = "sha256:00f750132769f1c65a4f7240bc84f13985b4da774bd17dfbe5d9cd442746bd49"}, ] [[package]] @@ -4709,8 +4386,6 @@ version = "6.0.12.20241230" description = "Typing stubs for PyYAML" optional = false python-versions = ">=3.8" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "types_PyYAML-6.0.12.20241230-py3-none-any.whl", hash = "sha256:fa4d32565219b68e6dee5f67534c722e53c00d1cfc09c435ef04d7353e1e96e6"}, {file = "types_pyyaml-6.0.12.20241230.tar.gz", hash = "sha256:7f07622dbd34bb9c8b264fe860a17e0efcad00d50b5f27e93984909d9363498c"}, @@ -4722,8 +4397,6 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" 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"}, @@ -4735,12 +4408,10 @@ version = "2025.1" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" -groups = ["main", "dev"] files = [ {file = "tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639"}, {file = "tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694"}, ] -markers = {main = "python_version == \"3.11\" or python_version >= \"3.12\"", dev = "python_version == \"3.11\" and sys_platform == \"win32\" or python_version >= \"3.12\" and sys_platform == \"win32\""} [[package]] name = "uc-micro-py" @@ -4748,8 +4419,6 @@ version = "1.0.3" description = "Micro subset of unicode data files for linkify-it-py projects." optional = false python-versions = ">=3.7" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "uc-micro-py-1.0.3.tar.gz", hash = "sha256:d321b92cff673ec58027c04015fcaa8bb1e005478643ff4a500882eaab88c48a"}, {file = "uc_micro_py-1.0.3-py3-none-any.whl", hash = "sha256:db1dffff340817673d7b466ec86114a9dc0e9d4d9b5ba229d9d60e5c12600cd5"}, @@ -4764,8 +4433,6 @@ version = "2.3.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" -groups = ["main", "dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, @@ -4783,8 +4450,6 @@ version = "0.1.0" description = "Flexible version handling" optional = false python-versions = "*" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "verspec-0.1.0-py3-none-any.whl", hash = "sha256:741877d5633cc9464c45a469ae2a31e801e6dbbaa85b9675d481cda100f11c31"}, {file = "verspec-0.1.0.tar.gz", hash = "sha256:c4504ca697b2056cdb4bfa7121461f5a0e81809255b41c03dda4ba823637c01e"}, @@ -4799,8 +4464,6 @@ version = "6.0.0" description = "Filesystem events monitoring" optional = false python-versions = ">=3.9" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26"}, {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112"}, @@ -4843,8 +4506,6 @@ version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" -groups = ["dev"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, @@ -4856,8 +4517,6 @@ version = "0.5.1" description = "Character encoding aliases for legacy web content" optional = false python-versions = "*" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, @@ -4869,8 +4528,6 @@ version = "5.3.0" description = "Radically simplified static file serving for WSGI applications" optional = false python-versions = ">=3.5, <4" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "whitenoise-5.3.0-py2.py3-none-any.whl", hash = "sha256:d963ef25639d1417e8a247be36e6aedd8c7c6f0a08adcb5a89146980a96b577c"}, {file = "whitenoise-5.3.0.tar.gz", hash = "sha256:d234b871b52271ae7ed6d9da47ffe857c76568f11dd30e28e18c5869dbd11e12"}, @@ -4881,15 +4538,13 @@ brotli = ["Brotli"] [[package]] name = "xarray" -version = "2025.1.1" +version = "2025.1.2" description = "N-D labeled arrays and datasets in Python" optional = false python-versions = ">=3.10" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ - {file = "xarray-2025.1.1-py3-none-any.whl", hash = "sha256:8a69d17c1e4ad09664fd0bc2dbb398e7368eda25bd19456fb919a6eb6490fb72"}, - {file = "xarray-2025.1.1.tar.gz", hash = "sha256:1a3011d00ca92a94ba31b297c2eccd310b87a7dacf5acc8d0468385d4a834342"}, + {file = "xarray-2025.1.2-py3-none-any.whl", hash = "sha256:a7ad6a36c6e0becd67f8aff6a7808d20e4bdcd344debb5205f0a34b1a4a7f8d6"}, + {file = "xarray-2025.1.2.tar.gz", hash = "sha256:e7675c79ac69d274dd3b3c5450ce57176928d2792947576251ed1c7df1783224"}, ] [package.dependencies] @@ -4912,8 +4567,6 @@ version = "2025.1.0" description = "Source of XYZ tiles providers" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "xyzservices-2025.1.0-py3-none-any.whl", hash = "sha256:fa599956c5ab32dad1689960b3bb08fdcdbe0252cc82d84fc60ae415dc648907"}, {file = "xyzservices-2025.1.0.tar.gz", hash = "sha256:5cdbb0907c20be1be066c6e2dc69c645842d1113a4e83e642065604a21f254ba"}, @@ -4925,8 +4578,6 @@ version = "3.0.0" description = "Mutable mapping tools" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "zict-3.0.0-py2.py3-none-any.whl", hash = "sha256:5796e36bd0e0cc8cf0fbc1ace6a68912611c1dbd74750a3f3026b9b9d6a327ae"}, {file = "zict-3.0.0.tar.gz", hash = "sha256:e321e263b6a97aafc0790c3cfb3c04656b7066e6738c37fffcca95d803c9fba5"}, @@ -4938,8 +4589,6 @@ 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.11\"" files = [ {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, @@ -4959,8 +4608,6 @@ version = "5.0" description = "Very basic event publishing system" optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "python_version == \"3.11\" and extra == \"prod\" or python_version >= \"3.12\" and extra == \"prod\"" files = [ {file = "zope.event-5.0-py3-none-any.whl", hash = "sha256:2832e95014f4db26c47a13fdaef84cef2f4df37e66b59d8f1f4a8f319a632c26"}, {file = "zope.event-5.0.tar.gz", hash = "sha256:bac440d8d9891b4068e2b5a2c5e2c9765a9df762944bda6955f96bb9b91e67cd"}, @@ -4979,8 +4626,6 @@ version = "7.2" description = "Interfaces for Python" optional = false python-versions = ">=3.8" -groups = ["main"] -markers = "python_version == \"3.11\" or python_version >= \"3.12\"" files = [ {file = "zope.interface-7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ce290e62229964715f1011c3dbeab7a4a1e4971fd6f31324c4519464473ef9f2"}, {file = "zope.interface-7.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:05b910a5afe03256b58ab2ba6288960a2892dfeef01336dc4be6f1b9ed02ab0a"}, @@ -5033,6 +4678,6 @@ testing = ["coverage[toml]", "zope.event", "zope.testing"] prod = ["gevent", "gunicorn"] [metadata] -lock-version = "2.1" +lock-version = "2.0" python-versions = ">=3.11.0,<3.13" -content-hash = "e9bc5608e411a3d263088da64101e8c72044ecdf2e4fd5c62dac5771613f0c2b" +content-hash = "5099902428829b642dd749dd6bba32f2fa06041aa9f900a37ae722af25a5b669" diff --git a/pyproject.toml b/pyproject.toml index 5dfd07de2..e3ea79f18 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,6 +47,7 @@ social-auth-core = "^4.5.4" sqlalchemy = "^2.0.17" strictyaml = "^1.7" whitenoise = "^5.3" +objgraph = "^3.6.2" [tool.poetry.group.dev.dependencies] mkdocs-material = "^9.5.20" diff --git a/vast_pipeline/pipeline/loading.py b/vast_pipeline/pipeline/loading.py index 441c917af..1900c655b 100644 --- a/vast_pipeline/pipeline/loading.py +++ b/vast_pipeline/pipeline/loading.py @@ -1,6 +1,7 @@ import os import logging import gc +import objgraph import numpy as np import pandas as pd import dask.dataframe as dd @@ -199,6 +200,9 @@ def make_upload_images( measurements.to_parquet(img.measurements_path, index=False) del measurements, image, band, img gc.collect() + + types_list = objgraph.most_common_types(limit=2000) + logger.info(types_list) logger.info("Total images upload/loading time: %.2f seconds", timer.reset_init()) From b876fc7ac798bee4ec505d74f3b0c9e9c94a7049 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Wed, 12 Mar 2025 12:59:17 +1100 Subject: [PATCH 11/66] Update config.py to hopefully handle image ingest. --- vast_pipeline/pipeline/config.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/vast_pipeline/pipeline/config.py b/vast_pipeline/pipeline/config.py index 538a180c8..286d0776d 100644 --- a/vast_pipeline/pipeline/config.py +++ b/vast_pipeline/pipeline/config.py @@ -529,10 +529,11 @@ def validate(self, user: User = None): # ensure num_workers and num_workers_io are # either None (from null in config yaml) or an integer - for param_name in ('num_workers', 'num_workers_io'): - param_value = self['processing'][param_name] - if (param_value is not None) and (type(param_value) is not int): - raise PipelineConfigError(f"{param_name} can only be an integer or 'null'") + if 'processing' in self._yaml: + for param_name in ('num_workers', 'num_workers_io'): + param_value = self['processing'][param_name] + if (param_value is not None) and (type(param_value) is not int): + raise PipelineConfigError(f"{param_name} can only be an integer or 'null'") def check_prev_config_diff(self) -> bool: """ From 57e80ea6addbf8c0e867205eac67f76102a100c0 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Wed, 12 Mar 2025 13:17:51 +1100 Subject: [PATCH 12/66] Add more objgraph logging --- vast_pipeline/pipeline/loading.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/vast_pipeline/pipeline/loading.py b/vast_pipeline/pipeline/loading.py index 1900c655b..f9a5f15a3 100644 --- a/vast_pipeline/pipeline/loading.py +++ b/vast_pipeline/pipeline/loading.py @@ -201,8 +201,9 @@ def make_upload_images( del measurements, image, band, img gc.collect() - types_list = objgraph.most_common_types(limit=2000) + types_list = objgraph.most_common_types(limit=750, shortnames=False) logger.info(types_list) + leaking_stats = objgraph.typestats(objgraph.get_leaking_objects(), shortnames=False) logger.info("Total images upload/loading time: %.2f seconds", timer.reset_init()) From 0fa9250375a07bf689c69e55cc90354ded9bb804 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Wed, 12 Mar 2025 13:24:44 +1100 Subject: [PATCH 13/66] del skyreg --- vast_pipeline/pipeline/loading.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vast_pipeline/pipeline/loading.py b/vast_pipeline/pipeline/loading.py index f9a5f15a3..18c0518ca 100644 --- a/vast_pipeline/pipeline/loading.py +++ b/vast_pipeline/pipeline/loading.py @@ -198,7 +198,7 @@ def make_upload_images( os.makedirs(base_folder) measurements.to_parquet(img.measurements_path, index=False) - del measurements, image, band, img + del measurements, image, band, img, skyreg gc.collect() types_list = objgraph.most_common_types(limit=750, shortnames=False) From 56336ee66d73acb74d1dd2156c63b95cb4153c06 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Tue, 11 Mar 2025 21:36:19 +1100 Subject: [PATCH 14/66] Improved logging --- vast_pipeline/pipeline/forced_extraction.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vast_pipeline/pipeline/forced_extraction.py b/vast_pipeline/pipeline/forced_extraction.py index 7e8379838..a0bd2aee5 100644 --- a/vast_pipeline/pipeline/forced_extraction.py +++ b/vast_pipeline/pipeline/forced_extraction.py @@ -447,6 +447,8 @@ def parallel_extraction( del out, func_d, df_per_image, measurements_parquet_data wait(df_out) + + logger.info("Waiting for forced extraction df to finish compute") return df_out From 97624d07e36b54deacfa8c7594dc32875d816552 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Wed, 12 Mar 2025 13:38:15 +1100 Subject: [PATCH 15/66] forced commit --- vast_pipeline/pipeline/forced_extraction.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/vast_pipeline/pipeline/forced_extraction.py b/vast_pipeline/pipeline/forced_extraction.py index a0bd2aee5..dacd8874d 100644 --- a/vast_pipeline/pipeline/forced_extraction.py +++ b/vast_pipeline/pipeline/forced_extraction.py @@ -744,7 +744,7 @@ def forced_extraction( # Get expected database measurements schema columns = read_schema(images_df.iloc[0]["measurements_path"]).names - logger.info("Starting save and upload...") + logger.info("Building save and upload...") extr_df = extr_df.map_partitions(save_and_upload_forced_df, p_run_path=p_run.path, p_run_id=p_run.id, @@ -757,7 +757,6 @@ def forced_extraction( enforce_metadata=False, meta=sources_meta) - logger.info("Finished save and upload") # Calculate epoch column for extr_df if sources_df['epoch'].dtype == 'object': extr_df["epoch"] = "FORCED" @@ -768,6 +767,7 @@ def forced_extraction( else: extr_df["epoch"] = sources_df['epoch'].compute().iloc[0] + logger.info("Built sources_df, extr_df concat") sources_df = dd.concat( [sources_df, extr_df] ) @@ -777,7 +777,9 @@ def forced_extraction( # by source id at this point to avoid needing to `set_index` on it # during the finalise step. sources_df = sources_df.persist() + logger.info("Persisted sources_df") wait(sources_df) + logger.info("Sources_df successfully computed") del extr_df From 052c1a253a0c3a0cd755535d4beb1082dfb14f2b Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Wed, 12 Mar 2025 14:42:41 +1100 Subject: [PATCH 16/66] More debugging nonsense --- vast_pipeline/pipeline/loading.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/vast_pipeline/pipeline/loading.py b/vast_pipeline/pipeline/loading.py index 18c0518ca..4e52cf382 100644 --- a/vast_pipeline/pipeline/loading.py +++ b/vast_pipeline/pipeline/loading.py @@ -201,9 +201,22 @@ def make_upload_images( del measurements, image, band, img, skyreg gc.collect() + logger.info("Logging memory leak checks...") types_list = objgraph.most_common_types(limit=750, shortnames=False) logger.info(types_list) leaking_stats = objgraph.typestats(objgraph.get_leaking_objects(), shortnames=False) + logger.info(leaking_stats) + + for obj_type in ('vast_pipeline.models.Image', 'vast_pipeline.models.SkyRegion'): + leaking_obj = objgraph.by_type(obj_type)[-1] + backref_chain = find_backref_chain(obj) + logger.info(obj_type) + logger.info(backref_chain) + referrers = gc.get_referrers(leaking_obj) + + for ref in referrers: + logger.info(f"Possible referrer: {type(ref)}, {repr(ref)}") + logger.info("Total images upload/loading time: %.2f seconds", timer.reset_init()) From fa3b261a8a48ad2ce8f0fde3db3f68426eb03a97 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Wed, 12 Mar 2025 15:38:57 +1100 Subject: [PATCH 17/66] More change --- vast_pipeline/image/main.py | 5 +++-- vast_pipeline/pipeline/loading.py | 10 ++++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/vast_pipeline/image/main.py b/vast_pipeline/image/main.py index a74e8b0a4..728b9ce71 100644 --- a/vast_pipeline/image/main.py +++ b/vast_pipeline/image/main.py @@ -122,13 +122,14 @@ def __get_header(self, hdu_index: int) -> fits.Header: try: with open_fits(self.path) as hdulist: - hdu = hdulist[hdu_index] + header = hdulist[hdu_index].header.copy() + hdulist.close() except Exception: raise IOError( ("Could not read this FITS file: " f"{os.path.basename(self.path)}") ) - return hdu.header.copy() + return header def __set_img_attr_for_telescope(self, header): """ diff --git a/vast_pipeline/pipeline/loading.py b/vast_pipeline/pipeline/loading.py index 4e52cf382..746ce59fc 100644 --- a/vast_pipeline/pipeline/loading.py +++ b/vast_pipeline/pipeline/loading.py @@ -11,6 +11,7 @@ from itertools import islice from django.db import transaction, connection, models from contextlib import closing +from pympler.asizeof import asizeof from vast_pipeline.image.main import SelavyImage from vast_pipeline.pipeline.model_generator import ( @@ -198,7 +199,7 @@ def make_upload_images( os.makedirs(base_folder) measurements.to_parquet(img.measurements_path, index=False) - del measurements, image, band, img, skyreg + del measurements, image, band gc.collect() logger.info("Logging memory leak checks...") @@ -209,7 +210,7 @@ def make_upload_images( for obj_type in ('vast_pipeline.models.Image', 'vast_pipeline.models.SkyRegion'): leaking_obj = objgraph.by_type(obj_type)[-1] - backref_chain = find_backref_chain(obj) + backref_chain = objgraph.find_backref_chain(leaking_obj,objgraph.is_proper_module) logger.info(obj_type) logger.info(backref_chain) referrers = gc.get_referrers(leaking_obj) @@ -217,6 +218,11 @@ def make_upload_images( for ref in referrers: logger.info(f"Possible referrer: {type(ref)}, {repr(ref)}") + logger.info("Size of specific objects") + logger.info(f"images list: {asizeof(images)/1024**2} MB") + logger.info(f"skyregions list: {asizeof(skyregions)/1024**2} MB") + logger.info(f"image: {asizeof(img)/1024**2} MB") + logger.info(f"skyreg: {asizeof(skyreg)/1024**2} MB") logger.info("Total images upload/loading time: %.2f seconds", timer.reset_init()) From edb866000e4619078c99d9309c1c1421505bb74c Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Wed, 12 Mar 2025 16:08:50 +1100 Subject: [PATCH 18/66] Update poetry --- poetry.lock | 41 ++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 1 + 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 55c32a0be..8b842605b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3438,6 +3438,20 @@ pyyaml = "*" [package.extras] extra = ["pygments (>=2.19.1)"] +[[package]] +name = "pympler" +version = "1.1" +description = "A development tool to measure, monitor and analyze the memory behavior of Python objects." +optional = false +python-versions = ">=3.6" +files = [ + {file = "Pympler-1.1-py3-none-any.whl", hash = "sha256:5b223d6027d0619584116a0cbc28e8d2e378f7a79c1e5e024f9ff3b673c58506"}, + {file = "pympler-1.1.tar.gz", hash = "sha256:1eaa867cb8992c218430f1708fdaccda53df064144d1c5656b1e6f1ee6000424"}, +] + +[package.dependencies] +pywin32 = {version = ">=226", markers = "platform_system == \"Windows\""} + [[package]] name = "pyopenssl" version = "25.0.0" @@ -3553,6 +3567,31 @@ all = ["defusedxml", "pillow"] docs = ["sphinx-astropy"] test = ["pytest-astropy", "pytest-doctestplus (>=0.13)", "requests-mock"] +[[package]] +name = "pywin32" +version = "309" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-309-cp310-cp310-win32.whl", hash = "sha256:5b78d98550ca093a6fe7ab6d71733fbc886e2af9d4876d935e7f6e1cd6577ac9"}, + {file = "pywin32-309-cp310-cp310-win_amd64.whl", hash = "sha256:728d08046f3d65b90d4c77f71b6fbb551699e2005cc31bbffd1febd6a08aa698"}, + {file = "pywin32-309-cp310-cp310-win_arm64.whl", hash = "sha256:c667bcc0a1e6acaca8984eb3e2b6e42696fc035015f99ff8bc6c3db4c09a466a"}, + {file = "pywin32-309-cp311-cp311-win32.whl", hash = "sha256:d5df6faa32b868baf9ade7c9b25337fa5eced28eb1ab89082c8dae9c48e4cd51"}, + {file = "pywin32-309-cp311-cp311-win_amd64.whl", hash = "sha256:e7ec2cef6df0926f8a89fd64959eba591a1eeaf0258082065f7bdbe2121228db"}, + {file = "pywin32-309-cp311-cp311-win_arm64.whl", hash = "sha256:54ee296f6d11db1627216e9b4d4c3231856ed2d9f194c82f26c6cb5650163f4c"}, + {file = "pywin32-309-cp312-cp312-win32.whl", hash = "sha256:de9acacced5fa82f557298b1fed5fef7bd49beee04190f68e1e4783fbdc19926"}, + {file = "pywin32-309-cp312-cp312-win_amd64.whl", hash = "sha256:6ff9eebb77ffc3d59812c68db33c0a7817e1337e3537859499bd27586330fc9e"}, + {file = "pywin32-309-cp312-cp312-win_arm64.whl", hash = "sha256:619f3e0a327b5418d833f44dc87859523635cf339f86071cc65a13c07be3110f"}, + {file = "pywin32-309-cp313-cp313-win32.whl", hash = "sha256:008bffd4afd6de8ca46c6486085414cc898263a21a63c7f860d54c9d02b45c8d"}, + {file = "pywin32-309-cp313-cp313-win_amd64.whl", hash = "sha256:bd0724f58492db4cbfbeb1fcd606495205aa119370c0ddc4f70e5771a3ab768d"}, + {file = "pywin32-309-cp313-cp313-win_arm64.whl", hash = "sha256:8fd9669cfd41863b688a1bc9b1d4d2d76fd4ba2128be50a70b0ea66b8d37953b"}, + {file = "pywin32-309-cp38-cp38-win32.whl", hash = "sha256:617b837dc5d9dfa7e156dbfa7d3906c009a2881849a80a9ae7519f3dd8c6cb86"}, + {file = "pywin32-309-cp38-cp38-win_amd64.whl", hash = "sha256:0be3071f555480fbfd86a816a1a773880ee655bf186aa2931860dbb44e8424f8"}, + {file = "pywin32-309-cp39-cp39-win32.whl", hash = "sha256:72ae9ae3a7a6473223589a1621f9001fe802d59ed227fd6a8503c9af67c1d5f4"}, + {file = "pywin32-309-cp39-cp39-win_amd64.whl", hash = "sha256:88bc06d6a9feac70783de64089324568ecbc65866e2ab318eab35da3811fd7ef"}, +] + [[package]] name = "pywin32-ctypes" version = "0.2.3" @@ -4680,4 +4719,4 @@ prod = ["gevent", "gunicorn"] [metadata] lock-version = "2.0" python-versions = ">=3.11.0,<3.13" -content-hash = "5099902428829b642dd749dd6bba32f2fa06041aa9f900a37ae722af25a5b669" +content-hash = "3ef4ca56707a9b9c01adaf524fa47159e211ed9434eae3017a294a0ea0f626bc" diff --git a/pyproject.toml b/pyproject.toml index e3ea79f18..9781cd073 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,6 +48,7 @@ sqlalchemy = "^2.0.17" strictyaml = "^1.7" whitenoise = "^5.3" objgraph = "^3.6.2" +pympler = "^1.1" [tool.poetry.group.dev.dependencies] mkdocs-material = "^9.5.20" From f862732583c93113a4b1a0fe7ce5055de913a538 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Thu, 13 Mar 2025 13:34:17 +1100 Subject: [PATCH 19/66] Change how dfs are persisted --- vast_pipeline/pipeline/forced_extraction.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/vast_pipeline/pipeline/forced_extraction.py b/vast_pipeline/pipeline/forced_extraction.py index dacd8874d..4a1f040eb 100644 --- a/vast_pipeline/pipeline/forced_extraction.py +++ b/vast_pipeline/pipeline/forced_extraction.py @@ -1,6 +1,7 @@ import os import logging import datetime +import gc import numpy as np import pandas as pd import dask.dataframe as dd @@ -767,7 +768,11 @@ def forced_extraction( else: extr_df["epoch"] = sources_df['epoch'].compute().iloc[0] - logger.info("Built sources_df, extr_df concat") + extr_df = extr_df.persist() + logger.info("Persisting extr_df...") + wait(extr_df) + logger.info("Persisted extr_df...") + sources_df = dd.concat( [sources_df, extr_df] ) @@ -777,11 +782,12 @@ def forced_extraction( # by source id at this point to avoid needing to `set_index` on it # during the finalise step. sources_df = sources_df.persist() - logger.info("Persisted sources_df") + logger.info("Persisting sources_df...") wait(sources_df) - logger.info("Sources_df successfully computed") + logger.info("Persisted sources_df") del extr_df + gc.collect() # get the number of forced extractions for the run forced_parquets = glob(os.path.join(p_run.path, "forced_measurements*.parquet")) From b16334ce3e4b7352631570e4170839bf434ed84a Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Thu, 13 Mar 2025 16:10:56 +1100 Subject: [PATCH 20/66] Add more checks --- vast_pipeline/pipeline/finalise.py | 2 +- vast_pipeline/pipeline/forced_extraction.py | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/vast_pipeline/pipeline/finalise.py b/vast_pipeline/pipeline/finalise.py index 11c4a817f..b7f5c4250 100644 --- a/vast_pipeline/pipeline/finalise.py +++ b/vast_pipeline/pipeline/finalise.py @@ -92,7 +92,7 @@ def final_operations( logger.info("Calculating statistics for sources...") log_total_memory_usage() - sources_df = sources_df.set_index("source") \ + sources_df = sources_df.set_index("source", shuffle="disk") \ .repartition(partition_size=f"{upload_chunk_size_mb}MB") srcs_df = parallel_groupby(sources_df) diff --git a/vast_pipeline/pipeline/forced_extraction.py b/vast_pipeline/pipeline/forced_extraction.py index 4a1f040eb..578089c0c 100644 --- a/vast_pipeline/pipeline/forced_extraction.py +++ b/vast_pipeline/pipeline/forced_extraction.py @@ -772,10 +772,18 @@ def forced_extraction( logger.info("Persisting extr_df...") wait(extr_df) logger.info("Persisted extr_df...") + + mem_check = lambda df: df.memory_usage(deep=True).sum() + + logger.info("Computing memory usage of sources_df...") + mem_usage = sources_df.map_partitions(mem_check).compute() + logger.info(f"Memory usage of sources_df = {mem_usage}") + + logger.info("Computing memory usage of sources_df...") + mem_usage = sources_df.map_partitions(mem_check).compute() + logger.info(f"Memory usage of sources_df = {mem_usage}") - sources_df = dd.concat( - [sources_df, extr_df] - ) + sources_df = dd.concat([sources_df, extr_df], interleave_partitions=True) # Wait for the forced extraction step to complete # NOTE: Ideally we would have some optimised way of sorting sources_df @@ -788,6 +796,10 @@ def forced_extraction( del extr_df gc.collect() + + logger.info("Computing memory usage of sources_df...") + mem_usage = sources_df.map_partitions(mem_check).compute() + logger.info(f"Memory usage of sources_df = {mem_usage}") # get the number of forced extractions for the run forced_parquets = glob(os.path.join(p_run.path, "forced_measurements*.parquet")) From 2e2073338e8a770647611b7f5114f07ef17f39a3 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Tue, 25 Mar 2025 14:24:20 +1100 Subject: [PATCH 21/66] Commit a bunch of junk --- vast_pipeline/pipeline/finalise.py | 61 +++++++++++++++++++++++++++++- vast_pipeline/pipeline/loading.py | 13 ++++--- vast_pipeline/pipeline/pairs.py | 45 +++++++++++++++++++++- vast_pipeline/utils/utils.py | 16 ++++---- webinterface/settings.py | 2 +- 5 files changed, 120 insertions(+), 17 deletions(-) diff --git a/vast_pipeline/pipeline/finalise.py b/vast_pipeline/pipeline/finalise.py index b7f5c4250..ef0bce1dd 100644 --- a/vast_pipeline/pipeline/finalise.py +++ b/vast_pipeline/pipeline/finalise.py @@ -29,6 +29,8 @@ log_total_memory_usage ) +from vast_pipeline.utils.utils import calculate_n_partitions + # NOTE: Get testing environment status. # See comment in forced_extraction.py __TESTING__ = settings.TESTING @@ -91,9 +93,28 @@ def final_operations( # calculate source fields logger.info("Calculating statistics for sources...") log_total_memory_usage() + + print(sources_df.source.isna().sum().compute()) + + #sources_df['source'] = sources_df['source'].astype('category') + + #sources_df = sources_df.set_index("source", shuffle="tasks") \ + # .repartition(partition_size="0.1MB") \ + # .persist() + + #from timeit import default_timer as timer + + #t0 = timer() + npartitions = calculate_n_partitions(sources_df, partition_size_mb=upload_chunk_size_mb) + #t1 = timer() + + sources_df = sources_df.set_index("source") \ + .shuffle(npartitions=npartitions, on_index=True) + logger.info(sources_df.npartitions) + + logger.info(sources_df.partitions[0].compute()) + #assert 1==0 - sources_df = sources_df.set_index("source", shuffle="disk") \ - .repartition(partition_size=f"{upload_chunk_size_mb}MB") srcs_df = parallel_groupby(sources_df) mem_usage = get_df_memory_usage(srcs_df) @@ -140,7 +161,27 @@ def final_operations( pairs_dir = os.path.join(p_run.path, 'measurement_pairs.parquet') pairs_dir_tmp = os.path.join(pairs_dir, "tmp") + + logger.info("Dumping sources_df to file") + + #sources_df.compute().to_pickle("sources_df_dump.pickle") + #pairs_dir = os.path.join(p_run.path, 'sources_df_dump.csv') + #sources_df.to_csv(pairs_dir) + + #pairs_dir = os.path.join(p_run.path, 'sources_df_dump.hdf') + #sources_df = sources_df.drop('related', axis=1) + #sources_df.to_hdf(pairs_dir, key='/data') + + pairs_dir = os.path.join(p_run.path, 'sources_df_dump.parquet') + sources_df_out = sources_df.drop('related', axis=1) + sources_df_out.to_parquet(pairs_dir) + + #logger.info("Dumping srcs_df to file") + #srcs_df_path = os.path.join(p_run.path,"srcs_df_dump.pickle") + #srcs_df.to_pickle(srcs_df_path) + n_partitions, source_divisions = calculate_measurement_pair_metrics(sources_df, pairs_dir_tmp) + logger.info('Measurement pair metrics time: %.2f seconds', timer.reset()) # calculate measurement pair metric aggregates for sources by finding @@ -157,15 +198,24 @@ def final_operations( flux_type="int", ) if max_peak_pairs.npartitions == max_int_pairs.npartitions == n_partitions: + logger.debug("Using dd merge") pair_agg_metrics = dd.merge(max_peak_pairs, max_int_pairs, on="source", how="outer") pair_agg_metrics = pair_agg_metrics.set_index("source") pair_agg_metrics = pair_agg_metrics.compute() else: + logger.debug("Using pd merge") max_peak_pairs = max_peak_pairs.compute() max_int_pairs = max_int_pairs.compute() pair_agg_metrics = max_peak_pairs.merge(max_int_pairs, on="source", how="outer") pair_agg_metrics = pair_agg_metrics.set_index("source") + pair_metrics_dupes = pair_agg_metrics.index.duplicated(keep=False) + logger.info("Duplicated pair_agg_metrics:") + logger.info(pair_agg_metrics[pair_metrics_dupes]) + + pair_agg_metrics_path = os.path.join(p_run.path, 'pair_agg_metrics.csv') + pair_agg_metrics.to_csv(pair_agg_metrics_path) + # join with sources and replace agg metrics NaNs with 0 as the # DataTables API JSON serialization doesn't like them srcs_df = srcs_df.join(pair_agg_metrics).fillna(value={ @@ -174,6 +224,13 @@ def final_operations( "vs_abs_significant_max_int": 0.0, "m_abs_significant_max_int": 0.0, }) + + srcs_df_dupes = srcs_df.index.duplicated(keep=False) + logger.info("Duplicated srcs_df:") + logger.info(srcs_df[srcs_df_dupes]) + + #assert 1 == 0 + logger.info( "Measurement pair aggregate metrics time: %.2f seconds", diff --git a/vast_pipeline/pipeline/loading.py b/vast_pipeline/pipeline/loading.py index 746ce59fc..d4bea327d 100644 --- a/vast_pipeline/pipeline/loading.py +++ b/vast_pipeline/pipeline/loading.py @@ -202,6 +202,7 @@ def make_upload_images( del measurements, image, band gc.collect() + """ logger.info("Logging memory leak checks...") types_list = objgraph.most_common_types(limit=750, shortnames=False) logger.info(types_list) @@ -217,12 +218,12 @@ def make_upload_images( for ref in referrers: logger.info(f"Possible referrer: {type(ref)}, {repr(ref)}") - - logger.info("Size of specific objects") - logger.info(f"images list: {asizeof(images)/1024**2} MB") - logger.info(f"skyregions list: {asizeof(skyregions)/1024**2} MB") - logger.info(f"image: {asizeof(img)/1024**2} MB") - logger.info(f"skyreg: {asizeof(skyreg)/1024**2} MB") + """ + logger.debug("Size of specific objects") + logger.debug(f"images list: {asizeof(images)/1024**2} MB") + logger.debug(f"skyregions list: {asizeof(skyregions)/1024**2} MB") + logger.debug(f"image: {asizeof(img)/1024**2} MB") + logger.debug(f"skyreg: {asizeof(skyreg)/1024**2} MB") logger.info("Total images upload/loading time: %.2f seconds", timer.reset_init()) diff --git a/vast_pipeline/pipeline/pairs.py b/vast_pipeline/pipeline/pairs.py index 2269ce1c4..f74738283 100644 --- a/vast_pipeline/pipeline/pairs.py +++ b/vast_pipeline/pipeline/pairs.py @@ -68,6 +68,9 @@ def calculate_measurement_pair_aggregate_metrics( filters = [(f"vs_abs_significant_max_{flux_type}", ">=", min_vs)] pair_filtered = dd.read_parquet(pairs_parquet_dir, columns=columns, filters=filters) + logger.info("Pair filtered, inside calculate_measurement_pair_aggregate_metrics:") + logger.info(pair_filtered[pair_filtered.source=='svhm7A6i9xDw'].compute()) + logger.info(pair_filtered[pair_filtered.source=='zyZLnpwkhEYa'].compute()) def _get_max_flux(partition): partition=partition.reset_index(drop=True) @@ -78,6 +81,10 @@ def _get_max_flux(partition): return partition.loc[inds] pair_agg_metrics = pair_filtered.map_partitions(_get_max_flux) + + logger.info("Pair agg_metrics inside calculate_measurement_pair_aggregate_metrics:") + logger.info(pair_agg_metrics[pair_agg_metrics.source=='svhm7A6i9xDw'].compute()) + logger.info(pair_agg_metrics[pair_agg_metrics.source=='zyZLnpwkhEYa'].compute()) return pair_agg_metrics @@ -141,15 +148,51 @@ def calculate_measurement_pair_metrics( vs_peak, vs_int - variability t-statistic m_peak, m_int - variability modulation index """ - + logger.info("input df:") + logger.info(df) + logger.info(df.columns) # select relevant columns df_pairs = df[["id", "flux_int", "flux_int_err", "flux_peak", "flux_peak_err", "image", "datetime"]].rename(columns={"image": "image_name"}) + + #logger.info(df_pairs.head()) + #exit() + + duplicated_source_rows = df.loc['svhm7A6i9xDw'].compute() + logger.info("Duplicated source rows:") + logger.info(duplicated_source_rows) + + #exit() + #duplicated_source_rows.to_csv('duplicated_source_rows.csv') + + + logger.info("Pairs df info:") + logger.info(df_pairs.columns) + logger.info(df_pairs.head()) # keep record of divisions source_divisions = df_pairs.divisions n_partitions = df_pairs.npartitions + logger.info(f"source divisions: {source_divisions}") + logger.info(f"n_partitions: {n_partitions}") + + + def _get_source_ids(partition, partition_info=None): + return pd.DataFrame({'source': partition.index.unique(), 'partition_num': partition_info['number']}) + + logger.info(df_pairs.head()) + #exit() + source_partition_df = df_pairs.map_partitions(_get_source_ids, meta={'source':str, 'partition_num':float}).compute() + logger.info("Source partition df:") + logger.info(source_partition_df) + source_partition_df.to_csv('source_partition_df.csv') + dupes = source_partition_df['source'].duplicated(keep=False) + logger.info("Multi-partition dupes:") + logger.info(source_partition_df[dupes]) + + #logger.info(df.loc['okTehBmcSi7y'].compute()) + def _get_pair_partition(partition): partition = partition.sort_values(["source", "datetime"]) # Extract combinations for each group within the partition diff --git a/vast_pipeline/utils/utils.py b/vast_pipeline/utils/utils.py index f8b605fad..90c88d565 100644 --- a/vast_pipeline/utils/utils.py +++ b/vast_pipeline/utils/utils.py @@ -393,8 +393,8 @@ def timeStamped(fname, fmt="%Y-%m-%d-%H-%M-%S_{fname}"): def calculate_n_partitions( - df: pd.DataFrame, - n_cpu: int, + df: Union[pd.DataFrame, dd.DataFrame], + n_cpu: Optional[int] = None, partition_size_mb: Optional[int] = 15 ) -> int: """ @@ -423,17 +423,19 @@ def calculate_n_partitions( mem = mem.compute() mem_usage_mb = mem / 1e6 - n_partitions = int(np.ceil(mem_usage_mb / partition_size_mb)) + + #logger.info(n_partitions) # n_partitions should be >= n_cpu for optimal parallel processing - if n_partitions < n_cpu: - n_partitions = n_cpu + if n_cpu is not None: + if n_partitions < n_cpu: + n_partitions = n_cpu - partition_size_mb = int(np.ceil(mem_usage_mb / n_partitions)) + partition_size_mb = mem_usage_mb / n_partitions logger.debug( - "Using %d partitions of %dMB", + "Using %d partitions of %.2fMB", n_partitions, partition_size_mb) diff --git a/webinterface/settings.py b/webinterface/settings.py index 13a5e9090..c4409d95e 100644 --- a/webinterface/settings.py +++ b/webinterface/settings.py @@ -249,7 +249,7 @@ # Dask cluster DASK_SCHEDULER_HOST = env('DASK_SCHEDULER_HOST', cast=str, default='localhost') DASK_SCHEDULER_PORT = env('DASK_SCHEDULER_PORT', cast=str, default='8786') -DASK_NUM_WORKERS = env('DASK_NUM_WORKERS', cast=int, default=14) +DASK_NUM_WORKERS = env('DASK_NUM_WORKERS', cast=int, default=20) DASK_THREADS_PER_WORKER = env('DASK_THREADS_PER_WORKER', cast=int, default=1) # Logging From bc2dde1af208564b51881c566c9d0bb10ef08726 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Tue, 25 Mar 2025 17:18:20 +1100 Subject: [PATCH 22/66] Some minor cleanup --- vast_pipeline/pipeline/finalise.py | 47 +----------------------------- vast_pipeline/pipeline/loading.py | 25 ---------------- vast_pipeline/pipeline/pairs.py | 22 ++------------ webinterface/settings.py | 2 +- 4 files changed, 4 insertions(+), 92 deletions(-) diff --git a/vast_pipeline/pipeline/finalise.py b/vast_pipeline/pipeline/finalise.py index ef0bce1dd..4f24d3f85 100644 --- a/vast_pipeline/pipeline/finalise.py +++ b/vast_pipeline/pipeline/finalise.py @@ -93,29 +93,10 @@ def final_operations( # calculate source fields logger.info("Calculating statistics for sources...") log_total_memory_usage() - - print(sources_df.source.isna().sum().compute()) - - #sources_df['source'] = sources_df['source'].astype('category') - - #sources_df = sources_df.set_index("source", shuffle="tasks") \ - # .repartition(partition_size="0.1MB") \ - # .persist() - - #from timeit import default_timer as timer - - #t0 = timer() + npartitions = calculate_n_partitions(sources_df, partition_size_mb=upload_chunk_size_mb) - #t1 = timer() - sources_df = sources_df.set_index("source") \ .shuffle(npartitions=npartitions, on_index=True) - logger.info(sources_df.npartitions) - - logger.info(sources_df.partitions[0].compute()) - #assert 1==0 - - srcs_df = parallel_groupby(sources_df) mem_usage = get_df_memory_usage(srcs_df) logger.info('Groupby-apply time: %.2f seconds', timer.reset()) @@ -161,24 +142,6 @@ def final_operations( pairs_dir = os.path.join(p_run.path, 'measurement_pairs.parquet') pairs_dir_tmp = os.path.join(pairs_dir, "tmp") - - logger.info("Dumping sources_df to file") - - #sources_df.compute().to_pickle("sources_df_dump.pickle") - #pairs_dir = os.path.join(p_run.path, 'sources_df_dump.csv') - #sources_df.to_csv(pairs_dir) - - #pairs_dir = os.path.join(p_run.path, 'sources_df_dump.hdf') - #sources_df = sources_df.drop('related', axis=1) - #sources_df.to_hdf(pairs_dir, key='/data') - - pairs_dir = os.path.join(p_run.path, 'sources_df_dump.parquet') - sources_df_out = sources_df.drop('related', axis=1) - sources_df_out.to_parquet(pairs_dir) - - #logger.info("Dumping srcs_df to file") - #srcs_df_path = os.path.join(p_run.path,"srcs_df_dump.pickle") - #srcs_df.to_pickle(srcs_df_path) n_partitions, source_divisions = calculate_measurement_pair_metrics(sources_df, pairs_dir_tmp) @@ -198,12 +161,10 @@ def final_operations( flux_type="int", ) if max_peak_pairs.npartitions == max_int_pairs.npartitions == n_partitions: - logger.debug("Using dd merge") pair_agg_metrics = dd.merge(max_peak_pairs, max_int_pairs, on="source", how="outer") pair_agg_metrics = pair_agg_metrics.set_index("source") pair_agg_metrics = pair_agg_metrics.compute() else: - logger.debug("Using pd merge") max_peak_pairs = max_peak_pairs.compute() max_int_pairs = max_int_pairs.compute() pair_agg_metrics = max_peak_pairs.merge(max_int_pairs, on="source", how="outer") @@ -213,9 +174,6 @@ def final_operations( logger.info("Duplicated pair_agg_metrics:") logger.info(pair_agg_metrics[pair_metrics_dupes]) - pair_agg_metrics_path = os.path.join(p_run.path, 'pair_agg_metrics.csv') - pair_agg_metrics.to_csv(pair_agg_metrics_path) - # join with sources and replace agg metrics NaNs with 0 as the # DataTables API JSON serialization doesn't like them srcs_df = srcs_df.join(pair_agg_metrics).fillna(value={ @@ -228,9 +186,6 @@ def final_operations( srcs_df_dupes = srcs_df.index.duplicated(keep=False) logger.info("Duplicated srcs_df:") logger.info(srcs_df[srcs_df_dupes]) - - #assert 1 == 0 - logger.info( "Measurement pair aggregate metrics time: %.2f seconds", diff --git a/vast_pipeline/pipeline/loading.py b/vast_pipeline/pipeline/loading.py index d4bea327d..e4b2b5300 100644 --- a/vast_pipeline/pipeline/loading.py +++ b/vast_pipeline/pipeline/loading.py @@ -1,7 +1,6 @@ import os import logging import gc -import objgraph import numpy as np import pandas as pd import dask.dataframe as dd @@ -11,7 +10,6 @@ from itertools import islice from django.db import transaction, connection, models from contextlib import closing -from pympler.asizeof import asizeof from vast_pipeline.image.main import SelavyImage from vast_pipeline.pipeline.model_generator import ( @@ -201,29 +199,6 @@ def make_upload_images( measurements.to_parquet(img.measurements_path, index=False) del measurements, image, band gc.collect() - - """ - logger.info("Logging memory leak checks...") - types_list = objgraph.most_common_types(limit=750, shortnames=False) - logger.info(types_list) - leaking_stats = objgraph.typestats(objgraph.get_leaking_objects(), shortnames=False) - logger.info(leaking_stats) - - for obj_type in ('vast_pipeline.models.Image', 'vast_pipeline.models.SkyRegion'): - leaking_obj = objgraph.by_type(obj_type)[-1] - backref_chain = objgraph.find_backref_chain(leaking_obj,objgraph.is_proper_module) - logger.info(obj_type) - logger.info(backref_chain) - referrers = gc.get_referrers(leaking_obj) - - for ref in referrers: - logger.info(f"Possible referrer: {type(ref)}, {repr(ref)}") - """ - logger.debug("Size of specific objects") - logger.debug(f"images list: {asizeof(images)/1024**2} MB") - logger.debug(f"skyregions list: {asizeof(skyregions)/1024**2} MB") - logger.debug(f"image: {asizeof(img)/1024**2} MB") - logger.debug(f"skyreg: {asizeof(skyreg)/1024**2} MB") logger.info("Total images upload/loading time: %.2f seconds", timer.reset_init()) diff --git a/vast_pipeline/pipeline/pairs.py b/vast_pipeline/pipeline/pairs.py index f74738283..35091e1fb 100644 --- a/vast_pipeline/pipeline/pairs.py +++ b/vast_pipeline/pipeline/pairs.py @@ -68,10 +68,7 @@ def calculate_measurement_pair_aggregate_metrics( filters = [(f"vs_abs_significant_max_{flux_type}", ">=", min_vs)] pair_filtered = dd.read_parquet(pairs_parquet_dir, columns=columns, filters=filters) - logger.info("Pair filtered, inside calculate_measurement_pair_aggregate_metrics:") - logger.info(pair_filtered[pair_filtered.source=='svhm7A6i9xDw'].compute()) - logger.info(pair_filtered[pair_filtered.source=='zyZLnpwkhEYa'].compute()) - + def _get_max_flux(partition): partition=partition.reset_index(drop=True) inds = [] @@ -81,10 +78,6 @@ def _get_max_flux(partition): return partition.loc[inds] pair_agg_metrics = pair_filtered.map_partitions(_get_max_flux) - - logger.info("Pair agg_metrics inside calculate_measurement_pair_aggregate_metrics:") - logger.info(pair_agg_metrics[pair_agg_metrics.source=='svhm7A6i9xDw'].compute()) - logger.info(pair_agg_metrics[pair_agg_metrics.source=='zyZLnpwkhEYa'].compute()) return pair_agg_metrics @@ -148,23 +141,12 @@ def calculate_measurement_pair_metrics( vs_peak, vs_int - variability t-statistic m_peak, m_int - variability modulation index """ - logger.info("input df:") + logger.info("calculate_measurement_pair_metrics input df:") logger.info(df) logger.info(df.columns) # select relevant columns df_pairs = df[["id", "flux_int", "flux_int_err", "flux_peak", "flux_peak_err", "image", "datetime"]].rename(columns={"image": "image_name"}) - - #logger.info(df_pairs.head()) - #exit() - - duplicated_source_rows = df.loc['svhm7A6i9xDw'].compute() - logger.info("Duplicated source rows:") - logger.info(duplicated_source_rows) - - #exit() - #duplicated_source_rows.to_csv('duplicated_source_rows.csv') - logger.info("Pairs df info:") logger.info(df_pairs.columns) diff --git a/webinterface/settings.py b/webinterface/settings.py index c4409d95e..13a5e9090 100644 --- a/webinterface/settings.py +++ b/webinterface/settings.py @@ -249,7 +249,7 @@ # Dask cluster DASK_SCHEDULER_HOST = env('DASK_SCHEDULER_HOST', cast=str, default='localhost') DASK_SCHEDULER_PORT = env('DASK_SCHEDULER_PORT', cast=str, default='8786') -DASK_NUM_WORKERS = env('DASK_NUM_WORKERS', cast=int, default=20) +DASK_NUM_WORKERS = env('DASK_NUM_WORKERS', cast=int, default=14) DASK_THREADS_PER_WORKER = env('DASK_THREADS_PER_WORKER', cast=int, default=1) # Logging From 9afd18c9c8a1fefbf91657aeb86660da97ee4012 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Tue, 25 Mar 2025 17:26:47 +1100 Subject: [PATCH 23/66] Fix --- vast_pipeline/pipeline/finalise.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vast_pipeline/pipeline/finalise.py b/vast_pipeline/pipeline/finalise.py index 4f24d3f85..4c70ae60c 100644 --- a/vast_pipeline/pipeline/finalise.py +++ b/vast_pipeline/pipeline/finalise.py @@ -98,6 +98,8 @@ def final_operations( sources_df = sources_df.set_index("source") \ .shuffle(npartitions=npartitions, on_index=True) + srcs_df = parallel_groupby(sources_df) + mem_usage = get_df_memory_usage(srcs_df) logger.info('Groupby-apply time: %.2f seconds', timer.reset()) logger.debug(f"Initial srcs_df memory: {mem_usage}MB") From aa9a3bd31815982dded1c5a83caaf3becf7ea170 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Thu, 27 Mar 2025 09:27:57 +1100 Subject: [PATCH 24/66] Remove pympler and objgraph --- poetry.lock | 323 +++++++++++++++++++++---------------------------- pyproject.toml | 2 - 2 files changed, 135 insertions(+), 190 deletions(-) diff --git a/poetry.lock b/poetry.lock index 8b842605b..711ed0cc8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -77,13 +77,13 @@ typing = ["pandas-stubs (>=2.0)"] [[package]] name = "astropy-iers-data" -version = "0.2025.3.3.0.34.45" +version = "0.2025.3.24.0.35.32" description = "IERS Earth Rotation and Leap Second tables for the astropy core package" optional = false python-versions = ">=3.8" files = [ - {file = "astropy_iers_data-0.2025.3.3.0.34.45-py3-none-any.whl", hash = "sha256:5c8762ec79dbc67e220d8b1cdf15e1d94a954f57750a5682023f385d41732f66"}, - {file = "astropy_iers_data-0.2025.3.3.0.34.45.tar.gz", hash = "sha256:22ce2349ee288b09cb4cc13a6e015a3c8d4ace66ed2eae49b42119d943f6d5e8"}, + {file = "astropy_iers_data-0.2025.3.24.0.35.32-py3-none-any.whl", hash = "sha256:a9eb0c46a19d055dac53fdb99d91d0117ec5ccfd0033ff0ffcfcac4d4a44a677"}, + {file = "astropy_iers_data-0.2025.3.24.0.35.32.tar.gz", hash = "sha256:4c01603b92800b5a89a2a7418b3f84d66fef3334e8e5af2ec726510db6e1b384"}, ] [package.extras] @@ -132,20 +132,20 @@ test = ["astroid (>=2,<4)", "pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "attrs" -version = "25.1.0" +version = "25.3.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" files = [ - {file = "attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a"}, - {file = "attrs-25.1.0.tar.gz", hash = "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e"}, + {file = "attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3"}, + {file = "attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b"}, ] [package.extras] benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier"] tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] @@ -795,20 +795,20 @@ tests = ["hypothesis (==4.23)", "pytest (>=3.10,<4.0)", "pytest-asyncio (>=0.8,< [[package]] name = "dask" -version = "2025.2.0" +version = "2025.3.0" description = "Parallel PyData with Task Scheduling" optional = false python-versions = ">=3.10" files = [ - {file = "dask-2025.2.0-py3-none-any.whl", hash = "sha256:f0fdeef6ceb0a06569d456c9e704f220f7f54e80f3a6ea42ab98cea6bc642b6e"}, - {file = "dask-2025.2.0.tar.gz", hash = "sha256:89c87125d04d28141eaccc4794164ce9098163fd22d8ad943db48f8d4c815460"}, + {file = "dask-2025.3.0-py3-none-any.whl", hash = "sha256:b5d72bb33788904a218fd7da1850238517592358ecc79c30bb5c188a71df506d"}, + {file = "dask-2025.3.0.tar.gz", hash = "sha256:322834f44ebc24abeb564c56ccb817c97d6e7af6be71ad0ad96b78b51f2e0e85"}, ] [package.dependencies] bokeh = {version = ">=3.1.0", optional = true, markers = "extra == \"diagnostics\""} click = ">=8.1" cloudpickle = ">=3.0.0" -distributed = {version = "2025.2.0", optional = true, markers = "extra == \"distributed\""} +distributed = {version = "2025.3.0", optional = true, markers = "extra == \"distributed\""} fsspec = ">=2021.09.0" importlib_metadata = {version = ">=4.13.0", markers = "python_version < \"3.12\""} jinja2 = {version = ">=2.10.3", optional = true, markers = "extra == \"diagnostics\""} @@ -826,7 +826,7 @@ 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)"] +distributed = ["distributed (==2025.3.0)"] test = ["pandas[test]", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytest-rerunfailures", "pytest-timeout", "pytest-xdist"] [[package]] @@ -896,19 +896,19 @@ profile = ["gprof2dot (>=2022.7.29)"] [[package]] name = "distributed" -version = "2025.2.0" +version = "2025.3.0" description = "Distributed scheduler for Dask" optional = false python-versions = ">=3.10" files = [ - {file = "distributed-2025.2.0-py3-none-any.whl", hash = "sha256:368462084be47092d0a835f6c64c9b852da64dc88302b76d5f93bd5131228c67"}, - {file = "distributed-2025.2.0.tar.gz", hash = "sha256:84e8e3a9290db805250cd8f0b46416b8e3e32c8088ffa778d8a21ea1e2c1cac3"}, + {file = "distributed-2025.3.0-py3-none-any.whl", hash = "sha256:ebdacd181873b39bc30185857a5a856f051efaaf42ef2a8f507708857acdc6a9"}, + {file = "distributed-2025.3.0.tar.gz", hash = "sha256:84a68c91db2a106c752ca7845fba8cd92ad4f3545c0fb2d9b6dec0f44b225539"}, ] [package.dependencies] click = ">=8.0" cloudpickle = ">=3.0.0" -dask = "2025.2.0" +dask = "2025.3.0" jinja2 = ">=2.10.3" locket = ">=1.0.0" msgpack = ">=1.0.2" @@ -1003,17 +1003,17 @@ Django = ">=3.2" [[package]] name = "django-picklefield" -version = "3.2" +version = "3.3" description = "Pickled object field for Django" optional = false -python-versions = ">=3" +python-versions = ">=3.9" files = [ - {file = "django-picklefield-3.2.tar.gz", hash = "sha256:aa463f5d79d497dbe789f14b45180f00a51d0d670067d0729f352a3941cdfa4d"}, - {file = "django_picklefield-3.2-py3-none-any.whl", hash = "sha256:e9a73539d110f69825d9320db18bcb82e5189ff48dbed41821c026a20497764c"}, + {file = "django-picklefield-3.3.tar.gz", hash = "sha256:4e76dd20f2e95ffdaf18d641226ccecc169ff0473b0d6bec746f3ab97c26b8cb"}, + {file = "django_picklefield-3.3-py3-none-any.whl", hash = "sha256:d6f6fd94a17177fe0d16b0b452a9860b8a1da97b6e70633ab53ade4975f1ce9a"}, ] [package.dependencies] -Django = ">=3.2" +Django = ">=4.2" [package.extras] tests = ["tox"] @@ -1253,13 +1253,13 @@ resolved_reference = "6652dec9326437fc68961f87e04b451ae33f7871" [[package]] name = "fsspec" -version = "2025.2.0" +version = "2025.3.0" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2025.2.0-py3-none-any.whl", hash = "sha256:9de2ad9ce1f85e1931858535bc882543171d197001a0a5eb2ddc04f1781ab95b"}, - {file = "fsspec-2025.2.0.tar.gz", hash = "sha256:1c24b16eaa0a1798afa0337aa0db9b256718ab2a89c425371f5628d22c3b6afd"}, + {file = "fsspec-2025.3.0-py3-none-any.whl", hash = "sha256:efb87af3efa9103f94ca91a7f8cb7a4df91af9f74fc106c9c7ea0efd7277c1b3"}, + {file = "fsspec-2025.3.0.tar.gz", hash = "sha256:a935fd1ea872591f2b5148907d103488fc523295e6c64b835cfad8c3eca44972"}, ] [package.extras] @@ -1487,13 +1487,13 @@ test = ["objgraph", "psutil"] [[package]] name = "griffe" -version = "1.6.0" +version = "1.6.3" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false python-versions = ">=3.9" files = [ - {file = "griffe-1.6.0-py3-none-any.whl", hash = "sha256:9f1dfe035d4715a244ed2050dfbceb05b1f470809ed4f6bb10ece5a7302f8dd1"}, - {file = "griffe-1.6.0.tar.gz", hash = "sha256:eb5758088b9c73ad61c7ac014f3cdfb4c57b5c2fcbfca69996584b702aefa354"}, + {file = "griffe-1.6.3-py3-none-any.whl", hash = "sha256:7a0c559f10d8a9016f4d0b4ceaacc087e31e2370cb1aa9a59006a30d5a279fb3"}, + {file = "griffe-1.6.3.tar.gz", hash = "sha256:568cc9e50de04f6c76234bf46dd7f3a264ea3cbb1380fb54818e81e3675a83cf"}, ] [package.dependencies] @@ -1521,13 +1521,13 @@ tornado = ["tornado (>=0.2)"] [[package]] name = "holoviews" -version = "1.20.1" +version = "1.20.2" description = "A high-level plotting API for the PyData ecosystem built on HoloViews." optional = false python-versions = ">=3.9" files = [ - {file = "holoviews-1.20.1-py3-none-any.whl", hash = "sha256:479b43cacc0f150cf55d3fd51cc019354b42adbb715708d04d8f7aaf5d4466e9"}, - {file = "holoviews-1.20.1.tar.gz", hash = "sha256:f4ad8c6533d9ac918a762cb6ba8e7508f55525f9dfa447b8806da66272badceb"}, + {file = "holoviews-1.20.2-py3-none-any.whl", hash = "sha256:1f892c04bc23e8a3a9cde082b606b9463c9ff78c3d0c00e2ddcc41fe6e738458"}, + {file = "holoviews-1.20.2.tar.gz", hash = "sha256:8c78b798601ce3af31523667c6d1cb40df8d781249ebebbdb2c5f6143565e6d8"}, ] [package.dependencies] @@ -1660,13 +1660,13 @@ ipython = {version = ">=7.31.1", markers = "python_version >= \"3.11\""} [[package]] name = "ipython" -version = "8.33.0" +version = "8.34.0" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.10" files = [ - {file = "ipython-8.33.0-py3-none-any.whl", hash = "sha256:aa5b301dfe1eaf0167ff3238a6825f810a029c9dad9d3f1597f30bd5ff65cc44"}, - {file = "ipython-8.33.0.tar.gz", hash = "sha256:4c3e36a6dfa9e8e3702bd46f3df668624c975a22ff340e96ea7277afbd76217d"}, + {file = "ipython-8.34.0-py3-none-any.whl", hash = "sha256:0419883fa46e0baa182c5d50ebb8d6b49df1889fdb70750ad6d8cfe678eda6e3"}, + {file = "ipython-8.34.0.tar.gz", hash = "sha256:c31d658e754673ecc6514583e7dda8069e47136eb62458816b7d1e6625948b5a"}, ] [package.dependencies] @@ -2337,13 +2337,13 @@ min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-imp [[package]] name = "mkdocs-autorefs" -version = "1.4.0" +version = "1.4.1" description = "Automatically link across pages in MkDocs." optional = false python-versions = ">=3.9" files = [ - {file = "mkdocs_autorefs-1.4.0-py3-none-any.whl", hash = "sha256:bad19f69655878d20194acd0162e29a89c3f7e6365ffe54e72aa3fd1072f240d"}, - {file = "mkdocs_autorefs-1.4.0.tar.gz", hash = "sha256:a9c0aa9c90edbce302c09d050a3c4cb7c76f8b7b2c98f84a7a05f53d00392156"}, + {file = "mkdocs_autorefs-1.4.1-py3-none-any.whl", hash = "sha256:9793c5ac06a6ebbe52ec0f8439256e66187badf4b5334b5fde0b128ec134df4f"}, + {file = "mkdocs_autorefs-1.4.1.tar.gz", hash = "sha256:4b5b6235a4becb2b10425c2fa191737e415b37aa3418919db33e5d774c9db079"}, ] [package.dependencies] @@ -2383,13 +2383,13 @@ pyyaml = ">=5.1" [[package]] name = "mkdocs-git-revision-date-localized-plugin" -version = "1.4.1" +version = "1.4.5" description = "Mkdocs plugin that enables displaying the localized date of the last git modification of a markdown file." optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_git_revision_date_localized_plugin-1.4.1-py3-none-any.whl", hash = "sha256:bb1eca7f156e0c8a587167662923d76efed7f7e0c06b84471aa5ae72a744a434"}, - {file = "mkdocs_git_revision_date_localized_plugin-1.4.1.tar.gz", hash = "sha256:364d7c4c45c4f333c750e34bc298ac685a7a8bf9b7b52890d52b2f90f1812c4b"}, + {file = "mkdocs_git_revision_date_localized_plugin-1.4.5-py3-none-any.whl", hash = "sha256:395ae0b9eec565c78a76fffc938b70f52774bf2971245482d31aba47018c5fa9"}, + {file = "mkdocs_git_revision_date_localized_plugin-1.4.5.tar.gz", hash = "sha256:9e37f1343d314c9cd8f9cbbf117c4bdc1d2d24a0653c5bbd7059d072f2cd0972"}, ] [package.dependencies] @@ -2400,13 +2400,13 @@ pytz = ">=2025.1" [[package]] name = "mkdocs-material" -version = "9.6.7" +version = "9.6.9" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.6.7-py3-none-any.whl", hash = "sha256:8a159e45e80fcaadd9fbeef62cbf928569b93df954d4dc5ba76d46820caf7b47"}, - {file = "mkdocs_material-9.6.7.tar.gz", hash = "sha256:3e2c1fceb9410056c2d91f334a00cdea3215c28750e00c691c1e46b2a33309b4"}, + {file = "mkdocs_material-9.6.9-py3-none-any.whl", hash = "sha256:6e61b7fb623ce2aa4622056592b155a9eea56ff3487d0835075360be45a4c8d1"}, + {file = "mkdocs_material-9.6.9.tar.gz", hash = "sha256:a4872139715a1f27b2aa3f3dc31a9794b7bbf36333c0ba4607cf04786c94f89c"}, ] [package.dependencies] @@ -2766,20 +2766,6 @@ rsa = ["cryptography (>=3.0.0)"] signals = ["blinker (>=1.4.0)"] signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] -[[package]] -name = "objgraph" -version = "3.6.2" -description = "Draws Python object reference graphs with graphviz" -optional = false -python-versions = ">=3.7" -files = [ - {file = "objgraph-3.6.2-py3-none-any.whl", hash = "sha256:8114c97712291c3ba30d882406a384d0a7651b307ea9a06e0d83836ccde85e15"}, - {file = "objgraph-3.6.2.tar.gz", hash = "sha256:00b9f2f40f7422e3c7f45a61c4dafdaf81f03ff0649d6eaec866f01030e51ad8"}, -] - -[package.extras] -ipython = ["graphviz"] - [[package]] name = "packaging" version = "24.2" @@ -3121,19 +3107,19 @@ testing = ["mock", "pytest", "pytest-rerunfailures"] [[package]] name = "platformdirs" -version = "4.3.6" +version = "4.3.7" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, - {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, + {file = "platformdirs-4.3.7-py3-none-any.whl", hash = "sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94"}, + {file = "platformdirs-4.3.7.tar.gz", hash = "sha256:eb437d586b6a0986388f0d6f74aa0cde27b48d0e3d66843640bfb6bdcdb6e351"}, ] [package.extras] -docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] -type = ["mypy (>=1.11.2)"] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.4)", "pytest-cov (>=6)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.14.1)"] [[package]] name = "prompt-toolkit" @@ -3438,20 +3424,6 @@ pyyaml = "*" [package.extras] extra = ["pygments (>=2.19.1)"] -[[package]] -name = "pympler" -version = "1.1" -description = "A development tool to measure, monitor and analyze the memory behavior of Python objects." -optional = false -python-versions = ">=3.6" -files = [ - {file = "Pympler-1.1-py3-none-any.whl", hash = "sha256:5b223d6027d0619584116a0cbc28e8d2e378f7a79c1e5e024f9ff3b673c58506"}, - {file = "pympler-1.1.tar.gz", hash = "sha256:1eaa867cb8992c218430f1708fdaccda53df064144d1c5656b1e6f1ee6000424"}, -] - -[package.dependencies] -pywin32 = {version = ">=226", markers = "platform_system == \"Windows\""} - [[package]] name = "pyopenssl" version = "25.0.0" @@ -3473,13 +3445,13 @@ test = ["pretend", "pytest (>=3.0.1)", "pytest-rerunfailures"] [[package]] name = "pyparsing" -version = "3.2.1" +version = "3.2.3" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.9" files = [ - {file = "pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1"}, - {file = "pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a"}, + {file = "pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf"}, + {file = "pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be"}, ] [package.extras] @@ -3519,13 +3491,13 @@ postgresql = ["psycopg2"] [[package]] name = "pytz" -version = "2025.1" +version = "2025.2" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2025.1-py2.py3-none-any.whl", hash = "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57"}, - {file = "pytz-2025.1.tar.gz", hash = "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e"}, + {file = "pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00"}, + {file = "pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3"}, ] [[package]] @@ -3567,31 +3539,6 @@ all = ["defusedxml", "pillow"] docs = ["sphinx-astropy"] test = ["pytest-astropy", "pytest-doctestplus (>=0.13)", "requests-mock"] -[[package]] -name = "pywin32" -version = "309" -description = "Python for Window Extensions" -optional = false -python-versions = "*" -files = [ - {file = "pywin32-309-cp310-cp310-win32.whl", hash = "sha256:5b78d98550ca093a6fe7ab6d71733fbc886e2af9d4876d935e7f6e1cd6577ac9"}, - {file = "pywin32-309-cp310-cp310-win_amd64.whl", hash = "sha256:728d08046f3d65b90d4c77f71b6fbb551699e2005cc31bbffd1febd6a08aa698"}, - {file = "pywin32-309-cp310-cp310-win_arm64.whl", hash = "sha256:c667bcc0a1e6acaca8984eb3e2b6e42696fc035015f99ff8bc6c3db4c09a466a"}, - {file = "pywin32-309-cp311-cp311-win32.whl", hash = "sha256:d5df6faa32b868baf9ade7c9b25337fa5eced28eb1ab89082c8dae9c48e4cd51"}, - {file = "pywin32-309-cp311-cp311-win_amd64.whl", hash = "sha256:e7ec2cef6df0926f8a89fd64959eba591a1eeaf0258082065f7bdbe2121228db"}, - {file = "pywin32-309-cp311-cp311-win_arm64.whl", hash = "sha256:54ee296f6d11db1627216e9b4d4c3231856ed2d9f194c82f26c6cb5650163f4c"}, - {file = "pywin32-309-cp312-cp312-win32.whl", hash = "sha256:de9acacced5fa82f557298b1fed5fef7bd49beee04190f68e1e4783fbdc19926"}, - {file = "pywin32-309-cp312-cp312-win_amd64.whl", hash = "sha256:6ff9eebb77ffc3d59812c68db33c0a7817e1337e3537859499bd27586330fc9e"}, - {file = "pywin32-309-cp312-cp312-win_arm64.whl", hash = "sha256:619f3e0a327b5418d833f44dc87859523635cf339f86071cc65a13c07be3110f"}, - {file = "pywin32-309-cp313-cp313-win32.whl", hash = "sha256:008bffd4afd6de8ca46c6486085414cc898263a21a63c7f860d54c9d02b45c8d"}, - {file = "pywin32-309-cp313-cp313-win_amd64.whl", hash = "sha256:bd0724f58492db4cbfbeb1fcd606495205aa119370c0ddc4f70e5771a3ab768d"}, - {file = "pywin32-309-cp313-cp313-win_arm64.whl", hash = "sha256:8fd9669cfd41863b688a1bc9b1d4d2d76fd4ba2128be50a70b0ea66b8d37953b"}, - {file = "pywin32-309-cp38-cp38-win32.whl", hash = "sha256:617b837dc5d9dfa7e156dbfa7d3906c009a2881849a80a9ae7519f3dd8c6cb86"}, - {file = "pywin32-309-cp38-cp38-win_amd64.whl", hash = "sha256:0be3071f555480fbfd86a816a1a773880ee655bf186aa2931860dbb44e8424f8"}, - {file = "pywin32-309-cp39-cp39-win32.whl", hash = "sha256:72ae9ae3a7a6473223589a1621f9001fe802d59ed227fd6a8503c9af67c1d5f4"}, - {file = "pywin32-309-cp39-cp39-win_amd64.whl", hash = "sha256:88bc06d6a9feac70783de64089324568ecbc65866e2ab318eab35da3811fd7ef"}, -] - [[package]] name = "pywin32-ctypes" version = "0.2.3" @@ -3938,18 +3885,18 @@ tests = ["coverage[toml] (>=5.0.2)", "pytest"] [[package]] name = "setuptools" -version = "75.8.2" +version = "78.1.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.9" files = [ - {file = "setuptools-75.8.2-py3-none-any.whl", hash = "sha256:558e47c15f1811c1fa7adbd0096669bf76c1d3f433f58324df69f3f5ecac4e8f"}, - {file = "setuptools-75.8.2.tar.gz", hash = "sha256:4880473a969e5f23f2a2be3646b2dfd84af9028716d398e46192f84bc36900d2"}, + {file = "setuptools-78.1.0-py3-none-any.whl", hash = "sha256:3e386e96793c8702ae83d17b853fb93d3e09ef82ec62722e61da5cd22376dcd8"}, + {file = "setuptools-78.1.0.tar.gz", hash = "sha256:18fd474d4a82a5f83dac888df697af65afa82dec7323d09c3e37d1f14288da54"}, ] [package.extras] check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.8.0)"] -core = ["importlib_metadata (>=6)", "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)", "wheel (>=0.43.0)"] +core = ["importlib_metadata (>=6)", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "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)"] @@ -4060,68 +4007,68 @@ files = [ [[package]] name = "sqlalchemy" -version = "2.0.38" +version = "2.0.39" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" 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"}, + {file = "SQLAlchemy-2.0.39-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:66a40003bc244e4ad86b72abb9965d304726d05a939e8c09ce844d27af9e6d37"}, + {file = "SQLAlchemy-2.0.39-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67de057fbcb04a066171bd9ee6bcb58738d89378ee3cabff0bffbf343ae1c787"}, + {file = "SQLAlchemy-2.0.39-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:533e0f66c32093a987a30df3ad6ed21170db9d581d0b38e71396c49718fbb1ca"}, + {file = "SQLAlchemy-2.0.39-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7399d45b62d755e9ebba94eb89437f80512c08edde8c63716552a3aade61eb42"}, + {file = "SQLAlchemy-2.0.39-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:788b6ff6728072b313802be13e88113c33696a9a1f2f6d634a97c20f7ef5ccce"}, + {file = "SQLAlchemy-2.0.39-cp37-cp37m-win32.whl", hash = "sha256:01da15490c9df352fbc29859d3c7ba9cd1377791faeeb47c100832004c99472c"}, + {file = "SQLAlchemy-2.0.39-cp37-cp37m-win_amd64.whl", hash = "sha256:f2bcb085faffcacf9319b1b1445a7e1cfdc6fb46c03f2dce7bc2d9a4b3c1cdc5"}, + {file = "SQLAlchemy-2.0.39-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b761a6847f96fdc2d002e29e9e9ac2439c13b919adfd64e8ef49e75f6355c548"}, + {file = "SQLAlchemy-2.0.39-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0d7e3866eb52d914aea50c9be74184a0feb86f9af8aaaa4daefe52b69378db0b"}, + {file = "SQLAlchemy-2.0.39-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:995c2bacdddcb640c2ca558e6760383dcdd68830160af92b5c6e6928ffd259b4"}, + {file = "SQLAlchemy-2.0.39-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:344cd1ec2b3c6bdd5dfde7ba7e3b879e0f8dd44181f16b895940be9b842fd2b6"}, + {file = "SQLAlchemy-2.0.39-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:5dfbc543578058c340360f851ddcecd7a1e26b0d9b5b69259b526da9edfa8875"}, + {file = "SQLAlchemy-2.0.39-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3395e7ed89c6d264d38bea3bfb22ffe868f906a7985d03546ec7dc30221ea980"}, + {file = "SQLAlchemy-2.0.39-cp38-cp38-win32.whl", hash = "sha256:bf555f3e25ac3a70c67807b2949bfe15f377a40df84b71ab2c58d8593a1e036e"}, + {file = "SQLAlchemy-2.0.39-cp38-cp38-win_amd64.whl", hash = "sha256:463ecfb907b256e94bfe7bcb31a6d8c7bc96eca7cbe39803e448a58bb9fcad02"}, + {file = "sqlalchemy-2.0.39-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6827f8c1b2f13f1420545bd6d5b3f9e0b85fe750388425be53d23c760dcf176b"}, + {file = "sqlalchemy-2.0.39-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d9f119e7736967c0ea03aff91ac7d04555ee038caf89bb855d93bbd04ae85b41"}, + {file = "sqlalchemy-2.0.39-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4600c7a659d381146e1160235918826c50c80994e07c5b26946a3e7ec6c99249"}, + {file = "sqlalchemy-2.0.39-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a06e6c8e31c98ddc770734c63903e39f1947c9e3e5e4bef515c5491b7737dde"}, + {file = "sqlalchemy-2.0.39-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c4c433f78c2908ae352848f56589c02b982d0e741b7905228fad628999799de4"}, + {file = "sqlalchemy-2.0.39-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7bd5c5ee1448b6408734eaa29c0d820d061ae18cb17232ce37848376dcfa3e92"}, + {file = "sqlalchemy-2.0.39-cp310-cp310-win32.whl", hash = "sha256:87a1ce1f5e5dc4b6f4e0aac34e7bb535cb23bd4f5d9c799ed1633b65c2bcad8c"}, + {file = "sqlalchemy-2.0.39-cp310-cp310-win_amd64.whl", hash = "sha256:871f55e478b5a648c08dd24af44345406d0e636ffe021d64c9b57a4a11518304"}, + {file = "sqlalchemy-2.0.39-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a28f9c238f1e143ff42ab3ba27990dfb964e5d413c0eb001b88794c5c4a528a9"}, + {file = "sqlalchemy-2.0.39-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:08cf721bbd4391a0e765fe0fe8816e81d9f43cece54fdb5ac465c56efafecb3d"}, + {file = "sqlalchemy-2.0.39-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a8517b6d4005facdbd7eb4e8cf54797dbca100a7df459fdaff4c5123265c1cd"}, + {file = "sqlalchemy-2.0.39-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b2de1523d46e7016afc7e42db239bd41f2163316935de7c84d0e19af7e69538"}, + {file = "sqlalchemy-2.0.39-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:412c6c126369ddae171c13987b38df5122cb92015cba6f9ee1193b867f3f1530"}, + {file = "sqlalchemy-2.0.39-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b35e07f1d57b79b86a7de8ecdcefb78485dab9851b9638c2c793c50203b2ae8"}, + {file = "sqlalchemy-2.0.39-cp311-cp311-win32.whl", hash = "sha256:3eb14ba1a9d07c88669b7faf8f589be67871d6409305e73e036321d89f1d904e"}, + {file = "sqlalchemy-2.0.39-cp311-cp311-win_amd64.whl", hash = "sha256:78f1b79132a69fe8bd6b5d91ef433c8eb40688ba782b26f8c9f3d2d9ca23626f"}, + {file = "sqlalchemy-2.0.39-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c457a38351fb6234781d054260c60e531047e4d07beca1889b558ff73dc2014b"}, + {file = "sqlalchemy-2.0.39-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:018ee97c558b499b58935c5a152aeabf6d36b3d55d91656abeb6d93d663c0c4c"}, + {file = "sqlalchemy-2.0.39-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5493a8120d6fc185f60e7254fc056a6742f1db68c0f849cfc9ab46163c21df47"}, + {file = "sqlalchemy-2.0.39-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2cf5b5ddb69142511d5559c427ff00ec8c0919a1e6c09486e9c32636ea2b9dd"}, + {file = "sqlalchemy-2.0.39-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9f03143f8f851dd8de6b0c10784363712058f38209e926723c80654c1b40327a"}, + {file = "sqlalchemy-2.0.39-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:06205eb98cb3dd52133ca6818bf5542397f1dd1b69f7ea28aa84413897380b06"}, + {file = "sqlalchemy-2.0.39-cp312-cp312-win32.whl", hash = "sha256:7f5243357e6da9a90c56282f64b50d29cba2ee1f745381174caacc50d501b109"}, + {file = "sqlalchemy-2.0.39-cp312-cp312-win_amd64.whl", hash = "sha256:2ed107331d188a286611cea9022de0afc437dd2d3c168e368169f27aa0f61338"}, + {file = "sqlalchemy-2.0.39-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fe193d3ae297c423e0e567e240b4324d6b6c280a048e64c77a3ea6886cc2aa87"}, + {file = "sqlalchemy-2.0.39-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:79f4f502125a41b1b3b34449e747a6abfd52a709d539ea7769101696bdca6716"}, + {file = "sqlalchemy-2.0.39-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a10ca7f8a1ea0fd5630f02feb055b0f5cdfcd07bb3715fc1b6f8cb72bf114e4"}, + {file = "sqlalchemy-2.0.39-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6b0a1c7ed54a5361aaebb910c1fa864bae34273662bb4ff788a527eafd6e14d"}, + {file = "sqlalchemy-2.0.39-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:52607d0ebea43cf214e2ee84a6a76bc774176f97c5a774ce33277514875a718e"}, + {file = "sqlalchemy-2.0.39-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c08a972cbac2a14810463aec3a47ff218bb00c1a607e6689b531a7c589c50723"}, + {file = "sqlalchemy-2.0.39-cp313-cp313-win32.whl", hash = "sha256:23c5aa33c01bd898f879db158537d7e7568b503b15aad60ea0c8da8109adf3e7"}, + {file = "sqlalchemy-2.0.39-cp313-cp313-win_amd64.whl", hash = "sha256:4dabd775fd66cf17f31f8625fc0e4cfc5765f7982f94dc09b9e5868182cb71c0"}, + {file = "sqlalchemy-2.0.39-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2600a50d590c22d99c424c394236899ba72f849a02b10e65b4c70149606408b5"}, + {file = "sqlalchemy-2.0.39-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4eff9c270afd23e2746e921e80182872058a7a592017b2713f33f96cc5f82e32"}, + {file = "sqlalchemy-2.0.39-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7332868ce891eda48896131991f7f2be572d65b41a4050957242f8e935d5d7"}, + {file = "sqlalchemy-2.0.39-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:125a7763b263218a80759ad9ae2f3610aaf2c2fbbd78fff088d584edf81f3782"}, + {file = "sqlalchemy-2.0.39-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:04545042969833cb92e13b0a3019549d284fd2423f318b6ba10e7aa687690a3c"}, + {file = "sqlalchemy-2.0.39-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:805cb481474e111ee3687c9047c5f3286e62496f09c0e82e8853338aaaa348f8"}, + {file = "sqlalchemy-2.0.39-cp39-cp39-win32.whl", hash = "sha256:34d5c49f18778a3665d707e6286545a30339ad545950773d43977e504815fa70"}, + {file = "sqlalchemy-2.0.39-cp39-cp39-win_amd64.whl", hash = "sha256:35e72518615aa5384ef4fae828e3af1b43102458b74a8c481f69af8abf7e802a"}, + {file = "sqlalchemy-2.0.39-py3-none-any.whl", hash = "sha256:a1c6b0a5e3e326a466d809b651c63f278b1256146a377a528b6938a279da334f"}, + {file = "sqlalchemy-2.0.39.tar.gz", hash = "sha256:5d2d1fe548def3267b4c70a8568f108d1fed7cbbeccb9cc166e05af2abc25c22"}, ] [package.dependencies] @@ -4410,46 +4357,46 @@ files = [ [[package]] name = "types-pytz" -version = "2025.1.0.20250204" +version = "2025.2.0.20250326" description = "Typing stubs for pytz" optional = false python-versions = ">=3.9" files = [ - {file = "types_pytz-2025.1.0.20250204-py3-none-any.whl", hash = "sha256:32ca4a35430e8b94f6603b35beb7f56c32260ddddd4f4bb305fdf8f92358b87e"}, - {file = "types_pytz-2025.1.0.20250204.tar.gz", hash = "sha256:00f750132769f1c65a4f7240bc84f13985b4da774bd17dfbe5d9cd442746bd49"}, + {file = "types_pytz-2025.2.0.20250326-py3-none-any.whl", hash = "sha256:3c397fd1b845cd2b3adc9398607764ced9e578a98a5d1fbb4a9bc9253edfb162"}, + {file = "types_pytz-2025.2.0.20250326.tar.gz", hash = "sha256:deda02de24f527066fc8d6a19e284ab3f3ae716a42b4adb6b40e75e408c08d36"}, ] [[package]] name = "types-pyyaml" -version = "6.0.12.20241230" +version = "6.0.12.20250326" description = "Typing stubs for PyYAML" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "types_PyYAML-6.0.12.20241230-py3-none-any.whl", hash = "sha256:fa4d32565219b68e6dee5f67534c722e53c00d1cfc09c435ef04d7353e1e96e6"}, - {file = "types_pyyaml-6.0.12.20241230.tar.gz", hash = "sha256:7f07622dbd34bb9c8b264fe860a17e0efcad00d50b5f27e93984909d9363498c"}, + {file = "types_pyyaml-6.0.12.20250326-py3-none-any.whl", hash = "sha256:961871cfbdc1ad8ae3cb6ae3f13007262bcfc168adc513119755a6e4d5d7ed65"}, + {file = "types_pyyaml-6.0.12.20250326.tar.gz", hash = "sha256:5e2d86d8706697803f361ba0b8188eef2999e1c372cd4faee4ebb0844b8a4190"}, ] [[package]] name = "typing-extensions" -version = "4.12.2" +version = "4.13.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" 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"}, + {file = "typing_extensions-4.13.0-py3-none-any.whl", hash = "sha256:c8dd92cc0d6425a97c18fbb9d1954e5ff92c1ca881a309c45f06ebc0b79058e5"}, + {file = "typing_extensions-4.13.0.tar.gz", hash = "sha256:0a4ac55a5820789d87e297727d229866c9650f6521b64206413c4fbada24d95b"}, ] [[package]] name = "tzdata" -version = "2025.1" +version = "2025.2" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639"}, - {file = "tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694"}, + {file = "tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8"}, + {file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"}, ] [[package]] @@ -4577,13 +4524,13 @@ brotli = ["Brotli"] [[package]] name = "xarray" -version = "2025.1.2" +version = "2025.3.0" description = "N-D labeled arrays and datasets in Python" optional = false python-versions = ">=3.10" files = [ - {file = "xarray-2025.1.2-py3-none-any.whl", hash = "sha256:a7ad6a36c6e0becd67f8aff6a7808d20e4bdcd344debb5205f0a34b1a4a7f8d6"}, - {file = "xarray-2025.1.2.tar.gz", hash = "sha256:e7675c79ac69d274dd3b3c5450ce57176928d2792947576251ed1c7df1783224"}, + {file = "xarray-2025.3.0-py3-none-any.whl", hash = "sha256:022b7eac5ebc26d70d34211de732ec1a15127a40455f9492acdde7fbe5bbf091"}, + {file = "xarray-2025.3.0.tar.gz", hash = "sha256:531cf6d64e6ab54c19239930a840654f1a79d2140e9f0d11d1e8d69dcc581d0f"}, ] [package.dependencies] @@ -4594,10 +4541,10 @@ pandas = ">=2.1" [package.extras] accel = ["bottleneck", "flox", "numba (>=0.54)", "numbagg", "opt_einsum", "scipy"] complete = ["xarray[accel,etc,io,parallel,viz]"] -dev = ["hypothesis", "jinja2", "mypy", "pre-commit", "pytest", "pytest-cov", "pytest-env", "pytest-timeout", "pytest-xdist", "ruff (>=0.8.0)", "sphinx", "sphinx_autosummary_accessors", "xarray[complete]"] etc = ["sparse"] io = ["cftime", "fsspec", "h5netcdf", "netCDF4", "pooch", "pydap", "scipy", "zarr"] parallel = ["dask[complete]"] +types = ["pandas-stubs", "types-PyYAML", "types-Pygments", "types-colorama", "types-decorator", "types-defusedxml", "types-docutils", "types-networkx", "types-openpyxl", "types-pexpect", "types-psutil", "types-pycurl", "types-python-dateutil", "types-pytz", "types-setuptools"] viz = ["cartopy", "matplotlib", "nc-time-axis", "seaborn"] [[package]] @@ -4719,4 +4666,4 @@ prod = ["gevent", "gunicorn"] [metadata] lock-version = "2.0" python-versions = ">=3.11.0,<3.13" -content-hash = "3ef4ca56707a9b9c01adaf524fa47159e211ed9434eae3017a294a0ea0f626bc" +content-hash = "e9bc5608e411a3d263088da64101e8c72044ecdf2e4fd5c62dac5771613f0c2b" diff --git a/pyproject.toml b/pyproject.toml index 9781cd073..5dfd07de2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,8 +47,6 @@ social-auth-core = "^4.5.4" sqlalchemy = "^2.0.17" strictyaml = "^1.7" whitenoise = "^5.3" -objgraph = "^3.6.2" -pympler = "^1.1" [tool.poetry.group.dev.dependencies] mkdocs-material = "^9.5.20" From b8af6c84722714faa77b4683e54abceb1733f0f6 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Thu, 27 Mar 2025 12:00:45 +1100 Subject: [PATCH 25/66] Cleanup --- vast_pipeline/pipeline/finalise.py | 18 ++++++----- vast_pipeline/pipeline/forced_extraction.py | 33 ++++++++------------- vast_pipeline/pipeline/pairs.py | 32 ++++++++------------ 3 files changed, 35 insertions(+), 48 deletions(-) diff --git a/vast_pipeline/pipeline/finalise.py b/vast_pipeline/pipeline/finalise.py index fb23b9eda..5f78845be 100644 --- a/vast_pipeline/pipeline/finalise.py +++ b/vast_pipeline/pipeline/finalise.py @@ -12,7 +12,7 @@ from vast_pipeline.models import Run from vast_pipeline.utils.utils import ( - StopWatch, optimise_numeric, delete_file_or_dir + StopWatch, optimise_numeric, delete_file_or_dir, calculate_n_partitions ) from vast_pipeline.pipeline.loading import ( update_sources, @@ -29,8 +29,6 @@ log_total_memory_usage ) -from vast_pipeline.utils.utils import calculate_n_partitions - # NOTE: Get testing environment status. # See comment in forced_extraction.py __TESTING__ = settings.TESTING @@ -98,7 +96,9 @@ def final_operations( logger.info("Calculating statistics for sources...") log_total_memory_usage() - npartitions = calculate_n_partitions(sources_df, partition_size_mb=upload_chunk_size_mb) + npartitions = calculate_n_partitions(sources_df, + partition_size_mb=upload_chunk_size_mb + ) sources_df = sources_df.set_index("source") \ .shuffle(npartitions=npartitions, on_index=True) @@ -176,9 +176,10 @@ def final_operations( pair_agg_metrics = max_peak_pairs.merge(max_int_pairs, on="source", how="outer") pair_agg_metrics = pair_agg_metrics.set_index("source") + # NOTE: this logging check can eventually be removed pair_metrics_dupes = pair_agg_metrics.index.duplicated(keep=False) - logger.info("Duplicated pair_agg_metrics:") - logger.info(pair_agg_metrics[pair_metrics_dupes]) + logger.debug("Duplicated pair_agg_metrics:") + logger.debug(pair_agg_metrics[pair_metrics_dupes]) # join with sources and replace agg metrics NaNs with 0 as the # DataTables API JSON serialization doesn't like them @@ -189,9 +190,10 @@ def final_operations( "m_abs_significant_max_int": 0.0, }) + # NOTE: this logging check can eventually be removed srcs_df_dupes = srcs_df.index.duplicated(keep=False) - logger.info("Duplicated srcs_df:") - logger.info(srcs_df[srcs_df_dupes]) + logger.debug("Duplicated srcs_df:") + logger.debug(srcs_df[srcs_df_dupes]) logger.info( "Measurement pair aggregate metrics time: %.2f seconds", diff --git a/vast_pipeline/pipeline/forced_extraction.py b/vast_pipeline/pipeline/forced_extraction.py index 578089c0c..1ed62316d 100644 --- a/vast_pipeline/pipeline/forced_extraction.py +++ b/vast_pipeline/pipeline/forced_extraction.py @@ -350,7 +350,7 @@ def parallel_extraction( 'component_id', 'name', 'flux_int', 'flux_int_err' """ - logger.info("Starting parallel extraction") + logger.info("Starting parallel extraction...") # explode the lists in 'img_diff' column (this will make a copy of the df) # NOTE: Need to persist here since Dask loses futures after all the @@ -373,7 +373,7 @@ def parallel_extraction( .persist() ) - logger.info("Generated out df") + logger.debug("Parallel extraction: Generated out df") # drop the source for which we would have no hope of detecting max_snr = out["flux_peak"].values / out["image_rms_min"].values @@ -392,7 +392,7 @@ def parallel_extraction( out = out.drop(["image_rms_min", "detection"], axis=1).rename( columns={"image": "image_name"} ) - logger.info("Dropped low S/N detections") + logger.debug("Parallel extraction: Dropped low S/N detections") # get the unique images to extract from unique_images_to_extract = out["image_name"].unique().compute().tolist() @@ -420,7 +420,6 @@ def parallel_extraction( .merge(df_images[df_cols], on="id", how="left") .to_delayed() ) - logger.info("Generated delayed measurements_parquet_Data") # Create a list of dataframes containing the relevant data from out per image # This generates a list of delayed futures that will only compute at the next persist. @@ -436,20 +435,19 @@ def parallel_extraction( cluster_threshold=cluster_threshold, allow_nan=allow_nan) for image_df, meas_data in image_data_list ] - logger.info("Generated forced extraction delayed") # Persist at this point uning the number of io workers. # df_out will contain the forced extraction measurments per image. # df_out should be sorted and partitioned by image at this point. df_out = dd.from_delayed(func_d).persist(workers=io_workers) - logger.info("Persisted forced extraction df") + logger.info("Persisting forced extraction df...") del out, func_d, df_per_image, measurements_parquet_data wait(df_out) - logger.info("Waiting for forced extraction df to finish compute") + logger.info("Waiting for forced extraction df to finish compute...") return df_out @@ -678,7 +676,7 @@ def forced_extraction( ) ).set_index("name") - logger.debug("Made images_df") + #logger.debug("Made images_df") # | name | id | measurements_path | path | noise_path | # |:------------------------------|---------:|:--------------------|:-------------|:-------------| @@ -702,8 +700,7 @@ def forced_extraction( extr_df = extr_df.explode("img_diff").reset_index() total_to_extract = extr_df.shape[0] - logger.debug("Exploded out img_diff column") - logger.info(f"Total to extract: {total_to_extract}") + logger.debug(f"Total measurements to extract: %d", total_to_extract) if add_mode: logger.info("Running in add mode...") @@ -732,7 +729,6 @@ def forced_extraction( ) timer.reset() - logger.info("Starting parallel extraction...") extr_df = parallel_extraction( extr_df, images_df, sources_df[['source', 'image', 'flux_peak']], min_sigma, edge_buffer, cluster_threshold, allow_nan, add_mode, @@ -745,7 +741,7 @@ def forced_extraction( # Get expected database measurements schema columns = read_schema(images_df.iloc[0]["measurements_path"]).names - logger.info("Building save and upload...") + logger.debug("Building save and upload...") extr_df = extr_df.map_partitions(save_and_upload_forced_df, p_run_path=p_run.path, p_run_id=p_run.id, @@ -771,17 +767,15 @@ def forced_extraction( extr_df = extr_df.persist() logger.info("Persisting extr_df...") wait(extr_df) - logger.info("Persisted extr_df...") + logger.info("Persisted extr_df.") mem_check = lambda df: df.memory_usage(deep=True).sum() - logger.info("Computing memory usage of sources_df...") mem_usage = sources_df.map_partitions(mem_check).compute() - logger.info(f"Memory usage of sources_df = {mem_usage}") + logger.debug(f"Memory usage of sources_df = {mem_usage}") - logger.info("Computing memory usage of sources_df...") - mem_usage = sources_df.map_partitions(mem_check).compute() - logger.info(f"Memory usage of sources_df = {mem_usage}") + mem_usage = extr_df.map_partitions(mem_check).compute() + logger.debug(f"Memory usage of extr_df = {mem_usage}") sources_df = dd.concat([sources_df, extr_df], interleave_partitions=True) @@ -797,9 +791,8 @@ def forced_extraction( del extr_df gc.collect() - logger.info("Computing memory usage of sources_df...") mem_usage = sources_df.map_partitions(mem_check).compute() - logger.info(f"Memory usage of sources_df = {mem_usage}") + logger.debug(f"Memory usage of sources_df = {mem_usage}") # get the number of forced extractions for the run forced_parquets = glob(os.path.join(p_run.path, "forced_measurements*.parquet")) diff --git a/vast_pipeline/pipeline/pairs.py b/vast_pipeline/pipeline/pairs.py index 35091e1fb..8bf1f9871 100644 --- a/vast_pipeline/pipeline/pairs.py +++ b/vast_pipeline/pipeline/pairs.py @@ -68,7 +68,7 @@ def calculate_measurement_pair_aggregate_metrics( filters = [(f"vs_abs_significant_max_{flux_type}", ">=", min_vs)] pair_filtered = dd.read_parquet(pairs_parquet_dir, columns=columns, filters=filters) - + def _get_max_flux(partition): partition=partition.reset_index(drop=True) inds = [] @@ -141,39 +141,31 @@ def calculate_measurement_pair_metrics( vs_peak, vs_int - variability t-statistic m_peak, m_int - variability modulation index """ - logger.info("calculate_measurement_pair_metrics input df:") - logger.info(df) - logger.info(df.columns) # select relevant columns df_pairs = df[["id", "flux_int", "flux_int_err", "flux_peak", "flux_peak_err", "image", "datetime"]].rename(columns={"image": "image_name"}) - logger.info("Pairs df info:") - logger.info(df_pairs.columns) - logger.info(df_pairs.head()) + logger.debug("df_pairs info:") + logger.debug(df_pairs.columns) + logger.debug(df_pairs.head()) # keep record of divisions source_divisions = df_pairs.divisions n_partitions = df_pairs.npartitions - logger.info(f"source divisions: {source_divisions}") - logger.info(f"n_partitions: {n_partitions}") - + logger.debug(f"source divisions: {source_divisions}") + logger.debug(f"n_partitions: {n_partitions}") + # NOTE - this check can also probably be removed eventually def _get_source_ids(partition, partition_info=None): return pd.DataFrame({'source': partition.index.unique(), 'partition_num': partition_info['number']}) - - logger.info(df_pairs.head()) - #exit() + source_partition_df = df_pairs.map_partitions(_get_source_ids, meta={'source':str, 'partition_num':float}).compute() - logger.info("Source partition df:") - logger.info(source_partition_df) - source_partition_df.to_csv('source_partition_df.csv') + logger.debug("Source partition df:") + logger.debug(source_partition_df) dupes = source_partition_df['source'].duplicated(keep=False) - logger.info("Multi-partition dupes:") - logger.info(source_partition_df[dupes]) - - #logger.info(df.loc['okTehBmcSi7y'].compute()) + logger.debug("Indices in multiple partitions:") + logger.debug(source_partition_df[dupes]) def _get_pair_partition(partition): partition = partition.sort_values(["source", "datetime"]) From 4487413b21d8ab1f32eec695652d3b03e9936657 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Thu, 27 Mar 2025 12:02:04 +1100 Subject: [PATCH 26/66] Revert formatting changes --- vast_pipeline/daskmanager/manager.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/vast_pipeline/daskmanager/manager.py b/vast_pipeline/daskmanager/manager.py index 133b946de..8db23e323 100644 --- a/vast_pipeline/daskmanager/manager.py +++ b/vast_pipeline/daskmanager/manager.py @@ -20,12 +20,12 @@ def _start_cluster(): logger.info(f"dashboard_port: {s.DASK_DASHBOARD_PORT}") cluster = LocalCluster( - n_workers=int(s.DASK_NUM_WORKERS), - threads_per_worker=s.DASK_THREADS_PER_WORKER, - host=s.DASK_SCHEDULER_HOST, - scheduler_port=int(s.DASK_SCHEDULER_PORT), - dashboard_address=f"{s.DASK_DASHBOARD_HOST}:{s.DASK_DASHBOARD_PORT}", - ) + n_workers=int(s.DASK_NUM_WORKERS), + threads_per_worker=s.DASK_THREADS_PER_WORKER, + host=s.DASK_SCHEDULER_HOST, + scheduler_port=int(s.DASK_SCHEDULER_PORT), + dashboard_address=f"{s.DASK_DASHBOARD_HOST}:{s.DASK_DASHBOARD_PORT}", + ) client = Client(cluster) logger.info('Connected to local Dask Cluster') return client From 2de9a587dd6cc7638bdf7baffb65218ebdeb11eb Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Thu, 27 Mar 2025 12:12:33 +1100 Subject: [PATCH 27/66] Updated changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d142b8faf..9a7e19b5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), #### Added +- V2: Added additional logging throughout forced_extraction to help monitor memory usage [#820](https://github.com/askap-vast/vast-pipeline/pull/820) +- V2: Added some logging to pinpoint duplicate source ID error - this is likely unnecessary, but keeping in case the error persists [#820](https://github.com/askap-vast/vast-pipeline/pull/820) - V2: Migrate pipeline to used a Dask.distributed.LocalCluster throughout [#816](https://github.com/askap-vast/vast-pipeline/pull/816) - V2: Add Dask.distributed support - V2: Use `django-postgres-copy` for database uploads [#803](https://github.com/askap-vast/vast-pipeline/pull/803) @@ -32,6 +34,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), #### Fixed +- V2: Fixed duplicate source ID error by switching from sources_df.repartition() to sources_df.shuffle() in pipeline.finalise.final_operations [#820](https://github.com/askap-vast/vast-pipeline/pull/820) +- V2: Partial fix for image upload memory leak via garbage collect [#820](https://github.com/askap-vast/vast-pipeline/pull/820) +- V2: Fixed dd.concat memory blow-up in pipeline.forced_extraction.forced_extraction by persisting both dataframes prior [#820](https://github.com/askap-vast/vast-pipeline/pull/820) - V2: Pair metrics working with V2 dask LocalCluster changes [#817](https://github.com/askap-vast/vast-pipeline/pull/817) - V2: Fixed missing JS9 overlays on source webpage [#809](https://github.com/askap-vast/vast-pipeline/pull/809) - V2: Fix bug when deleting source tags from database which are referenced by multiple sources [#803](https://github.com/askap-vast/vast-pipeline/pull/803) @@ -53,6 +58,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), #### List of PRs +- [#820](https://github.com/askap-vast/vast-pipeline/pull/820): - [#833](https://github.com/askap-vast/vast-pipeline/pull/833): feat: V2: Limit associations upload to using num_io_workers - [#829](https://github.com/askap-vast/vast-pipeline/pull/829): feat: V2: Allow user specification of dask dashboard paramters and add some further logging to dask setup - [#817](https://github.com/askap-vast/vast-pipeline/pull/817): fix: V2: Updates to pairs calculation to make it work with Dask `LocalCluster`. From bba06c7cd4158c155e53577cdcfe94caf74b6fe9 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Thu, 27 Mar 2025 12:14:47 +1100 Subject: [PATCH 28/66] Updated changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a7e19b5c..80bcd378b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -58,7 +58,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), #### List of PRs -- [#820](https://github.com/askap-vast/vast-pipeline/pull/820): +- [#820](https://github.com/askap-vast/vast-pipeline/pull/820): fix: Fixes for duplicate source ID error and memory leak in forced_extraction. Partial fix for memory leak in image upload. - [#833](https://github.com/askap-vast/vast-pipeline/pull/833): feat: V2: Limit associations upload to using num_io_workers - [#829](https://github.com/askap-vast/vast-pipeline/pull/829): feat: V2: Allow user specification of dask dashboard paramters and add some further logging to dask setup - [#817](https://github.com/askap-vast/vast-pipeline/pull/817): fix: V2: Updates to pairs calculation to make it work with Dask `LocalCluster`. From 89f40239b57656d3f533798459ab971f93399eda Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Thu, 27 Mar 2025 12:44:27 +1100 Subject: [PATCH 29/66] Do association upload with one worker --- vast_pipeline/pipeline/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vast_pipeline/pipeline/main.py b/vast_pipeline/pipeline/main.py index b9151129d..15af2d274 100644 --- a/vast_pipeline/pipeline/main.py +++ b/vast_pipeline/pipeline/main.py @@ -347,7 +347,7 @@ def process_pipeline(self, p_run: Run) -> None: done_source_ids, self.previous_parquets, self.config["processing"]["max_partition_mb"], - self.dm.get_n_random_workers(self.config['processing']['num_workers_io']), + self.dm.get_n_random_workers(1), ) log_total_memory_usage() From 0c0e3bd01ca853da90932fe232c57b33c479d205 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Thu, 27 Mar 2025 13:55:16 +1100 Subject: [PATCH 30/66] Fixed broken logging statement --- vast_pipeline/pipeline/forced_extraction.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/vast_pipeline/pipeline/forced_extraction.py b/vast_pipeline/pipeline/forced_extraction.py index 1ed62316d..56b54af78 100644 --- a/vast_pipeline/pipeline/forced_extraction.py +++ b/vast_pipeline/pipeline/forced_extraction.py @@ -698,7 +698,7 @@ def forced_extraction( # Explode out the img_diff column. extr_df = extr_df.explode("img_diff").reset_index() - total_to_extract = extr_df.shape[0] + total_to_extract = extr_df.shape[0].compute() logger.debug(f"Total measurements to extract: %d", total_to_extract) @@ -712,7 +712,6 @@ def forced_extraction( # images. # 3. A new relation has been created and they need the forced # measuremnts filled in (actually covered by 2.) - total_to_extract = extr_df.shape[0].compute() extr_df = dd.concat( [ extr_df[~extr_df["img_diff"].isin(done_images_df["name"])], From 653b5cc09a9f53735e2fef32bef0035e4ee8a6e5 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Thu, 27 Mar 2025 15:34:47 +1100 Subject: [PATCH 31/66] Further logging cleanup --- vast_pipeline/pipeline/forced_extraction.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/vast_pipeline/pipeline/forced_extraction.py b/vast_pipeline/pipeline/forced_extraction.py index 56b54af78..392ed9977 100644 --- a/vast_pipeline/pipeline/forced_extraction.py +++ b/vast_pipeline/pipeline/forced_extraction.py @@ -439,15 +439,16 @@ def parallel_extraction( # Persist at this point uning the number of io workers. # df_out will contain the forced extraction measurments per image. # df_out should be sorted and partitioned by image at this point. - df_out = dd.from_delayed(func_d).persist(workers=io_workers) - logger.info("Persisting forced extraction df...") + df_out = dd.from_delayed(func_d).persist(workers=io_workers) del out, func_d, df_per_image, measurements_parquet_data + logger.info("Waiting for forced extraction df to finish compute...") + wait(df_out) - logger.info("Waiting for forced extraction df to finish compute...") + logger.info("Forced extraction df finished compute.") return df_out From ded5dbddb9fd2e2a9117485cd9c9c5ca5f99447c Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Fri, 28 Mar 2025 10:21:50 +1100 Subject: [PATCH 32/66] Add more logging --- vast_pipeline/pipeline/finalise.py | 2 ++ vast_pipeline/pipeline/loading.py | 12 +++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/vast_pipeline/pipeline/finalise.py b/vast_pipeline/pipeline/finalise.py index 5f78845be..568b962b0 100644 --- a/vast_pipeline/pipeline/finalise.py +++ b/vast_pipeline/pipeline/finalise.py @@ -323,6 +323,8 @@ def final_operations( # Repartition associations df to optimise upload associations_df = associations_df.repartition(partition_size=f'{upload_chunk_size_mb}MB') + + logger.info("Number of associations: %d", len(associations_df.index)) if add_mode: # Load old associations so the already uploaded ones can be removed diff --git a/vast_pipeline/pipeline/loading.py b/vast_pipeline/pipeline/loading.py index 54763ce09..d48329b4b 100644 --- a/vast_pipeline/pipeline/loading.py +++ b/vast_pipeline/pipeline/loading.py @@ -41,6 +41,8 @@ UUID_LEN_SOURCE ) +from timeit import default_timer as timer + logger = logging.getLogger(__name__) @@ -80,11 +82,13 @@ def copy_upload_model( batch_size: The batch size such that in memory csvs don't get crazy big. Defaults to 10_000. """ + mem_csv = None total_rows = len(df) start_index = 0 while start_index < total_rows: + t0 = timer() end_index = min(start_index + batch_size, total_rows) batch = df.iloc[start_index:end_index] @@ -93,7 +97,8 @@ def copy_upload_model( num_copied = djmodel.copies.from_csv( csv_io, drop_constraints=False, drop_indexes=False, mapping=mapping ) - logging.info(f"Copied {num_copied} {djmodel.__name__} objects to database.") + t1 = timer() + logging.info(f"Copied {num_copied} {djmodel.__name__} objects to database. (%.2fs)", t1-t0) start_index = end_index @@ -434,8 +439,13 @@ def copy_upload_associations( } def upload(df, Association, mapping, batch_size): + t0 = timer() df["db_id"] = df.apply(lambda _: generate_shortuuid(UUID_LEN_MEAS), axis=1) + t1 = timer() copy_upload_model(df, Association, mapping=mapping, batch_size=batch_size) + t2 = timer() + + logging.info("generate ID time: %.2f, upload time: %.2f",t1-t0, t2-t1) associations_df = associations_df[columns_to_upload].map_partitions(upload, Association, From 338fb2480cd775cb03066acd73f451e92e7bdb39 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Fri, 28 Mar 2025 13:28:19 +1100 Subject: [PATCH 33/66] Hardcode association upload batch size --- vast_pipeline/pipeline/finalise.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vast_pipeline/pipeline/finalise.py b/vast_pipeline/pipeline/finalise.py index 568b962b0..34a4ae088 100644 --- a/vast_pipeline/pipeline/finalise.py +++ b/vast_pipeline/pipeline/finalise.py @@ -350,7 +350,7 @@ def final_operations( # upload associations into DB if not __TESTING__: assoc_df = associations_df_upload.loc[:, ["id", "source", "d2d", "dr"]] - copy_upload_associations(assoc_df, io_workers) + copy_upload_associations(assoc_df, io_workers, batch_size=10_000) # write associations to parquet file associations_df[['source', 'id', 'd2d', 'dr']] \ From 8862d96c140c411514b11e49a336565bcde03116 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Fri, 28 Mar 2025 16:28:59 +1100 Subject: [PATCH 34/66] Bump it to 100k --- vast_pipeline/pipeline/finalise.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vast_pipeline/pipeline/finalise.py b/vast_pipeline/pipeline/finalise.py index 34a4ae088..22a158dc3 100644 --- a/vast_pipeline/pipeline/finalise.py +++ b/vast_pipeline/pipeline/finalise.py @@ -350,7 +350,7 @@ def final_operations( # upload associations into DB if not __TESTING__: assoc_df = associations_df_upload.loc[:, ["id", "source", "d2d", "dr"]] - copy_upload_associations(assoc_df, io_workers, batch_size=10_000) + copy_upload_associations(assoc_df, io_workers, batch_size=100_000) # write associations to parquet file associations_df[['source', 'id', 'd2d', 'dr']] \ From 9e8e6b379b4219442bb4687a1b064d21df762b3c Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Fri, 28 Mar 2025 17:21:04 +1100 Subject: [PATCH 35/66] Revert to 10k --- vast_pipeline/pipeline/finalise.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vast_pipeline/pipeline/finalise.py b/vast_pipeline/pipeline/finalise.py index 22a158dc3..34a4ae088 100644 --- a/vast_pipeline/pipeline/finalise.py +++ b/vast_pipeline/pipeline/finalise.py @@ -350,7 +350,7 @@ def final_operations( # upload associations into DB if not __TESTING__: assoc_df = associations_df_upload.loc[:, ["id", "source", "d2d", "dr"]] - copy_upload_associations(assoc_df, io_workers, batch_size=100_000) + copy_upload_associations(assoc_df, io_workers, batch_size=10_000) # write associations to parquet file associations_df[['source', 'id', 'd2d', 'dr']] \ From 6e91e4a286d8d6cecd0d6c80a07072e79567bee9 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Fri, 28 Mar 2025 19:11:27 +1100 Subject: [PATCH 36/66] More tweaks --- vast_pipeline/pipeline/finalise.py | 4 +++- vast_pipeline/pipeline/loading.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/vast_pipeline/pipeline/finalise.py b/vast_pipeline/pipeline/finalise.py index 34a4ae088..37daace88 100644 --- a/vast_pipeline/pipeline/finalise.py +++ b/vast_pipeline/pipeline/finalise.py @@ -349,8 +349,10 @@ def final_operations( # upload associations into DB if not __TESTING__: + batch_size = 10_000 + logger.info("Using batches of %d", batch_size) assoc_df = associations_df_upload.loc[:, ["id", "source", "d2d", "dr"]] - copy_upload_associations(assoc_df, io_workers, batch_size=10_000) + copy_upload_associations(assoc_df, io_workers, batch_size=batch_size) # write associations to parquet file associations_df[['source', 'id', 'd2d', 'dr']] \ diff --git a/vast_pipeline/pipeline/loading.py b/vast_pipeline/pipeline/loading.py index d48329b4b..cd9544d53 100644 --- a/vast_pipeline/pipeline/loading.py +++ b/vast_pipeline/pipeline/loading.py @@ -445,7 +445,7 @@ def upload(df, Association, mapping, batch_size): copy_upload_model(df, Association, mapping=mapping, batch_size=batch_size) t2 = timer() - logging.info("generate ID time: %.2f, upload time: %.2f",t1-t0, t2-t1) + logging.info("generate ID time: %.2f, partition upload time: %.2f",t1-t0, t2-t1) associations_df = associations_df[columns_to_upload].map_partitions(upload, Association, From 135e7a3d87b829dacf6864973859e255d7bc6de7 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Sat, 29 Mar 2025 09:14:08 +1100 Subject: [PATCH 37/66] Even more logging --- vast_pipeline/pipeline/loading.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/vast_pipeline/pipeline/loading.py b/vast_pipeline/pipeline/loading.py index cd9544d53..dce4198d5 100644 --- a/vast_pipeline/pipeline/loading.py +++ b/vast_pipeline/pipeline/loading.py @@ -82,7 +82,7 @@ def copy_upload_model( batch_size: The batch size such that in memory csvs don't get crazy big. Defaults to 10_000. """ - + s = timer() mem_csv = None total_rows = len(df) start_index = 0 @@ -90,15 +90,18 @@ def copy_upload_model( while start_index < total_rows: t0 = timer() end_index = min(start_index + batch_size, total_rows) + t1 = timer() batch = df.iloc[start_index:end_index] + t2 = timer() mem_csv = in_memory_csv(batch) + t3 = timer() with closing(mem_csv) as csv_io: num_copied = djmodel.copies.from_csv( csv_io, drop_constraints=False, drop_indexes=False, mapping=mapping ) - t1 = timer() - logging.info(f"Copied {num_copied} {djmodel.__name__} objects to database. (%.2fs)", t1-t0) + t4 = timer() + logging.info(f"Copied {num_copied} {djmodel.__name__} objects to database. (%.2fs, %.2fs, %.2fs, %.2fs, %.2fs)", s-t0, t1-t0, t2-t1, t3-t2,t4-t2) start_index = end_index From c7d005bc9dc03acd800f4624426e9d2220f477c4 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Sat, 29 Mar 2025 14:49:28 +1100 Subject: [PATCH 38/66] Clean up logging order --- vast_pipeline/pipeline/loading.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vast_pipeline/pipeline/loading.py b/vast_pipeline/pipeline/loading.py index dce4198d5..2a414bf9a 100644 --- a/vast_pipeline/pipeline/loading.py +++ b/vast_pipeline/pipeline/loading.py @@ -101,7 +101,7 @@ def copy_upload_model( csv_io, drop_constraints=False, drop_indexes=False, mapping=mapping ) t4 = timer() - logging.info(f"Copied {num_copied} {djmodel.__name__} objects to database. (%.2fs, %.2fs, %.2fs, %.2fs, %.2fs)", s-t0, t1-t0, t2-t1, t3-t2,t4-t2) + logging.info(f"Copied {num_copied} {djmodel.__name__} objects to database. (%.2fs, %.2fs, %.2fs, %.2fs, %.2fs)", t0-s, t1-t0, t2-t1, t3-t2,t4-t2) start_index = end_index From 92e742604e347a6e71f9690d1b151ea2548799be Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Sat, 29 Mar 2025 14:55:45 +1100 Subject: [PATCH 39/66] More detailed timing --- vast_pipeline/pipeline/loading.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/vast_pipeline/pipeline/loading.py b/vast_pipeline/pipeline/loading.py index 2a414bf9a..6acfbcf2f 100644 --- a/vast_pipeline/pipeline/loading.py +++ b/vast_pipeline/pipeline/loading.py @@ -86,6 +86,7 @@ def copy_upload_model( mem_csv = None total_rows = len(df) start_index = 0 + s1 = timer() while start_index < total_rows: t0 = timer() @@ -97,13 +98,15 @@ def copy_upload_model( mem_csv = in_memory_csv(batch) t3 = timer() with closing(mem_csv) as csv_io: + t4 = timer() num_copied = djmodel.copies.from_csv( csv_io, drop_constraints=False, drop_indexes=False, mapping=mapping ) - t4 = timer() - logging.info(f"Copied {num_copied} {djmodel.__name__} objects to database. (%.2fs, %.2fs, %.2fs, %.2fs, %.2fs)", t0-s, t1-t0, t2-t1, t3-t2,t4-t2) - + t5 = timer() + t6 = timer() start_index = end_index + t7 = timer() + logging.info(f"Copied {num_copied} {djmodel.__name__} objects to database. (%.2fs, %.2fs, %.2fs, %.2fs, %.2fs, %.2fs, %.2fs, %.2fs)", s1-s, t1-t0, t2-t1, t3-t2,t4-t3, t5-t4, t6-t5, t7-t6) del mem_csv From 734da3d87d3b12cbf92cf9c83c43763fb79042e4 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Sat, 29 Mar 2025 16:19:25 +1100 Subject: [PATCH 40/66] More tweaks --- vast_pipeline/pipeline/finalise.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/vast_pipeline/pipeline/finalise.py b/vast_pipeline/pipeline/finalise.py index 37daace88..c668b2074 100644 --- a/vast_pipeline/pipeline/finalise.py +++ b/vast_pipeline/pipeline/finalise.py @@ -318,13 +318,17 @@ def final_operations( associations_df = sources_df.drop("related", axis=1).reset_index() mem_usage = get_df_memory_usage(associations_df) - logger.debug(f"sources_df memory after merge: {mem_usage}MB") + logger.debug(f"associations_df memory usage after related drop: {mem_usage}MB") log_total_memory_usage() + + logger.debug(f"Associations df has %d partitions", associations_df.npartitions) # Repartition associations df to optimise upload associations_df = associations_df.repartition(partition_size=f'{upload_chunk_size_mb}MB') - logger.info("Number of associations: %d", len(associations_df.index)) + logger.debug(f"...and is repartitioned into %d partitions", associations_df.npartitions) + + logger.info("Total number of associations: %d", len(associations_df.index)) if add_mode: # Load old associations so the already uploaded ones can be removed @@ -343,7 +347,7 @@ def final_operations( associations_df_upload = dd.from_pandas( associations_df_upload, npartitions=associations_df.npartitions ) - logger.debug(f"Add mode: #{associations_df_upload.shape[0]} associations to upload.") + logger.info(f"Add mode: #{associations_df_upload.shape[0]} associations to upload.") else: associations_df_upload = associations_df From 3278903b254fec1a58a96020012ddaec56872cd6 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Sat, 29 Mar 2025 16:20:21 +1100 Subject: [PATCH 41/66] Persist before mapping partitions --- vast_pipeline/pipeline/finalise.py | 1 + 1 file changed, 1 insertion(+) diff --git a/vast_pipeline/pipeline/finalise.py b/vast_pipeline/pipeline/finalise.py index c668b2074..83dc978a7 100644 --- a/vast_pipeline/pipeline/finalise.py +++ b/vast_pipeline/pipeline/finalise.py @@ -356,6 +356,7 @@ def final_operations( batch_size = 10_000 logger.info("Using batches of %d", batch_size) assoc_df = associations_df_upload.loc[:, ["id", "source", "d2d", "dr"]] + assoc_df = assoc_df.persist() copy_upload_associations(assoc_df, io_workers, batch_size=batch_size) # write associations to parquet file From 25aa3b1da18ae769fdda834134be8adde9e6c31c Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Sat, 29 Mar 2025 20:20:07 +1100 Subject: [PATCH 42/66] Remove repartition --- vast_pipeline/pipeline/finalise.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vast_pipeline/pipeline/finalise.py b/vast_pipeline/pipeline/finalise.py index 83dc978a7..5cf3f3378 100644 --- a/vast_pipeline/pipeline/finalise.py +++ b/vast_pipeline/pipeline/finalise.py @@ -324,7 +324,7 @@ def final_operations( logger.debug(f"Associations df has %d partitions", associations_df.npartitions) # Repartition associations df to optimise upload - associations_df = associations_df.repartition(partition_size=f'{upload_chunk_size_mb}MB') + #associations_df = associations_df.repartition(partition_size=f'{upload_chunk_size_mb}MB') logger.debug(f"...and is repartitioned into %d partitions", associations_df.npartitions) From 3e5a276bca2567e5feac8d356faa4e461be0e54e Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Sun, 30 Mar 2025 10:09:22 +1100 Subject: [PATCH 43/66] Write associations to file before upload --- vast_pipeline/pipeline/finalise.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/vast_pipeline/pipeline/finalise.py b/vast_pipeline/pipeline/finalise.py index 5cf3f3378..86f77c542 100644 --- a/vast_pipeline/pipeline/finalise.py +++ b/vast_pipeline/pipeline/finalise.py @@ -351,19 +351,20 @@ def final_operations( else: associations_df_upload = associations_df + # write associations to parquet file + associations_df[['source', 'id', 'd2d', 'dr']] \ + .rename(columns={"id": "meas_id", "source": "source_id"}) \ + .to_parquet(os.path.join(p_run.path, "associations.parquet"), overwrite=True) + # upload associations into DB if not __TESTING__: batch_size = 10_000 logger.info("Using batches of %d", batch_size) assoc_df = associations_df_upload.loc[:, ["id", "source", "d2d", "dr"]] assoc_df = assoc_df.persist() + wait(assoc_df) copy_upload_associations(assoc_df, io_workers, batch_size=batch_size) - # write associations to parquet file - associations_df[['source', 'id', 'd2d', 'dr']] \ - .rename(columns={"id": "meas_id", "source": "source_id"}) \ - .to_parquet(os.path.join(p_run.path, "associations.parquet"), overwrite=True) - nr_sources = srcs_df.shape[0] nr_new_sources = srcs_df["new"].sum() From ee18d9bbab1e92909393d8e62c6bac945c43c03d Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Sun, 30 Mar 2025 10:41:56 +1100 Subject: [PATCH 44/66] Missed import --- vast_pipeline/pipeline/finalise.py | 1 + 1 file changed, 1 insertion(+) diff --git a/vast_pipeline/pipeline/finalise.py b/vast_pipeline/pipeline/finalise.py index 86f77c542..ed3ee7479 100644 --- a/vast_pipeline/pipeline/finalise.py +++ b/vast_pipeline/pipeline/finalise.py @@ -9,6 +9,7 @@ from astropy.coordinates import SkyCoord from django.conf import settings from typing import List, Dict, Tuple +from dask.distributed import wait from vast_pipeline.models import Run from vast_pipeline.utils.utils import ( From 10079ada04c7a81f42603b4e76f1680aaacddc78 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Sun, 30 Mar 2025 16:26:39 +1100 Subject: [PATCH 45/66] Test finalise fix --- vast_pipeline/pipeline/finalise.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/vast_pipeline/pipeline/finalise.py b/vast_pipeline/pipeline/finalise.py index ed3ee7479..8a9e40fec 100644 --- a/vast_pipeline/pipeline/finalise.py +++ b/vast_pipeline/pipeline/finalise.py @@ -361,10 +361,10 @@ def final_operations( if not __TESTING__: batch_size = 10_000 logger.info("Using batches of %d", batch_size) - assoc_df = associations_df_upload.loc[:, ["id", "source", "d2d", "dr"]] - assoc_df = assoc_df.persist() - wait(assoc_df) - copy_upload_associations(assoc_df, io_workers, batch_size=batch_size) + #assoc_df = associations_df_upload.loc[:, ["id", "source", "d2d", "dr"]] + #assoc_df = assoc_df.persist() + #wait(assoc_df) + copy_upload_associations(associations_df_upload.loc[:, ["id", "source", "d2d", "dr"]], io_workers, batch_size=batch_size) nr_sources = srcs_df.shape[0] nr_new_sources = srcs_df["new"].sum() From ff0d234a78efbfa17f3b2f05532b21d208f605a5 Mon Sep 17 00:00:00 2001 From: Tom Mauch Date: Mon, 31 Mar 2025 10:44:14 +1100 Subject: [PATCH 46/66] Change measurements and association DB indices to UUIDs --- vast_pipeline/image/main.py | 9 +++---- ...ter_association_id_alter_measurement_id.py | 24 +++++++++++++++++++ vast_pipeline/models.py | 5 ++-- vast_pipeline/pipeline/forced_extraction.py | 9 +++---- vast_pipeline/pipeline/loading.py | 8 +++++-- 5 files changed, 43 insertions(+), 12 deletions(-) create mode 100644 vast_pipeline/migrations/0003_alter_association_id_alter_measurement_id.py diff --git a/vast_pipeline/image/main.py b/vast_pipeline/image/main.py index 3086fa677..9b5f57373 100644 --- a/vast_pipeline/image/main.py +++ b/vast_pipeline/image/main.py @@ -6,6 +6,7 @@ import logging import numpy as np import pandas as pd +import uuid from django.conf import settings from astropy.io import fits @@ -18,9 +19,9 @@ from vast_pipeline import models from vast_pipeline.survey.translators import tr_selavy -from vast_pipeline.utils.utils import ( - generate_shortuuid, UUID_LEN_MEAS, -) +#from vast_pipeline.utils.utils import ( +# generate_shortuuid, UUID_LEN_MEAS, +#) logger = logging.getLogger(__name__) @@ -342,7 +343,7 @@ def read_selavy(self, dj_image: models.Image) -> pd.DataFrame: df[key["name"]] = df[key["name"]].astype(key["dtype"]) # Add id column - df["id"] = df.apply(lambda _: generate_shortuuid(UUID_LEN_MEAS), axis=1) + df["id"] = df.apply(lambda _: str(uuid.uuid4()), axis=1) # do checks and fill in missing field for uploading sources # in DB (see fields in models.py -> Source model) diff --git a/vast_pipeline/migrations/0003_alter_association_id_alter_measurement_id.py b/vast_pipeline/migrations/0003_alter_association_id_alter_measurement_id.py new file mode 100644 index 000000000..453df72c4 --- /dev/null +++ b/vast_pipeline/migrations/0003_alter_association_id_alter_measurement_id.py @@ -0,0 +1,24 @@ +# Generated by Django 5.1.6 on 2025-03-30 23:19 + +import uuid +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('vast_pipeline', '0002_q3c'), + ] + + operations = [ + migrations.AlterField( + model_name='association', + name='id', + field=models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='measurement', + name='id', + field=models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False), + ), + ] diff --git a/vast_pipeline/models.py b/vast_pipeline/models.py index 8666970c0..e99ea8cdd 100644 --- a/vast_pipeline/models.py +++ b/vast_pipeline/models.py @@ -1,4 +1,5 @@ import numpy as np +import uuid from dataclasses import dataclass from itertools import combinations @@ -417,7 +418,7 @@ class Measurement(CommentableModel): Essentially a source single measurement in time. """ - id = ShortUUIDField(primary_key=True, editable=False, length=UUID_LEN_MEAS, alphabet=UUID_ALPHABET) + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) image = models.ForeignKey( Image, null=True, on_delete=models.CASCADE, to_field="id" ) # first image seen in @@ -713,7 +714,7 @@ class Association(models.Model): some parameters """ - id = ShortUUIDField(primary_key=True, editable=False, length=UUID_LEN_MEAS, alphabet=UUID_ALPHABET) + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) source = models.ForeignKey(Source, on_delete=models.CASCADE, to_field="id") meas = models.ForeignKey(Measurement, on_delete=models.CASCADE, to_field="id") diff --git a/vast_pipeline/pipeline/forced_extraction.py b/vast_pipeline/pipeline/forced_extraction.py index 3c3779c3e..0e075258d 100644 --- a/vast_pipeline/pipeline/forced_extraction.py +++ b/vast_pipeline/pipeline/forced_extraction.py @@ -6,6 +6,7 @@ import dask.dataframe as dd import dask.bag as db from glob import glob +import uuid from astropy import units as u from astropy.coordinates import SkyCoord @@ -22,8 +23,8 @@ from forced_phot import ForcedPhot from ..utils.utils import ( StopWatch, - generate_shortuuid, - UUID_LEN_MEAS + #generate_shortuuid, + #UUID_LEN_MEAS ) from vast_pipeline.image.utils import open_fits @@ -207,7 +208,7 @@ def extract_from_image( use_clusters=use_clusters ) logger.debug("%s - Time to measure FP: %.3fs", image, FP_timer.reset()) - + num_fits = np.sum(flux>0.0) logger.debug("%s: Obtained %d measurements " @@ -486,7 +487,7 @@ def _update_forced_measurements(df: pd.DataFrame) -> pd.DataFrame: The forced extraction dataframe updated with defaults. """ df["name"] = df["name"] + f"_f_{p_run_id}" - df["id"] = df.apply(lambda _: generate_shortuuid(UUID_LEN_MEAS), axis=1) + df["id"] = df.apply(lambda _: str(uuid.uuid4()), axis=1) default_pos_err = settings.POS_DEFAULT_MIN_ERROR / 3600.0 df["ra_err"] = default_pos_err df["dec_err"] = default_pos_err diff --git a/vast_pipeline/pipeline/loading.py b/vast_pipeline/pipeline/loading.py index c7651762a..c5d4e3be4 100644 --- a/vast_pipeline/pipeline/loading.py +++ b/vast_pipeline/pipeline/loading.py @@ -9,6 +9,7 @@ from itertools import islice from django.db import transaction, connection, models from contextlib import closing +from uuid import uuid4 from vast_pipeline.image.main import SelavyImage from vast_pipeline.pipeline.model_generator import ( @@ -40,6 +41,7 @@ UUID_LEN_SOURCE ) +from timeit import default_timer as timer logger = logging.getLogger(__name__) @@ -84,6 +86,7 @@ def copy_upload_model( start_index = 0 while start_index < total_rows: + t0 = timer() end_index = min(start_index + batch_size, total_rows) batch = df.iloc[start_index:end_index] @@ -92,7 +95,8 @@ def copy_upload_model( num_copied = djmodel.copies.from_csv( csv_io, drop_constraints=False, drop_indexes=False, mapping=mapping ) - logging.info(f"Copied {num_copied} {djmodel.__name__} objects to database.") + t1 = timer() + logging.info(f"Copied {num_copied} {djmodel.__name__} objects to database. (%.2fs)", t1-t0) start_index = end_index @@ -432,7 +436,7 @@ def copy_upload_associations( } def upload(df, Association, mapping, batch_size): - df["db_id"] = df.apply(lambda _: generate_shortuuid(UUID_LEN_MEAS), axis=1) + df["db_id"] = df.apply(lambda _: str(uuid4()), axis=1) copy_upload_model(df, Association, mapping=mapping, batch_size=batch_size) associations_df = associations_df[columns_to_upload].map_partitions(upload, From a9c43624da332a516c0013948d1de02327ba663a Mon Sep 17 00:00:00 2001 From: Tom Mauch Date: Mon, 31 Mar 2025 11:02:50 +1100 Subject: [PATCH 47/66] Update serializer --- vast_pipeline/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vast_pipeline/serializers.py b/vast_pipeline/serializers.py index cc889cf8f..866ab5425 100644 --- a/vast_pipeline/serializers.py +++ b/vast_pipeline/serializers.py @@ -56,7 +56,7 @@ class Meta: class MeasurementSerializer(serializers.ModelSerializer): - id = serializers.CharField(read_only=True) + id = serializers.UUIDField(read_only=True) frequency = serializers.SerializerMethodField(read_only=True) def get_frequency(self, obj): From 8d4ce2e16f122b07e6195f372bc136039a0c8d59 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Mon, 31 Mar 2025 13:25:24 +1100 Subject: [PATCH 48/66] Return ones array for new_high_sigma calcs in order to speed up testing --- vast_pipeline/pipeline/new_sources.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/vast_pipeline/pipeline/new_sources.py b/vast_pipeline/pipeline/new_sources.py index fbac380be..5101545a1 100644 --- a/vast_pipeline/pipeline/new_sources.py +++ b/vast_pipeline/pipeline/new_sources.py @@ -93,7 +93,8 @@ def extract_data_from_img(image: str) -> Dict[str, Union[np.ndarray, WCS, fits.H header = hdul[0].header bmaj = header['bmaj'] wcs = WCS(header, naxis=2) - data = hdul[0].data.squeeze().astype(np.float32) + #data = hdul[0].data.squeeze().astype(np.float32) + data = np.ones((header['NAXIS1'], header['NAXIS2'])).astype(np.float32) return {'data': data, 'wcs': wcs, 'bmaj': bmaj} From 7b3a9ab11f516206db0fff54cafa43fc4bec9075 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Mon, 31 Mar 2025 15:58:39 +1100 Subject: [PATCH 49/66] Clean up logging --- vast_pipeline/pipeline/forced_extraction.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vast_pipeline/pipeline/forced_extraction.py b/vast_pipeline/pipeline/forced_extraction.py index 392ed9977..0744fac33 100644 --- a/vast_pipeline/pipeline/forced_extraction.py +++ b/vast_pipeline/pipeline/forced_extraction.py @@ -771,10 +771,10 @@ def forced_extraction( mem_check = lambda df: df.memory_usage(deep=True).sum() - mem_usage = sources_df.map_partitions(mem_check).compute() + mem_usage = sources_df.map_partitions(mem_check).compute().sum() logger.debug(f"Memory usage of sources_df = {mem_usage}") - mem_usage = extr_df.map_partitions(mem_check).compute() + mem_usage = extr_df.map_partitions(mem_check).compute().sum() logger.debug(f"Memory usage of extr_df = {mem_usage}") sources_df = dd.concat([sources_df, extr_df], interleave_partitions=True) From a04e1922adc86b897d1b45f644a4668150a47f92 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Mon, 31 Mar 2025 21:37:34 +1100 Subject: [PATCH 50/66] More logging --- vast_pipeline/pipeline/finalise.py | 3 ++- vast_pipeline/pipeline/loading.py | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/vast_pipeline/pipeline/finalise.py b/vast_pipeline/pipeline/finalise.py index 8a9e40fec..325948a68 100644 --- a/vast_pipeline/pipeline/finalise.py +++ b/vast_pipeline/pipeline/finalise.py @@ -370,11 +370,12 @@ def final_operations( nr_new_sources = srcs_df["new"].sum() if calculate_pairs: + logger.info("Optimising measurement pair dataframe and output to parquet") # optimize measurement pair DataFrame and save to parquet file timer.reset() # ingest to dask data frames srcs_df.index.name = "source_id" - srcs_df = dd.from_pandas(srcs_df, npartitions=n_partitions) + srcs_df = dd.from_pandas(srcs_df, npartitions=n_partitions).persist() columns = ['id_a', 'id_b', 'flux_int_a', 'flux_int_err_a', 'flux_peak_a', 'flux_peak_err_a', 'image_name_a', 'flux_int_b', 'flux_int_err_b', 'flux_peak_b', 'flux_peak_err_b', 'image_name_b', 'vs_peak', 'vs_int', diff --git a/vast_pipeline/pipeline/loading.py b/vast_pipeline/pipeline/loading.py index 3221716bd..ce2d58c2e 100644 --- a/vast_pipeline/pipeline/loading.py +++ b/vast_pipeline/pipeline/loading.py @@ -428,7 +428,7 @@ def copy_upload_associations( This is likely the output of `DaskManager.get_n_random_workers()`. batch_size: The batch size. Defaults to 10_000. """ - logger.info("Upload associations...") + logger.info("Uploading associations...") columns_to_upload = ["source"] for fld in Association._meta.get_fields(): if getattr(fld, "attname", None) and fld.attname in associations_df.columns: @@ -461,6 +461,8 @@ def upload(df, Association, mapping, batch_size): meta={}) associations_df.compute(workers=io_workers) + + logger.info("Associaions upload complete.") def make_upload_associations(associations_df: pd.DataFrame) -> None: From bb9819521c9ad2024474deffc7efe077a5acba1d Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Tue, 1 Apr 2025 10:08:55 +1100 Subject: [PATCH 51/66] nerf forced extraction --- vast_pipeline/pipeline/forced_extraction.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/vast_pipeline/pipeline/forced_extraction.py b/vast_pipeline/pipeline/forced_extraction.py index 0744fac33..a4aae0ba9 100644 --- a/vast_pipeline/pipeline/forced_extraction.py +++ b/vast_pipeline/pipeline/forced_extraction.py @@ -183,6 +183,7 @@ def extract_from_image( # load the image, background and noisemaps into memory # a dedicated function may seem unneccesary, but will be useful if we # split the load to a separate thread. + """ forcedphot_input = _forcedphot_preload(image, data.pop('background_path'), data.pop('noise_path'), @@ -207,8 +208,13 @@ def extract_from_image( edge_buffer=edge_buffer, use_clusters=use_clusters ) + """ logger.debug("%s - Time to measure FP: %.3fs", image, FP_timer.reset()) + flux = np.ones(num_sources) * 5e-3 + flux_err = np.ones(num_sources) * 1e-3 + chisq = np.ones(num_sources) + num_fits = np.sum(flux>0.0) logger.debug("%s: Obtained %d measurements " From 23d4db61296e687473b824c6fdacc4a13d21d8bf Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Tue, 1 Apr 2025 10:40:32 +1100 Subject: [PATCH 52/66] More faff --- vast_pipeline/pipeline/finalise.py | 5 +++-- vast_pipeline/pipeline/forced_extraction.py | 4 ++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/vast_pipeline/pipeline/finalise.py b/vast_pipeline/pipeline/finalise.py index 8a9e40fec..961e25f36 100644 --- a/vast_pipeline/pipeline/finalise.py +++ b/vast_pipeline/pipeline/finalise.py @@ -371,10 +371,11 @@ def final_operations( if calculate_pairs: # optimize measurement pair DataFrame and save to parquet file + logger.info("Optimising measurement pair df and saving to parquet...") timer.reset() # ingest to dask data frames srcs_df.index.name = "source_id" - srcs_df = dd.from_pandas(srcs_df, npartitions=n_partitions) + srcs_df = dd.from_pandas(srcs_df, npartitions=n_partitions).persist() columns = ['id_a', 'id_b', 'flux_int_a', 'flux_int_err_a', 'flux_peak_a', 'flux_peak_err_a', 'image_name_a', 'flux_int_b', 'flux_int_err_b', 'flux_peak_b', 'flux_peak_err_b', 'image_name_b', 'vs_peak', 'vs_int', @@ -403,7 +404,7 @@ def final_operations( delete_file_or_dir(pairs_dir_tmp) - logger.info("Write the final version of measurement pair dataframe into files time: %.2f seconds", timer.reset()) + logger.info("Wrote the final version of measurement pair dataframe into files time: %.2f seconds", timer.reset()) logger.info("Total final operations time: %.2f seconds", timer.reset_init()) diff --git a/vast_pipeline/pipeline/forced_extraction.py b/vast_pipeline/pipeline/forced_extraction.py index a4aae0ba9..25994ce65 100644 --- a/vast_pipeline/pipeline/forced_extraction.py +++ b/vast_pipeline/pipeline/forced_extraction.py @@ -189,7 +189,11 @@ def extract_from_image( data.pop('noise_path'), memmap=False ) + """ + data.pop('background_path') + data.pop('noise_path') FP_timer = StopWatch() + """ FP = ForcedPhot(*forcedphot_input, use_numba=True) logger.debug("%s - Time to init FP: %.3f s", image, FP_timer.reset()) From ad5c3aec462cb5a5412315a3573d1f69e526debf Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Wed, 2 Apr 2025 11:49:46 +1100 Subject: [PATCH 53/66] More tweaks --- vast_pipeline/pipeline/finalise.py | 22 ++++++++++++++++------ vast_pipeline/pipeline/loading.py | 1 + vast_pipeline/pipeline/new_sources.py | 5 +++++ 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/vast_pipeline/pipeline/finalise.py b/vast_pipeline/pipeline/finalise.py index 6d5fd0aa1..789e5edd8 100644 --- a/vast_pipeline/pipeline/finalise.py +++ b/vast_pipeline/pipeline/finalise.py @@ -4,6 +4,7 @@ import pandas as pd import pyarrow as pa import dask.dataframe as dd +import dask.config as dc from astropy import units as u from astropy.coordinates import SkyCoord @@ -100,8 +101,14 @@ def final_operations( npartitions = calculate_n_partitions(sources_df, partition_size_mb=upload_chunk_size_mb ) - sources_df = sources_df.set_index("source") \ - .shuffle(npartitions=npartitions, on_index=True) + with dc.set({"dataframe.shuffle.method": "disk"}): + sources_df = sources_df.set_index("source") \ + .shuffle(npartitions=npartitions, on_index=True) + + sources_df = sources_df.persist() + logger.info("Persisting sources_df...") + wait(sources_df) + logger.info("Persisted sources_df...") srcs_df = parallel_groupby(sources_df) @@ -361,10 +368,13 @@ def final_operations( if not __TESTING__: batch_size = 10_000 logger.info("Using batches of %d", batch_size) - #assoc_df = associations_df_upload.loc[:, ["id", "source", "d2d", "dr"]] - #assoc_df = assoc_df.persist() - #wait(assoc_df) - copy_upload_associations(associations_df_upload.loc[:, ["id", "source", "d2d", "dr"]], io_workers, batch_size=batch_size) + associations_df_upload = associations_df_upload.loc[:, ["id", "source", "d2d", "dr"]].persist() + logger.info("Persisting associations_df_upload...") + wait(associations_df_upload) + logger.info("Persisted associations_df_upload") + copy_upload_associations(associations_df_upload, io_workers, batch_size=batch_size) + #copy_upload_associations(associations_df_upload.loc[:, ["id", "source", "d2d", "dr"]], io_workers, batch_size=batch_size) + nr_sources = srcs_df.shape[0] nr_new_sources = srcs_df["new"].sum() diff --git a/vast_pipeline/pipeline/loading.py b/vast_pipeline/pipeline/loading.py index ce2d58c2e..3c7856635 100644 --- a/vast_pipeline/pipeline/loading.py +++ b/vast_pipeline/pipeline/loading.py @@ -460,6 +460,7 @@ def upload(df, Association, mapping, batch_size): enforce_metadata=False, meta={}) + logger.info("Running compute on upload map_partitions...") associations_df.compute(workers=io_workers) logger.info("Associaions upload complete.") diff --git a/vast_pipeline/pipeline/new_sources.py b/vast_pipeline/pipeline/new_sources.py index 5101545a1..687f416a1 100644 --- a/vast_pipeline/pipeline/new_sources.py +++ b/vast_pipeline/pipeline/new_sources.py @@ -126,6 +126,7 @@ def get_image_rms_measurements( logger.debug(f"No image RMS measurements to get, returning") return pd.DataFrame({'source': [], 'true_sigma': []}) + """ # Ensure there is only one image in the df image = df['img_diff_rms_path'].unique() assert len(image) == 1 @@ -210,6 +211,10 @@ def get_image_rms_measurements( rms_mask = rms_values > 0. source = df['source'].values[rms_mask] true_sigma = df['flux_peak'].values[rms_mask]/rms_values[rms_mask] + """ + + source = df['source'].values + true_sigma = np.ones(len(df))*5 return pd.DataFrame({'source': source, 'true_sigma': true_sigma}) From d3c1a5352cb68640f6615893a8e0a8f69d24622d Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Wed, 2 Apr 2025 18:58:45 +1100 Subject: [PATCH 54/66] Switch to p2p shuffle --- vast_pipeline/pipeline/finalise.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vast_pipeline/pipeline/finalise.py b/vast_pipeline/pipeline/finalise.py index 789e5edd8..89775295b 100644 --- a/vast_pipeline/pipeline/finalise.py +++ b/vast_pipeline/pipeline/finalise.py @@ -101,7 +101,7 @@ def final_operations( npartitions = calculate_n_partitions(sources_df, partition_size_mb=upload_chunk_size_mb ) - with dc.set({"dataframe.shuffle.method": "disk"}): + with dc.set({"dataframe.shuffle.method": "p2p"}): sources_df = sources_df.set_index("source") \ .shuffle(npartitions=npartitions, on_index=True) From 5faa416734b68941f477c20065ae8d8ef21067b7 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Wed, 2 Apr 2025 21:48:52 +1100 Subject: [PATCH 55/66] Do not persist --- vast_pipeline/pipeline/finalise.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/vast_pipeline/pipeline/finalise.py b/vast_pipeline/pipeline/finalise.py index 89775295b..6186b5674 100644 --- a/vast_pipeline/pipeline/finalise.py +++ b/vast_pipeline/pipeline/finalise.py @@ -105,10 +105,10 @@ def final_operations( sources_df = sources_df.set_index("source") \ .shuffle(npartitions=npartitions, on_index=True) - sources_df = sources_df.persist() - logger.info("Persisting sources_df...") - wait(sources_df) - logger.info("Persisted sources_df...") + #sources_df = sources_df.persist() + #logger.info("Persisting sources_df...") + #wait(sources_df) + #logger.info("Persisted sources_df...") srcs_df = parallel_groupby(sources_df) From 3e129c7fa681eec315a765801ee8cea4d528d89a Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Thu, 3 Apr 2025 08:58:42 +1100 Subject: [PATCH 56/66] Compute associations df prior to upload --- vast_pipeline/pipeline/finalise.py | 8 ++++---- vast_pipeline/pipeline/loading.py | 16 +++++++++++++++- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/vast_pipeline/pipeline/finalise.py b/vast_pipeline/pipeline/finalise.py index 6186b5674..7064b43f4 100644 --- a/vast_pipeline/pipeline/finalise.py +++ b/vast_pipeline/pipeline/finalise.py @@ -368,10 +368,10 @@ def final_operations( if not __TESTING__: batch_size = 10_000 logger.info("Using batches of %d", batch_size) - associations_df_upload = associations_df_upload.loc[:, ["id", "source", "d2d", "dr"]].persist() - logger.info("Persisting associations_df_upload...") - wait(associations_df_upload) - logger.info("Persisted associations_df_upload") + associations_df_upload = associations_df_upload.loc[:, ["id", "source", "d2d", "dr"]]#.persist() + #logger.info("Persisting associations_df_upload...") + #wait(associations_df_upload) + #logger.info("Persisted associations_df_upload") copy_upload_associations(associations_df_upload, io_workers, batch_size=batch_size) #copy_upload_associations(associations_df_upload.loc[:, ["id", "source", "d2d", "dr"]], io_workers, batch_size=batch_size) diff --git a/vast_pipeline/pipeline/loading.py b/vast_pipeline/pipeline/loading.py index 3c7856635..4f771607b 100644 --- a/vast_pipeline/pipeline/loading.py +++ b/vast_pipeline/pipeline/loading.py @@ -444,6 +444,7 @@ def copy_upload_associations( "dr": "dr" } + """ def upload(df, Association, mapping, batch_size): t0 = timer() df["db_id"] = df.apply(lambda _: str(uuid4()), axis=1) @@ -464,7 +465,20 @@ def upload(df, Association, mapping, batch_size): associations_df.compute(workers=io_workers) logger.info("Associaions upload complete.") - + """ + + t0 = timer() + associations_df = associations_df.compute() + t1 = timer() + logger.info("Time to compute associations_df: %.2f s", t1-t0) + + associations_df["db_id"] = associations_df.apply(lambda _: str(uuid4()), axis=1) + t2 = timer() + logger.info("Time to add db_id: %.2f s", t2-t1) + + copy_upload_model(associations_df, Association, mapping=mapping, batch_size=batch_size) + t3 = timer() + logger.info("Time to upload: %.2f s", t3-t2) def make_upload_associations(associations_df: pd.DataFrame) -> None: """ From db5dda1226344fb7310fcfd4c18da0df95582045 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Thu, 3 Apr 2025 09:50:35 +1100 Subject: [PATCH 57/66] More tweaks --- vast_pipeline/pipeline/forced_extraction.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vast_pipeline/pipeline/forced_extraction.py b/vast_pipeline/pipeline/forced_extraction.py index e46dfd935..ad983d417 100644 --- a/vast_pipeline/pipeline/forced_extraction.py +++ b/vast_pipeline/pipeline/forced_extraction.py @@ -174,9 +174,11 @@ def extract_from_image( image = data.pop('path') # create the skycoord obj to pass to the forced extraction # see usage https://github.com/dlakaplan/forced_phot + """ P_islands = SkyCoord( df["wavg_ra"].to_numpy(), df["wavg_dec"].to_numpy(), unit=(u.deg, u.deg) ) + """ num_sources = len(df) logger.debug("Will fit %d sources for %s...", num_sources, image) From 2f304375f2ed8244d0d9d2b60a6c69ef2d44a3ee Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Mon, 12 May 2025 11:36:01 +1000 Subject: [PATCH 58/66] Fixed create_measurements_parquet logging --- vast_pipeline/pipeline/utils.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/vast_pipeline/pipeline/utils.py b/vast_pipeline/pipeline/utils.py index 653753ec1..43a79caaa 100644 --- a/vast_pipeline/pipeline/utils.py +++ b/vast_pipeline/pipeline/utils.py @@ -1350,7 +1350,7 @@ def create_measurements_parquet_file(p_run: Run, max_workers: Optional[int] = 10 'forced*.parquet' )) - logger.debug("Will create measurements from %i files...", len(m_files)) + logger.info("Will create measurements from %i files...", len(m_files)) associations = dd.read_parquet( os.path.join( @@ -1361,7 +1361,7 @@ def create_measurements_parquet_file(p_run: Run, max_workers: Optional[int] = 10 index='meas_id' ).compute() - logger.debug("Processing %d partitions with %d workers", len(m_files), max_workers) + logger.info("Processing %d partitions with %d workers...", len(m_files), max_workers) with Pool(max_workers) as pool: @@ -1373,12 +1373,12 @@ def create_measurements_parquet_file(p_run: Run, max_workers: Optional[int] = 10 ) pool.starmap(_process_measurements_file, iterable_arg) - logger.debug("Repartitioning dataframe and saving") + logger.info("Repartitioning dataframe and saving") _repartition_measurements(processed_temp.name, parquet_file) - logger.debug("Cleaning up temporary data") + logger.info("Cleaning up temporary data") processed_temp.cleanup() - logger.debug("Done.") + logger.info("Done.") def backup_parquets(p_run_path: str) -> None: From 8e2f0d4454a5de626fa2b7423edd4f845ad5e643 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Mon, 12 May 2025 15:03:58 +1000 Subject: [PATCH 59/66] Fix issues relating to measurement UUIDs in website rendering --- vast_pipeline/plots.py | 7 +++++++ vast_pipeline/urls.py | 1 + 2 files changed, 8 insertions(+) diff --git a/vast_pipeline/plots.py b/vast_pipeline/plots.py index b12845f8f..a21e9fd82 100644 --- a/vast_pipeline/plots.py +++ b/vast_pipeline/plots.py @@ -84,6 +84,8 @@ def plot_lightcurve( # lightcurve required cols: taustart_ts, flux, flux_err_upper, flux_err_lower, forced lightcurve = pd.DataFrame(measurements_qs) + print(lightcurve.columns) + lightcurve['id'] = lightcurve['id'].astype(str) # remap method values to labels to make a better legend lightcurve["method"] = lightcurve.forced.map({True: "Forced", False: "Selavy"}) @@ -167,6 +169,11 @@ def plot_lightcurve( ) .reset_index() ) + candidate_measurement_pairs_df = candidate_measurement_pairs_df.astype( + {'measurement_a_id': 'str', + 'measurement_b_id': 'str', + } + ) g = nx.Graph() for _row in candidate_measurement_pairs_df.itertuples(index=False): g.add_edge(_row.measurement_a_id, _row.measurement_b_id) diff --git a/vast_pipeline/urls.py b/vast_pipeline/urls.py index 9581e36e0..6f50194ed 100644 --- a/vast_pipeline/urls.py +++ b/vast_pipeline/urls.py @@ -38,6 +38,7 @@ name="image_detail", ), path("measurements/", views.MeasurementIndex, name="measurement_index"), + path("measurements//", views.MeasurementDetail, name="measurement_detail"), re_path( fr"^measurements/(?P[\w]{{{UUID_LEN_MEAS}}})(?:/(?P[\w]+))?/$", views.MeasurementDetail, From b260bf3c52c549326f0c5ed3256c20e0d88d0738 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Mon, 12 May 2025 15:11:25 +1000 Subject: [PATCH 60/66] Add memory limitation option --- vast_pipeline/daskmanager/manager.py | 2 ++ vast_pipeline/management/commands/runlocalcluster.py | 2 +- webinterface/settings.py | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/vast_pipeline/daskmanager/manager.py b/vast_pipeline/daskmanager/manager.py index 8db23e323..1e409e063 100644 --- a/vast_pipeline/daskmanager/manager.py +++ b/vast_pipeline/daskmanager/manager.py @@ -14,6 +14,7 @@ def _start_cluster(): logger.info('Starting local Dask Cluster...') logger.info(f"n_workers: {s.DASK_NUM_WORKERS}") logger.info(f"threads_per_worker: {s.DASK_THREADS_PER_WORKER}") + logger.info(f"memory per worker: {s.MEM_PER_WORKER}") logger.info(f"scheduler_host: {s.DASK_SCHEDULER_HOST}") logger.info(f"scheduler_port: {s.DASK_SCHEDULER_PORT}") logger.info(f"dashboard_host: {s.DASK_DASHBOARD_HOST}") @@ -24,6 +25,7 @@ def _start_cluster(): threads_per_worker=s.DASK_THREADS_PER_WORKER, host=s.DASK_SCHEDULER_HOST, scheduler_port=int(s.DASK_SCHEDULER_PORT), + memory_limit=float(s.MEM_PER_WORKER) dashboard_address=f"{s.DASK_DASHBOARD_HOST}:{s.DASK_DASHBOARD_PORT}", ) client = Client(cluster) diff --git a/vast_pipeline/management/commands/runlocalcluster.py b/vast_pipeline/management/commands/runlocalcluster.py index d3d5e4f09..98e9fe686 100644 --- a/vast_pipeline/management/commands/runlocalcluster.py +++ b/vast_pipeline/management/commands/runlocalcluster.py @@ -11,7 +11,7 @@ class Command(BaseCommand): """ This script will run a Dask LocalCluster on the IP and port - sepcified in the settings. Use --help for usage. + specified in the settings. Use --help for usage. """ help = 'Run a Dask LocalCluster' diff --git a/webinterface/settings.py b/webinterface/settings.py index 0583c120f..9f21ddf43 100644 --- a/webinterface/settings.py +++ b/webinterface/settings.py @@ -253,6 +253,7 @@ DASK_DASHBOARD_PORT = env('DASK_DASHBOARD_PORT', cast=str, default='8787') DASK_NUM_WORKERS = env('DASK_NUM_WORKERS', cast=int, default=14) DASK_THREADS_PER_WORKER = env('DASK_THREADS_PER_WORKER', cast=int, default=1) +DASK_MEM_PER_WORKER = env('DASK_THREADS_PER_WORKER', cast=float, default=3) # Logging LOGGING = { From 5077edf69e65870dcc91c8c725c72c82900ac8aa Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Mon, 12 May 2025 15:12:13 +1000 Subject: [PATCH 61/66] Remove hardcoded forced extraction skip --- vast_pipeline/pipeline/forced_extraction.py | 22 ++++++++++----------- vast_pipeline/pipeline/utils.py | 21 +++++++++++++------- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/vast_pipeline/pipeline/forced_extraction.py b/vast_pipeline/pipeline/forced_extraction.py index ad983d417..0b5b9a3ba 100644 --- a/vast_pipeline/pipeline/forced_extraction.py +++ b/vast_pipeline/pipeline/forced_extraction.py @@ -174,11 +174,11 @@ def extract_from_image( image = data.pop('path') # create the skycoord obj to pass to the forced extraction # see usage https://github.com/dlakaplan/forced_phot - """ + #""" P_islands = SkyCoord( df["wavg_ra"].to_numpy(), df["wavg_dec"].to_numpy(), unit=(u.deg, u.deg) ) - """ + #""" num_sources = len(df) logger.debug("Will fit %d sources for %s...", num_sources, image) @@ -186,17 +186,17 @@ def extract_from_image( # load the image, background and noisemaps into memory # a dedicated function may seem unneccesary, but will be useful if we # split the load to a separate thread. - """ + #""" forcedphot_input = _forcedphot_preload(image, data.pop('background_path'), data.pop('noise_path'), memmap=False ) - """ - data.pop('background_path') - data.pop('noise_path') + #""" + #data.pop('background_path') + #data.pop('noise_path') FP_timer = StopWatch() - """ + #""" FP = ForcedPhot(*forcedphot_input, use_numba=True) logger.debug("%s - Time to init FP: %.3f s", image, FP_timer.reset()) @@ -215,12 +215,12 @@ def extract_from_image( edge_buffer=edge_buffer, use_clusters=use_clusters ) - """ + #""" logger.debug("%s - Time to measure FP: %.3fs", image, FP_timer.reset()) - flux = np.ones(num_sources) * 5e-3 - flux_err = np.ones(num_sources) * 1e-3 - chisq = np.ones(num_sources) + #flux = np.ones(num_sources) * 5e-3 + #flux_err = np.ones(num_sources) * 1e-3 + #chisq = np.ones(num_sources) num_fits = np.sum(flux>0.0) diff --git a/vast_pipeline/pipeline/utils.py b/vast_pipeline/pipeline/utils.py index 43a79caaa..565e8cd57 100644 --- a/vast_pipeline/pipeline/utils.py +++ b/vast_pipeline/pipeline/utils.py @@ -1261,11 +1261,12 @@ def get_parallel_assoc_image_df( return images_df -def _process_measurements_file(m_file: str, - i: int, - out_dir: str, - associations: pd.DataFrame - ) -> None: +def _process_measurements_file( + m_file: str, + i: int, + out_dir: str, + associations: pd.DataFrame +) -> None: """ Process an individual measurements file and output as a single partition @@ -1278,7 +1279,9 @@ def _process_measurements_file(m_file: str, Returns: None """ + measurements = pd.read_parquet(m_file, engine='pyarrow') + logger.debug(f"Loaded {m_file}") # Memory blows up and everything is slow if we try and do a full merge. # Instead, pull out the indices that are in both dfs and then merge those. @@ -1286,12 +1289,16 @@ def _process_measurements_file(m_file: str, measurements = measurements.loc[ measurements['id'].isin(associations_merge.index) ] + logger.debug(f"{m_file}: pulled out shared indices") measurements = optimise_numeric(measurements) + logger.debug(f"{m_file}: optimised numeric entries") measurements = measurements.merge(associations_merge, right_index=True, left_on='id', how="inner").rename(columns={'source_id': 'source'}) + logger.debug(f"{m_file}: Finished merge") partition_file = os.path.join(out_dir, f'part.{i}.parquet') measurements.to_parquet(partition_file, index=False) + logger.debug(f"{m_file}: Wrote parquet. Finished.") def _repartition_measurements(in_file: str, out_file: str) -> None: """" @@ -1333,7 +1340,7 @@ def create_measurements_parquet_file(p_run: Run, max_workers: Optional[int] = 10 logger.info("Will write to final parquet file to %s.", parquet_file) processed_temp = tempfile.TemporaryDirectory() - logger.debug("Writing temporary data to %s", processed_temp.name) + logger.info("Writing temporary data to %s", processed_temp.name) images = pd.read_parquet( os.path.join( @@ -1350,7 +1357,7 @@ def create_measurements_parquet_file(p_run: Run, max_workers: Optional[int] = 10 'forced*.parquet' )) - logger.info("Will create measurements from %i files...", len(m_files)) + logger.info("Will create measurements parquet from %i files...", len(m_files)) associations = dd.read_parquet( os.path.join( From aa2623763e7fd2596f495d8fb50ffb710c57f30c Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Mon, 12 May 2025 15:13:41 +1000 Subject: [PATCH 62/66] More tweaks --- webinterface/.env.template | 1 + webinterface/settings.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/webinterface/.env.template b/webinterface/.env.template index 595e75266..b7c27f719 100644 --- a/webinterface/.env.template +++ b/webinterface/.env.template @@ -29,6 +29,7 @@ SOCIAL_AUTH_GITHUB_ADMIN_TEAM=fillMeUp # DASK_DASHBOARD_PORT=fillMeUp DASK_NUM_WORKERS=14 DASK_THREADS_PER_WORKER=1 +DASK_MEM_PER_WORKER=1.0 # Pipeline PIPELINE_WORKING_DIR=pipeline-runs diff --git a/webinterface/settings.py b/webinterface/settings.py index 9f21ddf43..f2d6633b9 100644 --- a/webinterface/settings.py +++ b/webinterface/settings.py @@ -253,7 +253,7 @@ DASK_DASHBOARD_PORT = env('DASK_DASHBOARD_PORT', cast=str, default='8787') DASK_NUM_WORKERS = env('DASK_NUM_WORKERS', cast=int, default=14) DASK_THREADS_PER_WORKER = env('DASK_THREADS_PER_WORKER', cast=int, default=1) -DASK_MEM_PER_WORKER = env('DASK_THREADS_PER_WORKER', cast=float, default=3) +DASK_MEM_PER_WORKER = env('DASK_MEM_PER_WORKER', cast=float, default=1.0) # Logging LOGGING = { From 14d6e9c5491c35bd3ac2022d7ec72f3c3f2d114b Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Mon, 12 May 2025 15:14:10 +1000 Subject: [PATCH 63/66] Missing comma --- vast_pipeline/daskmanager/manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vast_pipeline/daskmanager/manager.py b/vast_pipeline/daskmanager/manager.py index 1e409e063..31f6be95d 100644 --- a/vast_pipeline/daskmanager/manager.py +++ b/vast_pipeline/daskmanager/manager.py @@ -25,7 +25,7 @@ def _start_cluster(): threads_per_worker=s.DASK_THREADS_PER_WORKER, host=s.DASK_SCHEDULER_HOST, scheduler_port=int(s.DASK_SCHEDULER_PORT), - memory_limit=float(s.MEM_PER_WORKER) + memory_limit=float(s.MEM_PER_WORKER), dashboard_address=f"{s.DASK_DASHBOARD_HOST}:{s.DASK_DASHBOARD_PORT}", ) client = Client(cluster) From 010f1c7d34370a85e6598e5859e61c1887914ea1 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Mon, 12 May 2025 15:15:01 +1000 Subject: [PATCH 64/66] Fixed naming --- vast_pipeline/daskmanager/manager.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vast_pipeline/daskmanager/manager.py b/vast_pipeline/daskmanager/manager.py index 31f6be95d..02c3ed0ae 100644 --- a/vast_pipeline/daskmanager/manager.py +++ b/vast_pipeline/daskmanager/manager.py @@ -14,7 +14,7 @@ def _start_cluster(): logger.info('Starting local Dask Cluster...') logger.info(f"n_workers: {s.DASK_NUM_WORKERS}") logger.info(f"threads_per_worker: {s.DASK_THREADS_PER_WORKER}") - logger.info(f"memory per worker: {s.MEM_PER_WORKER}") + logger.info(f"memory per worker: {s.DASK_MEM_PER_WORKER}") logger.info(f"scheduler_host: {s.DASK_SCHEDULER_HOST}") logger.info(f"scheduler_port: {s.DASK_SCHEDULER_PORT}") logger.info(f"dashboard_host: {s.DASK_DASHBOARD_HOST}") @@ -25,7 +25,7 @@ def _start_cluster(): threads_per_worker=s.DASK_THREADS_PER_WORKER, host=s.DASK_SCHEDULER_HOST, scheduler_port=int(s.DASK_SCHEDULER_PORT), - memory_limit=float(s.MEM_PER_WORKER), + memory_limit=float(s.DASK_MEM_PER_WORKER), dashboard_address=f"{s.DASK_DASHBOARD_HOST}:{s.DASK_DASHBOARD_PORT}", ) client = Client(cluster) From 2c60f1e6bcd54b6784656e153f8bfbf5ad2ef789 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Wed, 14 May 2025 17:46:16 +1000 Subject: [PATCH 65/66] stash stuff --- vast_pipeline/pipeline/finalise.py | 12 ++++++------ vast_pipeline/pipeline/pairs.py | 24 ++++++++++++------------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/vast_pipeline/pipeline/finalise.py b/vast_pipeline/pipeline/finalise.py index 7064b43f4..76577eb68 100644 --- a/vast_pipeline/pipeline/finalise.py +++ b/vast_pipeline/pipeline/finalise.py @@ -185,9 +185,9 @@ def final_operations( pair_agg_metrics = pair_agg_metrics.set_index("source") # NOTE: this logging check can eventually be removed - pair_metrics_dupes = pair_agg_metrics.index.duplicated(keep=False) - logger.debug("Duplicated pair_agg_metrics:") - logger.debug(pair_agg_metrics[pair_metrics_dupes]) + #pair_metrics_dupes = pair_agg_metrics.index.duplicated(keep=False) + #logger.debug("Duplicated pair_agg_metrics:") + #logger.debug(pair_agg_metrics[pair_metrics_dupes]) # join with sources and replace agg metrics NaNs with 0 as the # DataTables API JSON serialization doesn't like them @@ -199,9 +199,9 @@ def final_operations( }) # NOTE: this logging check can eventually be removed - srcs_df_dupes = srcs_df.index.duplicated(keep=False) - logger.debug("Duplicated srcs_df:") - logger.debug(srcs_df[srcs_df_dupes]) + #srcs_df_dupes = srcs_df.index.duplicated(keep=False) + #logger.debug("Duplicated srcs_df:") + #logger.debug(srcs_df[srcs_df_dupes]) logger.info( "Measurement pair aggregate metrics time: %.2f seconds", diff --git a/vast_pipeline/pipeline/pairs.py b/vast_pipeline/pipeline/pairs.py index 8bf1f9871..9c7930bb2 100644 --- a/vast_pipeline/pipeline/pairs.py +++ b/vast_pipeline/pipeline/pairs.py @@ -145,9 +145,9 @@ def calculate_measurement_pair_metrics( df_pairs = df[["id", "flux_int", "flux_int_err", "flux_peak", "flux_peak_err", "image", "datetime"]].rename(columns={"image": "image_name"}) - logger.debug("df_pairs info:") - logger.debug(df_pairs.columns) - logger.debug(df_pairs.head()) + #logger.debug("df_pairs info:") + #logger.debug(df_pairs.columns) + #logger.debug(df_pairs.head()) # keep record of divisions source_divisions = df_pairs.divisions @@ -157,15 +157,15 @@ def calculate_measurement_pair_metrics( logger.debug(f"n_partitions: {n_partitions}") # NOTE - this check can also probably be removed eventually - def _get_source_ids(partition, partition_info=None): - return pd.DataFrame({'source': partition.index.unique(), 'partition_num': partition_info['number']}) - - source_partition_df = df_pairs.map_partitions(_get_source_ids, meta={'source':str, 'partition_num':float}).compute() - logger.debug("Source partition df:") - logger.debug(source_partition_df) - dupes = source_partition_df['source'].duplicated(keep=False) - logger.debug("Indices in multiple partitions:") - logger.debug(source_partition_df[dupes]) + #def _get_source_ids(partition, partition_info=None): + # return pd.DataFrame({'source': partition.index.unique(), 'partition_num': partition_info['number']}) + + #source_partition_df = df_pairs.map_partitions(_get_source_ids, meta={'source':str, 'partition_num':float}).compute() + #logger.debug("Source partition df:") + #logger.debug(source_partition_df) + #dupes = source_partition_df['source'].duplicated(keep=False) + #logger.debug("Indices in multiple partitions:") + #logger.debug(source_partition_df[dupes]) def _get_pair_partition(partition): partition = partition.sort_values(["source", "datetime"]) From 4e16e5c95f98f184082dd409f4caf41f3c053798 Mon Sep 17 00:00:00 2001 From: Dougal Dobie Date: Wed, 14 May 2025 21:00:56 +1000 Subject: [PATCH 66/66] Fix dask memory management --- vast_pipeline/daskmanager/manager.py | 2 +- webinterface/settings.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/vast_pipeline/daskmanager/manager.py b/vast_pipeline/daskmanager/manager.py index 02c3ed0ae..0d11c1701 100644 --- a/vast_pipeline/daskmanager/manager.py +++ b/vast_pipeline/daskmanager/manager.py @@ -25,7 +25,7 @@ def _start_cluster(): threads_per_worker=s.DASK_THREADS_PER_WORKER, host=s.DASK_SCHEDULER_HOST, scheduler_port=int(s.DASK_SCHEDULER_PORT), - memory_limit=float(s.DASK_MEM_PER_WORKER), + memory_limit=s.DASK_MEM_PER_WORKER, dashboard_address=f"{s.DASK_DASHBOARD_HOST}:{s.DASK_DASHBOARD_PORT}", ) client = Client(cluster) diff --git a/webinterface/settings.py b/webinterface/settings.py index f2d6633b9..29bcab889 100644 --- a/webinterface/settings.py +++ b/webinterface/settings.py @@ -253,7 +253,7 @@ DASK_DASHBOARD_PORT = env('DASK_DASHBOARD_PORT', cast=str, default='8787') DASK_NUM_WORKERS = env('DASK_NUM_WORKERS', cast=int, default=14) DASK_THREADS_PER_WORKER = env('DASK_THREADS_PER_WORKER', cast=int, default=1) -DASK_MEM_PER_WORKER = env('DASK_MEM_PER_WORKER', cast=float, default=1.0) +DASK_MEM_PER_WORKER = env('DASK_MEM_PER_WORKER', cast=str, default='1GB') # Logging LOGGING = {