From d3435bb03682e829fbf9fe1bbe2e2e3df5344528 Mon Sep 17 00:00:00 2001 From: Szymon Szyszkowski <69353402+project-defiant@users.noreply.github.com> Date: Thu, 12 Sep 2024 22:56:24 +0200 Subject: [PATCH] feat: drop airflow orchestration layer from gentropy (#758) * refactor: drop gentropy config * feat(airflow): removal of airflow orchestration BREAKING CHANGE: see https://github.com/opentargets/orchestration --------- Co-authored-by: Szymon Szyszkowski --- config/__init__.py | 3 - config/datasets/ot_gcp.yaml | 80 - config/ot_config.yaml | 5 - config/step/ot_colocalisation_coloc.yaml | 7 - config/step/ot_colocalisation_ecaviar.yaml | 7 - config/step/ot_eqtl_catalogue.yaml | 10 - config/step/ot_gene_index.yaml | 5 - config/step/ot_gwas_catalog_ingestion.yaml | 12 - .../step/ot_gwas_catalog_study_curation.yaml | 8 - .../step/ot_gwas_catalog_study_inclusion.yaml | 12 - config/step/ot_ld_based_clumping.yaml | 7 - config/step/ot_ld_index.yaml | 20 - config/step/ot_locus_to_gene_predict.yaml | 11 - config/step/ot_locus_to_gene_train.yaml | 19 - .../ot_ukb_ppp_eur_sumstat_preprocess.yaml | 13 - config/step/ot_variant_index.yaml | 6 - config/step/ot_variant_to_gene.yaml | 13 - config/step/session/dataproc.yaml | 5 - docs/development/airflow.md | 124 - docs/development/contributing.md | 36 +- docs/development/workflows.md | 27 - mkdocs.yml | 3 +- poetry.lock | 3737 +---------------- pyproject.toml | 8 +- src/airflow/.env | 6 - src/airflow/Dockerfile | 33 - src/airflow/config/.gitkeep | 0 src/airflow/dags/.gitkeep | 0 src/airflow/dags/common_airflow.py | 490 --- src/airflow/dags/configs/dag.yaml | 17 - src/airflow/dags/configs/variant_sources.yaml | 13 - src/airflow/dags/data_validation.py | 96 - src/airflow/dags/eqtl_preprocess.py | 73 - src/airflow/dags/genetics_etl.py | 154 - src/airflow/dags/gnomad_preprocess.py | 29 - .../dags/gwas_catalog_harmonisation.py | 125 - src/airflow/dags/gwas_catalog_preprocess.py | 223 - src/airflow/dags/gwas_curation_update.py | 34 - src/airflow/dags/ukb_ppp_eur.py | 45 - src/airflow/dags/variant_index.py | 321 -- src/airflow/docker-compose.yaml | 228 - src/airflow/logs/.gitkeep | 0 src/airflow/plugins/.gitkeep | 0 src/airflow/requirements.txt | 3 - tests/airflow/test_dag.py | 51 - 45 files changed, 149 insertions(+), 5970 deletions(-) delete mode 100644 config/__init__.py delete mode 100644 config/datasets/ot_gcp.yaml delete mode 100644 config/ot_config.yaml delete mode 100644 config/step/ot_colocalisation_coloc.yaml delete mode 100644 config/step/ot_colocalisation_ecaviar.yaml delete mode 100644 config/step/ot_eqtl_catalogue.yaml delete mode 100644 config/step/ot_gene_index.yaml delete mode 100644 config/step/ot_gwas_catalog_ingestion.yaml delete mode 100644 config/step/ot_gwas_catalog_study_curation.yaml delete mode 100644 config/step/ot_gwas_catalog_study_inclusion.yaml delete mode 100644 config/step/ot_ld_based_clumping.yaml delete mode 100644 config/step/ot_ld_index.yaml delete mode 100644 config/step/ot_locus_to_gene_predict.yaml delete mode 100644 config/step/ot_locus_to_gene_train.yaml delete mode 100644 config/step/ot_ukb_ppp_eur_sumstat_preprocess.yaml delete mode 100644 config/step/ot_variant_index.yaml delete mode 100644 config/step/ot_variant_to_gene.yaml delete mode 100644 config/step/session/dataproc.yaml delete mode 100644 docs/development/airflow.md delete mode 100644 docs/development/workflows.md delete mode 100644 src/airflow/.env delete mode 100644 src/airflow/Dockerfile delete mode 100644 src/airflow/config/.gitkeep delete mode 100644 src/airflow/dags/.gitkeep delete mode 100644 src/airflow/dags/common_airflow.py delete mode 100644 src/airflow/dags/configs/dag.yaml delete mode 100644 src/airflow/dags/configs/variant_sources.yaml delete mode 100644 src/airflow/dags/data_validation.py delete mode 100644 src/airflow/dags/eqtl_preprocess.py delete mode 100644 src/airflow/dags/genetics_etl.py delete mode 100644 src/airflow/dags/gnomad_preprocess.py delete mode 100644 src/airflow/dags/gwas_catalog_harmonisation.py delete mode 100644 src/airflow/dags/gwas_catalog_preprocess.py delete mode 100644 src/airflow/dags/gwas_curation_update.py delete mode 100644 src/airflow/dags/ukb_ppp_eur.py delete mode 100644 src/airflow/dags/variant_index.py delete mode 100644 src/airflow/docker-compose.yaml delete mode 100644 src/airflow/logs/.gitkeep delete mode 100644 src/airflow/plugins/.gitkeep delete mode 100644 src/airflow/requirements.txt delete mode 100644 tests/airflow/test_dag.py diff --git a/config/__init__.py b/config/__init__.py deleted file mode 100644 index 31939863f..000000000 --- a/config/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -"""Reference configuration yamls.""" - -from __future__ import annotations diff --git a/config/datasets/ot_gcp.yaml b/config/datasets/ot_gcp.yaml deleted file mode 100644 index a8d8886bb..000000000 --- a/config/datasets/ot_gcp.yaml +++ /dev/null @@ -1,80 +0,0 @@ -# Release specific configuration: -release_version: "24.06" -dev_version: XX.XX -release_folder: gs://genetics_etl_python_playground/releases/${datasets.release_version} - -inputs: gs://genetics_etl_python_playground/input -static_assets: gs://genetics_etl_python_playground/static_assets -outputs: gs://genetics_etl_python_playground/output/python_etl/parquet/${datasets.dev_version} - -## Datasets: -# GWAS -gwas_catalog_dataset: gs://gwas_catalog_data -# Ingestion input files: -gwas_catalog_associations: ${datasets.gwas_catalog_dataset}/curated_inputs/gwas_catalog_associations_ontology_annotated.tsv -gwas_catalog_studies: - - ${datasets.gwas_catalog_dataset}/curated_inputs/gwas_catalog_download_studies.tsv - - ${datasets.gwas_catalog_dataset}/curated_inputs/gwas_catalog_unpublished_studies.tsv -gwas_catalog_ancestries: - - ${datasets.gwas_catalog_dataset}/curated_inputs/gwas_catalog_download_ancestries.tsv - - ${datasets.gwas_catalog_dataset}/curated_inputs/gwas_catalog_unpublished_ancestries.tsv -gwas_catalog_sumstats_lut: ${datasets.gwas_catalog_dataset}/curated_inputs/harmonised_list.txt -gwas_catalog_study_curation: ${datasets.gwas_catalog_dataset}/manifests/gwas_catalog_study_curation.tsv -# Harmonised summary statistics list: -gwas_catalog_summary_stats_list: ${datasets.gwas_catalog_dataset}/manifests/gwas_catalog_harmonised_summary_statistics_list.txt -# Inclusion lists: -gwas_catalog_curated_inclusion_list: ${datasets.gwas_catalog_dataset}/manifests/gwas_catalog_curation_included_studies -gwas_catalog_summary_statistics_inclusion_list: ${datasets.gwas_catalog_dataset}/manifests/gwas_catalog_summary_statistics_included_studies -# Ingestion output folders: -gwas_catalog_study_index: ${datasets.gwas_catalog_dataset}/study_index -gwas_catalog_study_locus_folder: ${datasets.gwas_catalog_dataset}/study_locus_datasets -gwas_catalog_credible_set_folder: ${datasets.gwas_catalog_dataset}/credible_set_datasets - -# GnomAD -gnomad_public_bucket: gs://gcp-public-data--gnomad/release/ -# LD generation -# Templates require placeholders {POP} to expand template to match multiple populationwise paths -ld_matrix_template: ${datasets.gnomad_public_bucket}/2.1.1/ld/gnomad.genomes.r2.1.1.{POP}.common.adj.ld.bm -ld_index_raw_template: ${datasets.gnomad_public_bucket}/2.1.1/ld/gnomad.genomes.r2.1.1.{POP}.common.ld.variant_indices.ht -liftover_ht_path: ${datasets.gnomad_public_bucket}/2.1.1/liftover_grch38/ht/genomes/gnomad.genomes.r2.1.1.sites.liftover_grch38.ht -# GnomAD variant set: -gnomad_genomes_path: ${datasets.gnomad_public_bucket}4.0/ht/genomes/gnomad.genomes.v4.0.sites.ht/ - -# Others -chain_38_37: gs://hail-common/references/grch38_to_grch37.over.chain.gz -chain_37_38: ${datasets.static_assets}/grch37_to_grch38.over.chain -vep_consequences: ${datasets.static_assets}/variant_consequence_to_score.tsv -anderson: ${datasets.static_assets}/andersson2014/enhancer_tss_associations.bed -javierre: ${datasets.static_assets}/javierre_2016_preprocessed -jung: ${datasets.static_assets}/jung2019_pchic_tableS3.csv -thurman: ${datasets.static_assets}/thurman2012/genomewideCorrs_above0.7_promoterPlusMinus500kb_withGeneNames_32celltypeCategories.bed8.gz -target_index: ${datasets.static_assets}/targets # OTP 23.12 data -gene_interactions: ${datasets.static_assets}/interaction # OTP 23.12 data - -# Dev output datasets -gnomad_variants: ${datasets.static_assets}/gnomad_variants -study_locus: ${datasets.outputs}/study_locus -summary_statistics: ${datasets.outputs}/summary_statistics -study_locus_overlap: ${datasets.outputs}/study_locus_overlap -susie_finemapping: ${datasets.outputs}/finngen_susie_finemapping - -ld_index: ${datasets.static_assets}/ld_index -catalog_study_index: ${datasets.study_index}/catalog -catalog_study_locus: ${datasets.study_locus}/catalog_study_locus - -from_sumstats_study_locus: ${datasets.study_locus}/from_sumstats -from_sumstats_pics: ${datasets.credible_set}/from_sumstats - -vep_output_path: gs://genetics_etl_python_playground/vep/full_variant_index_vcf - -# ETL output datasets: -l2g_gold_standard_curation: ${datasets.release_folder}/locus_to_gene_gold_standard.json -l2g_model: ${datasets.release_folder}/locus_to_gene_model/classifier.skops -l2g_predictions: ${datasets.release_folder}/locus_to_gene_predictions -l2g_feature_matrix: ${datasets.release_folder}/locus_to_gene_feature_matrix -colocalisation: ${datasets.release_folder}/colocalisation -study_index: ${datasets.release_folder}/study_index -variant_index: ${datasets.release_folder}/variant_index -credible_set: ${datasets.release_folder}/credible_set -gene_index: ${datasets.release_folder}/gene_index -variant_to_gene: ${datasets.release_folder}/variant_to_gene diff --git a/config/ot_config.yaml b/config/ot_config.yaml deleted file mode 100644 index 7f28a58d6..000000000 --- a/config/ot_config.yaml +++ /dev/null @@ -1,5 +0,0 @@ -defaults: - - config - - datasets: ot_gcp - - _self_ - - override step/session: dataproc diff --git a/config/step/ot_colocalisation_coloc.yaml b/config/step/ot_colocalisation_coloc.yaml deleted file mode 100644 index f01335514..000000000 --- a/config/step/ot_colocalisation_coloc.yaml +++ /dev/null @@ -1,7 +0,0 @@ -defaults: - - colocalisation - -credible_set_path: ${datasets.credible_set} -study_index_path: ${datasets.study_index} -coloc_path: ${datasets.colocalisation} -colocalisation_method: Coloc diff --git a/config/step/ot_colocalisation_ecaviar.yaml b/config/step/ot_colocalisation_ecaviar.yaml deleted file mode 100644 index d57887c93..000000000 --- a/config/step/ot_colocalisation_ecaviar.yaml +++ /dev/null @@ -1,7 +0,0 @@ -defaults: - - colocalisation - -credible_set_path: ${datasets.credible_set} -study_index_path: ${datasets.study_index} -coloc_path: ${datasets.colocalisation} -colocalisation_method: ECaviar diff --git a/config/step/ot_eqtl_catalogue.yaml b/config/step/ot_eqtl_catalogue.yaml deleted file mode 100644 index 7d4441864..000000000 --- a/config/step/ot_eqtl_catalogue.yaml +++ /dev/null @@ -1,10 +0,0 @@ -defaults: - - eqtl_catalogue - -eqtl_catalogue_paths_imported: ??? -eqtl_catalogue_study_index_out: ??? -eqtl_catalogue_credible_sets_out: ??? -mqtl_quantification_methods_blacklist: [] -session: - extended_spark_conf: - "spark.sql.shuffle.partitions": "3200" diff --git a/config/step/ot_gene_index.yaml b/config/step/ot_gene_index.yaml deleted file mode 100644 index ce5971bf9..000000000 --- a/config/step/ot_gene_index.yaml +++ /dev/null @@ -1,5 +0,0 @@ -defaults: - - gene_index - -target_path: ${datasets.target_index} -gene_index_path: ${datasets.gene_index} diff --git a/config/step/ot_gwas_catalog_ingestion.yaml b/config/step/ot_gwas_catalog_ingestion.yaml deleted file mode 100644 index 8acc07d62..000000000 --- a/config/step/ot_gwas_catalog_ingestion.yaml +++ /dev/null @@ -1,12 +0,0 @@ -defaults: - - gwas_catalog_ingestion - -catalog_study_files: ${datasets.gwas_catalog_studies} -catalog_ancestry_files: ${datasets.gwas_catalog_ancestries} -catalog_associations_file: ${datasets.gwas_catalog_associations} -catalog_sumstats_lut: ${datasets.gwas_catalog_sumstats_lut} -variant_annotation_path: ${datasets.gnomad_variants} -catalog_studies_out: ${datasets.gwas_catalog_study_index} -catalog_associations_out: ${datasets.gwas_catalog_study_locus_folder}/gwas_catalog_curated_associations -gwas_catalog_study_curation_file: ${datasets.gwas_catalog_study_curation} -inclusion_list_path: ${datasets.gwas_catalog_curated_inclusion_list} diff --git a/config/step/ot_gwas_catalog_study_curation.yaml b/config/step/ot_gwas_catalog_study_curation.yaml deleted file mode 100644 index 77c1d7834..000000000 --- a/config/step/ot_gwas_catalog_study_curation.yaml +++ /dev/null @@ -1,8 +0,0 @@ -defaults: - - gwas_catalog_study_curation - -catalog_study_files: ${datasets.gwas_catalog_studies} -catalog_ancestry_files: ${datasets.gwas_catalog_ancestries} -catalog_sumstats_lut: ${datasets.gwas_catalog_sumstats_lut} -gwas_catalog_study_curation_file: ${datasets.gwas_catalog_study_curation} -gwas_catalog_study_curation_out: ??? diff --git a/config/step/ot_gwas_catalog_study_inclusion.yaml b/config/step/ot_gwas_catalog_study_inclusion.yaml deleted file mode 100644 index 41590333c..000000000 --- a/config/step/ot_gwas_catalog_study_inclusion.yaml +++ /dev/null @@ -1,12 +0,0 @@ -defaults: - - gwas_catalog_study_inclusion - -catalog_study_files: ${datasets.gwas_catalog_studies} -catalog_ancestry_files: ${datasets.gwas_catalog_ancestries} -catalog_associations_file: ${datasets.gwas_catalog_associations} -variant_annotation_path: ${datasets.gnomad_variants} -gwas_catalog_study_curation_file: ${datasets.gwas_catalog_study_curation} -harmonised_study_file: ${datasets.gwas_catalog_summary_stats_list} -criteria: ??? -inclusion_list_path: ??? -exclusion_list_path: ??? diff --git a/config/step/ot_ld_based_clumping.yaml b/config/step/ot_ld_based_clumping.yaml deleted file mode 100644 index f836145c2..000000000 --- a/config/step/ot_ld_based_clumping.yaml +++ /dev/null @@ -1,7 +0,0 @@ -defaults: - - ld_based_clumping - -ld_index_path: ${datasets.ld_index}/2.1.1 -study_locus_input_path: ??? -study_index_path: ??? -clumped_study_locus_output_path: ??? diff --git a/config/step/ot_ld_index.yaml b/config/step/ot_ld_index.yaml deleted file mode 100644 index d17a0777c..000000000 --- a/config/step/ot_ld_index.yaml +++ /dev/null @@ -1,20 +0,0 @@ -defaults: - - ld_index - -ld_index_out: ${datasets.ld_index} -ld_matrix_template: ${datasets.ld_matrix_template} -ld_index_raw_template: ${datasets.ld_index_raw_template} -grch37_to_grch38_chain_path: ${datasets.chain_37_38} -liftover_ht_path: ${datasets.liftover_ht_path} -ld_populations: - - afr # African-American - - amr # American Admixed/Latino - - asj # Ashkenazi Jewish - - eas # East Asian - - est # Estonian - - fin # Finnish - - nfe # Non-Finnish European - - nwe # Northwestern European - - seu # Southeastern European -# The version will of the gnomad will be inferred from ld_matrix_template and appended to the ld_index_out. -use_version_from_input: true diff --git a/config/step/ot_locus_to_gene_predict.yaml b/config/step/ot_locus_to_gene_predict.yaml deleted file mode 100644 index c3cb88b59..000000000 --- a/config/step/ot_locus_to_gene_predict.yaml +++ /dev/null @@ -1,11 +0,0 @@ -defaults: - - locus_to_gene - -run_mode: predict -model_path: null -predictions_path: ${datasets.l2g_predictions} -feature_matrix_path: ${datasets.l2g_feature_matrix} -credible_set_path: ${datasets.credible_set} -variant_gene_path: ${datasets.variant_to_gene} -colocalisation_path: ${datasets.colocalisation} -study_index_path: ${datasets.study_index} diff --git a/config/step/ot_locus_to_gene_train.yaml b/config/step/ot_locus_to_gene_train.yaml deleted file mode 100644 index b59a24dae..000000000 --- a/config/step/ot_locus_to_gene_train.yaml +++ /dev/null @@ -1,19 +0,0 @@ -defaults: - - locus_to_gene - -run_mode: train -wandb_run_name: null -hf_hub_repo_id: opentargets/locus_to_gene -model_path: ${datasets.l2g_model} -predictions_path: ${datasets.l2g_predictions} -credible_set_path: ${datasets.credible_set} -variant_gene_path: ${datasets.variant_to_gene} -colocalisation_path: ${datasets.colocalisation} -study_index_path: ${datasets.study_index} -gold_standard_curation_path: ${datasets.l2g_gold_standard_curation} -gene_interactions_path: ${datasets.gene_interactions} -hyperparameters: - n_estimators: 100 - max_depth: 5 - loss: log_loss -download_from_hub: true diff --git a/config/step/ot_ukb_ppp_eur_sumstat_preprocess.yaml b/config/step/ot_ukb_ppp_eur_sumstat_preprocess.yaml deleted file mode 100644 index 24da7bad0..000000000 --- a/config/step/ot_ukb_ppp_eur_sumstat_preprocess.yaml +++ /dev/null @@ -1,13 +0,0 @@ -defaults: - - ukb_ppp_eur_sumstat_preprocess - -raw_study_index_path_from_tsv: ??? -raw_summary_stats_path: ??? -variant_annotation_path: ??? -tmp_variant_annotation_path: ??? -study_index_output_path: ??? -summary_stats_output_path: ??? - -session: - extended_spark_conf: - "spark.sql.shuffle.partitions": "3200" diff --git a/config/step/ot_variant_index.yaml b/config/step/ot_variant_index.yaml deleted file mode 100644 index 00b6b1602..000000000 --- a/config/step/ot_variant_index.yaml +++ /dev/null @@ -1,6 +0,0 @@ -defaults: - - variant_index - -vep_output_json_path: ${datasets.vep_output_path} -gnomad_variant_annotations_path: ${datasets.gnomad_variants} -variant_index_path: ${datasets.variant_index} diff --git a/config/step/ot_variant_to_gene.yaml b/config/step/ot_variant_to_gene.yaml deleted file mode 100644 index 7187a0625..000000000 --- a/config/step/ot_variant_to_gene.yaml +++ /dev/null @@ -1,13 +0,0 @@ -defaults: - - variant_to_gene - -variant_index_path: ${datasets.variant_index} -gene_index_path: ${datasets.gene_index} -vep_consequences_path: ${datasets.vep_consequences} -liftover_chain_file_path: ${datasets.chain_37_38} -interval_sources: - andersson: ${datasets.anderson} - javierre: ${datasets.javierre} - jung: ${datasets.jung} - thurman: ${datasets.thurman} -v2g_path: ${datasets.variant_to_gene} diff --git a/config/step/session/dataproc.yaml b/config/step/session/dataproc.yaml deleted file mode 100644 index 6ac641718..000000000 --- a/config/step/session/dataproc.yaml +++ /dev/null @@ -1,5 +0,0 @@ -defaults: - - base_session - -spark_uri: yarn -write_mode: errorifexists diff --git a/docs/development/airflow.md b/docs/development/airflow.md deleted file mode 100644 index ff5f7906c..000000000 --- a/docs/development/airflow.md +++ /dev/null @@ -1,124 +0,0 @@ -# Airflow configuration - -This section describes how to set up a local Airflow server which will orchestrate running workflows in Google Cloud Platform. This is useful for testing and debugging, but for production use, it is recommended to run Airflow on a dedicated server. - -## Install pre-requisites - -- [Docker](https://docs.docker.com/get-docker/) -- [Google Cloud SDK](https://cloud.google.com/sdk/docs/install) - -!!! warning macOS Docker memory allocation - - On macOS, the default amount of memory available for Docker might not be enough to get Airflow up and running. Allocate at least 4GB of memory for the Docker Engine (ideally 8GB). [More info](https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html#) - -## Configure Airflow access to Google Cloud Platform - -!!! warning Specifying Google Cloud parameters - - Run the next two command with the appropriate Google Cloud project ID and service account name to ensure the correct Google default application credentials are set up. - -Authenticate to Google Cloud: - -```bash -gcloud auth application-default login --project= -``` - -Create the service account key file that will be used by Airflow to access Google Cloud Platform resources: - -```bash -gcloud iam service-accounts keys create ~/.config/gcloud/service_account_credentials.json --iam-account=@appspot.gserviceaccount.com -``` - -## Set up Airflow - -Change the working directory so that all subsequent commands will work: - -```bash -cd src/airflow -``` - -### Build Docker image - -!!! note Custom Docker image for Airflow - - The custom Dockerfile built by the command below extends the official [Airflow Docker Compose YAML](https://airflow.apache.org/docs/apache-airflow/stable/docker-compose.yaml). We add support for Google Cloud SDK, Google Dataproc operators, and access to GCP credentials. - -```bash -docker build . --tag extending_airflow:latest -``` - -### Set Airflow user ID - -!!! note Setting Airflow user ID - - These commands allow Airflow running inside Docker to access the credentials file which was generated earlier. - -```bash -# If any user ID is already specified in .env, remove it. -grep -v "AIRFLOW_UID" .env > .env.tmp -# Add the correct user ID. -echo "AIRFLOW_UID=$(id -u)" >> .env.tmp -# Move the file. -mv .env.tmp .env -``` - -### Initialise - -Before starting Airflow, initialise the database: - -```bash -docker compose up airflow-init -``` - -Now start all services: - -```bash -docker compose up -d -``` - -Airflow UI will now be available at `http://localhost:8080/`. Default username and password are both `airflow`. - -For additional information on how to use Airflow visit the [official documentation](https://airflow.apache.org/docs/apache-airflow/stable/index.html). - -### Cleaning up - -At any time, you can check the status of your containers with: - -```bash -docker ps -``` - -To stop Airflow, run: - -```bash -docker compose down -``` - -To cleanup the Airflow database, run: - -```bash -docker compose down --volumes --remove-orphans -``` - -### Advanced configuration - -More information on running Airflow with Docker Compose can be found in the [official docs](https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html). - -1. **Increase Airflow concurrency**. Modify the `docker-compose.yaml` and add the following to the x-airflow-common → environment section: - - ```yaml - AIRFLOW__CORE__PARALLELISM: 32 - AIRFLOW__CORE__MAX_ACTIVE_TASKS_PER_DAG: 32 - AIRFLOW__SCHEDULER__MAX_TIS_PER_QUERY: 16 - AIRFLOW__CORE__MAX_ACTIVE_RUNS_PER_DAG: 1 - # Also add the following line if you are using CeleryExecutor (by default, LocalExecutor is used). - AIRFLOW__CELERY__WORKER_CONCURRENCY: 32 - ``` - -1. **Additional pip packages**. They can be added to the `requirements.txt` file. - -## Troubleshooting - -Note that when you a a new workflow under `dags/`, Airflow will not pick that up immediately. By default the filesystem is only scanned for new DAGs every 300s. However, once the DAG is added, updates are applied nearly instantaneously. - -Also, if you edit the DAG while an instance of it is running, it might cause problems with the run, as Airflow will try to update the tasks and their properties in DAG according to the file changes. diff --git a/docs/development/contributing.md b/docs/development/contributing.md index 3a363210f..acbb8f2a7 100644 --- a/docs/development/contributing.md +++ b/docs/development/contributing.md @@ -18,7 +18,7 @@ For Google Cloud configuration: Check that you have the `make` utility installed, and if not (which is unlikely), install it using your system package manager. -Check that you have `java` installed. +Check that you have `java` installed. To be able to use all features including hail support use java 11. ## Environment configuration @@ -26,30 +26,19 @@ Run `make setup-dev` to install/update the necessary packages and activate the d It is recommended to use VS Code as an IDE for development. -## How to run the code +## How to create gentropy step -All pipelines in this repository are intended to be run in Google Dataproc. Running them locally is not currently supported. +All gentropy steps can be invoked after successful environment configuration by running -In order to run the code: +```python +poetry run gentropy step= +``` -1. Manually edit your local `src/airflow/dags/*` file and comment out the steps you do not want to run. +1. Create a new step config in the `src/gentropy/config.py` that inherits from `StepConfig` class. -2. Manually edit your local `pyproject.toml` file and modify the version of the code. +2. Register new step configuration to `ConfigStore`. - - This must be different from the version used by any other people working on the repository to avoid any deployment conflicts, so it's a good idea to use your name, for example: `1.2.3+jdoe`. - - You can also add a brief branch description, for example: `1.2.3+jdoe.myfeature`. - - Note that the version must comply with [PEP440 conventions](https://peps.python.org/pep-0440/#normalization), otherwise Poetry will not allow it to be deployed. - - Do not use underscores or hyphens in your version name. When building the WHL file, they will be automatically converted to dots, which means the file name will no longer match the version and the build will fail. Use dots instead. - -3. Manually edit your local `src/airflow/dags/common_airflow.py` and set `GENTROPY_VERSION` to the same version as you did in the previous step. - -4. Run `make build`. - - - This will create a bundle containing the neccessary code, configuration and dependencies to run the ETL pipeline, and then upload this bundle to Google Cloud. - - A version specific subpath is used, so uploading the code will not affect any branches but your own. - - If there was already a code bundle uploaded with the same version number, it will be replaced. - -5. Open Airflow UI and run the DAG. +3. Create a step class that holds the business logic in new file in the `src/gentropy`. ## Contributing checklist @@ -72,8 +61,7 @@ For more details on each of these steps, see the sections below. ### Configuration -- Input and output paths in `config/datasets/ot_gcp.yaml` -- Step configuration, for example: `config/step/ot_finngen_sumstat_preprocess.yaml` +- step default configuration in the `src/gentropy/config/` `StepConfig` derived classes. ### Classes @@ -87,6 +75,6 @@ For more details on each of these steps, see the sections below. - Test sample data, for example: `tests/gentropy/data_samples/finngen_studies_sample.json` - Test definition, for example: `tests/dataset/test_study_index.py` → `test_study_index_finngen_creation`) -### Orchestration +### Airflow dags -- Airflow DAG, for example: `src/airflow/dags/finngen_harmonisation.py` +- Upstream of version 2.0.0 airflow orchestration layer was moved to the [orchestration repository](https://github.com/opentargets/orchestration) diff --git a/docs/development/workflows.md b/docs/development/workflows.md deleted file mode 100644 index 2269041d8..000000000 --- a/docs/development/workflows.md +++ /dev/null @@ -1,27 +0,0 @@ -# Pipeline workflows - -This page describes the high level components of the pipeline, which are organised as Airflow DAGs (directed acyclic graphs). - -## Note on DAGs and Dataproc clusters - -Each DAG consists of the following general stages: - -1. Create cluster (if it already exists, this step is skipped) - -1. Install dependencies on the cluster - -1. Run data processing steps for this DAG - -1. Delete the cluster - -Within a DAG, all data processing steps run on the same Dataproc cluster as separate jobs. - -There is no need to configure DAGs or steps depending on the size of the input data. Clusters have autoscaling enabled, which means they will increase or decrease the number of worker VMs to accommodate the load. - -## DAG 1: Preprocess - -This DAG contains steps which are only supposed to be run once, or very rarely. They ingest external data and apply bespoke transformations specific for each particular data source. The output is normalised according to the data schemas used by the pipeline. - -## DAG 2: ETL - -The ETL DAG takes the inputs of the previous step and performs the main algorithmic processing. This processing is supposed to be data source agnostic. diff --git a/mkdocs.yml b/mkdocs.yml index 180c6fbe1..3704ed274 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -48,7 +48,8 @@ markdown_extensions: - pymdownx.tabbed: alternate_style: true combine_header_slug: true - + - pymdownx.tasklist: + custom_checkbox: true hooks: - src/utils/schemadocs.py diff --git a/poetry.lock b/poetry.lock index 2ba1390ce..0df0da543 100644 --- a/poetry.lock +++ b/poetry.lock @@ -14,17 +14,6 @@ files = [ [package.dependencies] pycares = ">=3.0.0" -[[package]] -name = "aiofiles" -version = "23.2.1" -description = "File support for asyncio." -optional = false -python-versions = ">=3.7" -files = [ - {file = "aiofiles-23.2.1-py3-none-any.whl", hash = "sha256:19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107"}, - {file = "aiofiles-23.2.1.tar.gz", hash = "sha256:84ec2218d8419404abcb9f0c02df3f34c6e0a68ed41072acfb1cef5cbc29051a"}, -] - [[package]] name = "aiohttp" version = "3.9.5" @@ -135,36 +124,6 @@ files = [ [package.dependencies] frozenlist = ">=1.1.0" -[[package]] -name = "alembic" -version = "1.13.1" -description = "A database migration tool for SQLAlchemy." -optional = false -python-versions = ">=3.8" -files = [ - {file = "alembic-1.13.1-py3-none-any.whl", hash = "sha256:2edcc97bed0bd3272611ce3a98d98279e9c209e7186e43e75bbb1b2bdfdbcc43"}, - {file = "alembic-1.13.1.tar.gz", hash = "sha256:4932c8558bf68f2ee92b9bbcb8218671c627064d5b08939437af6d77dc05e595"}, -] - -[package.dependencies] -Mako = "*" -SQLAlchemy = ">=1.3.0" -typing-extensions = ">=4" - -[package.extras] -tz = ["backports.zoneinfo"] - -[[package]] -name = "annotated-types" -version = "0.7.0" -description = "Reusable constraint types to use with typing.Annotated" -optional = false -python-versions = ">=3.8" -files = [ - {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, - {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, -] - [[package]] name = "antlr4-python3-runtime" version = "4.9.3" @@ -175,493 +134,6 @@ files = [ {file = "antlr4-python3-runtime-4.9.3.tar.gz", hash = "sha256:f224469b4168294902bb1efa80a8bf7855f24c99aef99cbefc1bcd3cce77881b"}, ] -[[package]] -name = "anyio" -version = "4.4.0" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -optional = false -python-versions = ">=3.8" -files = [ - {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, - {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, -] - -[package.dependencies] -exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} -idna = ">=2.8" -sniffio = ">=1.1" -typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} - -[package.extras] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (>=0.23)"] - -[[package]] -name = "apache-airflow" -version = "2.9.2" -description = "Programmatically author, schedule and monitor data pipelines" -optional = false -python-versions = "<3.13,~=3.8" -files = [ - {file = "apache_airflow-2.9.2-py3-none-any.whl", hash = "sha256:6fd6501b1622ab58f4a3c1fc5bed4c216bd36915243bb9445b54415c3e625200"}, - {file = "apache_airflow-2.9.2.tar.gz", hash = "sha256:c5d7b4bbcbc4d7b2bb3433af2d9307a3f3dc0b142c25fdbe8f187dd4cad5521d"}, -] - -[package.dependencies] -alembic = ">=1.13.1,<2.0" -apache-airflow-providers-common-io = "*" -apache-airflow-providers-common-sql = "*" -apache-airflow-providers-fab = ">=1.0.2" -apache-airflow-providers-ftp = "*" -apache-airflow-providers-http = "*" -apache-airflow-providers-imap = "*" -apache-airflow-providers-smtp = "*" -apache-airflow-providers-sqlite = "*" -argcomplete = ">=1.10" -asgiref = "*" -attrs = ">=22.1.0" -blinker = ">=1.6.2" -colorlog = ">=4.0.2,<5.0" -configupdater = ">=3.1.1" -connexion = {version = ">=2.10.0,<3.0", extras = ["flask"]} -cron-descriptor = ">=1.2.24" -croniter = ">=2.0.2" -cryptography = ">=39.0.0" -deprecated = ">=1.2.13" -dill = ">=0.2.2" -flask = ">=2.2,<2.3" -flask-caching = ">=1.5.0" -flask-session = ">=0.4.0,<0.6" -flask-wtf = ">=0.15" -fsspec = ">=2023.10.0" -google-re2 = ">=1.0" -gunicorn = ">=20.1.0" -httpx = "*" -importlib_metadata = {version = ">=6.5", markers = "python_version < \"3.12\""} -itsdangerous = ">=2.0" -jinja2 = ">=3.0.0" -jsonschema = ">=4.18.0" -lazy-object-proxy = "*" -linkify-it-py = ">=2.0.0" -lockfile = ">=0.12.2" -markdown-it-py = ">=2.1.0" -markupsafe = ">=1.1.1" -marshmallow-oneofschema = ">=2.0.1" -mdit-py-plugins = ">=0.3.0" -methodtools = ">=0.4.7" -opentelemetry-api = ">=1.15.0" -opentelemetry-exporter-otlp = "*" -packaging = ">=14.0" -pathspec = ">=0.9.0" -pendulum = ">=2.1.2,<4.0" -pluggy = ">=1.0" -psutil = ">=4.2.0" -pygments = ">=2.0.1" -pyjwt = ">=2.0.0" -python-daemon = ">=3.0.0" -python-dateutil = ">=2.3" -python-nvd3 = ">=0.15.0" -python-slugify = ">=5.0" -requests = ">=2.27.0,<3" -rfc3339-validator = ">=0.1.4" -rich = ">=12.4.4" -rich-argparse = ">=1.0.0" -setproctitle = ">=1.1.8" -sqlalchemy = ">=1.4.36,<2.0" -sqlalchemy-jsonfield = ">=1.0" -tabulate = ">=0.7.5" -tenacity = ">=6.2.0,<8.2.0 || >8.2.0" -termcolor = ">=1.1.0" -unicodecsv = ">=0.14.1" -universal-pathlib = ">=0.2.2" -werkzeug = ">=2.0,<3" - -[package.extras] -aiobotocore = ["aiobotocore (>=2.7.0)"] -airbyte = ["apache-airflow-providers-airbyte"] -alibaba = ["apache-airflow-providers-alibaba"] -all = ["apache-airflow[aiobotocore]", "apache-airflow[airbyte]", "apache-airflow[alibaba]", "apache-airflow[all-dbs]", "apache-airflow[amazon]", "apache-airflow[apache-atlas]", "apache-airflow[apache-beam]", "apache-airflow[apache-cassandra]", "apache-airflow[apache-drill]", "apache-airflow[apache-druid]", "apache-airflow[apache-flink]", "apache-airflow[apache-hdfs]", "apache-airflow[apache-hive]", "apache-airflow[apache-impala]", "apache-airflow[apache-kafka]", "apache-airflow[apache-kylin]", "apache-airflow[apache-livy]", "apache-airflow[apache-pig]", "apache-airflow[apache-pinot]", "apache-airflow[apache-spark]", "apache-airflow[apache-webhdfs]", "apache-airflow[apprise]", "apache-airflow[arangodb]", "apache-airflow[asana]", "apache-airflow[async]", "apache-airflow[atlassian-jira]", "apache-airflow[celery]", "apache-airflow[cgroups]", "apache-airflow[cloudant]", "apache-airflow[cncf-kubernetes]", "apache-airflow[cohere]", "apache-airflow[common-io]", "apache-airflow[common-sql]", "apache-airflow[databricks]", "apache-airflow[datadog]", "apache-airflow[dbt-cloud]", "apache-airflow[deprecated-api]", "apache-airflow[dingding]", "apache-airflow[discord]", "apache-airflow[docker]", "apache-airflow[elasticsearch]", "apache-airflow[exasol]", "apache-airflow[fab]", "apache-airflow[facebook]", "apache-airflow[ftp]", "apache-airflow[github-enterprise]", "apache-airflow[github]", "apache-airflow[google-auth]", "apache-airflow[google]", "apache-airflow[graphviz]", "apache-airflow[grpc]", "apache-airflow[hashicorp]", "apache-airflow[http]", "apache-airflow[imap]", "apache-airflow[influxdb]", "apache-airflow[jdbc]", "apache-airflow[jenkins]", "apache-airflow[kerberos]", "apache-airflow[ldap]", "apache-airflow[leveldb]", "apache-airflow[microsoft-azure]", "apache-airflow[microsoft-mssql]", "apache-airflow[microsoft-psrp]", "apache-airflow[microsoft-winrm]", "apache-airflow[mongo]", "apache-airflow[mysql]", "apache-airflow[neo4j]", "apache-airflow[odbc]", "apache-airflow[openai]", "apache-airflow[openfaas]", "apache-airflow[openlineage]", "apache-airflow[opensearch]", "apache-airflow[opsgenie]", "apache-airflow[oracle]", "apache-airflow[otel]", "apache-airflow[pagerduty]", "apache-airflow[pandas]", "apache-airflow[papermill]", "apache-airflow[password]", "apache-airflow[pgvector]", "apache-airflow[pinecone]", "apache-airflow[postgres]", "apache-airflow[presto]", "apache-airflow[pydantic]", "apache-airflow[qdrant]", "apache-airflow[rabbitmq]", "apache-airflow[redis]", "apache-airflow[s3fs]", "apache-airflow[salesforce]", "apache-airflow[samba]", "apache-airflow[saml]", "apache-airflow[segment]", "apache-airflow[sendgrid]", "apache-airflow[sentry]", "apache-airflow[sftp]", "apache-airflow[singularity]", "apache-airflow[slack]", "apache-airflow[smtp]", "apache-airflow[snowflake]", "apache-airflow[sqlite]", "apache-airflow[ssh]", "apache-airflow[statsd]", "apache-airflow[tableau]", "apache-airflow[tabular]", "apache-airflow[telegram]", "apache-airflow[teradata]", "apache-airflow[trino]", "apache-airflow[uv]", "apache-airflow[vertica]", "apache-airflow[virtualenv]", "apache-airflow[weaviate]", "apache-airflow[yandex]", "apache-airflow[zendesk]"] -all-core = ["apache-airflow[aiobotocore]", "apache-airflow[apache-atlas]", "apache-airflow[apache-webhdfs]", "apache-airflow[async]", "apache-airflow[cgroups]", "apache-airflow[deprecated-api]", "apache-airflow[github-enterprise]", "apache-airflow[google-auth]", "apache-airflow[graphviz]", "apache-airflow[kerberos]", "apache-airflow[ldap]", "apache-airflow[leveldb]", "apache-airflow[otel]", "apache-airflow[pandas]", "apache-airflow[password]", "apache-airflow[pydantic]", "apache-airflow[rabbitmq]", "apache-airflow[s3fs]", "apache-airflow[saml]", "apache-airflow[sentry]", "apache-airflow[statsd]", "apache-airflow[uv]", "apache-airflow[virtualenv]"] -all-dbs = ["apache-airflow[apache-cassandra]", "apache-airflow[apache-drill]", "apache-airflow[apache-druid]", "apache-airflow[apache-hdfs]", "apache-airflow[apache-hive]", "apache-airflow[apache-impala]", "apache-airflow[apache-pinot]", "apache-airflow[arangodb]", "apache-airflow[cloudant]", "apache-airflow[databricks]", "apache-airflow[exasol]", "apache-airflow[influxdb]", "apache-airflow[microsoft-mssql]", "apache-airflow[mongo]", "apache-airflow[mysql]", "apache-airflow[neo4j]", "apache-airflow[postgres]", "apache-airflow[presto]", "apache-airflow[trino]", "apache-airflow[vertica]"] -amazon = ["apache-airflow-providers-amazon"] -apache-atlas = ["atlasclient (>=0.1.2)"] -apache-beam = ["apache-airflow-providers-apache-beam"] -apache-cassandra = ["apache-airflow-providers-apache-cassandra"] -apache-drill = ["apache-airflow-providers-apache-drill"] -apache-druid = ["apache-airflow-providers-apache-druid"] -apache-flink = ["apache-airflow-providers-apache-flink"] -apache-hdfs = ["apache-airflow-providers-apache-hdfs"] -apache-hive = ["apache-airflow-providers-apache-hive"] -apache-impala = ["apache-airflow-providers-apache-impala"] -apache-kafka = ["apache-airflow-providers-apache-kafka"] -apache-kylin = ["apache-airflow-providers-apache-kylin"] -apache-livy = ["apache-airflow-providers-apache-livy"] -apache-pig = ["apache-airflow-providers-apache-pig"] -apache-pinot = ["apache-airflow-providers-apache-pinot"] -apache-spark = ["apache-airflow-providers-apache-spark"] -apache-webhdfs = ["hdfs[avro,dataframe,kerberos] (>=2.0.4)"] -apprise = ["apache-airflow-providers-apprise"] -arangodb = ["apache-airflow-providers-arangodb"] -asana = ["apache-airflow-providers-asana"] -async = ["eventlet (>=0.33.3)", "gevent (>=0.13)", "greenlet (>=0.4.9)"] -atlas = ["apache-airflow[apache-atlas]"] -atlassian-jira = ["apache-airflow-providers-atlassian-jira"] -aws = ["apache-airflow[amazon]"] -azure = ["apache-airflow[microsoft-azure]"] -cassandra = ["apache-airflow[apache-cassandra]"] -celery = ["apache-airflow-providers-celery"] -cgroups = ["cgroupspy (>=0.2.2)"] -cloudant = ["apache-airflow-providers-cloudant"] -cncf-kubernetes = ["apache-airflow-providers-cncf-kubernetes"] -cohere = ["apache-airflow-providers-cohere"] -common-io = ["apache-airflow-providers-common-io"] -common-sql = ["apache-airflow-providers-common-sql"] -databricks = ["apache-airflow-providers-databricks"] -datadog = ["apache-airflow-providers-datadog"] -dbt-cloud = ["apache-airflow-providers-dbt-cloud"] -deprecated-api = ["requests (>=2.27.0,<3)"] -devel-ci = ["aiobotocore (>=2.7.0)", "aiofiles (>=23.2.0)", "aioresponses (>=0.7.6)", "amqp", "astroid (>=2.12.3,<3.0)", "atlasclient (>=0.1.2)", "authlib (>=1.0.0)", "backports-zoneinfo (>=0.2.1)", "bcrypt (>=2.0.0)", "beautifulsoup4 (>=4.7.1)", "black (>=23.12.0)", "blinker (>=1.1)", "blinker (>=1.7.0)", "cgroupspy (>=0.2.2)", "checksumdir (>=1.2.0)", "click (>=8.0)", "click (>=8.0,!=8.1.4,!=8.1.5)", "coverage (>=7.4.0)", "diagrams (>=0.23.4)", "docutils (>=0.16,<0.17)", "duckdb (>=0.10.0)", "duckdb (>=0.9.0)", "eralchemy2 (>=1.3.8)", "eventlet (>=0.33.3)", "flask-bcrypt (>=0.7.1)", "gevent (>=0.13)", "gitpython (>=3.1.40)", "graphviz (>=0.12)", "greenlet (>=0.4.9)", "hatch (>=1.9.1)", "hdfs[avro,dataframe,kerberos] (>=2.0.4)", "ipdb (>=0.13.13)", "ldap3 (>=2.5.1)", "mypy (==1.9.0)", "opentelemetry-exporter-prometheus", "pandas (>=1.2.5,<2.2)", "pipdeptree (>=2.13.1)", "plyvel", "pre-commit (>=3.5.0)", "pydantic (>=2.3.0)", "pygithub (>=2.1.1)", "pykerberos (>=1.1.13)", "pytest (>=7.4.4,<8.0)", "pytest-asyncio (>=0.23.3)", "pytest-cov (>=4.1.0)", "pytest-custom-exit-code (>=0.3.0)", "pytest-icdiff (>=0.9)", "pytest-instafail (>=0.5.0)", "pytest-mock (>=3.12.0)", "pytest-rerunfailures (>=13.0)", "pytest-timeouts (>=1.2.1)", "pytest-xdist (>=3.5.0)", "python-ldap", "python3-saml (>=1.16.0)", "requests (>=2.27.0,<3)", "requests-kerberos (>=0.10.0)", "requests-mock (>=1.11.0)", "restructuredtext-lint (>=1.4.0)", "rich-click (>=1.7.0)", "ruff (==0.3.3)", "s3fs (>=2023.10.0)", "semver (>=3.0.2)", "sentry-sdk (>=1.32.0,!=1.33.0)", "sphinx (>=5.3.0,<6.0.0)", "sphinx-airflow-theme (>=0.0.12)", "sphinx-argparse (>=0.4.0)", "sphinx-autoapi (>=2.1.1)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.5.0)", "sphinx-jinja (>=2.0.2)", "sphinx-rtd-theme (>=2.0.0)", "sphinxcontrib-applehelp (>=1.0.4)", "sphinxcontrib-devhelp (>=1.0.2)", "sphinxcontrib-htmlhelp (>=2.0.1)", "sphinxcontrib-httpdomain (>=1.8.1)", "sphinxcontrib-jquery (>=4.1)", "sphinxcontrib-jsmath (>=1.0.1)", "sphinxcontrib-qthelp (>=1.0.3)", "sphinxcontrib-redoc (>=1.6.0)", "sphinxcontrib-serializinghtml (==1.1.5)", "sphinxcontrib-spelling (>=8.0.0)", "statsd (>=3.3.0)", "thrift-sasl (>=0.2.0)", "time-machine (>=2.13.0)", "towncrier (>=23.11.0)", "twine (>=4.0.2)", "types-aiofiles", "types-certifi", "types-croniter", "types-deprecated", "types-docutils", "types-markdown", "types-paramiko", "types-protobuf", "types-pymysql", "types-python-dateutil", "types-python-slugify", "types-pytz", "types-pyyaml", "types-redis", "types-requests", "types-setuptools", "types-tabulate", "types-termcolor", "types-toml", "uv (>=0.1.32)", "virtualenv", "wheel (>=0.42.0)", "yamllint (>=1.33.0)"] -dingding = ["apache-airflow-providers-dingding"] -discord = ["apache-airflow-providers-discord"] -docker = ["apache-airflow-providers-docker"] -druid = ["apache-airflow[apache-druid]"] -elasticsearch = ["apache-airflow-providers-elasticsearch"] -exasol = ["apache-airflow-providers-exasol"] -fab = ["apache-airflow-providers-fab"] -facebook = ["apache-airflow-providers-facebook"] -ftp = ["apache-airflow-providers-ftp"] -gcp = ["apache-airflow[google]"] -gcp-api = ["apache-airflow[google]"] -github = ["apache-airflow-providers-github"] -github-enterprise = ["apache-airflow[fab]", "authlib (>=1.0.0)"] -google = ["apache-airflow-providers-google"] -google-auth = ["apache-airflow[fab]", "authlib (>=1.0.0)"] -graphviz = ["graphviz (>=0.12)"] -grpc = ["apache-airflow-providers-grpc"] -hashicorp = ["apache-airflow-providers-hashicorp"] -hdfs = ["apache-airflow[apache-hdfs]"] -hive = ["apache-airflow[apache-hive]"] -http = ["apache-airflow-providers-http"] -imap = ["apache-airflow-providers-imap"] -influxdb = ["apache-airflow-providers-influxdb"] -jdbc = ["apache-airflow-providers-jdbc"] -jenkins = ["apache-airflow-providers-jenkins"] -kerberos = ["pykerberos (>=1.1.13)", "requests-kerberos (>=0.10.0)", "thrift-sasl (>=0.2.0)"] -kubernetes = ["apache-airflow[cncf-kubernetes]"] -ldap = ["ldap3 (>=2.5.1)", "python-ldap"] -leveldb = ["plyvel"] -microsoft-azure = ["apache-airflow-providers-microsoft-azure"] -microsoft-mssql = ["apache-airflow-providers-microsoft-mssql"] -microsoft-psrp = ["apache-airflow-providers-microsoft-psrp"] -microsoft-winrm = ["apache-airflow-providers-microsoft-winrm"] -mongo = ["apache-airflow-providers-mongo"] -mssql = ["apache-airflow[microsoft-mssql]"] -mysql = ["apache-airflow-providers-mysql"] -neo4j = ["apache-airflow-providers-neo4j"] -odbc = ["apache-airflow-providers-odbc"] -openai = ["apache-airflow-providers-openai"] -openfaas = ["apache-airflow-providers-openfaas"] -openlineage = ["apache-airflow-providers-openlineage"] -opensearch = ["apache-airflow-providers-opensearch"] -opsgenie = ["apache-airflow-providers-opsgenie"] -oracle = ["apache-airflow-providers-oracle"] -otel = ["opentelemetry-exporter-prometheus"] -pagerduty = ["apache-airflow-providers-pagerduty"] -pandas = ["pandas (>=1.2.5,<2.2)"] -papermill = ["apache-airflow-providers-papermill"] -password = ["bcrypt (>=2.0.0)", "flask-bcrypt (>=0.7.1)"] -pgvector = ["apache-airflow-providers-pgvector"] -pinecone = ["apache-airflow-providers-pinecone"] -pinot = ["apache-airflow[apache-pinot]"] -postgres = ["apache-airflow-providers-postgres"] -presto = ["apache-airflow-providers-presto"] -pydantic = ["pydantic (>=2.3.0)"] -qdrant = ["apache-airflow-providers-qdrant"] -rabbitmq = ["amqp"] -redis = ["apache-airflow-providers-redis"] -s3 = ["apache-airflow[amazon]"] -s3fs = ["s3fs (>=2023.10.0)"] -salesforce = ["apache-airflow-providers-salesforce"] -samba = ["apache-airflow-providers-samba"] -saml = ["python3-saml (>=1.16.0)"] -segment = ["apache-airflow-providers-segment"] -sendgrid = ["apache-airflow-providers-sendgrid"] -sentry = ["blinker (>=1.1)", "sentry-sdk (>=1.32.0,!=1.33.0)"] -sftp = ["apache-airflow-providers-sftp"] -singularity = ["apache-airflow-providers-singularity"] -slack = ["apache-airflow-providers-slack"] -smtp = ["apache-airflow-providers-smtp"] -snowflake = ["apache-airflow-providers-snowflake"] -spark = ["apache-airflow[apache-spark]"] -sqlite = ["apache-airflow-providers-sqlite"] -ssh = ["apache-airflow-providers-ssh"] -statsd = ["statsd (>=3.3.0)"] -tableau = ["apache-airflow-providers-tableau"] -tabular = ["apache-airflow-providers-tabular"] -telegram = ["apache-airflow-providers-telegram"] -teradata = ["apache-airflow-providers-teradata"] -trino = ["apache-airflow-providers-trino"] -uv = ["uv (>=0.1.32)"] -vertica = ["apache-airflow-providers-vertica"] -virtualenv = ["virtualenv"] -weaviate = ["apache-airflow-providers-weaviate"] -webhdfs = ["apache-airflow[apache-webhdfs]"] -winrm = ["apache-airflow[microsoft-winrm]"] -yandex = ["apache-airflow-providers-yandex"] -zendesk = ["apache-airflow-providers-zendesk"] - -[[package]] -name = "apache-airflow-providers-common-io" -version = "1.3.2" -description = "Provider package apache-airflow-providers-common-io for Apache Airflow" -optional = false -python-versions = "~=3.8" -files = [ - {file = "apache_airflow_providers_common_io-1.3.2-py3-none-any.whl", hash = "sha256:7c0299d8eb2e3fc7b99f522c4d333e2b888edbf47861a8f3e3ae78707ae77aab"}, - {file = "apache_airflow_providers_common_io-1.3.2.tar.gz", hash = "sha256:1212e484a16ad311bcb979e84ad1fa1cc45d7f5ba4dfcbd7978887bd30809e75"}, -] - -[package.dependencies] -apache-airflow = ">=2.8.0" - -[package.extras] -openlineage = ["apache-airflow-providers-openlineage"] - -[[package]] -name = "apache-airflow-providers-common-sql" -version = "1.14.0" -description = "Provider package apache-airflow-providers-common-sql for Apache Airflow" -optional = false -python-versions = "~=3.8" -files = [ - {file = "apache_airflow_providers_common_sql-1.14.0-py3-none-any.whl", hash = "sha256:620ba5bf559964159b3faf0bf921e666d1c3bb74ade27daa385f9e9ecd413a1c"}, - {file = "apache_airflow_providers_common_sql-1.14.0.tar.gz", hash = "sha256:6179512edf261ede96adda31a535eec024471a5708a7528d27a4ece72f35783f"}, -] - -[package.dependencies] -apache-airflow = ">=2.7.0" -more-itertools = ">=9.0.0" -sqlparse = ">=0.4.2" - -[package.extras] -openlineage = ["apache-airflow-providers-openlineage"] -pandas = ["pandas (>=1.2.5,<2.2)"] - -[[package]] -name = "apache-airflow-providers-fab" -version = "1.1.1" -description = "Provider package apache-airflow-providers-fab for Apache Airflow" -optional = false -python-versions = "~=3.8" -files = [ - {file = "apache_airflow_providers_fab-1.1.1-py3-none-any.whl", hash = "sha256:5d393d209ef432618e1926b019fb7b543d1fc932b592c39b4170779c409a38a5"}, - {file = "apache_airflow_providers_fab-1.1.1.tar.gz", hash = "sha256:60c1722f9985675e65f78c05bca8b4eb708a3140a2ed16d8de2c4cc4a4ecadc3"}, -] - -[package.dependencies] -apache-airflow = ">=2.9.0" -flask = ">=2.2,<2.3" -flask-appbuilder = "4.4.1" -flask-login = ">=0.6.2" -google-re2 = ">=1.0" -jmespath = "*" - -[[package]] -name = "apache-airflow-providers-ftp" -version = "3.9.1" -description = "Provider package apache-airflow-providers-ftp for Apache Airflow" -optional = false -python-versions = "~=3.8" -files = [ - {file = "apache_airflow_providers_ftp-3.9.1-py3-none-any.whl", hash = "sha256:74744b27f356bc42b528605d33a868ed2b4c670a1c90a857fb05402740e6f980"}, - {file = "apache_airflow_providers_ftp-3.9.1.tar.gz", hash = "sha256:b5cc4445a6fabb73f760c678d1b7f1d10586dfc6c9d34746c7462180f1cbb3ce"}, -] - -[package.dependencies] -apache-airflow = ">=2.7.0" - -[package.extras] -openlineage = ["apache-airflow-providers-openlineage"] - -[[package]] -name = "apache-airflow-providers-google" -version = "10.15.0" -description = "Provider package apache-airflow-providers-google for Apache Airflow" -optional = false -python-versions = "~=3.8" -files = [ - {file = "apache_airflow_providers_google-10.15.0-py3-none-any.whl", hash = "sha256:70d2d4feb66f06cd750ea673344f3be20d2d575c9645f7e2b030c73551a297fc"}, - {file = "apache_airflow_providers_google-10.15.0.tar.gz", hash = "sha256:ff48fa0a29abec2645a8008c47d0a84a759b7203412707a5e2fc01558c4052a3"}, -] - -[package.dependencies] -apache-airflow = ">=2.6.0" -apache-airflow-providers-common-sql = ">=1.7.2" -asgiref = ">=3.5.2" -gcloud-aio-auth = ">=4.0.0,<5.0.0" -gcloud-aio-bigquery = ">=6.1.2" -gcloud-aio-storage = ">=9.0.0" -gcsfs = ">=2023.10.0" -google-ads = ">=22.1.0" -google-analytics-admin = "*" -google-api-core = ">=2.11.0,<2.16.0 || >2.16.0" -google-api-python-client = ">=1.6.0" -google-auth = ">=1.0.0" -google-auth-httplib2 = ">=0.0.1" -google-cloud-aiplatform = ">=1.22.1" -google-cloud-automl = ">=2.12.0" -google-cloud-batch = ">=0.13.0" -google-cloud-bigquery-datatransfer = ">=3.13.0" -google-cloud-bigtable = ">=2.17.0" -google-cloud-build = ">=3.22.0" -google-cloud-compute = ">=1.10.0" -google-cloud-container = ">=2.17.4" -google-cloud-datacatalog = ">=3.11.1" -google-cloud-dataflow-client = ">=0.8.6" -google-cloud-dataform = ">=0.5.0" -google-cloud-dataplex = ">=1.10.0" -google-cloud-dataproc = ">=5.8.0" -google-cloud-dataproc-metastore = ">=1.12.0" -google-cloud-dlp = ">=3.12.0" -google-cloud-kms = ">=2.15.0" -google-cloud-language = ">=2.9.0" -google-cloud-logging = ">=3.5.0" -google-cloud-memcache = ">=1.7.0" -google-cloud-monitoring = ">=2.18.0" -google-cloud-orchestration-airflow = ">=1.10.0" -google-cloud-os-login = ">=2.9.1" -google-cloud-pubsub = ">=2.19.0" -google-cloud-redis = ">=2.12.0" -google-cloud-run = ">=0.9.0" -google-cloud-secret-manager = ">=2.16.0" -google-cloud-spanner = ">=3.11.1" -google-cloud-speech = ">=2.18.0" -google-cloud-storage = ">=2.7.0" -google-cloud-storage-transfer = ">=1.4.1" -google-cloud-tasks = ">=2.13.0" -google-cloud-texttospeech = ">=2.14.1" -google-cloud-translate = ">=3.11.0" -google-cloud-videointelligence = ">=2.11.0" -google-cloud-vision = ">=3.4.0" -google-cloud-workflows = ">=1.10.0" -grpcio-gcp = ">=0.2.2" -httpx = "*" -json-merge-patch = ">=0.2" -looker-sdk = ">=22.2.0" -pandas = ">=1.2.5" -pandas-gbq = "*" -proto-plus = ">=1.19.6" -PyOpenSSL = "*" -sqlalchemy-bigquery = ">=1.2.1" -sqlalchemy-spanner = ">=1.6.2" - -[package.extras] -amazon = ["apache-airflow-providers-amazon (>=2.6.0)"] -apache-beam = ["apache-airflow-providers-apache-beam", "apache-beam[gcp]"] -apache-cassandra = ["apache-airflow-providers-apache-cassandra"] -cncf-kubernetes = ["apache-airflow-providers-cncf-kubernetes (>=7.2.0)"] -common-sql = ["apache-airflow-providers-common-sql"] -facebook = ["apache-airflow-providers-facebook (>=2.2.0)"] -leveldb = ["plyvel"] -microsoft-azure = ["apache-airflow-providers-microsoft-azure"] -microsoft-mssql = ["apache-airflow-providers-microsoft-mssql"] -mysql = ["apache-airflow-providers-mysql"] -openlineage = ["apache-airflow-providers-openlineage"] -oracle = ["apache-airflow-providers-oracle (>=3.1.0)"] -postgres = ["apache-airflow-providers-postgres"] -presto = ["apache-airflow-providers-presto"] -salesforce = ["apache-airflow-providers-salesforce"] -sftp = ["apache-airflow-providers-sftp"] -ssh = ["apache-airflow-providers-ssh"] -trino = ["apache-airflow-providers-trino"] - -[[package]] -name = "apache-airflow-providers-http" -version = "4.11.1" -description = "Provider package apache-airflow-providers-http for Apache Airflow" -optional = false -python-versions = "~=3.8" -files = [ - {file = "apache_airflow_providers_http-4.11.1-py3-none-any.whl", hash = "sha256:f8aff8d009d8068654bed6c84c1bf13100ebbda4563c5fdea067047ba85a84bf"}, - {file = "apache_airflow_providers_http-4.11.1.tar.gz", hash = "sha256:401c4c976ca35388574afa85282fa35ed0514a77ef7ca442ea74132b3442a869"}, -] - -[package.dependencies] -aiohttp = ">=3.9.2" -apache-airflow = ">=2.7.0" -asgiref = "*" -requests = ">=2.27.0,<3" -requests_toolbelt = "*" - -[[package]] -name = "apache-airflow-providers-imap" -version = "3.6.1" -description = "Provider package apache-airflow-providers-imap for Apache Airflow" -optional = false -python-versions = "~=3.8" -files = [ - {file = "apache_airflow_providers_imap-3.6.1-py3-none-any.whl", hash = "sha256:1630dfad25a4db28da37ed4cb522674e37d0d981238fdb34ed2933c7f348763a"}, - {file = "apache_airflow_providers_imap-3.6.1.tar.gz", hash = "sha256:20e8052b43f32c3e711cbe0ffe3763cf550ffb06011ed4c57c3e806dd99dfa06"}, -] - -[package.dependencies] -apache-airflow = ">=2.7.0" - -[[package]] -name = "apache-airflow-providers-smtp" -version = "1.7.1" -description = "Provider package apache-airflow-providers-smtp for Apache Airflow" -optional = false -python-versions = "~=3.8" -files = [ - {file = "apache_airflow_providers_smtp-1.7.1-py3-none-any.whl", hash = "sha256:eab0910fa1351e58e1e87bb2489084ad5157e33a8752cce3164fd38f4b50c694"}, - {file = "apache_airflow_providers_smtp-1.7.1.tar.gz", hash = "sha256:707c4e2d75ce328693b55429f1f771e00cd2a2d6b52ce14edc20cb6d785be76e"}, -] - -[package.dependencies] -apache-airflow = ">=2.7.0" - -[[package]] -name = "apache-airflow-providers-sqlite" -version = "3.8.1" -description = "Provider package apache-airflow-providers-sqlite for Apache Airflow" -optional = false -python-versions = "~=3.8" -files = [ - {file = "apache_airflow_providers_sqlite-3.8.1-py3-none-any.whl", hash = "sha256:be9749275ac266245a2973269842674b10c3ad184790f9f0fd75e76e1d3b2440"}, - {file = "apache_airflow_providers_sqlite-3.8.1.tar.gz", hash = "sha256:b958c5aa725fcf6505c77dc3d600f3c6f9255be5405ea51fa966ae1d85842d3e"}, -] - -[package.dependencies] -apache-airflow = ">=2.7.0" -apache-airflow-providers-common-sql = ">=1.3.1" - -[package.extras] -common-sql = ["apache-airflow-providers-common-sql"] - -[[package]] -name = "apispec" -version = "6.6.1" -description = "A pluggable API specification generator. Currently supports the OpenAPI Specification (f.k.a. the Swagger specification)." -optional = false -python-versions = ">=3.8" -files = [ - {file = "apispec-6.6.1-py3-none-any.whl", hash = "sha256:6460315cb38ac6a2ff42d9e2b8dc0435c37d4428d3abeda96ff97b5dc8eb6b94"}, - {file = "apispec-6.6.1.tar.gz", hash = "sha256:f5caa47cee75fe03b9c50b5594048b4c052eeca2c212e0dac12dbb6175d9a659"}, -] - -[package.dependencies] -packaging = ">=21.3" -PyYAML = {version = ">=3.10", optional = true, markers = "extra == \"yaml\""} - -[package.extras] -dev = ["apispec[tests]", "pre-commit (>=3.5,<4.0)", "tox"] -docs = ["apispec[marshmallow]", "pyyaml (==6.0.1)", "sphinx (==7.3.7)", "sphinx-issues (==4.1.0)", "sphinx-rtd-theme (==2.0.0)"] -marshmallow = ["marshmallow (>=3.18.0)"] -tests = ["apispec[marshmallow,yaml]", "openapi-spec-validator (==0.7.1)", "pytest"] -yaml = ["PyYAML (>=3.10)"] - [[package]] name = "appnope" version = "0.1.4" @@ -673,37 +145,6 @@ files = [ {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, ] -[[package]] -name = "argcomplete" -version = "3.4.0" -description = "Bash tab completion for argparse" -optional = false -python-versions = ">=3.8" -files = [ - {file = "argcomplete-3.4.0-py3-none-any.whl", hash = "sha256:69a79e083a716173e5532e0fa3bef45f793f4e61096cf52b5a42c0211c8b8aa5"}, - {file = "argcomplete-3.4.0.tar.gz", hash = "sha256:c2abcdfe1be8ace47ba777d4fce319eb13bf8ad9dace8d085dcad6eded88057f"}, -] - -[package.extras] -test = ["coverage", "mypy", "pexpect", "ruff", "wheel"] - -[[package]] -name = "asgiref" -version = "3.8.1" -description = "ASGI specs, helper code, and adapters" -optional = false -python-versions = ">=3.8" -files = [ - {file = "asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47"}, - {file = "asgiref-3.8.1.tar.gz", hash = "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590"}, -] - -[package.dependencies] -typing-extensions = {version = ">=4", markers = "python_version < \"3.11\""} - -[package.extras] -tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] - [[package]] name = "asttokens" version = "2.4.1" @@ -878,17 +319,6 @@ files = [ [package.extras] dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] -[[package]] -name = "backoff" -version = "2.2.1" -description = "Function decoration for backoff and retry" -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, - {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, -] - [[package]] name = "beautifulsoup4" version = "4.12.3" @@ -910,17 +340,6 @@ charset-normalizer = ["charset-normalizer"] html5lib = ["html5lib"] lxml = ["lxml"] -[[package]] -name = "blinker" -version = "1.8.2" -description = "Fast, simple object-to-object and broadcast signaling" -optional = false -python-versions = ">=3.8" -files = [ - {file = "blinker-1.8.2-py3-none-any.whl", hash = "sha256:1779309f71bf239144b9399d06ae925637cf6634cf6bd131104184531bf67c01"}, - {file = "blinker-1.8.2.tar.gz", hash = "sha256:8f77b09d3bf7c795e969e9486f39c2c5e9c39d4ee07424be2bc594ece9642d83"}, -] - [[package]] name = "bokeh" version = "3.4.1" @@ -992,17 +411,6 @@ files = [ {file = "bracex-2.4.tar.gz", hash = "sha256:a27eaf1df42cf561fed58b7a8f3fdf129d1ea16a81e1fadd1d17989bc6384beb"}, ] -[[package]] -name = "cachelib" -version = "0.9.0" -description = "A collection of cache libraries in the same API interface." -optional = false -python-versions = ">=3.7" -files = [ - {file = "cachelib-0.9.0-py3-none-any.whl", hash = "sha256:811ceeb1209d2fe51cd2b62810bd1eccf70feba5c52641532498be5c675493b3"}, - {file = "cachelib-0.9.0.tar.gz", hash = "sha256:38222cc7c1b79a23606de5c2607f4925779e37cdcea1c2ad21b8bae94b5425a5"}, -] - [[package]] name = "cachetools" version = "5.3.3" @@ -1014,31 +422,6 @@ files = [ {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, ] -[[package]] -name = "cattrs" -version = "23.2.3" -description = "Composable complex class support for attrs and dataclasses." -optional = false -python-versions = ">=3.8" -files = [ - {file = "cattrs-23.2.3-py3-none-any.whl", hash = "sha256:0341994d94971052e9ee70662542699a3162ea1e0c62f7ce1b4a57f563685108"}, - {file = "cattrs-23.2.3.tar.gz", hash = "sha256:a934090d95abaa9e911dac357e3a8699e0b4b14f8529bcc7d2b1ad9d51672b9f"}, -] - -[package.dependencies] -attrs = ">=23.1.0" -exceptiongroup = {version = ">=1.1.1", markers = "python_version < \"3.11\""} -typing-extensions = {version = ">=4.1.0,<4.6.3 || >4.6.3", markers = "python_version < \"3.11\""} - -[package.extras] -bson = ["pymongo (>=4.4.0)"] -cbor2 = ["cbor2 (>=5.4.6)"] -msgpack = ["msgpack (>=1.0.5)"] -orjson = ["orjson (>=3.9.2)"] -pyyaml = ["pyyaml (>=6.0)"] -tomlkit = ["tomlkit (>=0.11.8)"] -ujson = ["ujson (>=5.7.0)"] - [[package]] name = "certifi" version = "2024.6.2" @@ -1125,17 +508,6 @@ files = [ {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, ] -[[package]] -name = "chardet" -version = "5.2.0" -description = "Universal encoding detector for Python 3" -optional = false -python-versions = ">=3.7" -files = [ - {file = "chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"}, - {file = "chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7"}, -] - [[package]] name = "charset-normalizer" version = "3.3.2" @@ -1249,21 +621,6 @@ files = [ [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} -[[package]] -name = "clickclick" -version = "20.10.2" -description = "Click utility functions" -optional = false -python-versions = "*" -files = [ - {file = "clickclick-20.10.2-py2.py3-none-any.whl", hash = "sha256:c8f33e6d9ec83f68416dd2136a7950125bd256ec39ccc9a85c6e280a16be2bb5"}, - {file = "clickclick-20.10.2.tar.gz", hash = "sha256:4efb13e62353e34c5eef7ed6582c4920b418d7dedc86d819e22ee089ba01802c"}, -] - -[package.dependencies] -click = ">=4.0" -PyYAML = ">=3.11" - [[package]] name = "colorama" version = "0.4.6" @@ -1275,20 +632,6 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -[[package]] -name = "colorlog" -version = "4.8.0" -description = "Log formatting with colors!" -optional = false -python-versions = "*" -files = [ - {file = "colorlog-4.8.0-py2.py3-none-any.whl", hash = "sha256:3dd15cb27e8119a24c1a7b5c93f9f3b455855e0f73993b1c25921b2f646f1dcd"}, - {file = "colorlog-4.8.0.tar.gz", hash = "sha256:59b53160c60902c405cdec28d38356e09d40686659048893e026ecbd589516b1"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} - [[package]] name = "comm" version = "0.2.2" @@ -1320,49 +663,6 @@ files = [ [package.extras] test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] -[[package]] -name = "configupdater" -version = "3.2" -description = "Parser like ConfigParser but for updating configuration files" -optional = false -python-versions = ">=3.6" -files = [ - {file = "ConfigUpdater-3.2-py2.py3-none-any.whl", hash = "sha256:0f65a041627d7693840b4dd743581db4c441c97195298a29d075f91b79539df2"}, - {file = "ConfigUpdater-3.2.tar.gz", hash = "sha256:9fdac53831c1b062929bf398b649b87ca30e7f1a735f3fbf482072804106306b"}, -] - -[package.extras] -testing = ["flake8", "pytest", "pytest-cov", "pytest-randomly", "pytest-xdist", "sphinx"] - -[[package]] -name = "connexion" -version = "2.14.1" -description = "Connexion - API first applications with OpenAPI/Swagger and Flask" -optional = false -python-versions = ">=3.6" -files = [ - {file = "connexion-2.14.1-py2.py3-none-any.whl", hash = "sha256:f343717241b4c4802a694c38fee66fb1693c897fe4ea5a957fa9b3b07caf6394"}, - {file = "connexion-2.14.1.tar.gz", hash = "sha256:99aa5781e70a7b94f8ffae8cf89f309d49cdb811bbd65a8e2f2546f3b19a01e6"}, -] - -[package.dependencies] -clickclick = ">=1.2,<21" -flask = ">=1.0.4,<3" -inflection = ">=0.3.1,<0.6" -itsdangerous = ">=0.24" -jsonschema = ">=2.5.1,<5" -packaging = ">=20" -PyYAML = ">=5.1,<7" -requests = ">=2.9.1,<3" -werkzeug = ">=1.0,<3" - -[package.extras] -aiohttp = ["MarkupSafe (>=0.23)", "aiohttp (>=2.3.10,<4)", "aiohttp-jinja2 (>=0.14.0,<2)"] -docs = ["sphinx-autoapi (==1.8.1)"] -flask = ["flask (>=1.0.4,<3)", "itsdangerous (>=0.24)"] -swagger-ui = ["swagger-ui-bundle (>=0.0.2,<0.1)"] -tests = ["MarkupSafe (>=0.23)", "aiohttp (>=2.3.10,<4)", "aiohttp-jinja2 (>=0.14.0,<2)", "aiohttp-remotes", "decorator (>=5,<6)", "flask (>=1.0.4,<3)", "itsdangerous (>=0.24)", "pytest (>=6,<7)", "pytest-aiohttp", "pytest-cov (>=2,<3)", "swagger-ui-bundle (>=0.0.2,<0.1)", "testfixtures (>=6,<7)"] - [[package]] name = "contourpy" version = "1.2.1" @@ -1493,35 +793,6 @@ tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.1 [package.extras] toml = ["tomli"] -[[package]] -name = "cron-descriptor" -version = "1.4.3" -description = "A Python library that converts cron expressions into human readable strings." -optional = false -python-versions = "*" -files = [ - {file = "cron_descriptor-1.4.3-py3-none-any.whl", hash = "sha256:a67ba21804983b1427ed7f3e1ec27ee77bf24c652b0430239c268c5ddfbf9dc0"}, - {file = "cron_descriptor-1.4.3.tar.gz", hash = "sha256:7b1a00d7d25d6ae6896c0da4457e790b98cba778398a3d48e341e5e0d33f0488"}, -] - -[package.extras] -dev = ["polib"] - -[[package]] -name = "croniter" -version = "2.0.5" -description = "croniter provides iteration for datetime object with cron like format" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.6" -files = [ - {file = "croniter-2.0.5-py2.py3-none-any.whl", hash = "sha256:fdbb44920944045cc323db54599b321325141d82d14fa7453bc0699826bbe9ed"}, - {file = "croniter-2.0.5.tar.gz", hash = "sha256:f1f8ca0af64212fbe99b1bee125ee5a1b53a9c1b433968d8bca8817b79d237f3"}, -] - -[package.dependencies] -python-dateutil = "*" -pytz = ">2021.1" - [[package]] name = "cryptography" version = "41.0.7" @@ -1717,26 +988,6 @@ files = [ {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, ] -[[package]] -name = "dnspython" -version = "2.6.1" -description = "DNS toolkit" -optional = false -python-versions = ">=3.8" -files = [ - {file = "dnspython-2.6.1-py3-none-any.whl", hash = "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50"}, - {file = "dnspython-2.6.1.tar.gz", hash = "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc"}, -] - -[package.extras] -dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "sphinx (>=7.2.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"] -dnssec = ["cryptography (>=41)"] -doh = ["h2 (>=4.1.0)", "httpcore (>=1.0.0)", "httpx (>=0.26.0)"] -doq = ["aioquic (>=0.9.25)"] -idna = ["idna (>=3.6)"] -trio = ["trio (>=0.23)"] -wmi = ["wmi (>=1.5.1)"] - [[package]] name = "docker-pycreds" version = "0.4.0" @@ -1751,17 +1002,6 @@ files = [ [package.dependencies] six = ">=1.4.0" -[[package]] -name = "docstring-parser" -version = "0.16" -description = "Parse Python docstrings in reST, Google and Numpydoc format" -optional = false -python-versions = ">=3.6,<4.0" -files = [ - {file = "docstring_parser-0.16-py3-none-any.whl", hash = "sha256:bf0a1387354d3691d102edef7ec124f219ef639982d096e26e3b60aeffa90637"}, - {file = "docstring_parser-0.16.tar.gz", hash = "sha256:538beabd0af1e2db0146b6bd3caa526c35a34d61af9fd2887f3a8a27a739aa6e"}, -] - [[package]] name = "docstring-parser-fork" version = "0.0.8" @@ -1774,49 +1014,23 @@ files = [ ] [[package]] -name = "docutils" -version = "0.21.2" -description = "Docutils -- Python Documentation Utilities" +name = "exceptiongroup" +version = "1.2.1" +description = "Backport of PEP 654 (exception groups)" optional = false -python-versions = ">=3.9" +python-versions = ">=3.7" files = [ - {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, - {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, + {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, + {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, ] +[package.extras] +test = ["pytest (>=6)"] + [[package]] -name = "email-validator" -version = "2.2.0" -description = "A robust email address syntax and deliverability validation library." -optional = false -python-versions = ">=3.8" -files = [ - {file = "email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631"}, - {file = "email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7"}, -] - -[package.dependencies] -dnspython = ">=2.0.0" -idna = ">=2.0.0" - -[[package]] -name = "exceptiongroup" -version = "1.2.1" -description = "Backport of PEP 654 (exception groups)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, - {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, -] - -[package.extras] -test = ["pytest (>=6)"] - -[[package]] -name = "execnet" -version = "2.1.1" -description = "execnet: rapid multi-Python deployment" +name = "execnet" +version = "2.1.1" +description = "execnet: rapid multi-Python deployment" optional = false python-versions = ">=3.8" files = [ @@ -1873,208 +1087,6 @@ mccabe = ">=0.7.0,<0.8.0" pycodestyle = ">=2.12.0,<2.13.0" pyflakes = ">=3.2.0,<3.3.0" -[[package]] -name = "flask" -version = "2.2.5" -description = "A simple framework for building complex web applications." -optional = false -python-versions = ">=3.7" -files = [ - {file = "Flask-2.2.5-py3-none-any.whl", hash = "sha256:58107ed83443e86067e41eff4631b058178191a355886f8e479e347fa1285fdf"}, - {file = "Flask-2.2.5.tar.gz", hash = "sha256:edee9b0a7ff26621bd5a8c10ff484ae28737a2410d99b0bb9a6850c7fb977aa0"}, -] - -[package.dependencies] -click = ">=8.0" -itsdangerous = ">=2.0" -Jinja2 = ">=3.0" -Werkzeug = ">=2.2.2" - -[package.extras] -async = ["asgiref (>=3.2)"] -dotenv = ["python-dotenv"] - -[[package]] -name = "flask-appbuilder" -version = "4.4.1" -description = "Simple and rapid application development framework, built on top of Flask. includes detailed security, auto CRUD generation for your models, google charts and much more." -optional = false -python-versions = "~=3.7" -files = [ - {file = "Flask-AppBuilder-4.4.1.tar.gz", hash = "sha256:a64d4c3b5197547744c7c41f7eb0fe0206ba1677369ce47903dd08c3c9b753bd"}, - {file = "Flask_AppBuilder-4.4.1-py3-none-any.whl", hash = "sha256:6ebdb384a23c0e111736ac36f6de04f02d40ac2976feedbdd473d8ba0201dd92"}, -] - -[package.dependencies] -apispec = {version = ">=6.0.0,<7", extras = ["yaml"]} -click = ">=8,<9" -colorama = ">=0.3.9,<1" -email-validator = ">=1.0.5" -Flask = ">=2,<3.0.0" -Flask-Babel = ">=1,<3" -Flask-JWT-Extended = ">=4.0.0,<5.0.0" -Flask-Limiter = ">3,<4" -Flask-Login = ">=0.3,<0.7" -Flask-SQLAlchemy = ">=2.4,<3" -Flask-WTF = ">=0.14.2,<2" -jsonschema = ">=3,<5" -marshmallow = ">=3.18.0,<4" -marshmallow-sqlalchemy = ">=0.22.0,<0.29.0" -prison = ">=0.2.1,<1.0.0" -PyJWT = ">=2.0.0,<3.0.0" -python-dateutil = ">=2.3,<3" -SQLAlchemy = "<1.5" -sqlalchemy-utils = ">=0.32.21,<1" -werkzeug = "<4" -WTForms = "<4" - -[package.extras] -jmespath = ["jmespath (>=0.9.5)"] -oauth = ["Authlib (>=0.14,<2.0.0)"] -openid = ["Flask-OpenID (>=1.2.5,<2)"] -talisman = ["flask-talisman (>=1.0.0,<2.0)"] - -[[package]] -name = "flask-babel" -version = "2.0.0" -description = "Adds i18n/l10n support to Flask applications" -optional = false -python-versions = "*" -files = [ - {file = "Flask-Babel-2.0.0.tar.gz", hash = "sha256:f9faf45cdb2e1a32ea2ec14403587d4295108f35017a7821a2b1acb8cfd9257d"}, - {file = "Flask_Babel-2.0.0-py3-none-any.whl", hash = "sha256:e6820a052a8d344e178cdd36dd4bb8aea09b4bda3d5f9fa9f008df2c7f2f5468"}, -] - -[package.dependencies] -Babel = ">=2.3" -Flask = "*" -Jinja2 = ">=2.5" -pytz = "*" - -[package.extras] -dev = ["Pallets-Sphinx-Themes", "bumpversion", "ghp-import", "pytest", "pytest-mock", "sphinx"] - -[[package]] -name = "flask-caching" -version = "2.3.0" -description = "Adds caching support to Flask applications." -optional = false -python-versions = ">=3.8" -files = [ - {file = "Flask_Caching-2.3.0-py3-none-any.whl", hash = "sha256:51771c75682e5abc1483b78b96d9131d7941dc669b073852edfa319dd4e29b6e"}, - {file = "flask_caching-2.3.0.tar.gz", hash = "sha256:d7e4ca64a33b49feb339fcdd17e6ba25f5e01168cf885e53790e885f83a4d2cf"}, -] - -[package.dependencies] -cachelib = ">=0.9.0,<0.10.0" -Flask = "*" - -[[package]] -name = "flask-jwt-extended" -version = "4.6.0" -description = "Extended JWT integration with Flask" -optional = false -python-versions = ">=3.7,<4" -files = [ - {file = "Flask-JWT-Extended-4.6.0.tar.gz", hash = "sha256:9215d05a9413d3855764bcd67035e75819d23af2fafb6b55197eb5a3313fdfb2"}, - {file = "Flask_JWT_Extended-4.6.0-py2.py3-none-any.whl", hash = "sha256:63a28fc9731bcc6c4b8815b6f954b5904caa534fc2ae9b93b1d3ef12930dca95"}, -] - -[package.dependencies] -Flask = ">=2.0,<4.0" -PyJWT = ">=2.0,<3.0" -Werkzeug = ">=0.14" - -[package.extras] -asymmetric-crypto = ["cryptography (>=3.3.1)"] - -[[package]] -name = "flask-limiter" -version = "3.7.0" -description = "Rate limiting for flask applications" -optional = false -python-versions = ">=3.8" -files = [ - {file = "Flask_Limiter-3.7.0-py3-none-any.whl", hash = "sha256:4318382f17ecb09848bc6d0f7bc4bb1bf89bcf162200bf47b7b969126693bfda"}, - {file = "flask_limiter-3.7.0.tar.gz", hash = "sha256:e474462505f6dd0d776db16c46092e9a065ebcb30b10aed0caf54c6b9a4a471a"}, -] - -[package.dependencies] -Flask = ">=2" -limits = ">=2.8" -ordered-set = ">4,<5" -rich = ">=12,<14" -typing-extensions = ">=4" - -[package.extras] -memcached = ["limits[memcached]"] -mongodb = ["limits[mongodb]"] -redis = ["limits[redis]"] - -[[package]] -name = "flask-login" -version = "0.6.3" -description = "User authentication and session management for Flask." -optional = false -python-versions = ">=3.7" -files = [ - {file = "Flask-Login-0.6.3.tar.gz", hash = "sha256:5e23d14a607ef12806c699590b89d0f0e0d67baeec599d75947bf9c147330333"}, - {file = "Flask_Login-0.6.3-py3-none-any.whl", hash = "sha256:849b25b82a436bf830a054e74214074af59097171562ab10bfa999e6b78aae5d"}, -] - -[package.dependencies] -Flask = ">=1.0.4" -Werkzeug = ">=1.0.1" - -[[package]] -name = "flask-session" -version = "0.5.0" -description = "Server-side session support for Flask" -optional = false -python-versions = ">=3.7" -files = [ - {file = "Flask-Session-0.5.0.tar.gz", hash = "sha256:190875e6aebf2953c6803d42379ef3b934bc209ef8ef006f97aecb08f5aaeb86"}, - {file = "flask_session-0.5.0-py3-none-any.whl", hash = "sha256:1619bcbc16f04f64e90f8e0b17145ba5c9700090bb1294e889956c1282d58631"}, -] - -[package.dependencies] -cachelib = "*" -flask = ">=2.2" - -[[package]] -name = "flask-sqlalchemy" -version = "2.5.1" -description = "Adds SQLAlchemy support to your Flask application." -optional = false -python-versions = ">= 2.7, != 3.0.*, != 3.1.*, != 3.2.*, != 3.3.*" -files = [ - {file = "Flask-SQLAlchemy-2.5.1.tar.gz", hash = "sha256:2bda44b43e7cacb15d4e05ff3cc1f8bc97936cc464623424102bfc2c35e95912"}, - {file = "Flask_SQLAlchemy-2.5.1-py2.py3-none-any.whl", hash = "sha256:f12c3d4cc5cc7fdcc148b9527ea05671718c3ea45d50c7e732cceb33f574b390"}, -] - -[package.dependencies] -Flask = ">=0.10" -SQLAlchemy = ">=0.8.0" - -[[package]] -name = "flask-wtf" -version = "1.2.1" -description = "Form rendering, validation, and CSRF protection for Flask with WTForms." -optional = false -python-versions = ">=3.8" -files = [ - {file = "flask_wtf-1.2.1-py3-none-any.whl", hash = "sha256:fa6793f2fb7e812e0fe9743b282118e581fb1b6c45d414b8af05e659bd653287"}, - {file = "flask_wtf-1.2.1.tar.gz", hash = "sha256:8bb269eb9bb46b87e7c8233d7e7debdf1f8b74bf90cc1789988c29b37a97b695"}, -] - -[package.dependencies] -flask = "*" -itsdangerous = "*" -wtforms = "*" - -[package.extras] -email = ["email-validator"] - [[package]] name = "frozenlist" version = "1.4.1" @@ -2200,56 +1212,6 @@ test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask-expr", "dask[dataframe, test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard"] tqdm = ["tqdm"] -[[package]] -name = "gcloud-aio-auth" -version = "4.2.3" -description = "Python Client for Google Cloud Auth" -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "gcloud_aio_auth-4.2.3-py3-none-any.whl", hash = "sha256:e4adadd36e35eeeb8537b926840372c3080c2f5a6909d44aa1bacbced2260bb1"}, - {file = "gcloud_aio_auth-4.2.3.tar.gz", hash = "sha256:8e12297c5b45cfc20d629b83e1233f83a1c7d5f830f24f31bc5bb8816c0cda1b"}, -] - -[package.dependencies] -aiohttp = ">=3.3.0,<4.0.0" -backoff = ">=1.0.0,<3.0.0" -chardet = ">=2.0,<6.0" -cryptography = ">=2.0.0,<42.0.0" -pyjwt = ">=1.5.3,<3.0.0" -setuptools = ">=66.0.0,<67.0.0" - -[[package]] -name = "gcloud-aio-bigquery" -version = "7.1.0" -description = "Python Client for Google Cloud BigQuery" -optional = false -python-versions = ">=3.8,<4.0" -files = [ - {file = "gcloud_aio_bigquery-7.1.0-py3-none-any.whl", hash = "sha256:524ae3cc14c1af6977a358829cc673b4471159caa7d62bba7f2d9334262bcd4a"}, - {file = "gcloud_aio_bigquery-7.1.0.tar.gz", hash = "sha256:4a3c775c2677c0588e9caeb2df40d81a54b31c174e562a527cb08e023c4408a3"}, -] - -[package.dependencies] -gcloud-aio-auth = ">=3.1.0,<6.0.0" - -[[package]] -name = "gcloud-aio-storage" -version = "9.2.0" -description = "Python Client for Google Cloud Storage" -optional = false -python-versions = ">=3.8,<4.0" -files = [ - {file = "gcloud_aio_storage-9.2.0-py3-none-any.whl", hash = "sha256:0a8cc27223cea05ad27117fa574ce8697ec32a252382cbfdfe54df0678e92d03"}, - {file = "gcloud_aio_storage-9.2.0.tar.gz", hash = "sha256:47be865222d22fdf873cd5a4af9a285d7b64b176d4d92f1773ecacd52a6a8c6f"}, -] - -[package.dependencies] -aiofiles = ">=0.6.0,<24.0.0" -gcloud-aio-auth = ">=3.6.0,<6.0.0" -pyasn1-modules = ">=0.2.1,<0.4.0" -rsa = ">=3.1.4,<5.0.0" - [[package]] name = "gcsfs" version = "2024.6.0" @@ -2324,944 +1286,191 @@ doc = ["sphinx (==4.3.2)", "sphinx-autodoc-typehints", "sphinx-rtd-theme", "sphi test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions"] [[package]] -name = "google" -version = "3.0.0" -description = "Python bindings to the Google search engine." -optional = false -python-versions = "*" -files = [ - {file = "google-3.0.0-py2.py3-none-any.whl", hash = "sha256:889cf695f84e4ae2c55fbc0cfdaf4c1e729417fa52ab1db0485202ba173e4935"}, - {file = "google-3.0.0.tar.gz", hash = "sha256:143530122ee5130509ad5e989f0512f7cb218b2d4eddbafbad40fd10e8d8ccbe"}, -] - -[package.dependencies] -beautifulsoup4 = "*" - -[[package]] -name = "google-ads" -version = "22.1.0" -description = "Client library for the Google Ads API" -optional = false -python-versions = ">=3.7, <3.12" -files = [ - {file = "google-ads-22.1.0.tar.gz", hash = "sha256:cfab38b40eb8424a4a514823bd8b911a57ef55dd64e2112cfa46a70d8090de98"}, - {file = "google_ads-22.1.0-py3-none-any.whl", hash = "sha256:6fdd3fb635678fbb3c8f87271afc81f0e139882b83b48505160fc4daacf33ad0"}, -] - -[package.dependencies] -google-api-core = ">=2.8.0,<=3.0.0" -google-auth-oauthlib = ">=0.3.0,<2.0.0" -googleapis-common-protos = ">=1.56.0,<2.0.0" -grpcio = ">=1.38.1,<2.0.0" -grpcio-status = ">=1.38.1,<2.0.0" -proto-plus = ">=1.19.6,<2.0.0" -protobuf = ">=3.12.0,<3.18.dev0 || >=3.20.dev0,<5.0.0" -PyYAML = ">=5.1,<7.0" -setuptools = ">=40.3.0" - -[package.extras] -tests = ["nox (>=2020.12.31,<2022.6)"] - -[[package]] -name = "google-analytics-admin" -version = "0.22.7" -description = "Google Analytics Admin API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-analytics-admin-0.22.7.tar.gz", hash = "sha256:9546afaddf7ee275ec4729de6da8b15f27d4d245ee8896f80800e22572fc7987"}, - {file = "google_analytics_admin-0.22.7-py2.py3-none-any.whl", hash = "sha256:09463653ecb42306c34fb07c9ff27193737aae8e63c52b8f695bf705e8589b46"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-api-core" -version = "2.19.0" -description = "Google API client core library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-api-core-2.19.0.tar.gz", hash = "sha256:cf1b7c2694047886d2af1128a03ae99e391108a08804f87cfd35970e49c9cd10"}, - {file = "google_api_core-2.19.0-py3-none-any.whl", hash = "sha256:8661eec4078c35428fd3f69a2c7ee29e342896b70f01d1a1cbcb334372dd6251"}, -] - -[package.dependencies] -google-auth = ">=2.14.1,<3.0.dev0" -googleapis-common-protos = ">=1.56.2,<2.0.dev0" -grpcio = {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""} -grpcio-status = {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "extra == \"grpc\""} -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" -requests = ">=2.18.0,<3.0.0.dev0" - -[package.extras] -grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] -grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] -grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] - -[[package]] -name = "google-api-python-client" -version = "2.134.0" -description = "Google API Client Library for Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-api-python-client-2.134.0.tar.gz", hash = "sha256:4a8f0bea651a212997cc83c0f271fc86f80ef93d1cee9d84de7dfaeef2a858b6"}, - {file = "google_api_python_client-2.134.0-py2.py3-none-any.whl", hash = "sha256:ba05d60f6239990b7994f6328f17bb154c602d31860fb553016dc9f8ce886945"}, -] - -[package.dependencies] -google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0.dev0" -google-auth = ">=1.32.0,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0.dev0" -google-auth-httplib2 = ">=0.2.0,<1.0.0" -httplib2 = ">=0.19.0,<1.dev0" -uritemplate = ">=3.0.1,<5" - -[[package]] -name = "google-auth" -version = "2.30.0" -description = "Google Authentication Library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-auth-2.30.0.tar.gz", hash = "sha256:ab630a1320f6720909ad76a7dbdb6841cdf5c66b328d690027e4867bdfb16688"}, - {file = "google_auth-2.30.0-py2.py3-none-any.whl", hash = "sha256:8df7da660f62757388b8a7f249df13549b3373f24388cb5d2f1dd91cc18180b5"}, -] - -[package.dependencies] -cachetools = ">=2.0.0,<6.0" -pyasn1-modules = ">=0.2.1" -rsa = ">=3.1.4,<5" - -[package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] -enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] -pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] -reauth = ["pyu2f (>=0.1.5)"] -requests = ["requests (>=2.20.0,<3.0.0.dev0)"] - -[[package]] -name = "google-auth-httplib2" -version = "0.2.0" -description = "Google Authentication Library: httplib2 transport" -optional = false -python-versions = "*" -files = [ - {file = "google-auth-httplib2-0.2.0.tar.gz", hash = "sha256:38aa7badf48f974f1eb9861794e9c0cb2a0511a4ec0679b1f886d108f5640e05"}, - {file = "google_auth_httplib2-0.2.0-py2.py3-none-any.whl", hash = "sha256:b65a0a2123300dd71281a7bf6e64d65a0759287df52729bdd1ae2e47dc311a3d"}, -] - -[package.dependencies] -google-auth = "*" -httplib2 = ">=0.19.0" - -[[package]] -name = "google-auth-oauthlib" -version = "0.8.0" -description = "Google Authentication Library" -optional = false -python-versions = ">=3.6" -files = [ - {file = "google-auth-oauthlib-0.8.0.tar.gz", hash = "sha256:81056a310fb1c4a3e5a7e1a443e1eb96593c6bbc55b26c0261e4d3295d3e6593"}, - {file = "google_auth_oauthlib-0.8.0-py2.py3-none-any.whl", hash = "sha256:40cc612a13c3336d5433e94e2adb42a0c88f6feb6c55769e44500fc70043a576"}, -] - -[package.dependencies] -google-auth = ">=2.15.0" -requests-oauthlib = ">=0.7.0" - -[package.extras] -tool = ["click (>=6.0.0)"] - -[[package]] -name = "google-cloud-aiplatform" -version = "1.56.0" -description = "Vertex AI API client library" -optional = false -python-versions = ">=3.8" -files = [ - {file = "google-cloud-aiplatform-1.56.0.tar.gz", hash = "sha256:d4cfb085427dac01142915f523949ac2955d6c7f148d95017d3286a77caf5d5e"}, - {file = "google_cloud_aiplatform-1.56.0-py2.py3-none-any.whl", hash = "sha256:ee1ab3bd115c3caebf8ddfd3e47eeb8396a3ec2fc5f5baf1a5c295c8d64333ab"}, -] - -[package.dependencies] -docstring-parser = "<1" -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.8.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<3.0.0dev" -google-cloud-bigquery = ">=1.15.0,<3.20.0 || >3.20.0,<4.0.0dev" -google-cloud-resource-manager = ">=1.3.3,<3.0.0dev" -google-cloud-storage = ">=1.32.0,<3.0.0dev" -packaging = ">=14.3" -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" -pydantic = "<3" -shapely = "<3.0.0dev" - -[package.extras] -autologging = ["mlflow (>=1.27.0,<=2.1.1)"] -cloud-profiler = ["tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "werkzeug (>=2.0.0,<2.1.0dev)"] -datasets = ["pyarrow (>=10.0.1)", "pyarrow (>=14.0.0)", "pyarrow (>=3.0.0,<8.0dev)"] -endpoint = ["requests (>=2.28.1)"] -full = ["cloudpickle (<3.0)", "docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<=0.109.1)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-cloud-logging (<4.0)", "google-vizier (>=0.1.6)", "httpx (>=0.23.0,<0.25.0)", "immutabledict", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.1.1)", "nest-asyncio (>=1.0.0,<1.6.0)", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pandas (>=1.0.0,<2.2.0)", "pyarrow (>=10.0.1)", "pyarrow (>=14.0.0)", "pyarrow (>=3.0.0,<8.0dev)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pyyaml (>=5.3.1,<7)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<=2.9.3)", "ray[default] (>=2.5,<=2.9.3)", "requests (>=2.28.1)", "setuptools (<70.0.0)", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<2.1.0dev)"] -langchain = ["langchain (>=0.1.16,<0.3)", "langchain-core (<0.2)", "langchain-google-vertexai (<2)", "openinference-instrumentation-langchain (>=0.1.19,<0.2)", "tenacity (<=8.3)"] -langchain-testing = ["absl-py", "cloudpickle (>=3.0,<4.0)", "langchain (>=0.1.16,<0.3)", "langchain-core (<0.2)", "langchain-google-vertexai (<2)", "openinference-instrumentation-langchain (>=0.1.19,<0.2)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-sdk (<2)", "pydantic (>=2.6.3,<3)", "pytest-xdist", "tenacity (<=8.3)"] -lit = ["explainable-ai-sdk (>=1.0.0)", "lit-nlp (==0.4.0)", "pandas (>=1.0.0)", "tensorflow (>=2.3.0,<3.0.0dev)"] -metadata = ["numpy (>=1.15.0)", "pandas (>=1.0.0)"] -pipelines = ["pyyaml (>=5.3.1,<7)"] -prediction = ["docker (>=5.0.3)", "fastapi (>=0.71.0,<=0.109.1)", "httpx (>=0.23.0,<0.25.0)", "starlette (>=0.17.1)", "uvicorn[standard] (>=0.16.0)"] -preview = ["cloudpickle (<3.0)", "google-cloud-logging (<4.0)"] -private-endpoints = ["requests (>=2.28.1)", "urllib3 (>=1.21.1,<1.27)"] -rapid-evaluation = ["nest-asyncio (>=1.0.0,<1.6.0)", "pandas (>=1.0.0,<2.2.0)"] -ray = ["google-cloud-bigquery", "google-cloud-bigquery-storage", "immutabledict", "pandas (>=1.0.0,<2.2.0)", "pyarrow (>=6.0.1)", "pydantic (<2)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<=2.9.3)", "ray[default] (>=2.5,<=2.9.3)", "setuptools (<70.0.0)"] -ray-testing = ["google-cloud-bigquery", "google-cloud-bigquery-storage", "immutabledict", "pandas (>=1.0.0,<2.2.0)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pytest-xdist", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<=2.9.3)", "ray[default] (>=2.5,<=2.9.3)", "ray[train] (==2.9.3)", "scikit-learn", "setuptools (<70.0.0)", "tensorflow", "torch (>=2.0.0,<2.1.0)", "xgboost", "xgboost-ray"] -reasoningengine = ["cloudpickle (>=3.0,<4.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-sdk (<2)", "pydantic (>=2.6.3,<3)"] -tensorboard = ["tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "werkzeug (>=2.0.0,<2.1.0dev)"] -testing = ["bigframes", "cloudpickle (<3.0)", "docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<=0.109.1)", "google-api-core (>=2.11,<3.0.0)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-cloud-logging (<4.0)", "google-vizier (>=0.1.6)", "grpcio-testing", "httpx (>=0.23.0,<0.25.0)", "immutabledict", "ipython", "kfp (>=2.6.0,<3.0.0)", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.1.1)", "nest-asyncio (>=1.0.0,<1.6.0)", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pandas (>=1.0.0,<2.2.0)", "pyarrow (>=10.0.1)", "pyarrow (>=14.0.0)", "pyarrow (>=3.0.0,<8.0dev)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pyfakefs", "pytest-asyncio", "pytest-xdist", "pyyaml (>=5.3.1,<7)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<=2.9.3)", "ray[default] (>=2.5,<=2.9.3)", "requests (>=2.28.1)", "requests-toolbelt (<1.0.0)", "scikit-learn", "setuptools (<70.0.0)", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (==2.13.0)", "tensorflow (==2.16.1)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "torch (>=2.0.0,<2.1.0)", "torch (>=2.2.0)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<2.1.0dev)", "xgboost"] -vizier = ["google-vizier (>=0.1.6)"] -xai = ["tensorflow (>=2.3.0,<3.0.0dev)"] - -[[package]] -name = "google-cloud-appengine-logging" -version = "1.4.3" -description = "Google Cloud Appengine Logging API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-appengine-logging-1.4.3.tar.gz", hash = "sha256:fb504e6199fe8de85baa9d31cecf6776877851fe58867de603317ec7cc739987"}, - {file = "google_cloud_appengine_logging-1.4.3-py2.py3-none-any.whl", hash = "sha256:8e30af51d853f219caf29e8b8b342b9ce8214b29f334dafae38d39aaaff7d372"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-audit-log" -version = "0.2.5" -description = "Google Cloud Audit Protos" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-audit-log-0.2.5.tar.gz", hash = "sha256:86e2faba3383adc8fd04a5bd7fd4f960b3e4aedaa7ed950f2f891ce16902eb6b"}, - {file = "google_cloud_audit_log-0.2.5-py2.py3-none-any.whl", hash = "sha256:18b94d4579002a450b7902cd2e8b8fdcb1ea2dd4df3b41f8f82be6d9f7fcd746"}, -] - -[package.dependencies] -googleapis-common-protos = ">=1.56.2,<2.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-automl" -version = "2.13.3" -description = "Google Cloud Automl API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-automl-2.13.3.tar.gz", hash = "sha256:891a9082eaedeb17bc5bb724fc150b7702c684d7420f9f22ae3f7c5fc611c71a"}, - {file = "google_cloud_automl-2.13.3-py2.py3-none-any.whl", hash = "sha256:8117943ad1534f1d11d40e0937ade7965c56a6d7fd2c2314e56942361727a6a2"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[package.extras] -libcst = ["libcst (>=0.2.5)"] -pandas = ["pandas (>=1.0.5)"] -storage = ["google-cloud-storage (>=1.18.0,<3.0.0dev)"] - -[[package]] -name = "google-cloud-batch" -version = "0.17.21" -description = "Google Cloud Batch API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-batch-0.17.21.tar.gz", hash = "sha256:ead5fd10553280a2fa9a05d892ff0446198ba381ad2895c88a80803e34e38a0a"}, - {file = "google_cloud_batch-0.17.21-py2.py3-none-any.whl", hash = "sha256:a202defeb82ed30479c80d13e6ef2d3952cc6f47d28bdf8376d12fa36ad407ac"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-bigquery" -version = "3.25.0" -description = "Google BigQuery API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-bigquery-3.25.0.tar.gz", hash = "sha256:5b2aff3205a854481117436836ae1403f11f2594e6810a98886afd57eda28509"}, - {file = "google_cloud_bigquery-3.25.0-py2.py3-none-any.whl", hash = "sha256:7f0c371bc74d2a7fb74dacbc00ac0f90c8c2bec2289b51dd6685a275873b1ce9"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<3.0.0dev" -google-cloud-core = ">=1.6.0,<3.0.0dev" -google-resumable-media = ">=0.6.0,<3.0dev" -packaging = ">=20.0.0" -python-dateutil = ">=2.7.2,<3.0dev" -requests = ">=2.21.0,<3.0.0dev" - -[package.extras] -all = ["Shapely (>=1.8.4,<3.0.0dev)", "db-dtypes (>=0.3.0,<2.0.0dev)", "geopandas (>=0.9.0,<1.0dev)", "google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "importlib-metadata (>=1.0.0)", "ipykernel (>=6.0.0)", "ipython (>=7.23.1,!=8.1.0)", "ipywidgets (>=7.7.0)", "opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)", "pandas (>=1.1.0)", "proto-plus (>=1.15.0,<2.0.0dev)", "protobuf (>=3.19.5,!=3.20.0,!=3.20.1,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<5.0.0dev)", "pyarrow (>=3.0.0)", "tqdm (>=4.7.4,<5.0.0dev)"] -bigquery-v2 = ["proto-plus (>=1.15.0,<2.0.0dev)", "protobuf (>=3.19.5,!=3.20.0,!=3.20.1,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<5.0.0dev)"] -bqstorage = ["google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "pyarrow (>=3.0.0)"] -geopandas = ["Shapely (>=1.8.4,<3.0.0dev)", "geopandas (>=0.9.0,<1.0dev)"] -ipython = ["ipykernel (>=6.0.0)", "ipython (>=7.23.1,!=8.1.0)"] -ipywidgets = ["ipykernel (>=6.0.0)", "ipywidgets (>=7.7.0)"] -opentelemetry = ["opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)"] -pandas = ["db-dtypes (>=0.3.0,<2.0.0dev)", "importlib-metadata (>=1.0.0)", "pandas (>=1.1.0)", "pyarrow (>=3.0.0)"] -tqdm = ["tqdm (>=4.7.4,<5.0.0dev)"] - -[[package]] -name = "google-cloud-bigquery-datatransfer" -version = "3.15.3" -description = "Google Cloud Bigquery Datatransfer API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-bigquery-datatransfer-3.15.3.tar.gz", hash = "sha256:e4c84eed31209c43b43f08dda7307eec0666a2431d8c087acf4a682ad41f3ab1"}, - {file = "google_cloud_bigquery_datatransfer-3.15.3-py2.py3-none-any.whl", hash = "sha256:cb8a0bf980d7d9386af638c42c006093f948147fc4bca3f11f724969517651dd"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-bigtable" -version = "2.24.0" -description = "Google Cloud Bigtable API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-bigtable-2.24.0.tar.gz", hash = "sha256:ace75f62ca3c52d6619d4ff7aed982129cae508baf776d81b33313f4f9ea5ed4"}, - {file = "google_cloud_bigtable-2.24.0-py2.py3-none-any.whl", hash = "sha256:09f35c1afcd57fec405ca5713919f09122a9beaf60a4f6952af6d4ac03065c91"}, -] - -[package.dependencies] -google-api-core = {version = ">=2.16.0,<3.0.0dev", extras = ["grpc"]} -google-cloud-core = ">=1.4.4,<3.0.0dev" -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[package.extras] -libcst = ["libcst (>=0.2.5)"] - -[[package]] -name = "google-cloud-build" -version = "3.24.0" -description = "Google Cloud Build API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-build-3.24.0.tar.gz", hash = "sha256:dbaf1c0df4bd8579a16b985332412847a3fd6f58bd2b72b38fbd791b80d0a900"}, - {file = "google_cloud_build-3.24.0-py2.py3-none-any.whl", hash = "sha256:1ba689730b5e27b8e226f3c7ba38e5af006321dcfbae211f995f26f9294fb19a"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-compute" -version = "1.19.0" -description = "Google Cloud Compute API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-compute-1.19.0.tar.gz", hash = "sha256:a07b3408b3f77786dcb196669ff3767bc51080718a7c2d3fd779defc8d817b4d"}, - {file = "google_cloud_compute-1.19.0-py2.py3-none-any.whl", hash = "sha256:48d5582dd257fc817113556ab40990ec7a50fb6b2e341bc8a55ef90e2e66501d"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-container" -version = "2.47.0" -description = "Google Cloud Container API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-container-2.47.0.tar.gz", hash = "sha256:b6fcce293bb69f96fd243a3d109c38f0152b26e3b0391f492ba3d0ca2e381df2"}, - {file = "google_cloud_container-2.47.0-py2.py3-none-any.whl", hash = "sha256:327e7b3ff68dbaca367c1840e8c2b0fc8a3d922264faf96dd0233c98785ee42a"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-core" -version = "2.4.1" -description = "Google Cloud API client core library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-core-2.4.1.tar.gz", hash = "sha256:9b7749272a812bde58fff28868d0c5e2f585b82f37e09a1f6ed2d4d10f134073"}, - {file = "google_cloud_core-2.4.1-py2.py3-none-any.whl", hash = "sha256:a9e6a4422b9ac5c29f79a0ede9485473338e2ce78d91f2370c01e730eab22e61"}, -] - -[package.dependencies] -google-api-core = ">=1.31.6,<2.0.dev0 || >2.3.0,<3.0.0dev" -google-auth = ">=1.25.0,<3.0dev" - -[package.extras] -grpc = ["grpcio (>=1.38.0,<2.0dev)", "grpcio-status (>=1.38.0,<2.0.dev0)"] - -[[package]] -name = "google-cloud-datacatalog" -version = "3.19.0" -description = "Google Cloud Datacatalog API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-datacatalog-3.19.0.tar.gz", hash = "sha256:3a8d0ef787f0edd4703e7e27c91a1b5f85bdbe04d61609132ec77269f7d52692"}, - {file = "google_cloud_datacatalog-3.19.0-py2.py3-none-any.whl", hash = "sha256:c76ccf0d98d150c2feb1552518f6efde441c820664742ccbe4daf749e009f58d"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-dataflow-client" -version = "0.8.10" -description = "Google Cloud Dataflow Client API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-dataflow-client-0.8.10.tar.gz", hash = "sha256:6aa8178743bce4b6c9142b492e649db84f55db70a88ec29a3d889054c4752144"}, - {file = "google_cloud_dataflow_client-0.8.10-py2.py3-none-any.whl", hash = "sha256:4b0dce886ec65fbf3195f87e956d559f6d4bd88a03b527aa8498c303e2d4d39a"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-dataform" -version = "0.5.9" -description = "Google Cloud Dataform API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-dataform-0.5.9.tar.gz", hash = "sha256:2733c3fbda4f0134629e2d6554db93e1840683567043906268718b1a874eb9ac"}, - {file = "google_cloud_dataform-0.5.9-py2.py3-none-any.whl", hash = "sha256:c94e61358a68de389803bb06b936f815108211b3324e1f143db9a8bd2bb6a081"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-dataplex" -version = "2.0.1" -description = "Google Cloud Dataplex API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-dataplex-2.0.1.tar.gz", hash = "sha256:f4ccb1f76eb7b8a2ae01cdcb2041bb613045d262b57bd65d2c7522e766923c15"}, - {file = "google_cloud_dataplex-2.0.1-py2.py3-none-any.whl", hash = "sha256:ebe732dcf54b372c4af8ee40e2f43e3eff329b98d2060b1a803a0e9e656f5da6"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-dataproc" -version = "5.10.1" -description = "Google Cloud Dataproc API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-dataproc-5.10.1.tar.gz", hash = "sha256:f3f0f0f3933328e80273774540368432550e296c255928657069a31a2de01c39"}, - {file = "google_cloud_dataproc-5.10.1-py2.py3-none-any.whl", hash = "sha256:28b763c9b019ca7d7c3e917ade04647c00494e77d4e682ca221d53e8d36f70af"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" - -[[package]] -name = "google-cloud-dataproc-metastore" -version = "1.15.3" -description = "Google Cloud Dataproc Metastore API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-dataproc-metastore-1.15.3.tar.gz", hash = "sha256:1f8a5a66e43a4d1c119e9be225ba66b041f432d046b5c4da6717fbd56fcfb4f5"}, - {file = "google_cloud_dataproc_metastore-1.15.3-py2.py3-none-any.whl", hash = "sha256:871dcea73ae2ab2ecfb6da1fe1bc82206eee817b744755f7b24aaef554b8d896"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-dlp" -version = "3.18.0" -description = "Google Cloud Dlp API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-dlp-3.18.0.tar.gz", hash = "sha256:47408cc75e8398c7dce93c3f62a3ed8582b20f125cc8e0dd331015ae3eb62f7e"}, - {file = "google_cloud_dlp-3.18.0-py2.py3-none-any.whl", hash = "sha256:68c5c3767b9d96597b6c51c97fe4d824439ca71622048b3d44b89ed7d6eecf0d"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-kms" -version = "2.23.0" -description = "Google Cloud Kms API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-kms-2.23.0.tar.gz", hash = "sha256:52b5fc6f70b163516fad610aafc088fbe788f501d5bbe1d5f458cdc3fcbafd2c"}, - {file = "google_cloud_kms-2.23.0-py2.py3-none-any.whl", hash = "sha256:cbf68592a5626ac4de43d8149f7933e9b9bd311e1c88d0d16d9e56a49d7a21c0"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-language" -version = "2.13.3" -description = "Google Cloud Language API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-language-2.13.3.tar.gz", hash = "sha256:569d35260af906de25b8e2a76b6364e05809b8453afd89da738d4a4fcb90846f"}, - {file = "google_cloud_language-2.13.3-py2.py3-none-any.whl", hash = "sha256:b060de20d8ed2b20b7b7ebd8a46ae240df36c9977db383db5155276d2b1f6b9a"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-logging" -version = "3.10.0" -description = "Stackdriver Logging API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-logging-3.10.0.tar.gz", hash = "sha256:d93d347351240ddb14cfe201987a2d32cf9d7f478b8b2fabed3015b425b3274f"}, - {file = "google_cloud_logging-3.10.0-py2.py3-none-any.whl", hash = "sha256:132192beb45731130a2ffbcd4b2b5cbd87370e7dcfa7397ae4002154f542bd20"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -google-cloud-appengine-logging = ">=0.1.0,<2.0.0dev" -google-cloud-audit-log = ">=0.1.0,<1.0.0dev" -google-cloud-core = ">=2.0.0,<3.0.0dev" -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-memcache" -version = "1.9.3" -description = "Google Cloud Memcache API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-memcache-1.9.3.tar.gz", hash = "sha256:ee5ff95afe47efc1a0746ba13b2f56996bc018f158f6b0cad69d835b0447d6e8"}, - {file = "google_cloud_memcache-1.9.3-py2.py3-none-any.whl", hash = "sha256:d1574670dcdb861cc772e2b797f7e5fb83b9dd7ef2ce34fbe4ff54d454a816d3"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-monitoring" -version = "2.21.0" -description = "Google Cloud Monitoring API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-monitoring-2.21.0.tar.gz", hash = "sha256:e7b1c8758fc3563ffb9a347bc5172e2782f44c121bc80fc15283e289cff675bf"}, - {file = "google_cloud_monitoring-2.21.0-py2.py3-none-any.whl", hash = "sha256:1b174e656a3bfd767c269bf2ba023b40e0a80a85e36ed0b75bb272be65e76904"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[package.extras] -pandas = ["pandas (>=0.23.2)"] - -[[package]] -name = "google-cloud-orchestration-airflow" -version = "1.12.1" -description = "Google Cloud Orchestration Airflow API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-orchestration-airflow-1.12.1.tar.gz", hash = "sha256:659a72f506a9441f1938664e98cdced9a4a852dc5d8c533a5c2f822cefe72eb1"}, - {file = "google_cloud_orchestration_airflow-1.12.1-py2.py3-none-any.whl", hash = "sha256:9dab139528860c3d10b9affe6a7e34848f10e15f5800554792c1bab37f713e3d"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-os-login" -version = "2.14.3" -description = "Google Cloud Os Login API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-os-login-2.14.3.tar.gz", hash = "sha256:b1a15ec7ee306de890750822dc4aab04c64e5bcf76447590f45551bf1afcf1e8"}, - {file = "google_cloud_os_login-2.14.3-py2.py3-none-any.whl", hash = "sha256:de19bb2ade36e982256050972b5f68be34a0f4c70365c76a7cd91de3f0e7985f"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-pubsub" -version = "2.21.5" -description = "Google Cloud Pub/Sub API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-pubsub-2.21.5.tar.gz", hash = "sha256:4fa96e7f200359ccc49cf6657e31ac35f5e6e55d00fbb3cedfa672903cf75b24"}, - {file = "google_cloud_pubsub-2.21.5-py2.py3-none-any.whl", hash = "sha256:fbd6b00a1e28ea47609b2a5562aeecbaf31ad9cf4f7a83f91c3605e869c6447c"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<3.0.0dev" -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -grpcio = ">=1.51.3,<2.0dev" -grpcio-status = ">=1.33.2" -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" - -[package.extras] -libcst = ["libcst (>=0.3.10)"] - -[[package]] -name = "google-cloud-redis" -version = "2.15.3" -description = "Google Cloud Redis API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-redis-2.15.3.tar.gz", hash = "sha256:e6a231e45107038cfe498dfad1f6dad2ca7bdca3a931323730be03ab7a000a8f"}, - {file = "google_cloud_redis-2.15.3-py2.py3-none-any.whl", hash = "sha256:df79f6f8a81f948d2d5343a76e7c9108ab56eab9279be0763da6968f497b2bdb"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-resource-manager" -version = "1.12.3" -description = "Google Cloud Resource Manager API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-resource-manager-1.12.3.tar.gz", hash = "sha256:809851824119834e4f2310b2c4f38621c1d16b2bb14d5b9f132e69c79d355e7f"}, - {file = "google_cloud_resource_manager-1.12.3-py2.py3-none-any.whl", hash = "sha256:92be7d6959927b76d90eafc4028985c37975a46ded5466a018f02e8649e113d4"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-run" -version = "0.10.5" -description = "Google Cloud Run API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-run-0.10.5.tar.gz", hash = "sha256:d6c546693ad1232794b75c617871f2e46283c0cd0c4cc3886b85b8f0a3ba575f"}, - {file = "google_cloud_run-0.10.5-py2.py3-none-any.whl", hash = "sha256:0f68125f13d1a87f74e1e78c37fa6afb4b094d76dad2b9f951d5526648e8939c"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-secret-manager" -version = "2.20.0" -description = "Google Cloud Secret Manager API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-secret-manager-2.20.0.tar.gz", hash = "sha256:a086a7413aaf4fffbd1c4fe9229ef0ce9bcf48f5a8df5b449c4a32deb5a2cfde"}, - {file = "google_cloud_secret_manager-2.20.0-py2.py3-none-any.whl", hash = "sha256:c20bf22e59d220c51aa84a1db3411b14b83aa71f788fae8d273c03a4bf3e77ed"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" - -[[package]] -name = "google-cloud-spanner" -version = "3.47.0" -description = "Google Cloud Spanner API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google_cloud_spanner-3.47.0-py2.py3-none-any.whl", hash = "sha256:b05fa4ffccf08af3f32c3c5c77edd1486a76ddbd42db8ad8865830fab3cfda80"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-cloud-core = ">=1.4.4,<3.0dev" -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -grpc-interceptor = ">=0.15.4" -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" -sqlparse = ">=0.4.4" - -[package.extras] -libcst = ["libcst (>=0.2.5)"] -tracing = ["opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0,<0.23dev)", "opentelemetry-sdk (>=1.1.0)"] - -[[package]] -name = "google-cloud-speech" -version = "2.26.0" -description = "Google Cloud Speech API client library" +name = "google" +version = "3.0.0" +description = "Python bindings to the Google search engine." optional = false -python-versions = ">=3.7" +python-versions = "*" files = [ - {file = "google-cloud-speech-2.26.0.tar.gz", hash = "sha256:d3156a78496aeacff403429408a1b13efe996da6f0544a25567904ad801671d5"}, - {file = "google_cloud_speech-2.26.0-py2.py3-none-any.whl", hash = "sha256:8b61aebcbcc9bd5450933c94c431584a07667e022d12834f9037bb2c0e673c87"}, + {file = "google-3.0.0-py2.py3-none-any.whl", hash = "sha256:889cf695f84e4ae2c55fbc0cfdaf4c1e729417fa52ab1db0485202ba173e4935"}, + {file = "google-3.0.0.tar.gz", hash = "sha256:143530122ee5130509ad5e989f0512f7cb218b2d4eddbafbad40fd10e8d8ccbe"}, ] [package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" +beautifulsoup4 = "*" [[package]] -name = "google-cloud-storage" -version = "2.17.0" -description = "Google Cloud Storage API client library" +name = "google-api-core" +version = "2.19.0" +description = "Google API client core library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-storage-2.17.0.tar.gz", hash = "sha256:49378abff54ef656b52dca5ef0f2eba9aa83dc2b2c72c78714b03a1a95fe9388"}, - {file = "google_cloud_storage-2.17.0-py2.py3-none-any.whl", hash = "sha256:5b393bc766b7a3bc6f5407b9e665b2450d36282614b7945e570b3480a456d1e1"}, + {file = "google-api-core-2.19.0.tar.gz", hash = "sha256:cf1b7c2694047886d2af1128a03ae99e391108a08804f87cfd35970e49c9cd10"}, + {file = "google_api_core-2.19.0-py3-none-any.whl", hash = "sha256:8661eec4078c35428fd3f69a2c7ee29e342896b70f01d1a1cbcb334372dd6251"}, ] [package.dependencies] -google-api-core = ">=2.15.0,<3.0.0dev" -google-auth = ">=2.26.1,<3.0dev" -google-cloud-core = ">=2.3.0,<3.0dev" -google-crc32c = ">=1.0,<2.0dev" -google-resumable-media = ">=2.6.0" -requests = ">=2.18.0,<3.0.0dev" +google-auth = ">=2.14.1,<3.0.dev0" +googleapis-common-protos = ">=1.56.2,<2.0.dev0" +grpcio = {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""} +grpcio-status = {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "extra == \"grpc\""} +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" +requests = ">=2.18.0,<3.0.0.dev0" [package.extras] -protobuf = ["protobuf (<5.0.0dev)"] +grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] +grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] +grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] -name = "google-cloud-storage-transfer" -version = "1.11.3" -description = "Google Cloud Storage Transfer API client library" +name = "google-auth" +version = "2.30.0" +description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-storage-transfer-1.11.3.tar.gz", hash = "sha256:c4564749492f41957f44c41b76f61f72c12b519424b841895bfe2d932c6f1490"}, - {file = "google_cloud_storage_transfer-1.11.3-py2.py3-none-any.whl", hash = "sha256:698e1b21c9dc710f543b2e6dc3c70334b872d4a80fafc0b2718fc91b6f45858e"}, + {file = "google-auth-2.30.0.tar.gz", hash = "sha256:ab630a1320f6720909ad76a7dbdb6841cdf5c66b328d690027e4867bdfb16688"}, + {file = "google_auth-2.30.0-py2.py3-none-any.whl", hash = "sha256:8df7da660f62757388b8a7f249df13549b3373f24388cb5d2f1dd91cc18180b5"}, ] [package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" +cachetools = ">=2.0.0,<6.0" +pyasn1-modules = ">=0.2.1" +rsa = ">=3.1.4,<5" + +[package.extras] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] +enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] +pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] +reauth = ["pyu2f (>=0.1.5)"] +requests = ["requests (>=2.20.0,<3.0.0.dev0)"] [[package]] -name = "google-cloud-tasks" -version = "2.16.3" -description = "Google Cloud Tasks API client library" +name = "google-auth-oauthlib" +version = "0.8.0" +description = "Google Authentication Library" optional = false -python-versions = ">=3.7" +python-versions = ">=3.6" files = [ - {file = "google-cloud-tasks-2.16.3.tar.gz", hash = "sha256:d891fe7006db4d6122838aa6de4aca6e0077bab224edcae684666ae3e303c45f"}, - {file = "google_cloud_tasks-2.16.3-py2.py3-none-any.whl", hash = "sha256:a1a8473f5c76907525b51ae4c20182a42333b5c3e1dc5782d7af6c2f58241a0c"}, + {file = "google-auth-oauthlib-0.8.0.tar.gz", hash = "sha256:81056a310fb1c4a3e5a7e1a443e1eb96593c6bbc55b26c0261e4d3295d3e6593"}, + {file = "google_auth_oauthlib-0.8.0-py2.py3-none-any.whl", hash = "sha256:40cc612a13c3336d5433e94e2adb42a0c88f6feb6c55769e44500fc70043a576"}, ] [package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" +google-auth = ">=2.15.0" +requests-oauthlib = ">=0.7.0" + +[package.extras] +tool = ["click (>=6.0.0)"] [[package]] -name = "google-cloud-texttospeech" -version = "2.16.3" -description = "Google Cloud Texttospeech API client library" +name = "google-cloud-bigquery" +version = "3.25.0" +description = "Google BigQuery API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-texttospeech-2.16.3.tar.gz", hash = "sha256:fabc315032d137da0710bb4c268734d336212d8fa8316b23b277dd3a84ce721c"}, - {file = "google_cloud_texttospeech-2.16.3-py2.py3-none-any.whl", hash = "sha256:5d1e23f9270908a5d7ecf2af04105fbd3a7ddde60fe48506e397bd18c1ece499"}, + {file = "google-cloud-bigquery-3.25.0.tar.gz", hash = "sha256:5b2aff3205a854481117436836ae1403f11f2594e6810a98886afd57eda28509"}, + {file = "google_cloud_bigquery-3.25.0-py2.py3-none-any.whl", hash = "sha256:7f0c371bc74d2a7fb74dacbc00ac0f90c8c2bec2289b51dd6685a275873b1ce9"}, ] [package.dependencies] google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" +google-auth = ">=2.14.1,<3.0.0dev" +google-cloud-core = ">=1.6.0,<3.0.0dev" +google-resumable-media = ">=0.6.0,<3.0dev" +packaging = ">=20.0.0" +python-dateutil = ">=2.7.2,<3.0dev" +requests = ">=2.21.0,<3.0.0dev" + +[package.extras] +all = ["Shapely (>=1.8.4,<3.0.0dev)", "db-dtypes (>=0.3.0,<2.0.0dev)", "geopandas (>=0.9.0,<1.0dev)", "google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "importlib-metadata (>=1.0.0)", "ipykernel (>=6.0.0)", "ipython (>=7.23.1,!=8.1.0)", "ipywidgets (>=7.7.0)", "opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)", "pandas (>=1.1.0)", "proto-plus (>=1.15.0,<2.0.0dev)", "protobuf (>=3.19.5,!=3.20.0,!=3.20.1,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<5.0.0dev)", "pyarrow (>=3.0.0)", "tqdm (>=4.7.4,<5.0.0dev)"] +bigquery-v2 = ["proto-plus (>=1.15.0,<2.0.0dev)", "protobuf (>=3.19.5,!=3.20.0,!=3.20.1,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<5.0.0dev)"] +bqstorage = ["google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "pyarrow (>=3.0.0)"] +geopandas = ["Shapely (>=1.8.4,<3.0.0dev)", "geopandas (>=0.9.0,<1.0dev)"] +ipython = ["ipykernel (>=6.0.0)", "ipython (>=7.23.1,!=8.1.0)"] +ipywidgets = ["ipykernel (>=6.0.0)", "ipywidgets (>=7.7.0)"] +opentelemetry = ["opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)"] +pandas = ["db-dtypes (>=0.3.0,<2.0.0dev)", "importlib-metadata (>=1.0.0)", "pandas (>=1.1.0)", "pyarrow (>=3.0.0)"] +tqdm = ["tqdm (>=4.7.4,<5.0.0dev)"] [[package]] -name = "google-cloud-translate" -version = "3.15.3" -description = "Google Cloud Translate API client library" +name = "google-cloud-core" +version = "2.4.1" +description = "Google Cloud API client core library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-translate-3.15.3.tar.gz", hash = "sha256:ed587a1e60cf847c3b1add6b28256e2d1722fa73a4285334f5ec5ca933e616f2"}, - {file = "google_cloud_translate-3.15.3-py2.py3-none-any.whl", hash = "sha256:2e92cd286fb25d5cf9fc0e8710f524fdf80656b6b64947d244e91696e69346ad"}, + {file = "google-cloud-core-2.4.1.tar.gz", hash = "sha256:9b7749272a812bde58fff28868d0c5e2f585b82f37e09a1f6ed2d4d10f134073"}, + {file = "google_cloud_core-2.4.1-py2.py3-none-any.whl", hash = "sha256:a9e6a4422b9ac5c29f79a0ede9485473338e2ce78d91f2370c01e730eab22e61"}, ] [package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -google-cloud-core = ">=1.4.4,<3.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" +google-api-core = ">=1.31.6,<2.0.dev0 || >2.3.0,<3.0.0dev" +google-auth = ">=1.25.0,<3.0dev" + +[package.extras] +grpc = ["grpcio (>=1.38.0,<2.0dev)", "grpcio-status (>=1.38.0,<2.0.dev0)"] [[package]] -name = "google-cloud-videointelligence" -version = "2.13.3" -description = "Google Cloud Videointelligence API client library" +name = "google-cloud-dataproc" +version = "5.10.1" +description = "Google Cloud Dataproc API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-videointelligence-2.13.3.tar.gz", hash = "sha256:1460721d8120661c477c01af0edd3db03845857f52146a4a39f16b4acfb36f6d"}, - {file = "google_cloud_videointelligence-2.13.3-py2.py3-none-any.whl", hash = "sha256:2eddfc42c4ef60378b638a5f4dfe466fadefae5cd6b1134eee377b5937be2c9e"}, + {file = "google-cloud-dataproc-5.10.1.tar.gz", hash = "sha256:f3f0f0f3933328e80273774540368432550e296c255928657069a31a2de01c39"}, + {file = "google_cloud_dataproc-5.10.1-py2.py3-none-any.whl", hash = "sha256:28b763c9b019ca7d7c3e917ade04647c00494e77d4e682ca221d53e8d36f70af"}, ] [package.dependencies] google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" [[package]] -name = "google-cloud-vision" -version = "3.7.2" -description = "Google Cloud Vision API client library" +name = "google-cloud-secret-manager" +version = "2.20.0" +description = "Google Cloud Secret Manager API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-vision-3.7.2.tar.gz", hash = "sha256:044330ad618c810333ff2296cd27ffd145f249638d1b35b270de6b460b00e8d2"}, - {file = "google_cloud_vision-3.7.2-py2.py3-none-any.whl", hash = "sha256:a313088fcd9c016af0427c2447eea1ad01bc192ca4cc33babaace1be587bbf75"}, + {file = "google-cloud-secret-manager-2.20.0.tar.gz", hash = "sha256:a086a7413aaf4fffbd1c4fe9229ef0ce9bcf48f5a8df5b449c4a32deb5a2cfde"}, + {file = "google_cloud_secret_manager-2.20.0-py2.py3-none-any.whl", hash = "sha256:c20bf22e59d220c51aa84a1db3411b14b83aa71f788fae8d273c03a4bf3e77ed"}, ] [package.dependencies] google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" proto-plus = ">=1.22.3,<2.0.0dev" protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" [[package]] -name = "google-cloud-workflows" -version = "1.14.3" -description = "Google Cloud Workflows API client library" +name = "google-cloud-storage" +version = "2.17.0" +description = "Google Cloud Storage API client library" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-workflows-1.14.3.tar.gz", hash = "sha256:2140b97f78037b967d4185576886772fe17be77d2ae9996d207a334ed5a77ffe"}, - {file = "google_cloud_workflows-1.14.3-py2.py3-none-any.whl", hash = "sha256:8e700e1e6e9e9ca6375d16cad6230c52cd123beca4597c86a956940bcce996d1"}, + {file = "google-cloud-storage-2.17.0.tar.gz", hash = "sha256:49378abff54ef656b52dca5ef0f2eba9aa83dc2b2c72c78714b03a1a95fe9388"}, + {file = "google_cloud_storage-2.17.0-py2.py3-none-any.whl", hash = "sha256:5b393bc766b7a3bc6f5407b9e665b2450d36282614b7945e570b3480a456d1e1"}, ] [package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" +google-api-core = ">=2.15.0,<3.0.0dev" +google-auth = ">=2.26.1,<3.0dev" +google-cloud-core = ">=2.3.0,<3.0dev" +google-crc32c = ">=1.0,<2.0dev" +google-resumable-media = ">=2.6.0" +requests = ">=2.18.0,<3.0.0dev" + +[package.extras] +protobuf = ["protobuf (<5.0.0dev)"] [[package]] name = "google-crc32c" @@ -3343,129 +1552,6 @@ files = [ [package.extras] testing = ["pytest"] -[[package]] -name = "google-re2" -version = "1.1.20240601" -description = "RE2 Python bindings" -optional = false -python-versions = "~=3.8" -files = [ - {file = "google_re2-1.1.20240601-1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:7f2034ac5fc866b507a9fd8d0419f190d967b5c19dac11292347ab25ca3a5d09"}, - {file = "google_re2-1.1.20240601-1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:1906dd4a00cb1130eab588a20fa00962e631043bb8ed74474525841730312024"}, - {file = "google_re2-1.1.20240601-1-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:88858d1e8855d845590b6199cad9035738de98942fcd9acc26be4de7f076e011"}, - {file = "google_re2-1.1.20240601-1-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:f1b312054643fc705743ebd11b083b32575f4bdf11cbe8fb5d7898e0aabf4969"}, - {file = "google_re2-1.1.20240601-1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:44dc3d9f085d5c122d9bb2efb5d0a98b1c0b0e8073b57fb77738496f6bf398d7"}, - {file = "google_re2-1.1.20240601-1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:9f77b0a6ad9e47af3a85fc6f43a7c9316fcd53f04641a73e19d8a15691561773"}, - {file = "google_re2-1.1.20240601-1-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e50cf20b0ec36210d7550fd28a3713cdac4ac8a8cc57d038194de2b9a8749ff"}, - {file = "google_re2-1.1.20240601-1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ad0775d9114980a0b78d60be778e3c57c2e2e666ac2ce6621b7cc1cf59f89cf9"}, - {file = "google_re2-1.1.20240601-1-cp310-cp310-win32.whl", hash = "sha256:37728529376aeb27b414eba497a70faeed5febf46f1ce06119c34ec6cf7998c8"}, - {file = "google_re2-1.1.20240601-1-cp310-cp310-win_amd64.whl", hash = "sha256:cbb834f68e3a0cbc4ad1a28f6b0b93668ceca9571d2b083e9438128452dd74ca"}, - {file = "google_re2-1.1.20240601-1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:c6a6f8e769b76089d19a3f87be0f64355d85be6519e5a44f8600ab53dc1afa4b"}, - {file = "google_re2-1.1.20240601-1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:7eafa78ab0fbc915173043b898ed9c74d7d55768503d8b2f4e37a7267585b000"}, - {file = "google_re2-1.1.20240601-1-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:766a3d241b73f2e678e853212ab61c12d23fec54c4f61c636453b7dee97a3f4d"}, - {file = "google_re2-1.1.20240601-2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:b2633f8db3f6eeaccd52f38fe32690f434e4c41ab1c84735252df11883b1972b"}, - {file = "google_re2-1.1.20240601-2-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:389beabe9244f0008a79b5deedb38eaf3c2ae9259785746d8b8a5579ad46bb71"}, - {file = "google_re2-1.1.20240601-2-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:f9ed2a0e92ed79f944d836c533e69ca6e3e9dd85ac7af6f7adf715ee9793e28b"}, - {file = "google_re2-1.1.20240601-2-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:9ec8533a75d4bc8a6d1f6cce3a8489667d6c75e10b64c94f2091ac8eda0d9c26"}, - {file = "google_re2-1.1.20240601-2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:c73266bd88c8cde2af9b183f03f2b8d52587956138c918d9378e66fbe5315744"}, - {file = "google_re2-1.1.20240601-2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:68e71346c60486ce9075ea87983c8ab19ec1eae8202dae21e1ba3146ae6a4328"}, - {file = "google_re2-1.1.20240601-2-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:376c62ea5c669bf1cf17e5005f73802265eb5b60ba8dfe239f6acd4f3043a1f8"}, - {file = "google_re2-1.1.20240601-2-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8fe4d50da0db4e63388a9b8222d73f29d6f40cb6188e28d70c4126c96e194d5"}, - {file = "google_re2-1.1.20240601-2-cp310-cp310-win32.whl", hash = "sha256:362a42c407ceae7b76890e8cd40b5428be811282d66e3d962b4181c5c8101c20"}, - {file = "google_re2-1.1.20240601-2-cp310-cp310-win_amd64.whl", hash = "sha256:ae4cce9bd7ec7fc110b6db8dedc43905abf6d3cad357c93dec815e1e6310ef59"}, - {file = "google_re2-1.1.20240601-2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:67ff76bd1cae55720285a4b1889f42690008101e9b6628d8a84080474dceef23"}, - {file = "google_re2-1.1.20240601-2-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:f44179b03e5047f1ae1eca321d9fffa2841914cc1e8524cde2c25d3feb93eb99"}, - {file = "google_re2-1.1.20240601-2-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:7470e394925926a1b0233dc77971354667292c3c6a75b680952e8242b0ddc6dd"}, - {file = "google_re2-1.1.20240601-2-cp311-cp311-macosx_13_0_x86_64.whl", hash = "sha256:edc1c22fc52561615f9347763c19649568f0d984f6a000e3c954243c662c41a2"}, - {file = "google_re2-1.1.20240601-2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:625b0ebbcc64dfcd5b7cacf4c68ee5679361cb7b9d0915df262bceca98744760"}, - {file = "google_re2-1.1.20240601-2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:c40dd618164e285880ce2c56f150fb5fd54d3508ce2fd97b28e503b4e72e8655"}, - {file = "google_re2-1.1.20240601-2-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:363632640c8b95d94c5d563fa14bcba793501dac3fe9f18f25ac13b75265cdfb"}, - {file = "google_re2-1.1.20240601-2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e0a5a5b0f153b348bf121ee4ea2ea51bc2bbdd4bec71ff9ec28b3725a28cfbd"}, - {file = "google_re2-1.1.20240601-2-cp311-cp311-win32.whl", hash = "sha256:82b980f6ccfcc23a7c7761be08b49ad6835d8f20f612befb739f28d91fe8290b"}, - {file = "google_re2-1.1.20240601-2-cp311-cp311-win_amd64.whl", hash = "sha256:15d7517727aa3e7d23d6692ca6e44545f09ca8ae7bb3608509ea5729f23179b3"}, - {file = "google_re2-1.1.20240601-2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:087fca3f81eb9dbd411a24ed4dbe4fdd5f64b10a1db3cfd183527e7044ff5835"}, - {file = "google_re2-1.1.20240601-2-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:c2a52a88819cdcb38fa9124e5e9ede6fd76945ee4bb408d59e78c6e25012d276"}, - {file = "google_re2-1.1.20240601-2-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:9c7114b4481deafaba66b236f54c24b35753228afd1b1ca93aa47e8601d037f7"}, - {file = "google_re2-1.1.20240601-2-cp312-cp312-macosx_13_0_x86_64.whl", hash = "sha256:a827b7c8008f5c3b2ae6750a93e5a289bfc52eb66d3db9ca40b6b6ea617ac603"}, - {file = "google_re2-1.1.20240601-2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:aa067e14de6fdd16a2e4832d07445a8d9ef9f888e616c0b246bd6df81b21b66f"}, - {file = "google_re2-1.1.20240601-2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:c51f3e66a982927810acb5ad7f2c255595ca67159f3777ab30becf6c39cea9c0"}, - {file = "google_re2-1.1.20240601-2-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec277e51b45133d32bfdc6f3ef3a7dcbb835da2e33ce3e4622f9ba734e6e12fa"}, - {file = "google_re2-1.1.20240601-2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:78d9974fb0a7a942277385106dcf887710e3a3c65ce04f21d8e850d8950d5f0e"}, - {file = "google_re2-1.1.20240601-2-cp312-cp312-win32.whl", hash = "sha256:c8189aad330cf21ecf822c618ae4bd6156309bcc2d5bfa46471cf18e518e8a88"}, - {file = "google_re2-1.1.20240601-2-cp312-cp312-win_amd64.whl", hash = "sha256:de31b81ab64a91486240442fcbde367129925eb524c02aaa6afdf02856b300fe"}, - {file = "google_re2-1.1.20240601-2-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:9e2b73edf865a5eb4d7cb9833ae978c535434b0e27303742109f9d4c72006bd4"}, - {file = "google_re2-1.1.20240601-2-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:02b25f81f739d9370280c8e949844dd602a72d0ade914ca62c5a658d0c23a87d"}, - {file = "google_re2-1.1.20240601-2-cp38-cp38-macosx_13_0_arm64.whl", hash = "sha256:c6d61c33ff7754dc6054e3dbae8f7fc85aa925f5a7ae4c07d0668627cbca4657"}, - {file = "google_re2-1.1.20240601-2-cp38-cp38-macosx_13_0_x86_64.whl", hash = "sha256:544cc5421124def304ab442b326e322454906b0348b3416c728c6f88266a4fbb"}, - {file = "google_re2-1.1.20240601-2-cp38-cp38-macosx_14_0_arm64.whl", hash = "sha256:0013ddbbae8d42bd8ab42213c5da3741630eae98b6eca816d72bc77fdda3d356"}, - {file = "google_re2-1.1.20240601-2-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:41638ba091c79af68af29374dc250948ec3c0413012c5a1ba9a0807bb7819641"}, - {file = "google_re2-1.1.20240601-2-cp38-cp38-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:864d16144f2a044107ef0fda304678874483b504605a2f4b53f5c9b01d431cb5"}, - {file = "google_re2-1.1.20240601-2-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:48cac1cf44389155e21b601f3d388d9d7cca58d8f45e221a039f877783c48419"}, - {file = "google_re2-1.1.20240601-2-cp38-cp38-win32.whl", hash = "sha256:32757eb4da382a7173da3944d2c9473787b82d76a2a122dc30713f4030c5619e"}, - {file = "google_re2-1.1.20240601-2-cp38-cp38-win_amd64.whl", hash = "sha256:bf58d89749a0dcd689d87a56c8ae8604adbb28ad063ae652f03e074057b00012"}, - {file = "google_re2-1.1.20240601-2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:6abc7debc08a51810d1d3cd57031f543e50e402c05235eb7e7f1e464442ca637"}, - {file = "google_re2-1.1.20240601-2-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:2f19de42708b11aaa91e14dd05dacb9cdcbe6f9579c9a434757a4b6baea22fd0"}, - {file = "google_re2-1.1.20240601-2-cp39-cp39-macosx_13_0_arm64.whl", hash = "sha256:4c1d4974da79dec3c0b064393d555fb5c185fe29bc30ec4521fa208f5357bcd0"}, - {file = "google_re2-1.1.20240601-2-cp39-cp39-macosx_13_0_x86_64.whl", hash = "sha256:515854058ac39685bd8b3dc7543a702ffe855f701fe6ea99e96ba3152a333420"}, - {file = "google_re2-1.1.20240601-2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:69edab9f90761ed5855e2d05cdfcb7d7dd6411f22d8ff4f6ff57c4836ec0aa49"}, - {file = "google_re2-1.1.20240601-2-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:e3aae4047f2891450f09073c16408a96b214ce63b6d98a58367685d7bdb7df79"}, - {file = "google_re2-1.1.20240601-2-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba3a21de393247ffff3b0b35a1c3916cc486a688626f1baaa8deac6eb4d1a6bd"}, - {file = "google_re2-1.1.20240601-2-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df08589bdbab42e169adc0d860f0b4cc7a64f576587c2b33ae1f028689c18d71"}, - {file = "google_re2-1.1.20240601-2-cp39-cp39-win32.whl", hash = "sha256:3f639baa417b64afd9f1c9513975ef3b821678046695eed258a833247c1c6fef"}, - {file = "google_re2-1.1.20240601-2-cp39-cp39-win_amd64.whl", hash = "sha256:f6e0093c5832135cba465c3eb01de2472a933222359a30d2f2119123b563f2aa"}, - {file = "google_re2-1.1.20240601-3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:39867a553b4a521fcb2bccae81130b027b499d229c473e78dfa5ffd3a8b69367"}, - {file = "google_re2-1.1.20240601-3-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:b568f0817ad4ae701ed2ebadaaa306fe4ea848612ebc731f4cda65e22a64686f"}, - {file = "google_re2-1.1.20240601-3-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:84c95604371386081fe90cbb1b0e430cfc46a31d5e18fe4dcbb66af1eafae6f3"}, - {file = "google_re2-1.1.20240601-3-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:a44c93eaf651d1b20394d8987bb58b3febcd4be3726438d96146782b031ad9b5"}, - {file = "google_re2-1.1.20240601-3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:77e17daff9f8b1207264098d48b99448966d16fec2b5dd50689c9526de3419e9"}, - {file = "google_re2-1.1.20240601-3-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:dd70c81ec855d84e0e7af875263d0136a8da8be2f33721f60f74a14db8662d99"}, - {file = "google_re2-1.1.20240601-3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f58bbde74f4329f9ef5d130a47f1786b9c39fcffba4408171c5f03e6fc80afd6"}, - {file = "google_re2-1.1.20240601-3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b4388b4d3161e8c7799f425cd894db440ec8ef2046b433b5fe4d97a0f1da708b"}, - {file = "google_re2-1.1.20240601-3-cp310-cp310-win32.whl", hash = "sha256:1325738300c4bc30b22e4db17d6248c2da186b52707f76bd3e2e9fc38718460a"}, - {file = "google_re2-1.1.20240601-3-cp310-cp310-win_amd64.whl", hash = "sha256:68862630d86f9c97268f65dd4b485cb18ab755920d0a878d7846d9f64d3a3a60"}, - {file = "google_re2-1.1.20240601-3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:a382f6562c0fb7140cc4a276f3ae1de93652a1a337710d7b643ed8ed11bf24d1"}, - {file = "google_re2-1.1.20240601-3-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:c421e929ceb86d954c584868049884cacb43b9388f3488e1029317f4ba9458f8"}, - {file = "google_re2-1.1.20240601-3-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:23cf5b38f57f41f76dec335f4847ab0acc2a58452c6cca67fc516db98e10c8ad"}, - {file = "google_re2-1.1.20240601-3-cp311-cp311-macosx_13_0_x86_64.whl", hash = "sha256:7e7545db6d053a69c5f82a605aabe9e60293ab59d744c206488f3b0da6ce01da"}, - {file = "google_re2-1.1.20240601-3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:e78ab5ee714c4d912e7c039ac4373d0a1a8dbc08149409db265c8243c01ce852"}, - {file = "google_re2-1.1.20240601-3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:c9b30c50f202ca1618e24ab70a7afcc5b8686e04f12a3c7f1107a06656b1d636"}, - {file = "google_re2-1.1.20240601-3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2854f9f8b475d321342dc91f4b6e30848e93bc0db21b93ac6e93769557022cfc"}, - {file = "google_re2-1.1.20240601-3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3ece158c1bdda0fb0d9a297102dc7420f7658090141a298a2d005357e0a767ce"}, - {file = "google_re2-1.1.20240601-3-cp311-cp311-win32.whl", hash = "sha256:ae34ffecb4e5d5e7a66187da8d8b07fb4f7d850cbfd327f12ed07ed369d9478e"}, - {file = "google_re2-1.1.20240601-3-cp311-cp311-win_amd64.whl", hash = "sha256:ed68a6548ccdf1af6db731bde1b03e453d0ce183d0ec6733bd4a5c153ab9fa03"}, - {file = "google_re2-1.1.20240601-3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:6680c9f2c8b98195ca346d0df03aa41a42c940b4694ca1b393c4fc387de2ebc2"}, - {file = "google_re2-1.1.20240601-3-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:933e6ada02c26ff14b47abe78ffc74859019b8723f610a1ddc6e33e2bc6d2d79"}, - {file = "google_re2-1.1.20240601-3-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:4fd74967dfed3dc3fbf90bb8398eb88f6381f39bf8acd5ea038814605e527c01"}, - {file = "google_re2-1.1.20240601-3-cp312-cp312-macosx_13_0_x86_64.whl", hash = "sha256:50272ba8d5fba4f576c171cab9cd306546121c6155cc525cbf601fb5954dda21"}, - {file = "google_re2-1.1.20240601-3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:83475203103521bd1647adaf7f7592dfc73fad9fbbcfa9756a2dc53ff183ca00"}, - {file = "google_re2-1.1.20240601-3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3174d348683751bd13a12cb998fbb47b2302f2fe6c35d0dc9cdaf430442ea266"}, - {file = "google_re2-1.1.20240601-3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79f3cac915446aa44d3aec612befb09f8aed5cb834ffa3e21542fe174e8333a6"}, - {file = "google_re2-1.1.20240601-3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c960ddee4416d78d50490da660660499a6e5920a65862e3e9e08ffac7ce957fe"}, - {file = "google_re2-1.1.20240601-3-cp312-cp312-win32.whl", hash = "sha256:7293bd39e8e69310ae5517221313f94ba0cc06fe1248dbfdd03cf98c46746907"}, - {file = "google_re2-1.1.20240601-3-cp312-cp312-win_amd64.whl", hash = "sha256:fb495ac61628b0c8747cb3d4deb0d941f081bcf3d913083475fafd0a4d826582"}, - {file = "google_re2-1.1.20240601-3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:96f7be3e3a3349c99d51078e6e47e691a91d07b86f2c21e12ec6a069f1d2f58e"}, - {file = "google_re2-1.1.20240601-3-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:1b1789ca35c46318cbb09adb6030fb5e097a67cc2073f483bd67c7ef8de10357"}, - {file = "google_re2-1.1.20240601-3-cp38-cp38-macosx_13_0_arm64.whl", hash = "sha256:9b818d9eae04c595e58e015255a68a1bc6fc19f47d687d24f76dda6dffc8ecc2"}, - {file = "google_re2-1.1.20240601-3-cp38-cp38-macosx_13_0_x86_64.whl", hash = "sha256:f7fa2d737c9968a6738b0b2d06981f02f95b9ca8b9d838c877cbb0f7b1cb4546"}, - {file = "google_re2-1.1.20240601-3-cp38-cp38-macosx_14_0_arm64.whl", hash = "sha256:f03f71abeeb61600027d90c65f6512f0bdea04692e88dd16808014371da4a8ef"}, - {file = "google_re2-1.1.20240601-3-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:985a9b29513a3ed116acaa9abe51fcca28776d27dcd71aa62dbe7c025c6f1761"}, - {file = "google_re2-1.1.20240601-3-cp38-cp38-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:93d6b28ab695d8ca6a8b2889622ad46ad577f9d304379c3aad42ce3dee93fb08"}, - {file = "google_re2-1.1.20240601-3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d76ce0a1c0ad7a9ed9659df582fc60b7c2a9eb2b837e9db57dd44c77bd9a0dd1"}, - {file = "google_re2-1.1.20240601-3-cp38-cp38-win32.whl", hash = "sha256:378daba7d5918d08e2d91ce16f0ae935edbfca739cb31acb699bdb8b40704e8e"}, - {file = "google_re2-1.1.20240601-3-cp38-cp38-win_amd64.whl", hash = "sha256:5719e37dd11b3b5d432439d986a119ea96dc2988908ffe3a493da97f7db5964d"}, - {file = "google_re2-1.1.20240601-3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:5b56c1686271f7e8762a5e23b76faf2071daa7a74d900474790271be1730e858"}, - {file = "google_re2-1.1.20240601-3-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:f95caca5de4ac6ead5821b5a17e281721662b8eecc37036f42a5fe8741136e47"}, - {file = "google_re2-1.1.20240601-3-cp39-cp39-macosx_13_0_arm64.whl", hash = "sha256:01297cbe44df033adec9d21a2241a7b50efb77bce625f196bf33bc0a87d6906d"}, - {file = "google_re2-1.1.20240601-3-cp39-cp39-macosx_13_0_x86_64.whl", hash = "sha256:c38e71f60ce1de30410790a3036dcb18f0fa3d8fb163218b2e8f4a55342101d1"}, - {file = "google_re2-1.1.20240601-3-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:15fa53562218ac897ad1df784cba3625cff2ccfa0f4e18b839ccf1e800e8d335"}, - {file = "google_re2-1.1.20240601-3-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:73ec934dcd803b32b3394b15cccab5017c3a403b137794b73cea2cf31d8b3f2e"}, - {file = "google_re2-1.1.20240601-3-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96e74a21304caffbfee0afe5291d3180ec65e9ba28f2ea8a32ad58369e3028dc"}, - {file = "google_re2-1.1.20240601-3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22e99029ecea3273fd2213b759aeb01f5b906de2e28d2f4e9316ed2391e9ad40"}, - {file = "google_re2-1.1.20240601-3-cp39-cp39-win32.whl", hash = "sha256:868de13b7cf57710bf3ee9f43dd63332a3ed7880f4e5202771056fc0fa3b8fea"}, - {file = "google_re2-1.1.20240601-3-cp39-cp39-win_amd64.whl", hash = "sha256:52beae3d11b15bd3a13d669c728fd423999a77bf7a8f132425322ba4dbe3c61c"}, - {file = "google_re2-1.1.20240601.tar.gz", hash = "sha256:3187f68855307754d49f398e583853d5b08d783d3fe662f6916b999075f7e095"}, -] - [[package]] name = "google-resumable-media" version = "2.7.1" @@ -3502,77 +1588,6 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4 [package.extras] grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] -[[package]] -name = "greenlet" -version = "3.0.3" -description = "Lightweight in-process concurrent programming" -optional = false -python-versions = ">=3.7" -files = [ - {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, - {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, - {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, - {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, - {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, - {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, - {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, - {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, - {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, - {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, - {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, - {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, - {file = "greenlet-3.0.3-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41"}, - {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7"}, - {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6"}, - {file = "greenlet-3.0.3-cp37-cp37m-win32.whl", hash = "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d"}, - {file = "greenlet-3.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67"}, - {file = "greenlet-3.0.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4"}, - {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5"}, - {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da"}, - {file = "greenlet-3.0.3-cp38-cp38-win32.whl", hash = "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3"}, - {file = "greenlet-3.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf"}, - {file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"}, - {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"}, - {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"}, - {file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"}, - {file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"}, - {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, -] - -[package.extras] -docs = ["Sphinx", "furo"] -test = ["objgraph", "psutil"] - [[package]] name = "griffe" version = "0.47.0" @@ -3603,23 +1618,6 @@ googleapis-common-protos = {version = ">=1.56.0,<2.0.0dev", extras = ["grpc"]} grpcio = ">=1.44.0,<2.0.0dev" protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" -[[package]] -name = "grpc-interceptor" -version = "0.15.4" -description = "Simplifies gRPC interceptors" -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "grpc-interceptor-0.15.4.tar.gz", hash = "sha256:1f45c0bcb58b6f332f37c637632247c9b02bc6af0fdceb7ba7ce8d2ebbfb0926"}, - {file = "grpc_interceptor-0.15.4-py3-none-any.whl", hash = "sha256:0035f33228693ed3767ee49d937bac424318db173fef4d2d0170b3215f254d9d"}, -] - -[package.dependencies] -grpcio = ">=1.49.1,<2.0.0" - -[package.extras] -testing = ["protobuf (>=4.21.9)"] - [[package]] name = "grpcio" version = "1.64.1" @@ -3678,20 +1676,6 @@ files = [ [package.extras] protobuf = ["grpcio-tools (>=1.64.1)"] -[[package]] -name = "grpcio-gcp" -version = "0.2.2" -description = "gRPC extensions for Google Cloud Platform" -optional = false -python-versions = "*" -files = [ - {file = "grpcio-gcp-0.2.2.tar.gz", hash = "sha256:e292605effc7da39b7a8734c719afb12ec4b5362add3528d8afad3aa3aa9057c"}, - {file = "grpcio_gcp-0.2.2-py2.py3-none-any.whl", hash = "sha256:1ef8e8531eab11356a3eb4c5b84e79e0d923d6782d19e1b1a45e1cabe4e783d7"}, -] - -[package.dependencies] -grpcio = ">=1.12.0" - [[package]] name = "grpcio-status" version = "1.48.2" @@ -3708,38 +1692,6 @@ googleapis-common-protos = ">=1.5.5" grpcio = ">=1.48.2" protobuf = ">=3.12.0" -[[package]] -name = "gunicorn" -version = "22.0.0" -description = "WSGI HTTP Server for UNIX" -optional = false -python-versions = ">=3.7" -files = [ - {file = "gunicorn-22.0.0-py3-none-any.whl", hash = "sha256:350679f91b24062c86e386e198a15438d53a7a8207235a78ba1b53df4c4378d9"}, - {file = "gunicorn-22.0.0.tar.gz", hash = "sha256:4a0b436239ff76fb33f11c07a16482c521a7e09c1ce3cc293c2330afe01bec63"}, -] - -[package.dependencies] -packaging = "*" - -[package.extras] -eventlet = ["eventlet (>=0.24.1,!=0.36.0)"] -gevent = ["gevent (>=1.4.0)"] -setproctitle = ["setproctitle"] -testing = ["coverage", "eventlet", "gevent", "pytest", "pytest-cov"] -tornado = ["tornado (>=0.2)"] - -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - [[package]] name = "hail" version = "0.2.127" @@ -3787,65 +1739,6 @@ tabulate = ">=0.8.9,<1" typer = ">=0.9.0,<1" uvloop = {version = ">=0.19.0,<1", markers = "sys_platform != \"win32\""} -[[package]] -name = "httpcore" -version = "1.0.5" -description = "A minimal low-level HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, - {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, -] - -[package.dependencies] -certifi = "*" -h11 = ">=0.13,<0.15" - -[package.extras] -asyncio = ["anyio (>=4.0,<5.0)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.26.0)"] - -[[package]] -name = "httplib2" -version = "0.22.0" -description = "A comprehensive HTTP client library." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "httplib2-0.22.0-py3-none-any.whl", hash = "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc"}, - {file = "httplib2-0.22.0.tar.gz", hash = "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81"}, -] - -[package.dependencies] -pyparsing = {version = ">=2.4.2,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.0.2 || >3.0.2,<3.0.3 || >3.0.3,<4", markers = "python_version > \"3.0\""} - -[[package]] -name = "httpx" -version = "0.27.0" -description = "The next generation HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, - {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, -] - -[package.dependencies] -anyio = "*" -certifi = "*" -httpcore = "==1.*" -idna = "*" -sniffio = "*" - -[package.extras] -brotli = ["brotli", "brotlicffi"] -cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] - [[package]] name = "huggingface-hub" version = "0.23.4" @@ -3918,66 +1811,21 @@ optional = false python-versions = ">=3.8" files = [ {file = "identify-2.5.36-py2.py3-none-any.whl", hash = "sha256:37d93f380f4de590500d9dba7db359d0d3da95ffe7f9de1753faa159e71e7dfa"}, - {file = "identify-2.5.36.tar.gz", hash = "sha256:e5e00f54165f9047fbebeb4a560f9acfb8af4c88232be60a488e9b68d122745d"}, -] - -[package.extras] -license = ["ukkonen"] - -[[package]] -name = "idna" -version = "3.7" -description = "Internationalized Domain Names in Applications (IDNA)" -optional = false -python-versions = ">=3.5" -files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, -] - -[[package]] -name = "importlib-metadata" -version = "7.1.0" -description = "Read metadata from Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, - {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, -] - -[package.dependencies] -zipp = ">=0.5" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] - -[[package]] -name = "importlib-resources" -version = "6.4.0" -description = "Read resources from Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "importlib_resources-6.4.0-py3-none-any.whl", hash = "sha256:50d10f043df931902d4194ea07ec57960f66a80449ff867bfe782b4c486ba78c"}, - {file = "importlib_resources-6.4.0.tar.gz", hash = "sha256:cdb2b453b8046ca4e3798eb1d84f3cce1446a0e8e7b5ef4efb600f19fc398145"}, + {file = "identify-2.5.36.tar.gz", hash = "sha256:e5e00f54165f9047fbebeb4a560f9acfb8af4c88232be60a488e9b68d122745d"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["jaraco.test (>=5.4)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)", "zipp (>=3.17)"] +license = ["ukkonen"] [[package]] -name = "inflection" -version = "0.5.1" -description = "A port of Ruby on Rails inflector to Python" +name = "idna" +version = "3.7" +description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "inflection-0.5.1-py2.py3-none-any.whl", hash = "sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2"}, - {file = "inflection-0.5.1.tar.gz", hash = "sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417"}, + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] [[package]] @@ -4115,17 +1963,6 @@ files = [ [package.extras] colors = ["colorama (>=0.4.6)"] -[[package]] -name = "itsdangerous" -version = "2.2.0" -description = "Safely pass data to untrusted environments and back." -optional = false -python-versions = ">=3.8" -files = [ - {file = "itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef"}, - {file = "itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173"}, -] - [[package]] name = "janus" version = "1.0.0" @@ -4212,51 +2049,6 @@ files = [ [package.dependencies] six = ">=1.13,<2.0" -[[package]] -name = "json-merge-patch" -version = "0.2" -description = "JSON Merge Patch library (https://tools.ietf.org/html/rfc7386)" -optional = false -python-versions = "*" -files = [ - {file = "json-merge-patch-0.2.tar.gz", hash = "sha256:09898b6d427c08754e2a97c709cf2dfd7e28bd10c5683a538914975eab778d39"}, -] - -[[package]] -name = "jsonschema" -version = "4.22.0" -description = "An implementation of JSON Schema validation for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jsonschema-4.22.0-py3-none-any.whl", hash = "sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802"}, - {file = "jsonschema-4.22.0.tar.gz", hash = "sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7"}, -] - -[package.dependencies] -attrs = ">=22.2.0" -jsonschema-specifications = ">=2023.03.6" -referencing = ">=0.28.4" -rpds-py = ">=0.7.1" - -[package.extras] -format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] -format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] - -[[package]] -name = "jsonschema-specifications" -version = "2023.12.1" -description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, - {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, -] - -[package.dependencies] -referencing = ">=0.31.0" - [[package]] name = "jupyter-client" version = "8.6.2" @@ -4299,129 +2091,6 @@ traitlets = ">=5.3" docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout"] -[[package]] -name = "lazy-object-proxy" -version = "1.10.0" -description = "A fast and thorough lazy object proxy." -optional = false -python-versions = ">=3.8" -files = [ - {file = "lazy-object-proxy-1.10.0.tar.gz", hash = "sha256:78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69"}, - {file = "lazy_object_proxy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:855e068b0358ab916454464a884779c7ffa312b8925c6f7401e952dcf3b89977"}, - {file = "lazy_object_proxy-1.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab7004cf2e59f7c2e4345604a3e6ea0d92ac44e1c2375527d56492014e690c3"}, - {file = "lazy_object_proxy-1.10.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc0d2fc424e54c70c4bc06787e4072c4f3b1aa2f897dfdc34ce1013cf3ceef05"}, - {file = "lazy_object_proxy-1.10.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e2adb09778797da09d2b5ebdbceebf7dd32e2c96f79da9052b2e87b6ea495895"}, - {file = "lazy_object_proxy-1.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1f711e2c6dcd4edd372cf5dec5c5a30d23bba06ee012093267b3376c079ec83"}, - {file = "lazy_object_proxy-1.10.0-cp310-cp310-win32.whl", hash = "sha256:76a095cfe6045c7d0ca77db9934e8f7b71b14645f0094ffcd842349ada5c5fb9"}, - {file = "lazy_object_proxy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:b4f87d4ed9064b2628da63830986c3d2dca7501e6018347798313fcf028e2fd4"}, - {file = "lazy_object_proxy-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fec03caabbc6b59ea4a638bee5fce7117be8e99a4103d9d5ad77f15d6f81020c"}, - {file = "lazy_object_proxy-1.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02c83f957782cbbe8136bee26416686a6ae998c7b6191711a04da776dc9e47d4"}, - {file = "lazy_object_proxy-1.10.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009e6bb1f1935a62889ddc8541514b6a9e1fcf302667dcb049a0be5c8f613e56"}, - {file = "lazy_object_proxy-1.10.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75fc59fc450050b1b3c203c35020bc41bd2695ed692a392924c6ce180c6f1dc9"}, - {file = "lazy_object_proxy-1.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:782e2c9b2aab1708ffb07d4bf377d12901d7a1d99e5e410d648d892f8967ab1f"}, - {file = "lazy_object_proxy-1.10.0-cp311-cp311-win32.whl", hash = "sha256:edb45bb8278574710e68a6b021599a10ce730d156e5b254941754a9cc0b17d03"}, - {file = "lazy_object_proxy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:e271058822765ad5e3bca7f05f2ace0de58a3f4e62045a8c90a0dfd2f8ad8cc6"}, - {file = "lazy_object_proxy-1.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e98c8af98d5707dcdecc9ab0863c0ea6e88545d42ca7c3feffb6b4d1e370c7ba"}, - {file = "lazy_object_proxy-1.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:952c81d415b9b80ea261d2372d2a4a2332a3890c2b83e0535f263ddfe43f0d43"}, - {file = "lazy_object_proxy-1.10.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80b39d3a151309efc8cc48675918891b865bdf742a8616a337cb0090791a0de9"}, - {file = "lazy_object_proxy-1.10.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e221060b701e2aa2ea991542900dd13907a5c90fa80e199dbf5a03359019e7a3"}, - {file = "lazy_object_proxy-1.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:92f09ff65ecff3108e56526f9e2481b8116c0b9e1425325e13245abfd79bdb1b"}, - {file = "lazy_object_proxy-1.10.0-cp312-cp312-win32.whl", hash = "sha256:3ad54b9ddbe20ae9f7c1b29e52f123120772b06dbb18ec6be9101369d63a4074"}, - {file = "lazy_object_proxy-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:127a789c75151db6af398b8972178afe6bda7d6f68730c057fbbc2e96b08d282"}, - {file = "lazy_object_proxy-1.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4ed0518a14dd26092614412936920ad081a424bdcb54cc13349a8e2c6d106a"}, - {file = "lazy_object_proxy-1.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ad9e6ed739285919aa9661a5bbed0aaf410aa60231373c5579c6b4801bd883c"}, - {file = "lazy_object_proxy-1.10.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fc0a92c02fa1ca1e84fc60fa258458e5bf89d90a1ddaeb8ed9cc3147f417255"}, - {file = "lazy_object_proxy-1.10.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0aefc7591920bbd360d57ea03c995cebc204b424524a5bd78406f6e1b8b2a5d8"}, - {file = "lazy_object_proxy-1.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5faf03a7d8942bb4476e3b62fd0f4cf94eaf4618e304a19865abf89a35c0bbee"}, - {file = "lazy_object_proxy-1.10.0-cp38-cp38-win32.whl", hash = "sha256:e333e2324307a7b5d86adfa835bb500ee70bfcd1447384a822e96495796b0ca4"}, - {file = "lazy_object_proxy-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:cb73507defd385b7705c599a94474b1d5222a508e502553ef94114a143ec6696"}, - {file = "lazy_object_proxy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:366c32fe5355ef5fc8a232c5436f4cc66e9d3e8967c01fb2e6302fd6627e3d94"}, - {file = "lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2297f08f08a2bb0d32a4265e98a006643cd7233fb7983032bd61ac7a02956b3b"}, - {file = "lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18dd842b49456aaa9a7cf535b04ca4571a302ff72ed8740d06b5adcd41fe0757"}, - {file = "lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:217138197c170a2a74ca0e05bddcd5f1796c735c37d0eee33e43259b192aa424"}, - {file = "lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9a3a87cf1e133e5b1994144c12ca4aa3d9698517fe1e2ca82977781b16955658"}, - {file = "lazy_object_proxy-1.10.0-cp39-cp39-win32.whl", hash = "sha256:30b339b2a743c5288405aa79a69e706a06e02958eab31859f7f3c04980853b70"}, - {file = "lazy_object_proxy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:a899b10e17743683b293a729d3a11f2f399e8a90c73b089e29f5d0fe3509f0dd"}, - {file = "lazy_object_proxy-1.10.0-pp310.pp311.pp312.pp38.pp39-none-any.whl", hash = "sha256:80fa48bd89c8f2f456fc0765c11c23bf5af827febacd2f523ca5bc1893fcc09d"}, -] - -[[package]] -name = "limits" -version = "3.13.0" -description = "Rate limiting utilities" -optional = false -python-versions = ">=3.8" -files = [ - {file = "limits-3.13.0-py3-none-any.whl", hash = "sha256:9767f7233da4255e9904b79908a728e8ec0984c0b086058b4cbbd309aea553f6"}, - {file = "limits-3.13.0.tar.gz", hash = "sha256:6571b0c567bfa175a35fed9f8a954c0c92f1c3200804282f1b8f1de4ad98a953"}, -] - -[package.dependencies] -deprecated = ">=1.2" -importlib-resources = ">=1.3" -packaging = ">=21,<25" -typing-extensions = "*" - -[package.extras] -all = ["aetcd", "coredis (>=3.4.0,<5)", "emcache (>=0.6.1)", "emcache (>=1)", "etcd3", "motor (>=3,<4)", "pymemcache (>3,<5.0.0)", "pymongo (>4.1,<5)", "redis (>3,!=4.5.2,!=4.5.3,<6.0.0)", "redis (>=4.2.0,!=4.5.2,!=4.5.3)"] -async-etcd = ["aetcd"] -async-memcached = ["emcache (>=0.6.1)", "emcache (>=1)"] -async-mongodb = ["motor (>=3,<4)"] -async-redis = ["coredis (>=3.4.0,<5)"] -etcd = ["etcd3"] -memcached = ["pymemcache (>3,<5.0.0)"] -mongodb = ["pymongo (>4.1,<5)"] -redis = ["redis (>3,!=4.5.2,!=4.5.3,<6.0.0)"] -rediscluster = ["redis (>=4.2.0,!=4.5.2,!=4.5.3)"] - -[[package]] -name = "linkify-it-py" -version = "2.0.3" -description = "Links recognition library with FULL unicode support." -optional = false -python-versions = ">=3.7" -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"}, -] - -[package.dependencies] -uc-micro-py = "*" - -[package.extras] -benchmark = ["pytest", "pytest-benchmark"] -dev = ["black", "flake8", "isort", "pre-commit", "pyproject-flake8"] -doc = ["myst-parser", "sphinx", "sphinx-book-theme"] -test = ["coverage", "pytest", "pytest-cov"] - -[[package]] -name = "lockfile" -version = "0.12.2" -description = "Platform-independent file locking module" -optional = false -python-versions = "*" -files = [ - {file = "lockfile-0.12.2-py2.py3-none-any.whl", hash = "sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"}, - {file = "lockfile-0.12.2.tar.gz", hash = "sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"}, -] - -[[package]] -name = "looker-sdk" -version = "24.10.0" -description = "Looker REST API" -optional = false -python-versions = ">=3.6" -files = [ - {file = "looker_sdk-24.10.0-py3-none-any.whl", hash = "sha256:26b4c919a0ec81bfa4d9c5eadddfad4c64ae46a20b0f299e7eabe300feaa1842"}, - {file = "looker_sdk-24.10.0.tar.gz", hash = "sha256:a6fe1e47912d10c90dadba0da33150dd694e24d65b84cb149a025ca26e3046cb"}, -] - -[package.dependencies] -attrs = {version = ">=20.1.0", markers = "python_version >= \"3.7\""} -cattrs = {version = ">=1.3", markers = "python_version >= \"3.7\""} -requests = ">=2.22" -typing-extensions = ">=4.1.1" - [[package]] name = "lxml" version = "5.3.0" @@ -4576,25 +2245,6 @@ html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] source = ["Cython (>=3.0.11)"] -[[package]] -name = "mako" -version = "1.3.5" -description = "A super-fast templating language that borrows the best ideas from the existing templating languages." -optional = false -python-versions = ">=3.8" -files = [ - {file = "Mako-1.3.5-py3-none-any.whl", hash = "sha256:260f1dbc3a519453a9c856dedfe4beb4e50bd5a26d96386cb6c80856556bb91a"}, - {file = "Mako-1.3.5.tar.gz", hash = "sha256:48dbc20568c1d276a2698b36d968fa76161bf127194907ea6fc594fa81f943bc"}, -] - -[package.dependencies] -MarkupSafe = ">=0.9.2" - -[package.extras] -babel = ["Babel"] -lingua = ["lingua"] -testing = ["pytest"] - [[package]] name = "markdown" version = "3.6" @@ -4610,30 +2260,6 @@ files = [ docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] testing = ["coverage", "pyyaml"] -[[package]] -name = "markdown-it-py" -version = "3.0.0" -description = "Python port of markdown-it. Markdown parsing, done right!" -optional = false -python-versions = ">=3.8" -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"}, -] - -[package.dependencies] -mdurl = ">=0.1,<1.0" - -[package.extras] -benchmarking = ["psutil", "pytest", "pytest-benchmark"] -code-style = ["pre-commit (>=3.0,<4.0)"] -compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] -linkify = ["linkify-it-py (>=1,<3)"] -plugins = ["mdit-py-plugins"] -profiling = ["gprof2dot"] -rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] -testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] - [[package]] name = "markupsafe" version = "2.1.5" @@ -4703,65 +2329,6 @@ files = [ {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] -[[package]] -name = "marshmallow" -version = "3.21.3" -description = "A lightweight library for converting complex datatypes to and from native Python datatypes." -optional = false -python-versions = ">=3.8" -files = [ - {file = "marshmallow-3.21.3-py3-none-any.whl", hash = "sha256:86ce7fb914aa865001a4b2092c4c2872d13bc347f3d42673272cabfdbad386f1"}, - {file = "marshmallow-3.21.3.tar.gz", hash = "sha256:4f57c5e050a54d66361e826f94fba213eb10b67b2fdb02c3e0343ce207ba1662"}, -] - -[package.dependencies] -packaging = ">=17.0" - -[package.extras] -dev = ["marshmallow[tests]", "pre-commit (>=3.5,<4.0)", "tox"] -docs = ["alabaster (==0.7.16)", "autodocsumm (==0.2.12)", "sphinx (==7.3.7)", "sphinx-issues (==4.1.0)", "sphinx-version-warning (==1.1.2)"] -tests = ["pytest", "pytz", "simplejson"] - -[[package]] -name = "marshmallow-oneofschema" -version = "3.1.1" -description = "marshmallow multiplexing schema" -optional = false -python-versions = ">=3.8" -files = [ - {file = "marshmallow_oneofschema-3.1.1-py3-none-any.whl", hash = "sha256:ff4cb2a488785ee8edd521a765682c2c80c78b9dc48894124531bdfa1ec9303b"}, - {file = "marshmallow_oneofschema-3.1.1.tar.gz", hash = "sha256:68b4a57d0281a04ac25d4eb7a4c5865a57090a0a8fd30fd6362c8e833ac6a6d9"}, -] - -[package.dependencies] -marshmallow = ">=3.0.0,<4.0.0" - -[package.extras] -dev = ["marshmallow-oneofschema[tests]", "pre-commit (>=3.5,<4.0)", "tox"] -tests = ["pytest"] - -[[package]] -name = "marshmallow-sqlalchemy" -version = "0.28.2" -description = "SQLAlchemy integration with the marshmallow (de)serialization library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "marshmallow-sqlalchemy-0.28.2.tar.gz", hash = "sha256:2ab0f1280c793e5aec81deab3e63ec23688ddfe05e5f38ac960368a1079520a1"}, - {file = "marshmallow_sqlalchemy-0.28.2-py2.py3-none-any.whl", hash = "sha256:c31b3bdf794de1d78c53e1c495502cbb3eeb06ed216869980c71d6159e7e9e66"}, -] - -[package.dependencies] -marshmallow = ">=3.0.0" -packaging = ">=21.3" -SQLAlchemy = ">=1.3.0,<2.0" - -[package.extras] -dev = ["flake8 (==6.0.0)", "flake8-bugbear (==23.2.13)", "pre-commit (==3.1.0)", "pytest", "pytest-lazy-fixture (>=0.6.2)", "tox"] -docs = ["alabaster (==0.7.13)", "sphinx (==6.1.3)", "sphinx-issues (==3.0.1)"] -lint = ["flake8 (==6.0.0)", "flake8-bugbear (==23.2.13)", "pre-commit (==3.1.0)"] -tests = ["pytest", "pytest-lazy-fixture (>=0.6.2)"] - [[package]] name = "matplotlib-inline" version = "0.1.7" @@ -4787,36 +2354,6 @@ files = [ {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] -[[package]] -name = "mdit-py-plugins" -version = "0.4.1" -description = "Collection of plugins for markdown-it-py" -optional = false -python-versions = ">=3.8" -files = [ - {file = "mdit_py_plugins-0.4.1-py3-none-any.whl", hash = "sha256:1020dfe4e6bfc2c79fb49ae4e3f5b297f5ccd20f010187acc52af2921e27dc6a"}, - {file = "mdit_py_plugins-0.4.1.tar.gz", hash = "sha256:834b8ac23d1cd60cec703646ffd22ae97b7955a6d596eb1d304be1e251ae499c"}, -] - -[package.dependencies] -markdown-it-py = ">=1.0.0,<4.0.0" - -[package.extras] -code-style = ["pre-commit"] -rtd = ["myst-parser", "sphinx-book-theme"] -testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] - -[[package]] -name = "mdurl" -version = "0.1.2" -description = "Markdown URL utilities" -optional = false -python-versions = ">=3.7" -files = [ - {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, - {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, -] - [[package]] name = "mergedeep" version = "1.3.4" @@ -4828,24 +2365,6 @@ files = [ {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, ] -[[package]] -name = "methodtools" -version = "0.4.7" -description = "Expand standard functools to methods" -optional = false -python-versions = "*" -files = [ - {file = "methodtools-0.4.7-py2.py3-none-any.whl", hash = "sha256:5e188c780b236adc12e75b5f078c5afb419ef99eb648569fc6d7071f053a1f11"}, - {file = "methodtools-0.4.7.tar.gz", hash = "sha256:e213439dd64cfe60213f7015da6efe5dd4003fd89376db3baa09fe13ec2bb0ba"}, -] - -[package.dependencies] -wirerope = ">=0.4.7" - -[package.extras] -doc = ["sphinx"] -test = ["functools32 (>=3.2.3-2)", "pytest (>=4.6.7)", "pytest-cov (>=2.6.1)"] - [[package]] name = "mkdocs" version = "1.6.0" @@ -5079,17 +2598,6 @@ files = [ griffe = ">=0.47" mkdocstrings = ">=0.25" -[[package]] -name = "more-itertools" -version = "10.3.0" -description = "More routines for operating on iterables, beyond itertools" -optional = false -python-versions = ">=3.8" -files = [ - {file = "more-itertools-10.3.0.tar.gz", hash = "sha256:e5d93ef411224fbcef366a6e8ddc4c5781bc6359d43412a65dd5964e46111463"}, - {file = "more_itertools-10.3.0-py3-none-any.whl", hash = "sha256:ea6a02e24a9161e51faad17a8782b92a0df82c12c1c8886fec7f0c3fa1a1b320"}, -] - [[package]] name = "msal" version = "1.29.0" @@ -5415,148 +2923,6 @@ files = [ antlr4-python3-runtime = "==4.9.*" PyYAML = ">=5.1.0" -[[package]] -name = "opentelemetry-api" -version = "1.25.0" -description = "OpenTelemetry Python API" -optional = false -python-versions = ">=3.8" -files = [ - {file = "opentelemetry_api-1.25.0-py3-none-any.whl", hash = "sha256:757fa1aa020a0f8fa139f8959e53dec2051cc26b832e76fa839a6d76ecefd737"}, - {file = "opentelemetry_api-1.25.0.tar.gz", hash = "sha256:77c4985f62f2614e42ce77ee4c9da5fa5f0bc1e1821085e9a47533a9323ae869"}, -] - -[package.dependencies] -deprecated = ">=1.2.6" -importlib-metadata = ">=6.0,<=7.1" - -[[package]] -name = "opentelemetry-exporter-otlp" -version = "1.25.0" -description = "OpenTelemetry Collector Exporters" -optional = false -python-versions = ">=3.8" -files = [ - {file = "opentelemetry_exporter_otlp-1.25.0-py3-none-any.whl", hash = "sha256:d67a831757014a3bc3174e4cd629ae1493b7ba8d189e8a007003cacb9f1a6b60"}, - {file = "opentelemetry_exporter_otlp-1.25.0.tar.gz", hash = "sha256:ce03199c1680a845f82e12c0a6a8f61036048c07ec7a0bd943142aca8fa6ced0"}, -] - -[package.dependencies] -opentelemetry-exporter-otlp-proto-grpc = "1.25.0" -opentelemetry-exporter-otlp-proto-http = "1.25.0" - -[[package]] -name = "opentelemetry-exporter-otlp-proto-common" -version = "1.25.0" -description = "OpenTelemetry Protobuf encoding" -optional = false -python-versions = ">=3.8" -files = [ - {file = "opentelemetry_exporter_otlp_proto_common-1.25.0-py3-none-any.whl", hash = "sha256:15637b7d580c2675f70246563363775b4e6de947871e01d0f4e3881d1848d693"}, - {file = "opentelemetry_exporter_otlp_proto_common-1.25.0.tar.gz", hash = "sha256:c93f4e30da4eee02bacd1e004eb82ce4da143a2f8e15b987a9f603e0a85407d3"}, -] - -[package.dependencies] -opentelemetry-proto = "1.25.0" - -[[package]] -name = "opentelemetry-exporter-otlp-proto-grpc" -version = "1.25.0" -description = "OpenTelemetry Collector Protobuf over gRPC Exporter" -optional = false -python-versions = ">=3.8" -files = [ - {file = "opentelemetry_exporter_otlp_proto_grpc-1.25.0-py3-none-any.whl", hash = "sha256:3131028f0c0a155a64c430ca600fd658e8e37043cb13209f0109db5c1a3e4eb4"}, - {file = "opentelemetry_exporter_otlp_proto_grpc-1.25.0.tar.gz", hash = "sha256:c0b1661415acec5af87625587efa1ccab68b873745ca0ee96b69bb1042087eac"}, -] - -[package.dependencies] -deprecated = ">=1.2.6" -googleapis-common-protos = ">=1.52,<2.0" -grpcio = ">=1.0.0,<2.0.0" -opentelemetry-api = ">=1.15,<2.0" -opentelemetry-exporter-otlp-proto-common = "1.25.0" -opentelemetry-proto = "1.25.0" -opentelemetry-sdk = ">=1.25.0,<1.26.0" - -[[package]] -name = "opentelemetry-exporter-otlp-proto-http" -version = "1.25.0" -description = "OpenTelemetry Collector Protobuf over HTTP Exporter" -optional = false -python-versions = ">=3.8" -files = [ - {file = "opentelemetry_exporter_otlp_proto_http-1.25.0-py3-none-any.whl", hash = "sha256:2eca686ee11b27acd28198b3ea5e5863a53d1266b91cda47c839d95d5e0541a6"}, - {file = "opentelemetry_exporter_otlp_proto_http-1.25.0.tar.gz", hash = "sha256:9f8723859e37c75183ea7afa73a3542f01d0fd274a5b97487ea24cb683d7d684"}, -] - -[package.dependencies] -deprecated = ">=1.2.6" -googleapis-common-protos = ">=1.52,<2.0" -opentelemetry-api = ">=1.15,<2.0" -opentelemetry-exporter-otlp-proto-common = "1.25.0" -opentelemetry-proto = "1.25.0" -opentelemetry-sdk = ">=1.25.0,<1.26.0" -requests = ">=2.7,<3.0" - -[[package]] -name = "opentelemetry-proto" -version = "1.25.0" -description = "OpenTelemetry Python Proto" -optional = false -python-versions = ">=3.8" -files = [ - {file = "opentelemetry_proto-1.25.0-py3-none-any.whl", hash = "sha256:f07e3341c78d835d9b86665903b199893befa5e98866f63d22b00d0b7ca4972f"}, - {file = "opentelemetry_proto-1.25.0.tar.gz", hash = "sha256:35b6ef9dc4a9f7853ecc5006738ad40443701e52c26099e197895cbda8b815a3"}, -] - -[package.dependencies] -protobuf = ">=3.19,<5.0" - -[[package]] -name = "opentelemetry-sdk" -version = "1.25.0" -description = "OpenTelemetry Python SDK" -optional = false -python-versions = ">=3.8" -files = [ - {file = "opentelemetry_sdk-1.25.0-py3-none-any.whl", hash = "sha256:d97ff7ec4b351692e9d5a15af570c693b8715ad78b8aafbec5c7100fe966b4c9"}, - {file = "opentelemetry_sdk-1.25.0.tar.gz", hash = "sha256:ce7fc319c57707ef5bf8b74fb9f8ebdb8bfafbe11898410e0d2a761d08a98ec7"}, -] - -[package.dependencies] -opentelemetry-api = "1.25.0" -opentelemetry-semantic-conventions = "0.46b0" -typing-extensions = ">=3.7.4" - -[[package]] -name = "opentelemetry-semantic-conventions" -version = "0.46b0" -description = "OpenTelemetry Semantic Conventions" -optional = false -python-versions = ">=3.8" -files = [ - {file = "opentelemetry_semantic_conventions-0.46b0-py3-none-any.whl", hash = "sha256:6daef4ef9fa51d51855d9f8e0ccd3a1bd59e0e545abe99ac6203804e36ab3e07"}, - {file = "opentelemetry_semantic_conventions-0.46b0.tar.gz", hash = "sha256:fbc982ecbb6a6e90869b15c1673be90bd18c8a56ff1cffc0864e38e2edffaefa"}, -] - -[package.dependencies] -opentelemetry-api = "1.25.0" - -[[package]] -name = "ordered-set" -version = "4.1.0" -description = "An OrderedSet is a custom MutableSet that remembers its order, so that every" -optional = false -python-versions = ">=3.7" -files = [ - {file = "ordered-set-4.1.0.tar.gz", hash = "sha256:694a8e44c87657c59292ede72891eb91d34131f6531463aab3009191c77364a8"}, - {file = "ordered_set-4.1.0-py3-none-any.whl", hash = "sha256:046e1132c71fcf3330438a539928932caf51ddbc582496833e23de611de14562"}, -] - -[package.extras] -dev = ["black", "mypy", "pytest"] - [[package]] name = "orjson" version = "3.10.5" @@ -5773,105 +3139,6 @@ files = [ {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] -[[package]] -name = "pendulum" -version = "3.0.0" -description = "Python datetimes made easy" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pendulum-3.0.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2cf9e53ef11668e07f73190c805dbdf07a1939c3298b78d5a9203a86775d1bfd"}, - {file = "pendulum-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fb551b9b5e6059377889d2d878d940fd0bbb80ae4810543db18e6f77b02c5ef6"}, - {file = "pendulum-3.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c58227ac260d5b01fc1025176d7b31858c9f62595737f350d22124a9a3ad82d"}, - {file = "pendulum-3.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60fb6f415fea93a11c52578eaa10594568a6716602be8430b167eb0d730f3332"}, - {file = "pendulum-3.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b69f6b4dbcb86f2c2fe696ba991e67347bcf87fe601362a1aba6431454b46bde"}, - {file = "pendulum-3.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:138afa9c373ee450ede206db5a5e9004fd3011b3c6bbe1e57015395cd076a09f"}, - {file = "pendulum-3.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:83d9031f39c6da9677164241fd0d37fbfc9dc8ade7043b5d6d62f56e81af8ad2"}, - {file = "pendulum-3.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0c2308af4033fa534f089595bcd40a95a39988ce4059ccd3dc6acb9ef14ca44a"}, - {file = "pendulum-3.0.0-cp310-none-win_amd64.whl", hash = "sha256:9a59637cdb8462bdf2dbcb9d389518c0263799189d773ad5c11db6b13064fa79"}, - {file = "pendulum-3.0.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3725245c0352c95d6ca297193192020d1b0c0f83d5ee6bb09964edc2b5a2d508"}, - {file = "pendulum-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6c035f03a3e565ed132927e2c1b691de0dbf4eb53b02a5a3c5a97e1a64e17bec"}, - {file = "pendulum-3.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:597e66e63cbd68dd6d58ac46cb7a92363d2088d37ccde2dae4332ef23e95cd00"}, - {file = "pendulum-3.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99a0f8172e19f3f0c0e4ace0ad1595134d5243cf75985dc2233e8f9e8de263ca"}, - {file = "pendulum-3.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:77d8839e20f54706aed425bec82a83b4aec74db07f26acd039905d1237a5e1d4"}, - {file = "pendulum-3.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afde30e8146292b059020fbc8b6f8fd4a60ae7c5e6f0afef937bbb24880bdf01"}, - {file = "pendulum-3.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:660434a6fcf6303c4efd36713ca9212c753140107ee169a3fc6c49c4711c2a05"}, - {file = "pendulum-3.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dee9e5a48c6999dc1106eb7eea3e3a50e98a50651b72c08a87ee2154e544b33e"}, - {file = "pendulum-3.0.0-cp311-none-win_amd64.whl", hash = "sha256:d4cdecde90aec2d67cebe4042fd2a87a4441cc02152ed7ed8fb3ebb110b94ec4"}, - {file = "pendulum-3.0.0-cp311-none-win_arm64.whl", hash = "sha256:773c3bc4ddda2dda9f1b9d51fe06762f9200f3293d75c4660c19b2614b991d83"}, - {file = "pendulum-3.0.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:409e64e41418c49f973d43a28afe5df1df4f1dd87c41c7c90f1a63f61ae0f1f7"}, - {file = "pendulum-3.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a38ad2121c5ec7c4c190c7334e789c3b4624798859156b138fcc4d92295835dc"}, - {file = "pendulum-3.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fde4d0b2024b9785f66b7f30ed59281bd60d63d9213cda0eb0910ead777f6d37"}, - {file = "pendulum-3.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b2c5675769fb6d4c11238132962939b960fcb365436b6d623c5864287faa319"}, - {file = "pendulum-3.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8af95e03e066826f0f4c65811cbee1b3123d4a45a1c3a2b4fc23c4b0dff893b5"}, - {file = "pendulum-3.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2165a8f33cb15e06c67070b8afc87a62b85c5a273e3aaa6bc9d15c93a4920d6f"}, - {file = "pendulum-3.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ad5e65b874b5e56bd942546ea7ba9dd1d6a25121db1c517700f1c9de91b28518"}, - {file = "pendulum-3.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:17fe4b2c844bbf5f0ece69cfd959fa02957c61317b2161763950d88fed8e13b9"}, - {file = "pendulum-3.0.0-cp312-none-win_amd64.whl", hash = "sha256:78f8f4e7efe5066aca24a7a57511b9c2119f5c2b5eb81c46ff9222ce11e0a7a5"}, - {file = "pendulum-3.0.0-cp312-none-win_arm64.whl", hash = "sha256:28f49d8d1e32aae9c284a90b6bb3873eee15ec6e1d9042edd611b22a94ac462f"}, - {file = "pendulum-3.0.0-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:d4e2512f4e1a4670284a153b214db9719eb5d14ac55ada5b76cbdb8c5c00399d"}, - {file = "pendulum-3.0.0-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:3d897eb50883cc58d9b92f6405245f84b9286cd2de6e8694cb9ea5cb15195a32"}, - {file = "pendulum-3.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e169cc2ca419517f397811bbe4589cf3cd13fca6dc38bb352ba15ea90739ebb"}, - {file = "pendulum-3.0.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f17c3084a4524ebefd9255513692f7e7360e23c8853dc6f10c64cc184e1217ab"}, - {file = "pendulum-3.0.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:826d6e258052715f64d05ae0fc9040c0151e6a87aae7c109ba9a0ed930ce4000"}, - {file = "pendulum-3.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2aae97087872ef152a0c40e06100b3665d8cb86b59bc8471ca7c26132fccd0f"}, - {file = "pendulum-3.0.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ac65eeec2250d03106b5e81284ad47f0d417ca299a45e89ccc69e36130ca8bc7"}, - {file = "pendulum-3.0.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a5346d08f3f4a6e9e672187faa179c7bf9227897081d7121866358af369f44f9"}, - {file = "pendulum-3.0.0-cp37-none-win_amd64.whl", hash = "sha256:235d64e87946d8f95c796af34818c76e0f88c94d624c268693c85b723b698aa9"}, - {file = "pendulum-3.0.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:6a881d9c2a7f85bc9adafcfe671df5207f51f5715ae61f5d838b77a1356e8b7b"}, - {file = "pendulum-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d7762d2076b9b1cb718a6631ad6c16c23fc3fac76cbb8c454e81e80be98daa34"}, - {file = "pendulum-3.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e8e36a8130819d97a479a0e7bf379b66b3b1b520e5dc46bd7eb14634338df8c"}, - {file = "pendulum-3.0.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7dc843253ac373358ffc0711960e2dd5b94ab67530a3e204d85c6e8cb2c5fa10"}, - {file = "pendulum-3.0.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a78ad3635d609ceb1e97d6aedef6a6a6f93433ddb2312888e668365908c7120"}, - {file = "pendulum-3.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b30a137e9e0d1f751e60e67d11fc67781a572db76b2296f7b4d44554761049d6"}, - {file = "pendulum-3.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c95984037987f4a457bb760455d9ca80467be792236b69d0084f228a8ada0162"}, - {file = "pendulum-3.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d29c6e578fe0f893766c0d286adbf0b3c726a4e2341eba0917ec79c50274ec16"}, - {file = "pendulum-3.0.0-cp38-none-win_amd64.whl", hash = "sha256:deaba8e16dbfcb3d7a6b5fabdd5a38b7c982809567479987b9c89572df62e027"}, - {file = "pendulum-3.0.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b11aceea5b20b4b5382962b321dbc354af0defe35daa84e9ff3aae3c230df694"}, - {file = "pendulum-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a90d4d504e82ad236afac9adca4d6a19e4865f717034fc69bafb112c320dcc8f"}, - {file = "pendulum-3.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:825799c6b66e3734227756fa746cc34b3549c48693325b8b9f823cb7d21b19ac"}, - {file = "pendulum-3.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad769e98dc07972e24afe0cff8d365cb6f0ebc7e65620aa1976fcfbcadc4c6f3"}, - {file = "pendulum-3.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6fc26907eb5fb8cc6188cc620bc2075a6c534d981a2f045daa5f79dfe50d512"}, - {file = "pendulum-3.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c717eab1b6d898c00a3e0fa7781d615b5c5136bbd40abe82be100bb06df7a56"}, - {file = "pendulum-3.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3ddd1d66d1a714ce43acfe337190be055cdc221d911fc886d5a3aae28e14b76d"}, - {file = "pendulum-3.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:822172853d7a9cf6da95d7b66a16c7160cb99ae6df55d44373888181d7a06edc"}, - {file = "pendulum-3.0.0-cp39-none-win_amd64.whl", hash = "sha256:840de1b49cf1ec54c225a2a6f4f0784d50bd47f68e41dc005b7f67c7d5b5f3ae"}, - {file = "pendulum-3.0.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3b1f74d1e6ffe5d01d6023870e2ce5c2191486928823196f8575dcc786e107b1"}, - {file = "pendulum-3.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:729e9f93756a2cdfa77d0fc82068346e9731c7e884097160603872686e570f07"}, - {file = "pendulum-3.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e586acc0b450cd21cbf0db6bae386237011b75260a3adceddc4be15334689a9a"}, - {file = "pendulum-3.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22e7944ffc1f0099a79ff468ee9630c73f8c7835cd76fdb57ef7320e6a409df4"}, - {file = "pendulum-3.0.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:fa30af36bd8e50686846bdace37cf6707bdd044e5cb6e1109acbad3277232e04"}, - {file = "pendulum-3.0.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:440215347b11914ae707981b9a57ab9c7b6983ab0babde07063c6ee75c0dc6e7"}, - {file = "pendulum-3.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:314c4038dc5e6a52991570f50edb2f08c339debdf8cea68ac355b32c4174e820"}, - {file = "pendulum-3.0.0-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5acb1d386337415f74f4d1955c4ce8d0201978c162927d07df8eb0692b2d8533"}, - {file = "pendulum-3.0.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a789e12fbdefaffb7b8ac67f9d8f22ba17a3050ceaaa635cd1cc4645773a4b1e"}, - {file = "pendulum-3.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:860aa9b8a888e5913bd70d819306749e5eb488e6b99cd6c47beb701b22bdecf5"}, - {file = "pendulum-3.0.0-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:5ebc65ea033ef0281368217fbf59f5cb05b338ac4dd23d60959c7afcd79a60a0"}, - {file = "pendulum-3.0.0-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d9fef18ab0386ef6a9ac7bad7e43ded42c83ff7ad412f950633854f90d59afa8"}, - {file = "pendulum-3.0.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:1c134ba2f0571d0b68b83f6972e2307a55a5a849e7dac8505c715c531d2a8795"}, - {file = "pendulum-3.0.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:385680812e7e18af200bb9b4a49777418c32422d05ad5a8eb85144c4a285907b"}, - {file = "pendulum-3.0.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9eec91cd87c59fb32ec49eb722f375bd58f4be790cae11c1b70fac3ee4f00da0"}, - {file = "pendulum-3.0.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4386bffeca23c4b69ad50a36211f75b35a4deb6210bdca112ac3043deb7e494a"}, - {file = "pendulum-3.0.0-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dfbcf1661d7146d7698da4b86e7f04814221081e9fe154183e34f4c5f5fa3bf8"}, - {file = "pendulum-3.0.0-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:04a1094a5aa1daa34a6b57c865b25f691848c61583fb22722a4df5699f6bf74c"}, - {file = "pendulum-3.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5b0ec85b9045bd49dd3a3493a5e7ddfd31c36a2a60da387c419fa04abcaecb23"}, - {file = "pendulum-3.0.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0a15b90129765b705eb2039062a6daf4d22c4e28d1a54fa260892e8c3ae6e157"}, - {file = "pendulum-3.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:bb8f6d7acd67a67d6fedd361ad2958ff0539445ef51cbe8cd288db4306503cd0"}, - {file = "pendulum-3.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd69b15374bef7e4b4440612915315cc42e8575fcda2a3d7586a0d88192d0c88"}, - {file = "pendulum-3.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc00f8110db6898360c53c812872662e077eaf9c75515d53ecc65d886eec209a"}, - {file = "pendulum-3.0.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:83a44e8b40655d0ba565a5c3d1365d27e3e6778ae2a05b69124db9e471255c4a"}, - {file = "pendulum-3.0.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1a3604e9fbc06b788041b2a8b78f75c243021e0f512447806a6d37ee5214905d"}, - {file = "pendulum-3.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:92c307ae7accebd06cbae4729f0ba9fa724df5f7d91a0964b1b972a22baa482b"}, - {file = "pendulum-3.0.0.tar.gz", hash = "sha256:5d034998dea404ec31fae27af6b22cff1708f830a1ed7353be4d1019bb9f584e"}, -] - -[package.dependencies] -python-dateutil = ">=2.6" -tzdata = ">=2020.1" - -[package.extras] -test = ["time-machine (>=2.6.0)"] - [[package]] name = "pep8-naming" version = "0.14.1" @@ -6070,33 +3337,16 @@ pyyaml = ">=5.1" virtualenv = ">=20.10.0" [[package]] -name = "prettier" -version = "0.0.7" -description = "Properly pprint of nested objects" -optional = false -python-versions = "*" -files = [ - {file = "prettier-0.0.7-py3-none-any.whl", hash = "sha256:20e76791de41cafe481328dd49552303f29ca192151cee1b120c26f66cae9bfc"}, - {file = "prettier-0.0.7.tar.gz", hash = "sha256:6c34b8cd09fd9c8956c05d6395ea3f575e0122dce494ba57685c07065abed427"}, -] - -[[package]] -name = "prison" -version = "0.2.1" -description = "Rison encoder/decoder" +name = "prettier" +version = "0.0.7" +description = "Properly pprint of nested objects" optional = false python-versions = "*" files = [ - {file = "prison-0.2.1-py2.py3-none-any.whl", hash = "sha256:f90bab63fca497aa0819a852f64fb21a4e181ed9f6114deaa5dc04001a7555c5"}, - {file = "prison-0.2.1.tar.gz", hash = "sha256:e6cd724044afcb1a8a69340cad2f1e3151a5839fd3a8027fd1357571e797c599"}, + {file = "prettier-0.0.7-py3-none-any.whl", hash = "sha256:20e76791de41cafe481328dd49552303f29ca192151cee1b120c26f66cae9bfc"}, + {file = "prettier-0.0.7.tar.gz", hash = "sha256:6c34b8cd09fd9c8956c05d6395ea3f575e0122dce494ba57685c07065abed427"}, ] -[package.dependencies] -six = "*" - -[package.extras] -dev = ["nose", "pipreqs", "twine"] - [[package]] name = "prompt-toolkit" version = "3.0.47" @@ -6396,116 +3646,6 @@ files = [ {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] -[[package]] -name = "pydantic" -version = "2.7.4" -description = "Data validation using Python type hints" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pydantic-2.7.4-py3-none-any.whl", hash = "sha256:ee8538d41ccb9c0a9ad3e0e5f07bf15ed8015b481ced539a1759d8cc89ae90d0"}, - {file = "pydantic-2.7.4.tar.gz", hash = "sha256:0c84efd9548d545f63ac0060c1e4d39bb9b14db8b3c0652338aecc07b5adec52"}, -] - -[package.dependencies] -annotated-types = ">=0.4.0" -pydantic-core = "2.18.4" -typing-extensions = ">=4.6.1" - -[package.extras] -email = ["email-validator (>=2.0.0)"] - -[[package]] -name = "pydantic-core" -version = "2.18.4" -description = "Core functionality for Pydantic validation and serialization" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pydantic_core-2.18.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:f76d0ad001edd426b92233d45c746fd08f467d56100fd8f30e9ace4b005266e4"}, - {file = "pydantic_core-2.18.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:59ff3e89f4eaf14050c8022011862df275b552caef8082e37b542b066ce1ff26"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a55b5b16c839df1070bc113c1f7f94a0af4433fcfa1b41799ce7606e5c79ce0a"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4d0dcc59664fcb8974b356fe0a18a672d6d7cf9f54746c05f43275fc48636851"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8951eee36c57cd128f779e641e21eb40bc5073eb28b2d23f33eb0ef14ffb3f5d"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4701b19f7e3a06ea655513f7938de6f108123bf7c86bbebb1196eb9bd35cf724"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00a3f196329e08e43d99b79b286d60ce46bed10f2280d25a1718399457e06be"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:97736815b9cc893b2b7f663628e63f436018b75f44854c8027040e05230eeddb"}, - {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6891a2ae0e8692679c07728819b6e2b822fb30ca7445f67bbf6509b25a96332c"}, - {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bc4ff9805858bd54d1a20efff925ccd89c9d2e7cf4986144b30802bf78091c3e"}, - {file = "pydantic_core-2.18.4-cp310-none-win32.whl", hash = "sha256:1b4de2e51bbcb61fdebd0ab86ef28062704f62c82bbf4addc4e37fa4b00b7cbc"}, - {file = "pydantic_core-2.18.4-cp310-none-win_amd64.whl", hash = "sha256:6a750aec7bf431517a9fd78cb93c97b9b0c496090fee84a47a0d23668976b4b0"}, - {file = "pydantic_core-2.18.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:942ba11e7dfb66dc70f9ae66b33452f51ac7bb90676da39a7345e99ffb55402d"}, - {file = "pydantic_core-2.18.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b2ebef0e0b4454320274f5e83a41844c63438fdc874ea40a8b5b4ecb7693f1c4"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a642295cd0c8df1b86fc3dced1d067874c353a188dc8e0f744626d49e9aa51c4"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f09baa656c904807e832cf9cce799c6460c450c4ad80803517032da0cd062e2"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98906207f29bc2c459ff64fa007afd10a8c8ac080f7e4d5beff4c97086a3dabd"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19894b95aacfa98e7cb093cd7881a0c76f55731efad31073db4521e2b6ff5b7d"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fbbdc827fe5e42e4d196c746b890b3d72876bdbf160b0eafe9f0334525119c8"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f85d05aa0918283cf29a30b547b4df2fbb56b45b135f9e35b6807cb28bc47951"}, - {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e85637bc8fe81ddb73fda9e56bab24560bdddfa98aa64f87aaa4e4b6730c23d2"}, - {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2f5966897e5461f818e136b8451d0551a2e77259eb0f73a837027b47dc95dab9"}, - {file = "pydantic_core-2.18.4-cp311-none-win32.whl", hash = "sha256:44c7486a4228413c317952e9d89598bcdfb06399735e49e0f8df643e1ccd0558"}, - {file = "pydantic_core-2.18.4-cp311-none-win_amd64.whl", hash = "sha256:8a7164fe2005d03c64fd3b85649891cd4953a8de53107940bf272500ba8a788b"}, - {file = "pydantic_core-2.18.4-cp311-none-win_arm64.whl", hash = "sha256:4e99bc050fe65c450344421017f98298a97cefc18c53bb2f7b3531eb39bc7805"}, - {file = "pydantic_core-2.18.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6f5c4d41b2771c730ea1c34e458e781b18cc668d194958e0112455fff4e402b2"}, - {file = "pydantic_core-2.18.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2fdf2156aa3d017fddf8aea5adfba9f777db1d6022d392b682d2a8329e087cef"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4748321b5078216070b151d5271ef3e7cc905ab170bbfd27d5c83ee3ec436695"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847a35c4d58721c5dc3dba599878ebbdfd96784f3fb8bb2c356e123bdcd73f34"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c40d4eaad41f78e3bbda31b89edc46a3f3dc6e171bf0ecf097ff7a0ffff7cb1"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:21a5e440dbe315ab9825fcd459b8814bb92b27c974cbc23c3e8baa2b76890077"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01dd777215e2aa86dfd664daed5957704b769e726626393438f9c87690ce78c3"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4b06beb3b3f1479d32befd1f3079cc47b34fa2da62457cdf6c963393340b56e9"}, - {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:564d7922e4b13a16b98772441879fcdcbe82ff50daa622d681dd682175ea918c"}, - {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0eb2a4f660fcd8e2b1c90ad566db2b98d7f3f4717c64fe0a83e0adb39766d5b8"}, - {file = "pydantic_core-2.18.4-cp312-none-win32.whl", hash = "sha256:8b8bab4c97248095ae0c4455b5a1cd1cdd96e4e4769306ab19dda135ea4cdb07"}, - {file = "pydantic_core-2.18.4-cp312-none-win_amd64.whl", hash = "sha256:14601cdb733d741b8958224030e2bfe21a4a881fb3dd6fbb21f071cabd48fa0a"}, - {file = "pydantic_core-2.18.4-cp312-none-win_arm64.whl", hash = "sha256:c1322d7dd74713dcc157a2b7898a564ab091ca6c58302d5c7b4c07296e3fd00f"}, - {file = "pydantic_core-2.18.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:823be1deb01793da05ecb0484d6c9e20baebb39bd42b5d72636ae9cf8350dbd2"}, - {file = "pydantic_core-2.18.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ebef0dd9bf9b812bf75bda96743f2a6c5734a02092ae7f721c048d156d5fabae"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae1d6df168efb88d7d522664693607b80b4080be6750c913eefb77e34c12c71a"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f9899c94762343f2cc2fc64c13e7cae4c3cc65cdfc87dd810a31654c9b7358cc"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99457f184ad90235cfe8461c4d70ab7dd2680e28821c29eca00252ba90308c78"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18f469a3d2a2fdafe99296a87e8a4c37748b5080a26b806a707f25a902c040a8"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cdf28938ac6b8b49ae5e92f2735056a7ba99c9b110a474473fd71185c1af5d"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:938cb21650855054dc54dfd9120a851c974f95450f00683399006aa6e8abb057"}, - {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:44cd83ab6a51da80fb5adbd9560e26018e2ac7826f9626bc06ca3dc074cd198b"}, - {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:972658f4a72d02b8abfa2581d92d59f59897d2e9f7e708fdabe922f9087773af"}, - {file = "pydantic_core-2.18.4-cp38-none-win32.whl", hash = "sha256:1d886dc848e60cb7666f771e406acae54ab279b9f1e4143babc9c2258213daa2"}, - {file = "pydantic_core-2.18.4-cp38-none-win_amd64.whl", hash = "sha256:bb4462bd43c2460774914b8525f79b00f8f407c945d50881568f294c1d9b4443"}, - {file = "pydantic_core-2.18.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:44a688331d4a4e2129140a8118479443bd6f1905231138971372fcde37e43528"}, - {file = "pydantic_core-2.18.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a2fdd81edd64342c85ac7cf2753ccae0b79bf2dfa063785503cb85a7d3593223"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86110d7e1907ab36691f80b33eb2da87d780f4739ae773e5fc83fb272f88825f"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:46387e38bd641b3ee5ce247563b60c5ca098da9c56c75c157a05eaa0933ed154"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:123c3cec203e3f5ac7b000bd82235f1a3eced8665b63d18be751f115588fea30"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc1803ac5c32ec324c5261c7209e8f8ce88e83254c4e1aebdc8b0a39f9ddb443"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53db086f9f6ab2b4061958d9c276d1dbe3690e8dd727d6abf2321d6cce37fa94"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:abc267fa9837245cc28ea6929f19fa335f3dc330a35d2e45509b6566dc18be23"}, - {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a0d829524aaefdebccb869eed855e2d04c21d2d7479b6cada7ace5448416597b"}, - {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:509daade3b8649f80d4e5ff21aa5673e4ebe58590b25fe42fac5f0f52c6f034a"}, - {file = "pydantic_core-2.18.4-cp39-none-win32.whl", hash = "sha256:ca26a1e73c48cfc54c4a76ff78df3727b9d9f4ccc8dbee4ae3f73306a591676d"}, - {file = "pydantic_core-2.18.4-cp39-none-win_amd64.whl", hash = "sha256:c67598100338d5d985db1b3d21f3619ef392e185e71b8d52bceacc4a7771ea7e"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:574d92eac874f7f4db0ca653514d823a0d22e2354359d0759e3f6a406db5d55d"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1f4d26ceb5eb9eed4af91bebeae4b06c3fb28966ca3a8fb765208cf6b51102ab"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77450e6d20016ec41f43ca4a6c63e9fdde03f0ae3fe90e7c27bdbeaece8b1ed4"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d323a01da91851a4f17bf592faf46149c9169d68430b3146dcba2bb5e5719abc"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43d447dd2ae072a0065389092a231283f62d960030ecd27565672bd40746c507"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:578e24f761f3b425834f297b9935e1ce2e30f51400964ce4801002435a1b41ef"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:81b5efb2f126454586d0f40c4d834010979cb80785173d1586df845a632e4e6d"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ab86ce7c8f9bea87b9d12c7f0af71102acbf5ecbc66c17796cff45dae54ef9a5"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:90afc12421df2b1b4dcc975f814e21bc1754640d502a2fbcc6d41e77af5ec312"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:51991a89639a912c17bef4b45c87bd83593aee0437d8102556af4885811d59f5"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:293afe532740370aba8c060882f7d26cfd00c94cae32fd2e212a3a6e3b7bc15e"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48ece5bde2e768197a2d0f6e925f9d7e3e826f0ad2271120f8144a9db18d5c8"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eae237477a873ab46e8dd748e515c72c0c804fb380fbe6c85533c7de51f23a8f"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:834b5230b5dfc0c1ec37b2fda433b271cbbc0e507560b5d1588e2cc1148cf1ce"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e858ac0a25074ba4bce653f9b5d0a85b7456eaddadc0ce82d3878c22489fa4ee"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2fd41f6eff4c20778d717af1cc50eca52f5afe7805ee530a4fbd0bae284f16e9"}, - {file = "pydantic_core-2.18.4.tar.gz", hash = "sha256:ec3beeada09ff865c344ff3bc2f427f5e6c26401cc6113d77e372c3fdac73864"}, -] - -[package.dependencies] -typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" - [[package]] name = "pydata-google-auth" version = "1.8.2" @@ -6615,24 +3755,6 @@ pyyaml = "*" [package.extras] extra = ["pygments (>=2.12)"] -[[package]] -name = "pyopenssl" -version = "24.1.0" -description = "Python wrapper module around the OpenSSL library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pyOpenSSL-24.1.0-py3-none-any.whl", hash = "sha256:17ed5be5936449c5418d1cd269a1a9e9081bc54c17aed272b45856a3d3dc86ad"}, - {file = "pyOpenSSL-24.1.0.tar.gz", hash = "sha256:cabed4bfaa5df9f1a16c0ef64a0cb65318b5cd077a7eda7d6970131ca2f41a6f"}, -] - -[package.dependencies] -cryptography = ">=41.0.5,<43" - -[package.extras] -docs = ["sphinx (!=5.2.0,!=5.2.0.post0,!=7.2.5)", "sphinx-rtd-theme"] -test = ["pretend", "pytest (>=3.0.1)", "pytest-rerunfailures"] - [[package]] name = "pyparsing" version = "3.1.2" @@ -6745,26 +3867,6 @@ psutil = ["psutil (>=3.0)"] setproctitle = ["setproctitle"] testing = ["filelock"] -[[package]] -name = "python-daemon" -version = "3.0.1" -description = "Library to implement a well-behaved Unix daemon process." -optional = false -python-versions = ">=3" -files = [ - {file = "python-daemon-3.0.1.tar.gz", hash = "sha256:6c57452372f7eaff40934a1c03ad1826bf5e793558e87fef49131e6464b4dae5"}, - {file = "python_daemon-3.0.1-py3-none-any.whl", hash = "sha256:42bb848a3260a027fa71ad47ecd959e471327cb34da5965962edd5926229f341"}, -] - -[package.dependencies] -docutils = "*" -lockfile = ">=0.10" -setuptools = ">=62.4.0" - -[package.extras] -devel = ["coverage", "docutils", "isort", "testscenarios (>=0.4)", "testtools", "twine"] -test = ["coverage", "docutils", "testscenarios (>=0.4)", "testtools"] - [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -6790,37 +3892,6 @@ files = [ {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, ] -[[package]] -name = "python-nvd3" -version = "0.16.0" -description = "Python NVD3 - Chart Library for d3.js" -optional = false -python-versions = "*" -files = [ - {file = "python-nvd3-0.16.0.tar.gz", hash = "sha256:0115887289b3f751716ddd05c7b53ac5f05e71201e52496decdac453a50dcf7e"}, -] - -[package.dependencies] -Jinja2 = ">=2.8" -python-slugify = ">=1.2.5" - -[[package]] -name = "python-slugify" -version = "8.0.4" -description = "A Python slugify application that also handles Unicode" -optional = false -python-versions = ">=3.7" -files = [ - {file = "python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856"}, - {file = "python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8"}, -] - -[package.dependencies] -text-unidecode = ">=1.3" - -[package.extras] -unidecode = ["Unidecode (>=1.1.1)"] - [[package]] name = "pytz" version = "2024.1" @@ -7029,21 +4100,6 @@ files = [ [package.dependencies] cffi = {version = "*", markers = "implementation_name == \"pypy\""} -[[package]] -name = "referencing" -version = "0.35.1" -description = "JSON Referencing + Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, - {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, -] - -[package.dependencies] -attrs = ">=22.2.0" -rpds-py = ">=0.7.0" - [[package]] name = "regex" version = "2024.5.15" @@ -7171,34 +4227,6 @@ requests = ">=2.0.0" [package.extras] rsa = ["oauthlib[signedtoken] (>=3.0.0)"] -[[package]] -name = "requests-toolbelt" -version = "1.0.0" -description = "A utility belt for advanced users of python-requests" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, - {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, -] - -[package.dependencies] -requests = ">=2.0.1,<3.0.0" - -[[package]] -name = "rfc3339-validator" -version = "0.1.4" -description = "A pure python RFC3339 validator" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, - {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, -] - -[package.dependencies] -six = "*" - [[package]] name = "rich" version = "12.6.0" @@ -7217,128 +4245,6 @@ pygments = ">=2.6.0,<3.0.0" [package.extras] jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"] -[[package]] -name = "rich-argparse" -version = "1.5.2" -description = "Rich help formatters for argparse and optparse" -optional = false -python-versions = ">=3.8" -files = [ - {file = "rich_argparse-1.5.2-py3-none-any.whl", hash = "sha256:7027503d5849e27fc7cc85fb58504363606f2ec1c8b3c27d9a8ad28788faf877"}, - {file = "rich_argparse-1.5.2.tar.gz", hash = "sha256:84d348d5b6dafe99fffe2c7ea1ca0afe14096c921693445b9eee65ee4fcbfd2c"}, -] - -[package.dependencies] -rich = ">=11.0.0" - -[[package]] -name = "rpds-py" -version = "0.18.1" -description = "Python bindings to Rust's persistent data structures (rpds)" -optional = false -python-versions = ">=3.8" -files = [ - {file = "rpds_py-0.18.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53"}, - {file = "rpds_py-0.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d"}, - {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60"}, - {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da"}, - {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1"}, - {file = "rpds_py-0.18.1-cp310-none-win32.whl", hash = "sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333"}, - {file = "rpds_py-0.18.1-cp310-none-win_amd64.whl", hash = "sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a"}, - {file = "rpds_py-0.18.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8"}, - {file = "rpds_py-0.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8"}, - {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7"}, - {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e"}, - {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88"}, - {file = "rpds_py-0.18.1-cp311-none-win32.whl", hash = "sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb"}, - {file = "rpds_py-0.18.1-cp311-none-win_amd64.whl", hash = "sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2"}, - {file = "rpds_py-0.18.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3"}, - {file = "rpds_py-0.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a"}, - {file = "rpds_py-0.18.1-cp312-none-win32.whl", hash = "sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6"}, - {file = "rpds_py-0.18.1-cp312-none-win_amd64.whl", hash = "sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72"}, - {file = "rpds_py-0.18.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74"}, - {file = "rpds_py-0.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0"}, - {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d"}, - {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e"}, - {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc"}, - {file = "rpds_py-0.18.1-cp38-none-win32.whl", hash = "sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9"}, - {file = "rpds_py-0.18.1-cp38-none-win_amd64.whl", hash = "sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2"}, - {file = "rpds_py-0.18.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93"}, - {file = "rpds_py-0.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c"}, - {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338"}, - {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b"}, - {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26"}, - {file = "rpds_py-0.18.1-cp39-none-win32.whl", hash = "sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360"}, - {file = "rpds_py-0.18.1-cp39-none-win_amd64.whl", hash = "sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e"}, - {file = "rpds_py-0.18.1.tar.gz", hash = "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f"}, -] - [[package]] name = "rsa" version = "4.9" @@ -7650,63 +4556,6 @@ docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-g testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] -[[package]] -name = "shapely" -version = "2.0.4" -description = "Manipulation and analysis of geometric objects" -optional = false -python-versions = ">=3.7" -files = [ - {file = "shapely-2.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:011b77153906030b795791f2fdfa2d68f1a8d7e40bce78b029782ade3afe4f2f"}, - {file = "shapely-2.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9831816a5d34d5170aa9ed32a64982c3d6f4332e7ecfe62dc97767e163cb0b17"}, - {file = "shapely-2.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5c4849916f71dc44e19ed370421518c0d86cf73b26e8656192fcfcda08218fbd"}, - {file = "shapely-2.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:841f93a0e31e4c64d62ea570d81c35de0f6cea224568b2430d832967536308e6"}, - {file = "shapely-2.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b4431f522b277c79c34b65da128029a9955e4481462cbf7ebec23aab61fc58"}, - {file = "shapely-2.0.4-cp310-cp310-win32.whl", hash = "sha256:92a41d936f7d6743f343be265ace93b7c57f5b231e21b9605716f5a47c2879e7"}, - {file = "shapely-2.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:30982f79f21bb0ff7d7d4a4e531e3fcaa39b778584c2ce81a147f95be1cd58c9"}, - {file = "shapely-2.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de0205cb21ad5ddaef607cda9a3191eadd1e7a62a756ea3a356369675230ac35"}, - {file = "shapely-2.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7d56ce3e2a6a556b59a288771cf9d091470116867e578bebced8bfc4147fbfd7"}, - {file = "shapely-2.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:58b0ecc505bbe49a99551eea3f2e8a9b3b24b3edd2a4de1ac0dc17bc75c9ec07"}, - {file = "shapely-2.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:790a168a808bd00ee42786b8ba883307c0e3684ebb292e0e20009588c426da47"}, - {file = "shapely-2.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4310b5494271e18580d61022c0857eb85d30510d88606fa3b8314790df7f367d"}, - {file = "shapely-2.0.4-cp311-cp311-win32.whl", hash = "sha256:63f3a80daf4f867bd80f5c97fbe03314348ac1b3b70fb1c0ad255a69e3749879"}, - {file = "shapely-2.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:c52ed79f683f721b69a10fb9e3d940a468203f5054927215586c5d49a072de8d"}, - {file = "shapely-2.0.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5bbd974193e2cc274312da16b189b38f5f128410f3377721cadb76b1e8ca5328"}, - {file = "shapely-2.0.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:41388321a73ba1a84edd90d86ecc8bfed55e6a1e51882eafb019f45895ec0f65"}, - {file = "shapely-2.0.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0776c92d584f72f1e584d2e43cfc5542c2f3dd19d53f70df0900fda643f4bae6"}, - {file = "shapely-2.0.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c75c98380b1ede1cae9a252c6dc247e6279403fae38c77060a5e6186c95073ac"}, - {file = "shapely-2.0.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3e700abf4a37b7b8b90532fa6ed5c38a9bfc777098bc9fbae5ec8e618ac8f30"}, - {file = "shapely-2.0.4-cp312-cp312-win32.whl", hash = "sha256:4f2ab0faf8188b9f99e6a273b24b97662194160cc8ca17cf9d1fb6f18d7fb93f"}, - {file = "shapely-2.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:03152442d311a5e85ac73b39680dd64a9892fa42bb08fd83b3bab4fe6999bfa0"}, - {file = "shapely-2.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:994c244e004bc3cfbea96257b883c90a86e8cbd76e069718eb4c6b222a56f78b"}, - {file = "shapely-2.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05ffd6491e9e8958b742b0e2e7c346635033d0a5f1a0ea083547fcc854e5d5cf"}, - {file = "shapely-2.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbdc1140a7d08faa748256438291394967aa54b40009f54e8d9825e75ef6113"}, - {file = "shapely-2.0.4-cp37-cp37m-win32.whl", hash = "sha256:5af4cd0d8cf2912bd95f33586600cac9c4b7c5053a036422b97cfe4728d2eb53"}, - {file = "shapely-2.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:464157509ce4efa5ff285c646a38b49f8c5ef8d4b340f722685b09bb033c5ccf"}, - {file = "shapely-2.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:489c19152ec1f0e5c5e525356bcbf7e532f311bff630c9b6bc2db6f04da6a8b9"}, - {file = "shapely-2.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b79bbd648664aa6f44ef018474ff958b6b296fed5c2d42db60078de3cffbc8aa"}, - {file = "shapely-2.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:674d7baf0015a6037d5758496d550fc1946f34bfc89c1bf247cabdc415d7747e"}, - {file = "shapely-2.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6cd4ccecc5ea5abd06deeaab52fcdba372f649728050c6143cc405ee0c166679"}, - {file = "shapely-2.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb5cdcbbe3080181498931b52a91a21a781a35dcb859da741c0345c6402bf00c"}, - {file = "shapely-2.0.4-cp38-cp38-win32.whl", hash = "sha256:55a38dcd1cee2f298d8c2ebc60fc7d39f3b4535684a1e9e2f39a80ae88b0cea7"}, - {file = "shapely-2.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:ec555c9d0db12d7fd777ba3f8b75044c73e576c720a851667432fabb7057da6c"}, - {file = "shapely-2.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f9103abd1678cb1b5f7e8e1af565a652e036844166c91ec031eeb25c5ca8af0"}, - {file = "shapely-2.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:263bcf0c24d7a57c80991e64ab57cba7a3906e31d2e21b455f493d4aab534aaa"}, - {file = "shapely-2.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ddf4a9bfaac643e62702ed662afc36f6abed2a88a21270e891038f9a19bc08fc"}, - {file = "shapely-2.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:485246fcdb93336105c29a5cfbff8a226949db37b7473c89caa26c9bae52a242"}, - {file = "shapely-2.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8de4578e838a9409b5b134a18ee820730e507b2d21700c14b71a2b0757396acc"}, - {file = "shapely-2.0.4-cp39-cp39-win32.whl", hash = "sha256:9dab4c98acfb5fb85f5a20548b5c0abe9b163ad3525ee28822ffecb5c40e724c"}, - {file = "shapely-2.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:31c19a668b5a1eadab82ff070b5a260478ac6ddad3a5b62295095174a8d26398"}, - {file = "shapely-2.0.4.tar.gz", hash = "sha256:5dc736127fac70009b8d309a0eeb74f3e08979e530cf7017f2f507ef62e6cfb8"}, -] - -[package.dependencies] -numpy = ">=1.14,<3" - -[package.extras] -docs = ["matplotlib", "numpydoc (==1.1.*)", "sphinx", "sphinx-book-theme", "sphinx-remove-toctrees"] -test = ["pytest", "pytest-cov"] - [[package]] name = "shellingham" version = "1.5.4" @@ -7762,17 +4611,6 @@ files = [ {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, ] -[[package]] -name = "sniffio" -version = "1.3.1" -description = "Sniff out which async library your code is running under" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, - {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, -] - [[package]] name = "sortedcontainers" version = "2.4.0" @@ -7795,186 +4633,6 @@ files = [ {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, ] -[[package]] -name = "sqlalchemy" -version = "1.4.52" -description = "Database Abstraction Library" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -files = [ - {file = "SQLAlchemy-1.4.52-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:f68016f9a5713684c1507cc37133c28035f29925c75c0df2f9d0f7571e23720a"}, - {file = "SQLAlchemy-1.4.52-cp310-cp310-manylinux1_x86_64.manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24bb0f81fbbb13d737b7f76d1821ec0b117ce8cbb8ee5e8641ad2de41aa916d3"}, - {file = "SQLAlchemy-1.4.52-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e93983cc0d2edae253b3f2141b0a3fb07e41c76cd79c2ad743fc27eb79c3f6db"}, - {file = "SQLAlchemy-1.4.52-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:84e10772cfc333eb08d0b7ef808cd76e4a9a30a725fb62a0495877a57ee41d81"}, - {file = "SQLAlchemy-1.4.52-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:427988398d2902de042093d17f2b9619a5ebc605bf6372f7d70e29bde6736842"}, - {file = "SQLAlchemy-1.4.52-cp310-cp310-win32.whl", hash = "sha256:1296f2cdd6db09b98ceb3c93025f0da4835303b8ac46c15c2136e27ee4d18d94"}, - {file = "SQLAlchemy-1.4.52-cp310-cp310-win_amd64.whl", hash = "sha256:80e7f697bccc56ac6eac9e2df5c98b47de57e7006d2e46e1a3c17c546254f6ef"}, - {file = "SQLAlchemy-1.4.52-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2f251af4c75a675ea42766880ff430ac33291c8d0057acca79710f9e5a77383d"}, - {file = "SQLAlchemy-1.4.52-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb8f9e4c4718f111d7b530c4e6fb4d28f9f110eb82e7961412955b3875b66de0"}, - {file = "SQLAlchemy-1.4.52-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afb1672b57f58c0318ad2cff80b384e816735ffc7e848d8aa51e0b0fc2f4b7bb"}, - {file = "SQLAlchemy-1.4.52-cp311-cp311-win32.whl", hash = "sha256:6e41cb5cda641f3754568d2ed8962f772a7f2b59403b95c60c89f3e0bd25f15e"}, - {file = "SQLAlchemy-1.4.52-cp311-cp311-win_amd64.whl", hash = "sha256:5bed4f8c3b69779de9d99eb03fd9ab67a850d74ab0243d1be9d4080e77b6af12"}, - {file = "SQLAlchemy-1.4.52-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:49e3772eb3380ac88d35495843daf3c03f094b713e66c7d017e322144a5c6b7c"}, - {file = "SQLAlchemy-1.4.52-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:618827c1a1c243d2540314c6e100aee7af09a709bd005bae971686fab6723554"}, - {file = "SQLAlchemy-1.4.52-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de9acf369aaadb71a725b7e83a5ef40ca3de1cf4cdc93fa847df6b12d3cd924b"}, - {file = "SQLAlchemy-1.4.52-cp312-cp312-win32.whl", hash = "sha256:763bd97c4ebc74136ecf3526b34808c58945023a59927b416acebcd68d1fc126"}, - {file = "SQLAlchemy-1.4.52-cp312-cp312-win_amd64.whl", hash = "sha256:f12aaf94f4d9679ca475975578739e12cc5b461172e04d66f7a3c39dd14ffc64"}, - {file = "SQLAlchemy-1.4.52-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:853fcfd1f54224ea7aabcf34b227d2b64a08cbac116ecf376907968b29b8e763"}, - {file = "SQLAlchemy-1.4.52-cp36-cp36m-manylinux1_x86_64.manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f98dbb8fcc6d1c03ae8ec735d3c62110949a3b8bc6e215053aa27096857afb45"}, - {file = "SQLAlchemy-1.4.52-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e135fff2e84103bc15c07edd8569612ce317d64bdb391f49ce57124a73f45c5"}, - {file = "SQLAlchemy-1.4.52-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5b5de6af8852500d01398f5047d62ca3431d1e29a331d0b56c3e14cb03f8094c"}, - {file = "SQLAlchemy-1.4.52-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3491c85df263a5c2157c594f54a1a9c72265b75d3777e61ee13c556d9e43ffc9"}, - {file = "SQLAlchemy-1.4.52-cp36-cp36m-win32.whl", hash = "sha256:427c282dd0deba1f07bcbf499cbcc9fe9a626743f5d4989bfdfd3ed3513003dd"}, - {file = "SQLAlchemy-1.4.52-cp36-cp36m-win_amd64.whl", hash = "sha256:ca5ce82b11731492204cff8845c5e8ca1a4bd1ade85e3b8fcf86e7601bfc6a39"}, - {file = "SQLAlchemy-1.4.52-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:29d4247313abb2015f8979137fe65f4eaceead5247d39603cc4b4a610936cd2b"}, - {file = "SQLAlchemy-1.4.52-cp37-cp37m-manylinux1_x86_64.manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a752bff4796bf22803d052d4841ebc3c55c26fb65551f2c96e90ac7c62be763a"}, - {file = "SQLAlchemy-1.4.52-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7ea11727feb2861deaa293c7971a4df57ef1c90e42cb53f0da40c3468388000"}, - {file = "SQLAlchemy-1.4.52-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d913f8953e098ca931ad7f58797f91deed26b435ec3756478b75c608aa80d139"}, - {file = "SQLAlchemy-1.4.52-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a251146b921725547ea1735b060a11e1be705017b568c9f8067ca61e6ef85f20"}, - {file = "SQLAlchemy-1.4.52-cp37-cp37m-win32.whl", hash = "sha256:1f8e1c6a6b7f8e9407ad9afc0ea41c1f65225ce505b79bc0342159de9c890782"}, - {file = "SQLAlchemy-1.4.52-cp37-cp37m-win_amd64.whl", hash = "sha256:346ed50cb2c30f5d7a03d888e25744154ceac6f0e6e1ab3bc7b5b77138d37710"}, - {file = "SQLAlchemy-1.4.52-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:4dae6001457d4497736e3bc422165f107ecdd70b0d651fab7f731276e8b9e12d"}, - {file = "SQLAlchemy-1.4.52-cp38-cp38-manylinux1_x86_64.manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5d2e08d79f5bf250afb4a61426b41026e448da446b55e4770c2afdc1e200fce"}, - {file = "SQLAlchemy-1.4.52-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bbce5dd7c7735e01d24f5a60177f3e589078f83c8a29e124a6521b76d825b85"}, - {file = "SQLAlchemy-1.4.52-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bdb7b4d889631a3b2a81a3347c4c3f031812eb4adeaa3ee4e6b0d028ad1852b5"}, - {file = "SQLAlchemy-1.4.52-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c294ae4e6bbd060dd79e2bd5bba8b6274d08ffd65b58d106394cb6abbf35cf45"}, - {file = "SQLAlchemy-1.4.52-cp38-cp38-win32.whl", hash = "sha256:bcdfb4b47fe04967669874fb1ce782a006756fdbebe7263f6a000e1db969120e"}, - {file = "SQLAlchemy-1.4.52-cp38-cp38-win_amd64.whl", hash = "sha256:7d0dbc56cb6af5088f3658982d3d8c1d6a82691f31f7b0da682c7b98fa914e91"}, - {file = "SQLAlchemy-1.4.52-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:a551d5f3dc63f096ed41775ceec72fdf91462bb95abdc179010dc95a93957800"}, - {file = "SQLAlchemy-1.4.52-cp39-cp39-manylinux1_x86_64.manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_5_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ab773f9ad848118df7a9bbabca53e3f1002387cdbb6ee81693db808b82aaab0"}, - {file = "SQLAlchemy-1.4.52-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2de46f5d5396d5331127cfa71f837cca945f9a2b04f7cb5a01949cf676db7d1"}, - {file = "SQLAlchemy-1.4.52-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7027be7930a90d18a386b25ee8af30514c61f3852c7268899f23fdfbd3107181"}, - {file = "SQLAlchemy-1.4.52-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99224d621affbb3c1a4f72b631f8393045f4ce647dd3262f12fe3576918f8bf3"}, - {file = "SQLAlchemy-1.4.52-cp39-cp39-win32.whl", hash = "sha256:c124912fd4e1bb9d1e7dc193ed482a9f812769cb1e69363ab68e01801e859821"}, - {file = "SQLAlchemy-1.4.52-cp39-cp39-win_amd64.whl", hash = "sha256:2c286fab42e49db23c46ab02479f328b8bdb837d3e281cae546cc4085c83b680"}, - {file = "SQLAlchemy-1.4.52.tar.gz", hash = "sha256:80e63bbdc5217dad3485059bdf6f65a7d43f33c8bde619df5c220edf03d87296"}, -] - -[package.dependencies] -greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" 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\")"} - -[package.extras] -aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] -aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] -asyncio = ["greenlet (!=0.4.17)"] -asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"] -mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2)"] -mssql = ["pyodbc"] -mssql-pymssql = ["pymssql"] -mssql-pyodbc = ["pyodbc"] -mypy = ["mypy (>=0.910)", "sqlalchemy2-stubs"] -mysql = ["mysqlclient (>=1.4.0)", "mysqlclient (>=1.4.0,<2)"] -mysql-connector = ["mysql-connector-python"] -oracle = ["cx_oracle (>=7)", "cx_oracle (>=7,<8)"] -postgresql = ["psycopg2 (>=2.7)"] -postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] -postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] -postgresql-psycopg2binary = ["psycopg2-binary"] -postgresql-psycopg2cffi = ["psycopg2cffi"] -pymysql = ["pymysql", "pymysql (<1)"] -sqlcipher = ["sqlcipher3_binary"] - -[[package]] -name = "sqlalchemy-bigquery" -version = "1.11.0" -description = "SQLAlchemy dialect for BigQuery" -optional = false -python-versions = "<3.13,>=3.8" -files = [ - {file = "sqlalchemy-bigquery-1.11.0.tar.gz", hash = "sha256:09a2b99b8591d441eef66d34d13057d0f09423fe259fef98c0502df61419d242"}, - {file = "sqlalchemy_bigquery-1.11.0-py2.py3-none-any.whl", hash = "sha256:99f868cfdd103b13f921ec1c1b748826b4b1187457dda48040da5ab5ba63c705"}, -] - -[package.dependencies] -google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0dev" -google-auth = ">=1.25.0,<3.0.0dev" -google-cloud-bigquery = ">=3.3.6,<4.0.0dev" -packaging = "*" -sqlalchemy = ">=1.4.16,<3.0.0dev" - -[package.extras] -alembic = ["alembic"] -all = ["GeoAlchemy2", "alembic", "google-cloud-bigquery-storage (>=2.0.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "packaging", "pyarrow (>=3.0.0)", "pytz", "shapely"] -bqstorage = ["google-cloud-bigquery-storage (>=2.0.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "pyarrow (>=3.0.0)"] -geography = ["GeoAlchemy2", "shapely"] -tests = ["packaging", "pytz"] - -[[package]] -name = "sqlalchemy-jsonfield" -version = "1.0.2" -description = "SQLALchemy JSONField implementation for storing dicts at SQL" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "SQLAlchemy-JSONField-1.0.2.tar.gz", hash = "sha256:dab3abc9d75a1640e7f3d4875564a4199f665d27863da8d5a089e4eaca5e67f2"}, - {file = "SQLAlchemy_JSONField-1.0.2-py3-none-any.whl", hash = "sha256:b2945fa1e60b07d5764a7c73b18da427948b35dd4c07c0e94939001dc2dacf77"}, -] - -[package.dependencies] -sqlalchemy = "*" - -[[package]] -name = "sqlalchemy-spanner" -version = "1.7.0" -description = "SQLAlchemy dialect integrated into Cloud Spanner database" -optional = false -python-versions = "*" -files = [ - {file = "sqlalchemy_spanner-1.7.0-py3-none-any.whl", hash = "sha256:9925037a50b94eda358d462b694aebde61bcbeca1bb7c5a0cf247f672a340d7c"}, - {file = "sqlalchemy_spanner-1.7.0.tar.gz", hash = "sha256:c5a184710d289a3ab8e20f10998928d08b5b89838cf39c7ed0b5f52e8ee6e13b"}, -] - -[package.dependencies] -alembic = "*" -google-cloud-spanner = ">=3.12.0" -sqlalchemy = ">=1.1.13" - -[package.extras] -tracing = ["opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)"] - -[[package]] -name = "sqlalchemy-utils" -version = "0.41.2" -description = "Various utility functions for SQLAlchemy." -optional = false -python-versions = ">=3.7" -files = [ - {file = "SQLAlchemy-Utils-0.41.2.tar.gz", hash = "sha256:bc599c8c3b3319e53ce6c5c3c471120bd325d0071fb6f38a10e924e3d07b9990"}, - {file = "SQLAlchemy_Utils-0.41.2-py3-none-any.whl", hash = "sha256:85cf3842da2bf060760f955f8467b87983fb2e30f1764fd0e24a48307dc8ec6e"}, -] - -[package.dependencies] -SQLAlchemy = ">=1.3" - -[package.extras] -arrow = ["arrow (>=0.3.4)"] -babel = ["Babel (>=1.3)"] -color = ["colour (>=0.0.4)"] -encrypted = ["cryptography (>=0.6)"] -intervals = ["intervals (>=0.7.1)"] -password = ["passlib (>=1.6,<2.0)"] -pendulum = ["pendulum (>=2.0.5)"] -phone = ["phonenumbers (>=5.9.2)"] -test = ["Jinja2 (>=2.3)", "Pygments (>=1.2)", "backports.zoneinfo", "docutils (>=0.10)", "flake8 (>=2.4.0)", "flexmock (>=0.9.7)", "isort (>=4.2.2)", "pg8000 (>=1.12.4)", "psycopg (>=3.1.8)", "psycopg2 (>=2.5.1)", "psycopg2cffi (>=2.8.1)", "pymysql", "pyodbc", "pytest (==7.4.4)", "python-dateutil (>=2.6)", "pytz (>=2014.2)"] -test-all = ["Babel (>=1.3)", "Jinja2 (>=2.3)", "Pygments (>=1.2)", "arrow (>=0.3.4)", "backports.zoneinfo", "colour (>=0.0.4)", "cryptography (>=0.6)", "docutils (>=0.10)", "flake8 (>=2.4.0)", "flexmock (>=0.9.7)", "furl (>=0.4.1)", "intervals (>=0.7.1)", "isort (>=4.2.2)", "passlib (>=1.6,<2.0)", "pendulum (>=2.0.5)", "pg8000 (>=1.12.4)", "phonenumbers (>=5.9.2)", "psycopg (>=3.1.8)", "psycopg2 (>=2.5.1)", "psycopg2cffi (>=2.8.1)", "pymysql", "pyodbc", "pytest (==7.4.4)", "python-dateutil", "python-dateutil (>=2.6)", "pytz (>=2014.2)"] -timezone = ["python-dateutil"] -url = ["furl (>=0.4.1)"] - -[[package]] -name = "sqlparse" -version = "0.5.0" -description = "A non-validating SQL parser." -optional = false -python-versions = ">=3.8" -files = [ - {file = "sqlparse-0.5.0-py3-none-any.whl", hash = "sha256:c204494cd97479d0e39f28c93d46c0b2d5959c7b9ab904762ea6c7af211c8663"}, - {file = "sqlparse-0.5.0.tar.gz", hash = "sha256:714d0a4932c059d16189f58ef5411ec2287a4360f17cdd0edd2d09d4c5087c93"}, -] - -[package.extras] -dev = ["build", "hatch"] -doc = ["sphinx"] - [[package]] name = "stack-data" version = "0.6.3" @@ -8037,17 +4695,6 @@ files = [ [package.extras] tests = ["pytest", "pytest-cov"] -[[package]] -name = "text-unidecode" -version = "1.3" -description = "The most basic Text::Unidecode port" -optional = false -python-versions = "*" -files = [ - {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, - {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, -] - [[package]] name = "threadpoolctl" version = "3.5.0" @@ -8164,59 +4811,6 @@ files = [ {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, ] -[[package]] -name = "uc-micro-py" -version = "1.0.3" -description = "Micro subset of unicode data files for linkify-it-py projects." -optional = false -python-versions = ">=3.7" -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"}, -] - -[package.extras] -test = ["coverage", "pytest", "pytest-cov"] - -[[package]] -name = "unicodecsv" -version = "0.14.1" -description = "Python2's stdlib csv module is nice, but it doesn't support unicode. This module is a drop-in replacement which *does*." -optional = false -python-versions = "*" -files = [ - {file = "unicodecsv-0.14.1.tar.gz", hash = "sha256:018c08037d48649a0412063ff4eda26eaa81eff1546dbffa51fa5293276ff7fc"}, -] - -[[package]] -name = "universal-pathlib" -version = "0.2.2" -description = "pathlib api extended to use fsspec backends" -optional = false -python-versions = ">=3.8" -files = [ - {file = "universal_pathlib-0.2.2-py3-none-any.whl", hash = "sha256:9bc176112d593348bb29806a47e409eda78dff8d95391d66dd6f85e443aaa75d"}, - {file = "universal_pathlib-0.2.2.tar.gz", hash = "sha256:6bc215548792ad5db3553708b1c19bafd9e2fa1667dc925ed404c95e52ae2f13"}, -] - -[package.dependencies] -fsspec = ">=2022.1.0" - -[package.extras] -dev = ["adlfs", "aiohttp", "cheroot", "gcsfs", "moto[s3,server] (<5)", "mypy (==1.8.0)", "packaging", "pydantic", "pydantic-settings", "pylint (==2.17.4)", "pytest (==8.0.0)", "pytest-cov (==4.1.0)", "pytest-mock (==3.12.0)", "pytest-sugar (==0.9.7)", "requests", "s3fs", "webdav4[fsspec]", "wsgidav"] -tests = ["mypy (==1.8.0)", "packaging", "pylint (==2.17.4)", "pytest (==8.0.0)", "pytest-cov (==4.1.0)", "pytest-mock (==3.12.0)", "pytest-sugar (==0.9.7)"] - -[[package]] -name = "uritemplate" -version = "4.1.1" -description = "Implementation of RFC 6570 URI Templates" -optional = false -python-versions = ">=3.6" -files = [ - {file = "uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e"}, - {file = "uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"}, -] - [[package]] name = "urllib3" version = "2.2.2" @@ -8409,41 +5003,6 @@ files = [ {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] -[[package]] -name = "werkzeug" -version = "2.3.8" -description = "The comprehensive WSGI web application library." -optional = false -python-versions = ">=3.8" -files = [ - {file = "werkzeug-2.3.8-py3-none-any.whl", hash = "sha256:bba1f19f8ec89d4d607a3bd62f1904bd2e609472d93cd85e9d4e178f472c3748"}, - {file = "werkzeug-2.3.8.tar.gz", hash = "sha256:554b257c74bbeb7a0d254160a4f8ffe185243f52a52035060b761ca62d977f03"}, -] - -[package.dependencies] -MarkupSafe = ">=2.1.1" - -[package.extras] -watchdog = ["watchdog (>=2.3)"] - -[[package]] -name = "wirerope" -version = "0.4.7" -description = "'Turn functions and methods into fully controllable objects'" -optional = false -python-versions = "*" -files = [ - {file = "wirerope-0.4.7-py2.py3-none-any.whl", hash = "sha256:332973a3be6898f02fd0e73b2e20414c5102cc6c811d75856a938206677495c8"}, - {file = "wirerope-0.4.7.tar.gz", hash = "sha256:f3961039218276283c5037da0fa164619def0327595f10892d562a61a8603990"}, -] - -[package.dependencies] -six = ">=1.11.0" - -[package.extras] -doc = ["sphinx"] -test = ["pytest (>=4.6.7)", "pytest-cov (>=2.6.1)"] - [[package]] name = "wrapt" version = "1.16.0" @@ -8523,23 +5082,6 @@ files = [ {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, ] -[[package]] -name = "wtforms" -version = "3.1.2" -description = "Form validation and rendering for Python web development." -optional = false -python-versions = ">=3.8" -files = [ - {file = "wtforms-3.1.2-py3-none-any.whl", hash = "sha256:bf831c042829c8cdbad74c27575098d541d039b1faa74c771545ecac916f2c07"}, - {file = "wtforms-3.1.2.tar.gz", hash = "sha256:f8d76180d7239c94c6322f7990ae1216dae3659b7aa1cee94b6318bdffb474b9"}, -] - -[package.dependencies] -markupsafe = "*" - -[package.extras] -email = ["email-validator"] - [[package]] name = "xyzservices" version = "2024.6.0" @@ -8672,22 +5214,7 @@ files = [ idna = ">=2.0" multidict = ">=4.0" -[[package]] -name = "zipp" -version = "3.19.2" -description = "Backport of pathlib-compatible object wrapper for zip files" -optional = false -python-versions = ">=3.8" -files = [ - {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, - {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, -] - -[package.extras] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] - [metadata] lock-version = "2.0" python-versions = "^3.10, <3.11" -content-hash = "489d535e828faa827aa6cedc3bb739eff1c3b841770d3b9e94bdde44e572e621" +content-hash = "5b7e79eb2ca58918d786e61b6331115376a24705da5478c6feef85d37f24685e" diff --git a/pyproject.toml b/pyproject.toml index d91629ab3..094ca1f6e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -71,8 +71,6 @@ pytest-xdist = "^3.5.0" ipython = "^8.19.0" ipykernel = "^6.28.0" google-cloud-dataproc = "^5.8.0" -apache-airflow = "^2.8.0" -apache-airflow-providers-google = "^10.13.1" pydoclint = ">=0.3.8,<0.6.0" prettier = "^0.0.7" deptry = ">=0.12,<0.21" @@ -113,7 +111,7 @@ requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" [tool.deptry] -extend_exclude = ["src/conftest.py", "src/airflow", "src/utils"] +extend_exclude = ["src/conftest.py", "src/utils"] [tool.deptry.per_rule_ignores] DEP001 = ["gentropy"] @@ -126,8 +124,8 @@ exclude = ["dist"] [tool.pytest.ini_options] addopts = "-n auto --doctest-modules --cov=src/ --cov-report=xml" -pythonpath = [".", "./src/airflow/dags"] -testpaths = ["tests/gentropy", "src/gentropy/"] +pythonpath = ["."] +testpaths = ["tests/gentropy", "src/gentropy"] # Semi-strict mode for mypy [tool.mypy] diff --git a/src/airflow/.env b/src/airflow/.env deleted file mode 100644 index 2bcd8244f..000000000 --- a/src/airflow/.env +++ /dev/null @@ -1,6 +0,0 @@ -AIRFLOW_IMAGE_NAME=extending_airflow:latest -GOOGLE_LOCAL_CREDENTIALS_PATH=~/.config/gcloud -GOOGLE_DOCKER_CREDENTIALS_PATH=/.config/gcloud -GOOGLE_APPLICATION_CREDENTIALS=/.config/gcloud/service_account_credentials.json -AIRFLOW_CONN_GOOGLE_CLOUD_DEFAULT='google-cloud-platform://?extra__google_cloud_platform__key_path=/.config/gcloud/service_account_credentials.json' -GCP_PROJECT_ID=open-targets-genetics-dev diff --git a/src/airflow/Dockerfile b/src/airflow/Dockerfile deleted file mode 100644 index 9ca7c9193..000000000 --- a/src/airflow/Dockerfile +++ /dev/null @@ -1,33 +0,0 @@ -FROM apache/airflow:slim-2.7.3-python3.10 - -# Install additional Python requirements. -# --no-cache-dir is a good practice when installing packages using pip, because it helps to keep the image lightweight. -COPY requirements.txt /requirements.txt -RUN pip install --quiet --user --no-cache-dir --upgrade pip setuptools && \ - pip install --quiet --user --no-cache-dir -r /requirements.txt - -# Source: https://airflow.apache.org/docs/docker-stack/recipes.html -# Installing the GCP CLI in the container -SHELL ["/bin/bash", "-o", "pipefail", "-e", "-u", "-x", "-c"] - -USER 0 -ARG CLOUD_SDK_VERSION=452.0.0 -ENV GCLOUD_HOME=/home/google-cloud-sdk - -ENV PATH="${GCLOUD_HOME}/bin/:${PATH}" - -RUN DOWNLOAD_URL="https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-${CLOUD_SDK_VERSION}-linux-x86_64.tar.gz" \ - && TMP_DIR="$(mktemp -d)" \ - && curl -fL "${DOWNLOAD_URL}" --output "${TMP_DIR}/google-cloud-sdk.tar.gz" \ - && mkdir -p "${GCLOUD_HOME}" \ - && tar xzf "${TMP_DIR}/google-cloud-sdk.tar.gz" -C "${GCLOUD_HOME}" --strip-components=1 \ - && "${GCLOUD_HOME}/install.sh" \ - --bash-completion=false \ - --path-update=false \ - --usage-reporting=false \ - --quiet \ - && rm -rf "${TMP_DIR}" \ - && gcloud --version - -# Switch back to a non-root user for security purposes -USER airflow diff --git a/src/airflow/config/.gitkeep b/src/airflow/config/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/airflow/dags/.gitkeep b/src/airflow/dags/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/airflow/dags/common_airflow.py b/src/airflow/dags/common_airflow.py deleted file mode 100644 index 9c3c2f91c..000000000 --- a/src/airflow/dags/common_airflow.py +++ /dev/null @@ -1,490 +0,0 @@ -"""Airflow boilerplate code which can be shared by several DAGs.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -import pendulum -import yaml -from google.cloud import batch_v1, dataproc_v1, storage - -from airflow.providers.google.cloud.operators.dataproc import ( - ClusterGenerator, - DataprocCreateClusterOperator, - DataprocDeleteClusterOperator, - DataprocSubmitJobOperator, -) -from airflow.utils.trigger_rule import TriggerRule - -if TYPE_CHECKING: - from pathlib import Path - -# Code version. It has to be repeated here as well as in `pyproject.toml`, because Airflow isn't able to look at files outside of its `dags/` directory. -GENTROPY_VERSION = "0.0.0" - -# Cloud configuration. -GCP_PROJECT = "open-targets-genetics-dev" -GCP_REGION = "europe-west1" -GCP_ZONE = "europe-west1-d" -GCP_DATAPROC_IMAGE = "2.1" -GCP_AUTOSCALING_POLICY = "otg-etl" - -# Cluster init configuration. -INITIALISATION_BASE_PATH = ( - f"gs://genetics_etl_python_playground/initialisation/{GENTROPY_VERSION}" -) -CONFIG_TAG = f"{INITIALISATION_BASE_PATH}/config.tar.gz" -PACKAGE_WHEEL = ( - f"{INITIALISATION_BASE_PATH}/gentropy-{GENTROPY_VERSION}-py3-none-any.whl" -) -INITIALISATION_EXECUTABLE_FILE = [ - f"{INITIALISATION_BASE_PATH}/install_dependencies_on_cluster.sh" -] - -# CLI configuration. -CLUSTER_CONFIG_DIR = "/config" -CONFIG_NAME = "ot_config" -PYTHON_CLI = "cli.py" - -# Shared DAG construction parameters. -shared_dag_args = { - "owner": "Open Targets Data Team", - "retries": 0, -} - -shared_dag_kwargs = { - "tags": ["genetics_etl", "experimental"], - "start_date": pendulum.now(tz="Europe/London").subtract(days=1), - "schedule": "@once", - "catchup": False, -} - -MACHINES = { - "VEPMACHINE": { - "machine_type": "e2-standard-4", - "cpu_milli": 2000, - "memory_mib": 2000, - "boot_disk_mib": 10000, - }, -} - - -def check_gcp_folder_exists(bucket_name: str, folder_path: str) -> bool: - """Check if a folder exists in a Google Cloud bucket. - - Args: - bucket_name (str): The name of the Google Cloud bucket. - folder_path (str): The path of the folder to check. - - Returns: - bool: True if the folder exists, False otherwise. - """ - client = storage.Client() - bucket = client.get_bucket(bucket_name) - blobs = bucket.list_blobs(prefix=folder_path) - return any(blobs) - - -def create_cluster( - cluster_name: str, - master_machine_type: str = "n1-highmem-16", - worker_machine_type: str = "n1-standard-16", - num_workers: int = 2, - num_preemptible_workers: int = 0, - num_local_ssds: int = 1, - autoscaling_policy: str = GCP_AUTOSCALING_POLICY, - master_disk_size: int = 500, -) -> DataprocCreateClusterOperator: - """Generate an Airflow task to create a Dataproc cluster. Common parameters are reused, and varying parameters can be specified as needed. - - Args: - cluster_name (str): Name of the cluster. - master_machine_type (str): Machine type for the master node. Defaults to "n1-highmem-8". - worker_machine_type (str): Machine type for the worker nodes. Defaults to "n1-standard-16". - num_workers (int): Number of worker nodes. Defaults to 2. - num_preemptible_workers (int): Number of preemptible worker nodes. Defaults to 0. - num_local_ssds (int): How many local SSDs to attach to each worker node, both primary and secondary. Defaults to 1. - autoscaling_policy (str): Name of the autoscaling policy to use. Defaults to GCP_AUTOSCALING_POLICY. - master_disk_size (int): Size of the master node's boot disk in GB. Defaults to 500. - - Returns: - DataprocCreateClusterOperator: Airflow task to create a Dataproc cluster. - """ - # Create base cluster configuration. - cluster_config = ClusterGenerator( - project_id=GCP_PROJECT, - zone=GCP_ZONE, - master_machine_type=master_machine_type, - worker_machine_type=worker_machine_type, - master_disk_size=master_disk_size, - worker_disk_size=500, - num_preemptible_workers=num_preemptible_workers, - num_workers=num_workers, - image_version=GCP_DATAPROC_IMAGE, - enable_component_gateway=True, - optional_components=["JUPYTER"], - init_actions_uris=INITIALISATION_EXECUTABLE_FILE, - metadata={ - "CONFIGTAR": CONFIG_TAG, - "PACKAGE": PACKAGE_WHEEL, - }, - idle_delete_ttl=30 * 60, # In seconds. - autoscaling_policy=f"projects/{GCP_PROJECT}/regions/{GCP_REGION}/autoscalingPolicies/{autoscaling_policy}", - ).make() - - # If specified, amend the configuration to include local SSDs for worker nodes. - if num_local_ssds: - for worker_section in ("worker_config", "secondary_worker_config"): - # Create a disk config section if it does not exist. - cluster_config[worker_section].setdefault("disk_config", {}) - # Specify the number of local SSDs. - cluster_config[worker_section]["disk_config"]["num_local_ssds"] = ( - num_local_ssds - ) - - # Return the cluster creation operator. - return DataprocCreateClusterOperator( - task_id="create_cluster", - project_id=GCP_PROJECT, - cluster_config=cluster_config, - region=GCP_REGION, - cluster_name=cluster_name, - trigger_rule=TriggerRule.ALL_SUCCESS, - ) - - -def submit_job( - cluster_name: str, - task_id: str, - job_type: str, - job_specification: dict[str, Any], - trigger_rule: TriggerRule = TriggerRule.ALL_SUCCESS, -) -> DataprocSubmitJobOperator: - """Submit an arbitrary job to a Dataproc cluster. - - Args: - cluster_name (str): Name of the cluster. - task_id (str): Name of the task. - job_type (str): Type of the job to submit. - job_specification (dict[str, Any]): Specification of the job to submit. - trigger_rule (TriggerRule): Trigger rule for the task. Defaults to TriggerRule.ALL_SUCCESS. - - Returns: - DataprocSubmitJobOperator: Airflow task to submit an arbitrary job to a Dataproc cluster. - """ - return DataprocSubmitJobOperator( - task_id=task_id, - region=GCP_REGION, - project_id=GCP_PROJECT, - job={ - "job_uuid": f"airflow-{task_id}", - "reference": {"project_id": GCP_PROJECT}, - "placement": {"cluster_name": cluster_name}, - job_type: job_specification, - }, - trigger_rule=trigger_rule, - ) - - -def submit_pyspark_job( - cluster_name: str, - task_id: str, - python_module_path: str, - args: list[str], - trigger_rule: TriggerRule = TriggerRule.ALL_SUCCESS, -) -> DataprocSubmitJobOperator: - """Submit a PySpark job to a Dataproc cluster. - - Args: - cluster_name (str): Name of the cluster. - task_id (str): Name of the task. - python_module_path (str): Path to the Python module to run. - args (list[str]): Arguments to pass to the Python module. - trigger_rule (TriggerRule): Trigger rule for the task. Defaults to TriggerRule.ALL_SUCCESS. - - Returns: - DataprocSubmitJobOperator: Airflow task to submit a PySpark job to a Dataproc cluster. - """ - return submit_job( - cluster_name=cluster_name, - task_id=task_id, - job_type="pyspark_job", - trigger_rule=trigger_rule, - job_specification={ - "main_python_file_uri": python_module_path, - "args": args, - "properties": { - "spark.jars": "/opt/conda/miniconda3/lib/python3.10/site-packages/hail/backend/hail-all-spark.jar", - "spark.driver.extraClassPath": "/opt/conda/miniconda3/lib/python3.10/site-packages/hail/backend/hail-all-spark.jar", - "spark.executor.extraClassPath": "./hail-all-spark.jar", - "spark.serializer": "org.apache.spark.serializer.KryoSerializer", - "spark.kryo.registrator": "is.hail.kryo.HailKryoRegistrator", - }, - }, - ) - - -def submit_step( - cluster_name: str, - step_id: str, - task_id: str = "", - trigger_rule: TriggerRule = TriggerRule.ALL_SUCCESS, - other_args: Optional[list[str]] = None, -) -> DataprocSubmitJobOperator: - """Submit a PySpark job to execute a specific CLI step. - - Args: - cluster_name (str): Name of the cluster. - step_id (str): Name of the step in gentropy. - task_id (str): Name of the task. Defaults to step_id. - trigger_rule (TriggerRule): Trigger rule for the task. Defaults to TriggerRule.ALL_SUCCESS. - other_args (Optional[list[str]]): Other arguments to pass to the CLI step. Defaults to None. - - Returns: - DataprocSubmitJobOperator: Airflow task to submit a PySpark job to execute a specific CLI step. - """ - if task_id == "": - task_id = step_id - return submit_pyspark_job( - cluster_name=cluster_name, - task_id=task_id, - python_module_path=f"{INITIALISATION_BASE_PATH}/{PYTHON_CLI}", - trigger_rule=trigger_rule, - args=[f"step={step_id}"] - + (other_args if other_args is not None else []) - + [ - f"--config-dir={CLUSTER_CONFIG_DIR}", - f"--config-name={CONFIG_NAME}", - ], - ) - - -def install_dependencies(cluster_name: str) -> DataprocSubmitJobOperator: - """Install dependencies on a Dataproc cluster. - - Args: - cluster_name (str): Name of the cluster. - - Returns: - DataprocSubmitJobOperator: Airflow task to install dependencies on a Dataproc cluster. - """ - return submit_job( - cluster_name=cluster_name, - task_id="install_dependencies", - job_type="pig_job", - job_specification={ - "jar_file_uris": [ - f"gs://genetics_etl_python_playground/initialisation/{GENTROPY_VERSION}/install_dependencies_on_cluster.sh" - ], - "query_list": { - "queries": [ - "sh chmod 750 ${PWD}/install_dependencies_on_cluster.sh", - "sh ${PWD}/install_dependencies_on_cluster.sh", - ] - }, - }, - ) - - -def delete_cluster(cluster_name: str) -> DataprocDeleteClusterOperator: - """Generate an Airflow task to delete a Dataproc cluster. - - Args: - cluster_name (str): Name of the cluster. - - Returns: - DataprocDeleteClusterOperator: Airflow task to delete a Dataproc cluster. - """ - return DataprocDeleteClusterOperator( - task_id="delete_cluster", - project_id=GCP_PROJECT, - cluster_name=cluster_name, - region=GCP_REGION, - trigger_rule=TriggerRule.ALL_DONE, - ) - - -def read_yaml_config(config_path: Path) -> Any: - """Parse a YAMl config file and do all necessary checks. - - Args: - config_path (Path): Path to the YAML config file. - - Returns: - Any: Parsed YAML config file. - """ - assert config_path.exists(), f"YAML config path {config_path} does not exist." - with open(config_path) as config_file: - return yaml.safe_load(config_file) - - -def generate_dag(cluster_name: str, tasks: list[DataprocSubmitJobOperator]) -> Any: - """For a list of tasks, generate a complete DAG. - - Args: - cluster_name (str): Name of the cluster. - tasks (list[DataprocSubmitJobOperator]): List of tasks to execute. - - Returns: - Any: Airflow DAG. - """ - return ( - create_cluster(cluster_name) - >> install_dependencies(cluster_name) - >> tasks - >> delete_cluster(cluster_name) - ) - - -def submit_pyspark_job_no_operator( - cluster_name: str, - step_id: str, - other_args: Optional[list[str]] = None, -) -> None: - """Submits the Pyspark job to the cluster. - - Args: - cluster_name (str): Cluster name - step_id (str): Step id - other_args (Optional[list[str]]): Other arguments to pass to the CLI step. Defaults to None. - """ - # Create the job client. - job_client = dataproc_v1.JobControllerClient( - client_options={"api_endpoint": f"{GCP_REGION}-dataproc.googleapis.com:443"} - ) - - python_uri = f"{INITIALISATION_BASE_PATH}/{PYTHON_CLI}" - # Create the job config. 'main_jar_file_uri' can also be a - # Google Cloud Storage URL. - job_description = { - "placement": {"cluster_name": cluster_name}, - "pyspark_job": { - "main_python_file_uri": python_uri, - "args": [f"step={step_id}"] - + (other_args if other_args is not None else []) - + [ - f"--config-dir={CLUSTER_CONFIG_DIR}", - f"--config-name={CONFIG_NAME}", - ], - "properties": { - "spark.jars": "/opt/conda/miniconda3/lib/python3.10/site-packages/hail/backend/hail-all-spark.jar", - "spark.driver.extraClassPath": "/opt/conda/miniconda3/lib/python3.10/site-packages/hail/backend/hail-all-spark.jar", - "spark.executor.extraClassPath": "./hail-all-spark.jar", - "spark.serializer": "org.apache.spark.serializer.KryoSerializer", - "spark.kryo.registrator": "is.hail.kryo.HailKryoRegistrator", - }, - }, - } - job_client.submit_job( - project_id=GCP_PROJECT, region=GCP_REGION, job=job_description - ) - - -def create_container_runnable( - image: str, commands: list[str], **kwargs: Any -) -> batch_v1.Runnable: - """Create a container runnable for a Batch job with additional optional parameters. - - Args: - image (str): The Docker image to use. - commands (list[str]): The commands to run in the container. - **kwargs (Any): Additional optional parameters to set on the container. - - Returns: - batch_v1.Runnable: The container runnable. - """ - container = batch_v1.Runnable.Container( - image_uri=image, entrypoint="/bin/sh", commands=commands, **kwargs - ) - return batch_v1.Runnable(container=container) - - -def create_task_spec( - image: str, commands: list[str], **kwargs: Any -) -> batch_v1.TaskSpec: - """Create a task for a Batch job. - - Args: - image (str): The Docker image to use. - commands (list[str]): The commands to run in the container. - **kwargs (Any): Any additional parameter to pass to the container runnable - - Returns: - batch_v1.TaskSpec: The task specification. - """ - task = batch_v1.TaskSpec() - task.runnables = [create_container_runnable(image, commands, **kwargs)] - return task - - -def set_up_mounting_points( - mounting_points: list[dict[str, str]], -) -> list[batch_v1.Volume]: - """Set up the mounting points for the container. - - Args: - mounting_points (list[dict[str, str]]): The mounting points. - - Returns: - list[batch_v1.Volume]: The volumes. - """ - volumes = [] - for mount in mounting_points: - gcs_bucket = batch_v1.GCS() - gcs_bucket.remote_path = mount["remote_path"] - gcs_volume = batch_v1.Volume() - gcs_volume.gcs = gcs_bucket - gcs_volume.mount_path = mount["mount_point"] - volumes.append(gcs_volume) - return volumes - - -def create_batch_job( - task: batch_v1.TaskSpec, - machine: str, - task_env: list[batch_v1.Environment], - mounting_points: list[dict[str, str]] | None = None, -) -> batch_v1.Job: - """Create a Google Batch job. - - Args: - task (batch_v1.TaskSpec): The task specification. - machine (str): The machine type to use. - task_env (list[batch_v1.Environment]): The environment variables for the task. - mounting_points (list[dict[str, str]] | None): List of mounting points. - - Returns: - batch_v1.Job: The Batch job. - """ - resources = batch_v1.ComputeResource() - resources.cpu_milli = MACHINES[machine]["cpu_milli"] - resources.memory_mib = MACHINES[machine]["memory_mib"] - resources.boot_disk_mib = MACHINES[machine]["boot_disk_mib"] - task.compute_resource = resources - - task.max_retry_count = 3 - task.max_run_duration = "43200s" - - # The mounting points are set up and assigned to the task: - task.volumes = set_up_mounting_points(mounting_points) if mounting_points else None - - group = batch_v1.TaskGroup() - group.task_spec = task - group.task_environments = task_env - - policy = batch_v1.AllocationPolicy.InstancePolicy() - policy.machine_type = MACHINES[machine]["machine_type"] - policy.provisioning_model = "SPOT" - - instances = batch_v1.AllocationPolicy.InstancePolicyOrTemplate() - instances.policy = policy - allocation_policy = batch_v1.AllocationPolicy() - allocation_policy.instances = [instances] - - job = batch_v1.Job() - job.task_groups = [group] - job.allocation_policy = allocation_policy - job.logs_policy = batch_v1.LogsPolicy() - job.logs_policy.destination = batch_v1.LogsPolicy.Destination.CLOUD_LOGGING - - return job diff --git a/src/airflow/dags/configs/dag.yaml b/src/airflow/dags/configs/dag.yaml deleted file mode 100644 index 24d185c1e..000000000 --- a/src/airflow/dags/configs/dag.yaml +++ /dev/null @@ -1,17 +0,0 @@ -- id: "ot_gene_index" -- id: "ot_variant_to_gene" - prerequisites: - - "ot_gene_index" -- id: "ot_colocalisation_ecaviar" -- id: "ot_colocalisation_coloc" -- id: "ot_locus_to_gene_train" - prerequisites: - - "ot_variant_to_gene" - - "ot_colocalisation_ecaviar" - - "ot_colocalisation_coloc" -- id: "ot_locus_to_gene_predict" - prerequisites: - - "ot_locus_to_gene_train" - - "ot_variant_to_gene" - - "ot_colocalisation_ecaviar" - - "ot_colocalisation_coloc" diff --git a/src/airflow/dags/configs/variant_sources.yaml b/src/airflow/dags/configs/variant_sources.yaml deleted file mode 100644 index 233eb0ccf..000000000 --- a/src/airflow/dags/configs/variant_sources.yaml +++ /dev/null @@ -1,13 +0,0 @@ -sources_inclusion_list: - - name: uniprot - location: gs://open-targets-pre-data-releases/24.09/input/evidence-files/uniprot.json.gz ## input - format: json - - name: clinvar - location: gs://open-targets-pre-data-releases/24.09/input/evidence-files/eva.json.gz - format: json - - name: pharmgkb - location: gs://open-targets-pre-data-releases/24.09/input/pharmacogenomics-inputs/pharmacogenomics.json.gz - format: json - - name: gentropy_credible_sets - location: gs://genetics_etl_python_playground/releases/24.06/credible_set - format: parquet diff --git a/src/airflow/dags/data_validation.py b/src/airflow/dags/data_validation.py deleted file mode 100644 index 875a169dc..000000000 --- a/src/airflow/dags/data_validation.py +++ /dev/null @@ -1,96 +0,0 @@ -"""DAG to validate study locus and study index datasets.""" - -from __future__ import annotations - -from pathlib import Path - -import common_airflow as common - -from airflow.models.dag import DAG - -CLUSTER_NAME = "otg-validation" - -# Input datasets: -STUDY_INDICES = [ - "gs://gwas_catalog_data/study_index", - "gs://eqtl_catalogue_data/study_index", - "gs://finngen_data/r10/study_index", -] -STUDY_LOCI = [ - "gs://gwas_catalog_data/credible_set_datasets/gwas_catalog_PICSed_curated_associations", - "gs://gwas_catalog_data/credible_set_datasets/gwas_catalog_PICSed_summary_statistics", - "gs://eqtl_catalogue_data/credible_set_datasets/susie", - "gs://finngen_data/r10/credible_set_datasets/finngen_susie_processed", -] -TARGET_INDEX = "gs://genetics_etl_python_playground/releases/24.06/gene_index" -DISEASE_INDEX = "gs://open-targets-pre-data-releases/24.06/output/etl/parquet/diseases" - -# Output datasets: -VALIDATED_STUDY = "gs://ot-team/dsuveges/otg-data/validated_study_index" -INVALID_STUDY = f"{VALIDATED_STUDY}_invalid" -INVALID_STUDY_QC = [ - "UNRESOLVED_TARGET", - "UNRESOLVED_DISEASE", - "UNKNOWN_STUDY_TYPE", - "DUPLICATED_STUDY", - "NO_GENE_PROVIDED", -] - -VALIDATED_STUDY_LOCI = "gs://ot-team/dsuveges/otg-data/validated_credible_set" -INVALID_STUDY_LOCI = f"{VALIDATED_STUDY_LOCI}_invalid" -INVALID_STUDY_LOCUS_QC = [ - "DUPLICATED_STUDYLOCUS_ID", - "AMBIGUOUS_STUDY", - "FAILED_STUDY", - "MISSING_STUDY", - "NO_GENOMIC_LOCATION_FLAG", - "COMPOSITE_FLAG", - "INCONSISTENCY_FLAG", - "PALINDROMIC_ALLELE_FLAG", -] - -with DAG( - dag_id=Path(__file__).stem, - description="Open Targets Genetics — Study locus and study index validation", - default_args=common.shared_dag_args, - **common.shared_dag_kwargs, -) as dag: - # Definition of the study index validation step: - validate_studies = common.submit_step( - cluster_name=CLUSTER_NAME, - step_id="study_validation", - task_id="study_validation", - other_args=[ - f"step.study_index_path={STUDY_INDICES}", - f"step.target_index_path={TARGET_INDEX}", - f"step.disease_index_path={DISEASE_INDEX}", - f"step.valid_study_index_path={VALIDATED_STUDY}", - f"step.invalid_study_index_path={INVALID_STUDY_LOCI}", - f"step.invalid_qc_reasons={INVALID_STUDY_QC}", - ], - ) - - # Definition of the study locus validation step: - validate_study_loci = common.submit_step( - cluster_name=CLUSTER_NAME, - step_id="credible_set_validation", - task_id="credible_set_validation", - other_args=[ - f"step.study_index_path={VALIDATED_STUDY}", - f"step.study_locus_path={STUDY_LOCI}", - f"step.valid_study_locus_path={VALIDATED_STUDY_LOCI}", - f"step.invalid_study_locus_path={INVALID_STUDY_LOCI}", - f"step.invalid_qc_reasons={INVALID_STUDY_LOCUS_QC}", - ], - ) - - ( - common.create_cluster( - CLUSTER_NAME, - master_machine_type="n1-highmem-32", - ) - >> common.install_dependencies(CLUSTER_NAME) - >> validate_studies - >> validate_study_loci - # >> common.delete_cluster(CLUSTER_NAME) - ) diff --git a/src/airflow/dags/eqtl_preprocess.py b/src/airflow/dags/eqtl_preprocess.py deleted file mode 100644 index 309604e09..000000000 --- a/src/airflow/dags/eqtl_preprocess.py +++ /dev/null @@ -1,73 +0,0 @@ -"""Airflow DAG to extract credible sets and a study index from eQTL Catalogue's finemapping results.""" - -from __future__ import annotations - -from pathlib import Path - -import common_airflow as common - -from airflow.models.dag import DAG -from airflow.providers.google.cloud.operators.dataflow import ( - DataflowTemplatedJobStartOperator, -) -from airflow.providers.google.cloud.operators.gcs import GCSDeleteObjectsOperator - -CLUSTER_NAME = "otg-preprocess-eqtl" -AUTOSCALING = "eqtl-preprocess" -PROJECT_ID = "open-targets-genetics-dev" - -EQTL_CATALOGUE_SUSIE_LOCATION = "gs://eqtl_catalogue_data/ebi_ftp/susie" -TEMP_DECOMPRESS_LOCATION = f"{EQTL_CATALOGUE_SUSIE_LOCATION}_decompressed_tmp" -DECOMPRESS_FAILED_LOG = f"{TEMP_DECOMPRESS_LOCATION}/logs.log" -STUDY_INDEX_PATH = "gs://eqtl_catalogue_data/study_index" -CREDIBLE_SET_PATH = "gs://eqtl_catalogue_data/credible_set_datasets/susie" - -with DAG( - dag_id=Path(__file__).stem, - description="Open Targets Genetics — eQTL preprocess", - default_args=common.shared_dag_args, - **common.shared_dag_kwargs, -): - # SuSIE fine mapping results are stored as gzipped files in a GCS bucket. - # To improve processing performance, we decompress the files before processing to a temporary location in GCS. - decompression_job = DataflowTemplatedJobStartOperator( - task_id="decompress_susie_outputs", - template="gs://dataflow-templates/latest/Bulk_Decompress_GCS_Files", - location="europe-west1", - project_id=PROJECT_ID, - parameters={ - "inputFilePattern": f"{EQTL_CATALOGUE_SUSIE_LOCATION}/**/*.gz", - "outputDirectory": TEMP_DECOMPRESS_LOCATION, - "outputFailureFile": DECOMPRESS_FAILED_LOG, - }, - ) - - ingestion_job = common.submit_step( - cluster_name=CLUSTER_NAME, - step_id="ot_eqtl_catalogue", - task_id="ot_eqtl_ingestion", - other_args=[ - f"step.eqtl_catalogue_paths_imported={TEMP_DECOMPRESS_LOCATION}", - f"step.eqtl_catalogue_study_index_out={STUDY_INDEX_PATH}", - f"step.eqtl_catalogue_credible_sets_out={CREDIBLE_SET_PATH}", - ], - ) - - delete_decompressed_job = GCSDeleteObjectsOperator( - task_id="delete_decompressed_files", - bucket_name=TEMP_DECOMPRESS_LOCATION.split("/")[2], - prefix=f"{TEMP_DECOMPRESS_LOCATION.split('/')[-1]}/", - ) - - ( - decompression_job - >> common.create_cluster( - CLUSTER_NAME, - autoscaling_policy=AUTOSCALING, - num_workers=4, - worker_machine_type="n1-highmem-8", - ) - >> common.install_dependencies(CLUSTER_NAME) - >> ingestion_job - >> [delete_decompressed_job, common.delete_cluster(CLUSTER_NAME)] - ) diff --git a/src/airflow/dags/genetics_etl.py b/src/airflow/dags/genetics_etl.py deleted file mode 100644 index aeb87398c..000000000 --- a/src/airflow/dags/genetics_etl.py +++ /dev/null @@ -1,154 +0,0 @@ -"""Test DAG to prototype data transfer.""" - -from __future__ import annotations - -from pathlib import Path - -import common_airflow as common - -from airflow.models.dag import DAG -from airflow.operators.python import ShortCircuitOperator -from airflow.providers.google.cloud.transfers.gcs_to_gcs import GCSToGCSOperator -from airflow.utils.task_group import TaskGroup - -CLUSTER_NAME = "otg-etl" -SOURCE_CONFIG_FILE_PATH = Path(__file__).parent / "configs" / "dag.yaml" - -# Release specific variables: -RELEASE_VERSION = "24.06" -RELEASE_BUCKET_NAME = "genetics_etl_python_playground" - -# Datasource paths: -GWAS_CATALOG_BUCKET_NAME = "gwas_catalog_data" -EQTL_BUCKET_NAME = "eqtl_catalogue_data" -FINNGEN_BUCKET_NAME = "finngen_data" -FINNGEN_RELEASE = "r10" - -# Files to move: -DATA_TO_MOVE = { - # GWAS Catalog summary study index: - "gwas_catalog_study_index": { - "source_bucket": GWAS_CATALOG_BUCKET_NAME, - "source_object": "study_index", - "destination_bucket": RELEASE_BUCKET_NAME, - "destination_object": f"releases/{RELEASE_VERSION}/study_index/gwas_catalog", - }, - # PICS credible sets from GWAS Catalog curated associations: - "gwas_catalog_curated_credible_set": { - "source_bucket": GWAS_CATALOG_BUCKET_NAME, - "source_object": "credible_set_datasets/gwas_catalog_PICSed_curated_associations", - "destination_bucket": RELEASE_BUCKET_NAME, - "destination_object": f"releases/{RELEASE_VERSION}/credible_set/gwas_catalog_PICSed_curated_associations", - }, - # PICS credible sets from GWAS Catalog summary statistics: - "gwas_catalog_sumstats_credible_set": { - "source_bucket": GWAS_CATALOG_BUCKET_NAME, - "source_object": "credible_set_datasets/gwas_catalog_PICSed_summary_statistics", - "destination_bucket": RELEASE_BUCKET_NAME, - "destination_object": f"releases/{RELEASE_VERSION}/credible_set/gwas_catalog_PICSed_summary_statistics", - }, - # GWAS Catalog manifest files: - "gwas_catalog_manifests": { - "source_bucket": GWAS_CATALOG_BUCKET_NAME, - "source_object": "manifests", - "destination_bucket": RELEASE_BUCKET_NAME, - "destination_object": f"releases/{RELEASE_VERSION}/manifests", - }, - # eQTL Catalog study index: - "eqtl_catalogue_study_index": { - "source_bucket": EQTL_BUCKET_NAME, - "source_object": "study_index", - "destination_bucket": RELEASE_BUCKET_NAME, - "destination_object": f"releases/{RELEASE_VERSION}/study_index/eqtl_catalogue", - }, - # eQTL Catalog SuSiE credible sets: - "eqtl_catalogue_susie_credible_set": { - "source_bucket": EQTL_BUCKET_NAME, - "source_object": "credible_set_datasets/susie", - "destination_bucket": RELEASE_BUCKET_NAME, - "destination_object": f"releases/{RELEASE_VERSION}/credible_set/eqtl_catalogue_susie", - }, - # Finngen study index: - "finngen_study_index": { - "source_bucket": FINNGEN_BUCKET_NAME, - "source_object": f"{FINNGEN_RELEASE}/study_index", - "destination_bucket": RELEASE_BUCKET_NAME, - "destination_object": f"releases/{RELEASE_VERSION}/study_index/finngen", - }, - # Finngen SuSiE credible sets: - "finngen_susie_credible_set": { - "source_bucket": FINNGEN_BUCKET_NAME, - "source_object": f"{FINNGEN_RELEASE}/credible_set_datasets/finngen_susie_processed", - "destination_bucket": RELEASE_BUCKET_NAME, - "destination_object": f"releases/{RELEASE_VERSION}/credible_set/finngen_susie", - }, - # L2G gold standard: - "gold_standard": { - "source_bucket": "genetics_etl_python_playground", - "source_object": "input/l2g/gold_standard/curation.json", - "destination_bucket": RELEASE_BUCKET_NAME, - "destination_object": f"releases/{RELEASE_VERSION}/locus_to_gene_gold_standard.json", - }, -} - - -# This operator meant to fail the DAG if the release folder exists: -ensure_release_folder_not_exists = ShortCircuitOperator( - task_id="test_release_folder_exists", - python_callable=lambda bucket, path: not common.check_gcp_folder_exists( - bucket, path - ), - op_kwargs={ - "bucket": RELEASE_BUCKET_NAME, - "path": f"releases/{RELEASE_VERSION}", - }, -) - -with DAG( - dag_id=Path(__file__).stem, - description="Open Targets Genetics ETL workflow", - default_args=common.shared_dag_args, - **common.shared_dag_kwargs, -): - # Compiling tasks for moving data to the right place: - with TaskGroup(group_id="data_transfer") as data_transfer: - # Defining the tasks to execute in the task group: - [ - GCSToGCSOperator( - task_id=f"move_{data_name}", - source_bucket=data["source_bucket"], - source_object=data["source_object"], - destination_bucket=data["destination_bucket"], - destination_object=data["destination_object"], - ) - for data_name, data in DATA_TO_MOVE.items() - ] - - with TaskGroup(group_id="genetics_etl") as genetics_etl: - # Parse and define all steps and their prerequisites. - tasks = {} - steps = common.read_yaml_config(SOURCE_CONFIG_FILE_PATH) - for step in steps: - # Define task for the current step. - step_id = step["id"] - this_task = common.submit_step( - cluster_name=CLUSTER_NAME, - step_id=step_id, - task_id=step_id, - ) - # Chain prerequisites. - tasks[step_id] = this_task - for prerequisite in step.get("prerequisites", []): - this_task.set_upstream(tasks[prerequisite]) - - common.generate_dag(cluster_name=CLUSTER_NAME, tasks=list(tasks.values())) - - # DAG description: - ( - # Test that the release folder doesn't exist: - ensure_release_folder_not_exists - # Run data transfer: - >> data_transfer - # Once datasets are transferred, run the rest of the steps: - >> genetics_etl - ) diff --git a/src/airflow/dags/gnomad_preprocess.py b/src/airflow/dags/gnomad_preprocess.py deleted file mode 100644 index 54e6b6bf4..000000000 --- a/src/airflow/dags/gnomad_preprocess.py +++ /dev/null @@ -1,29 +0,0 @@ -"""Airflow DAG for the Preprocess GnomAD datasets - LD index and GnomAD variant set.""" - -from __future__ import annotations - -from pathlib import Path - -import common_airflow as common - -from airflow.models.dag import DAG - -CLUSTER_NAME = "gnomad-preprocess" - -ALL_STEPS = [ - "ot_ld_index", - "ot_gnomad_variants", -] - - -with DAG( - dag_id=Path(__file__).stem, - description="Open Targets Genetics — GnomAD Preprocess", - default_args=common.shared_dag_args, - **common.shared_dag_kwargs, -): - all_tasks = [ - common.submit_step(cluster_name=CLUSTER_NAME, step_id=step, task_id=step) - for step in ALL_STEPS - ] - dag = common.generate_dag(cluster_name=CLUSTER_NAME, tasks=all_tasks) diff --git a/src/airflow/dags/gwas_catalog_harmonisation.py b/src/airflow/dags/gwas_catalog_harmonisation.py deleted file mode 100644 index e6399e957..000000000 --- a/src/airflow/dags/gwas_catalog_harmonisation.py +++ /dev/null @@ -1,125 +0,0 @@ -"""Airflow DAG for the harmonisation part of the pipeline.""" - -from __future__ import annotations - -import re -import time -from pathlib import Path -from typing import Any - -import common_airflow as common - -from airflow.decorators import task -from airflow.models.dag import DAG -from airflow.providers.google.cloud.operators.gcs import GCSListObjectsOperator - -CLUSTER_NAME = "otg-gwascatalog-harmonisation" -AUTOSCALING = "gwascatalog-harmonisation" - -SUMMARY_STATS_BUCKET_NAME = "gwas_catalog_data" -RAW_SUMMARY_STATISTICS_PREFIX = "raw_summary_statistics" -HARMONISED_SUMMARY_STATISTICS_PREFIX = "harmonised_summary_statistics" - -with DAG( - dag_id=Path(__file__).stem, - description="Open Targets Genetics — GWAS Catalog harmonisation", - default_args=common.shared_dag_args, - **common.shared_dag_kwargs, -): - # List raw harmonised files from GWAS Catalog - list_inputs = GCSListObjectsOperator( - task_id="list_raw_harmonised", - bucket=SUMMARY_STATS_BUCKET_NAME, - prefix=RAW_SUMMARY_STATISTICS_PREFIX, - match_glob="**/*.h.tsv.gz", - ) - # List parquet files that have been previously processed - list_outputs = GCSListObjectsOperator( - task_id="list_harmonised_parquet", - bucket=SUMMARY_STATS_BUCKET_NAME, - prefix=HARMONISED_SUMMARY_STATISTICS_PREFIX, - match_glob="**/_SUCCESS", - ) - - # Create list of pending jobs - @task(task_id="create_to_do_list") - def create_to_do_list(**kwargs: Any) -> Any: - """Create the to-do list of studies. - - Args: - **kwargs (Any): Keyword arguments. - - Returns: - Any: To-do list. - """ - ti = kwargs["ti"] - raw_harmonised = ti.xcom_pull( - task_ids="list_raw_harmonised", key="return_value" - ) - print("Number of raw harmonised files: ", len(raw_harmonised)) # noqa: T201 - to_do_list = [] - # Remove the ones that have been processed - parquets = ti.xcom_pull(task_ids="list_harmonised_parquet", key="return_value") - print("Number of parquet files: ", len(parquets)) # noqa: T201 - for path in raw_harmonised: - match_result = re.search( - rf"{RAW_SUMMARY_STATISTICS_PREFIX}/(.*)/(GCST\d+)/harmonised/(.*)\.h\.tsv\.gz", - path, - ) - if match_result: - study_id = match_result.group(2) - if ( - f"{HARMONISED_SUMMARY_STATISTICS_PREFIX}/{study_id}.parquet/_SUCCESS" - not in parquets - ): - to_do_list.append(path) - print("Number of jobs to submit: ", len(to_do_list)) # noqa: T201 - ti.xcom_push(key="to_do_list", value=to_do_list) - - # Submit jobs to dataproc - @task(task_id="submit_jobs") - def submit_jobs(**kwargs: Any) -> None: - """Submit jobs to dataproc. - - Args: - **kwargs (Any): Keyword arguments. - """ - ti = kwargs["ti"] - todo = ti.xcom_pull(task_ids="create_to_do_list", key="to_do_list") - print("Number of jobs to submit: ", len(todo)) # noqa: T201 - for i in range(len(todo)): - # Not to exceed default quota 400 jobs per minute - if i > 0 and i % 399 == 0: - time.sleep(60) - input_path = todo[i] - match_result = re.search( - rf"{RAW_SUMMARY_STATISTICS_PREFIX}/(.*)/(GCST\d+)/harmonised/(.*)\.h\.tsv\.gz", - input_path, - ) - if match_result: - study_id = match_result.group(2) - print("Submitting job for study: ", study_id) # noqa: T201 - common.submit_pyspark_job_no_operator( - cluster_name=CLUSTER_NAME, - step_id="gwas_catalog_sumstat_preprocess", - other_args=[ - f"step.raw_sumstats_path=gs://{SUMMARY_STATS_BUCKET_NAME}/{input_path}", - f"step.out_sumstats_path=gs://{SUMMARY_STATS_BUCKET_NAME}/{HARMONISED_SUMMARY_STATISTICS_PREFIX}/{study_id}.parquet", - ], - ) - - ( - [list_inputs, list_outputs] - >> create_to_do_list() - >> common.create_cluster( - CLUSTER_NAME, - autoscaling_policy=AUTOSCALING, - num_workers=8, - num_preemptible_workers=8, - master_machine_type="n1-highmem-64", - worker_machine_type="n1-standard-2", - ) - >> common.install_dependencies(CLUSTER_NAME) - >> submit_jobs() - # >> common.delete_cluster(CLUSTER_NAME) - ) diff --git a/src/airflow/dags/gwas_catalog_preprocess.py b/src/airflow/dags/gwas_catalog_preprocess.py deleted file mode 100644 index 7f6280242..000000000 --- a/src/airflow/dags/gwas_catalog_preprocess.py +++ /dev/null @@ -1,223 +0,0 @@ -"""Airflow DAG for the preprocessing of GWAS Catalog's harmonised summary statistics and curated associations.""" - -from __future__ import annotations - -from pathlib import Path - -import common_airflow as common - -from airflow.models.dag import DAG -from airflow.operators.python import PythonOperator -from airflow.providers.google.cloud.hooks.gcs import GCSHook -from airflow.providers.google.cloud.operators.gcs import GCSListObjectsOperator -from airflow.utils.task_group import TaskGroup - -CLUSTER_NAME = "otg-preprocess-gwascatalog" -AUTOSCALING = "otg-preprocess-gwascatalog" - -# Setting up bucket name and output object names: -GWAS_CATALOG_BUCKET_NAME = "gwas_catalog_data" -HARMONISED_SUMSTATS_PREFIX = "harmonised_summary_statistics" - -# Manifest paths: -MANIFESTS_PATH = f"gs://{GWAS_CATALOG_BUCKET_NAME}/manifests/" - -# The name of the manifest files have to be consistent with the config file: -HARMONISED_SUMSTATS_LIST_OBJECT_NAME = ( - "manifests/gwas_catalog_harmonised_summary_statistics_list.txt" -) -HARMONISED_SUMSTATS_LIST_FULL_NAME = ( - f"gs://{GWAS_CATALOG_BUCKET_NAME}/{HARMONISED_SUMSTATS_LIST_OBJECT_NAME}" -) -CURATION_INCLUSION_NAME = f"{MANIFESTS_PATH}/gwas_catalog_curation_included_studies" -CURATION_EXCLUSION_NAME = f"{MANIFESTS_PATH}/gwas_catalog_curation_excluded_studies" -SUMMARY_STATISTICS_INCLUSION_NAME = ( - f"{MANIFESTS_PATH}/gwas_catalog_summary_statistics_included_studies" -) -SUMMARY_STATISTICS_EXCLUSION_NAME = ( - f"{MANIFESTS_PATH}/gwas_catalog_summary_statistics_excluded_studies" -) - -# Study index: -STUDY_INDEX = f"gs://{GWAS_CATALOG_BUCKET_NAME}/study_index" - -# Study loci: -CURATED_STUDY_LOCI = f"gs://{GWAS_CATALOG_BUCKET_NAME}/study_locus_datasets/gwas_catalog_curated_associations" -CURATED_LD_CLUMPED = f"gs://{GWAS_CATALOG_BUCKET_NAME}/study_locus_datasets/gwas_catalog_curated_associations_ld_clumped" -WINDOW_BASED_CLUMPED = f"gs://{GWAS_CATALOG_BUCKET_NAME}/study_locus_datasets/gwas_catalog_summary_stats_window_clumped" -LD_BASED_CLUMPED = f"gs://{GWAS_CATALOG_BUCKET_NAME}/study_locus_datasets/gwas_catalog_summary_stats_ld_clumped" -# Credible sets: -CURATED_CREDIBLE_SETS = f"gs://{GWAS_CATALOG_BUCKET_NAME}/credible_set_datasets/gwas_catalog_PICSed_curated_associations" -SUMMARY_STATISTICS_CREDIBLE_SETS = f"gs://{GWAS_CATALOG_BUCKET_NAME}/credible_set_datasets/gwas_catalog_PICSed_summary_statistics" - - -def upload_harmonized_study_list( - concatenated_studies: str, bucket_name: str, object_name: str -) -> None: - """This function uploads file to GCP. - - Args: - concatenated_studies (str): Concatenated list of harmonized summary statistics. - bucket_name (str): Bucket name - object_name (str): Name of the object - """ - hook = GCSHook(gcp_conn_id="google_cloud_default") - hook.upload( - bucket_name=bucket_name, - object_name=object_name, - data=concatenated_studies, - encoding="utf-8", - ) - - -with DAG( - dag_id=Path(__file__).stem, - description="Open Targets Genetics — GWAS Catalog preprocess", - default_args=common.shared_dag_args, - **common.shared_dag_kwargs, -): - # Getting list of folders (each a gwas study with summary statistics) - list_harmonised_sumstats = GCSListObjectsOperator( - task_id="list_harmonised_parquet", - bucket=GWAS_CATALOG_BUCKET_NAME, - prefix=HARMONISED_SUMSTATS_PREFIX, - match_glob="**/_SUCCESS", - ) - - # Upload resuling list to a bucket: - upload_task = PythonOperator( - task_id="uploader", - python_callable=upload_harmonized_study_list, - op_kwargs={ - "concatenated_studies": '{{ "\n".join(ti.xcom_pull( key="return_value", task_ids="list_harmonised_parquet")) }}', - "bucket_name": GWAS_CATALOG_BUCKET_NAME, - "object_name": HARMONISED_SUMSTATS_LIST_OBJECT_NAME, - }, - ) - - # Processing curated GWAS Catalog top-bottom: - with TaskGroup(group_id="curation_processing") as curation_processing: - # Generate inclusion list: - curation_calculate_inclusion_list = common.submit_step( - cluster_name=CLUSTER_NAME, - step_id="ot_gwas_catalog_study_inclusion", - task_id="catalog_curation_inclusion_list", - other_args=[ - "step.criteria=curation", - f"step.inclusion_list_path={CURATION_INCLUSION_NAME}", - f"step.exclusion_list_path={CURATION_EXCLUSION_NAME}", - f"step.harmonised_study_file={HARMONISED_SUMSTATS_LIST_FULL_NAME}", - ], - ) - - # Ingest curated associations from GWAS Catalog: - curation_ingest_data = common.submit_step( - cluster_name=CLUSTER_NAME, - step_id="ot_gwas_catalog_ingestion", - task_id="ingest_curated_gwas_catalog_data", - other_args=[f"step.inclusion_list_path={CURATION_INCLUSION_NAME}"], - ) - - # Run LD-annotation and clumping on curated data: - curation_ld_clumping = common.submit_step( - cluster_name=CLUSTER_NAME, - step_id="ot_ld_based_clumping", - task_id="catalog_curation_ld_clumping", - other_args=[ - f"step.study_locus_input_path={CURATED_STUDY_LOCI}", - f"step.study_index_path={STUDY_INDEX}", - f"step.clumped_study_locus_output_path={CURATED_LD_CLUMPED}", - ], - ) - - # Do PICS based finemapping: - curation_pics = common.submit_step( - cluster_name=CLUSTER_NAME, - step_id="pics", - task_id="catalog_curation_pics", - other_args=[ - f"step.study_locus_ld_annotated_in={CURATED_LD_CLUMPED}", - f"step.picsed_study_locus_out={CURATED_CREDIBLE_SETS}", - ], - ) - - # Define order of steps: - ( - curation_calculate_inclusion_list - >> curation_ingest_data - >> curation_ld_clumping - >> curation_pics - ) - - # Processing summary statistics from GWAS Catalog: - with TaskGroup( - group_id="summary_statistics_processing" - ) as summary_statistics_processing: - # Generate inclusion study lists: - summary_stats_calculate_inclusion_list = common.submit_step( - cluster_name=CLUSTER_NAME, - step_id="ot_gwas_catalog_study_inclusion", - task_id="catalog_sumstats_inclusion_list", - other_args=[ - "step.criteria=summary_stats", - f"step.inclusion_list_path={SUMMARY_STATISTICS_INCLUSION_NAME}", - f"step.exclusion_list_path={SUMMARY_STATISTICS_EXCLUSION_NAME}", - f"step.harmonised_study_file={HARMONISED_SUMSTATS_LIST_FULL_NAME}", - ], - ) - - # Run window-based clumping: - summary_stats_window_based_clumping = common.submit_step( - cluster_name=CLUSTER_NAME, - step_id="window_based_clumping", - task_id="catalog_sumstats_window_clumping", - other_args=[ - f"step.summary_statistics_input_path=gs://{GWAS_CATALOG_BUCKET_NAME}/{HARMONISED_SUMSTATS_PREFIX}", - f"step.inclusion_list_path={SUMMARY_STATISTICS_INCLUSION_NAME}", - f"step.study_locus_output_path={WINDOW_BASED_CLUMPED}", - ], - ) - - # Run LD based clumping: - summary_stats_ld_clumping = common.submit_step( - cluster_name=CLUSTER_NAME, - step_id="ot_ld_based_clumping", - task_id="catalog_sumstats_ld_clumping", - other_args=[ - f"step.study_locus_input_path={WINDOW_BASED_CLUMPED}", - f"step.study_index_path={STUDY_INDEX}", - f"step.clumped_study_locus_output_path={LD_BASED_CLUMPED}", - ], - ) - - # Run PICS finemapping: - summary_stats_pics = common.submit_step( - cluster_name=CLUSTER_NAME, - step_id="pics", - task_id="catalog_sumstats_pics", - other_args=[ - f"step.study_locus_ld_annotated_in={LD_BASED_CLUMPED}", - f"step.picsed_study_locus_out={SUMMARY_STATISTICS_CREDIBLE_SETS}", - ], - ) - - # Order of steps within the group: - ( - summary_stats_calculate_inclusion_list - >> summary_stats_window_based_clumping - >> summary_stats_ld_clumping - >> summary_stats_pics - ) - - # DAG description: - ( - common.create_cluster( - CLUSTER_NAME, autoscaling_policy=AUTOSCALING, num_workers=5 - ) - >> common.install_dependencies(CLUSTER_NAME) - >> list_harmonised_sumstats - >> upload_task - >> curation_processing - >> summary_statistics_processing - >> common.delete_cluster(CLUSTER_NAME) - ) diff --git a/src/airflow/dags/gwas_curation_update.py b/src/airflow/dags/gwas_curation_update.py deleted file mode 100644 index d5fd38e35..000000000 --- a/src/airflow/dags/gwas_curation_update.py +++ /dev/null @@ -1,34 +0,0 @@ -"""DAG for updating GWAS Catalog curation table.""" -from __future__ import annotations - -from datetime import datetime -from pathlib import Path - -import common_airflow as common - -from airflow.models.dag import DAG - -CLUSTER_NAME = "otg-gwascatalog-curation" -RUN_DATE = datetime.today().strftime("%Y-%m-%d") - -with DAG( - dag_id=Path(__file__).stem, - description="Open Targets Genetics — GWAS Catalog curation update", - default_args=common.shared_dag_args, - **common.shared_dag_kwargs, -): - update_gwas_curation = common.submit_step( - cluster_name=CLUSTER_NAME, - step_id="ot_gwas_catalog_study_curation", - task_id="gwas_catalog_curation_update", - other_args=[ - f"step.gwas_catalog_study_curation_out=gs://genetics_etl_python_playground/input/v2d/GWAS_Catalog_study_curation_{RUN_DATE}.tsv", - ], - ) - - # DAG description: - ( - common.create_cluster(CLUSTER_NAME, num_workers=2) - >> common.install_dependencies(CLUSTER_NAME) - >> update_gwas_curation - ) diff --git a/src/airflow/dags/ukb_ppp_eur.py b/src/airflow/dags/ukb_ppp_eur.py deleted file mode 100644 index c8df8cf5b..000000000 --- a/src/airflow/dags/ukb_ppp_eur.py +++ /dev/null @@ -1,45 +0,0 @@ -"""Airflow DAG to ingest and harmonise UKB PPP (EUR) data.""" - -from __future__ import annotations - -from pathlib import Path - -import common_airflow as common - -from airflow.models.dag import DAG - -CLUSTER_NAME = "otg-ukb-ppp-eur" - -# Input location. -UKB_PPP_EUR_STUDY_INDEX = "gs://gentropy-tmp/batch/output/ukb_ppp_eur/study_index.tsv" -UKB_PPP_EUR_SUMMARY_STATS = "gs://gentropy-tmp/batch/output/ukb_ppp_eur/summary_stats.parquet" -VARIANT_ANNOTATION = "gs://genetics_etl_python_playground/output/python_etl/parquet/XX.XX/variant_annotation" - -# Output locations. -TMP_VARIANT_ANNOTATION = "gs://gentropy-tmp/variant_annotation" -UKB_PPP_EUR_OUTPUT_STUDY_INDEX = "gs://ukb_ppp_eur_data/study_index" -UKB_PPP_EUR_OUTPUT_SUMMARY_STATS = "gs://ukb_ppp_eur_data/summary_stats" - -with DAG( - dag_id=Path(__file__).stem, - description="Open Targets Genetics — Ingest UKB PPP (EUR)", - default_args=common.shared_dag_args, - **common.shared_dag_kwargs, -): - dag = common.generate_dag( - cluster_name=CLUSTER_NAME, - tasks=[ - common.submit_step( - cluster_name=CLUSTER_NAME, - step_id="ot_ukb_ppp_eur_sumstat_preprocess", - other_args=[ - f"step.raw_study_index_path_from_tsv={UKB_PPP_EUR_STUDY_INDEX}", - f"step.raw_summary_stats_path={UKB_PPP_EUR_SUMMARY_STATS}", - f"step.variant_annotation_path={VARIANT_ANNOTATION}", - f"step.tmp_variant_annotation_path={TMP_VARIANT_ANNOTATION}", - f"step.study_index_output_path={UKB_PPP_EUR_OUTPUT_STUDY_INDEX}", - f"step.summary_stats_output_path={UKB_PPP_EUR_OUTPUT_SUMMARY_STATS}", - ] - ) - ] - ) diff --git a/src/airflow/dags/variant_index.py b/src/airflow/dags/variant_index.py deleted file mode 100644 index 98ba48198..000000000 --- a/src/airflow/dags/variant_index.py +++ /dev/null @@ -1,321 +0,0 @@ -"""DAG that generates a variant index dataset based on several sources.""" - -from __future__ import annotations - -import os -import time -from dataclasses import dataclass -from pathlib import Path -from typing import Any - -import pandas as pd -from common_airflow import ( - create_batch_job, - create_cluster, - create_task_spec, - delete_cluster, - install_dependencies, - read_yaml_config, - shared_dag_args, - shared_dag_kwargs, - submit_step, -) -from google.cloud import batch_v1 - -from airflow.decorators import task -from airflow.models.dag import DAG -from airflow.providers.google.cloud.operators.cloud_batch import ( - CloudBatchSubmitJobOperator, -) -from airflow.providers.google.cloud.operators.gcs import GCSListObjectsOperator -from airflow.utils.trigger_rule import TriggerRule - -PROJECT_ID = "open-targets-genetics-dev" -REGION = "europe-west1" -GCS_BUCKET = "genetics_etl_python_playground" -CONFIG_FILE_PATH = Path(__file__).parent / "configs" / "variant_sources.yaml" -GENTROPY_DOCKER_IMAGE = "europe-west1-docker.pkg.dev/open-targets-genetics-dev/gentropy-app/gentropy:il-variant-idx" # TODO: change to dev -VEP_DOCKER_IMAGE = "europe-west1-docker.pkg.dev/open-targets-genetics-dev/gentropy-app/custom_ensembl_vep:dev" -VEP_CACHE_BUCKET = f"gs://{GCS_BUCKET}/vep/cache" - -RELEASE = "XX.XX" # This needs to be updated to the latest release - -VCF_DST_PATH = f"gs://{GCS_BUCKET}/{RELEASE}/variant_vcf" -VCF_MERGED_DST_PATH = f"{VCF_DST_PATH}/merged" -VEP_OUTPUT_BUCKET = f"gs://{GCS_BUCKET}/{RELEASE}/vep_output" -VARIANT_INDEX_BUCKET = f"gs://{GCS_BUCKET}/{RELEASE}/variant_index" -GNOMAD_ANNOTATION_PATH = f"gs://{GCS_BUCKET}/static_assets/gnomad_variants" -# Internal parameters for the docker image: -MOUNT_DIR = "/mnt/disks/share" - -CLUSTER_NAME = "otg-variant-index" -AUTOSCALING = "eqtl-preprocess" - - -@task(task_id="vcf_creation") -def create_vcf(**kwargs: Any) -> None: - """Task that sends the ConvertToVcfStep job to Google Batch. - - Args: - **kwargs (Any): Keyword arguments - """ - sources = read_yaml_config(CONFIG_FILE_PATH) - task_env = [ - batch_v1.Environment( - variables={ - "SOURCE_NAME": source["name"], - "SOURCE_PATH": source["location"], - "SOURCE_FORMAT": source["format"], - } - ) - for source in sources["sources_inclusion_list"] - ] - - commands = [ - "-c", - rf"poetry run gentropy step=variant_to_vcf step.source_path=$SOURCE_PATH step.source_format=$SOURCE_FORMAT step.vcf_path={VCF_DST_PATH}/$SOURCE_NAME +step.session.extended_spark_conf={{spark.jars:https://storage.googleapis.com/hadoop-lib/gcs/gcs-connector-hadoop3-latest.jar}}", - ] - task = create_task_spec( - GENTROPY_DOCKER_IMAGE, commands, options="-e HYDRA_FULL_ERROR=1" - ) - - batch_task = CloudBatchSubmitJobOperator( - task_id="vep_batch_job", - project_id=PROJECT_ID, - region=REGION, - job_name=f"vcf-job-{time.strftime('%Y%m%d-%H%M%S')}", - job=create_batch_job( - task, - "VEPMACHINE", - task_env, - ), - deferrable=False, - ) - - batch_task.execute(context=kwargs) - - -@task(task_id="merge_vcfs") -def merge_vcfs(chunk_size: int = 2000, **kwargs: Any) -> None: - """Task that merges the information from all the VCF files into a single one so that we only submit one VEP job. - - Args: - chunk_size (int): Partition size of the merged file. Defaults to 2000. - **kwargs (Any): Keyword arguments - """ - ti = kwargs["ti"] - input_vcfs = [ - f"gs://{GCS_BUCKET}/{listed_file}" - for listed_file in ti.xcom_pull( - task_ids="get_vcf_per_source", key="return_value" - ) - ] - merged_df = ( - pd.concat( - pd.read_csv( - file, - sep="\t", - dtype={ - "#CHROM": str, - "POS": int, - "ID": str, - "REF": str, - "ALT": str, - "QUAL": str, - "FILTER": str, - "INFO": str, - }, - ) - for file in input_vcfs - ) - .drop_duplicates(subset=["#CHROM", "POS", "REF", "ALT"]) - .sort_values(by=["#CHROM", "POS"]) - .reset_index(drop=True) - ) - # Partition the merged file into chunks of 2000 variants to run the VEP jobs in parallel - chunks = 0 - for i in range(0, len(merged_df), chunk_size): - merged_df[i : i + chunk_size].to_csv( - f"{VCF_MERGED_DST_PATH}/chunk_{i + 1}-{i + chunk_size}.vcf", - index=False, - header=True, - sep="\t", - ) - chunks += 1 - expected_chunks_count = len(merged_df) // chunk_size + 1 - assert ( - chunks == expected_chunks_count - ), f"Expected {expected_chunks_count} chunks but got {chunks} chunks" - - -@dataclass -class PathManager: - """It is quite complicated to keep track of all the input/output buckets, the corresponding mounting points prefixes etc...""" - - VCF_INPUT_BUCKET: str - VEP_OUTPUT_BUCKET: str - VEP_CACHE_BUCKET: str - MOUNT_DIR_ROOT: str - - # Derived parameters to find the list of files to process: - input_path: str | None = None - input_bucket: str | None = None - - # Derived parameters to initialise the docker image: - path_dictionary: dict[str, dict[str, str]] | None = None - - # Derived parameters to point to the right mouting points: - cache_dir: str | None = None - input_dir: str | None = None - output_dir: str | None = None - - def __post_init__(self: PathManager) -> None: - """Build paths based on the input parameters.""" - self.path_dictionary = { - "input": { - "remote_path": self.VCF_INPUT_BUCKET.replace("gs://", ""), - "mount_point": f"{self.MOUNT_DIR_ROOT}/input", - }, - "output": { - "remote_path": self.VEP_OUTPUT_BUCKET.replace("gs://", ""), - "mount_point": f"{self.MOUNT_DIR_ROOT}/output", - }, - "cache": { - "remote_path": self.VEP_CACHE_BUCKET.replace("gs://", ""), - "mount_point": f"{self.MOUNT_DIR_ROOT}/cache", - }, - } - # Parameters for fetching files: - self.input_path = self.VCF_INPUT_BUCKET.replace("gs://", "") + "/" - self.input_bucket = self.VCF_INPUT_BUCKET.split("/")[2] - - # Parameters for VEP: - self.cache_dir = f"{self.MOUNT_DIR_ROOT}/cache" - self.input_dir = f"{self.MOUNT_DIR_ROOT}/input" - self.output_dir = f"{self.MOUNT_DIR_ROOT}/output" - - def get_mount_config(self) -> list[dict[str, str]]: - """Return the mount configuration. - - Returns: - list[dict[str, str]]: The mount configuration. - """ - assert self.path_dictionary is not None, "Path dictionary not initialized." - return list(self.path_dictionary.values()) - - -@task(task_id="vep_annotation") -def vep_annotation(pm: PathManager, **kwargs: Any) -> None: - """Submit a Batch job to annotate VCFs with a local VEP docker image. - - Args: - pm (PathManager): The path manager with all the required path related information. - **kwargs (Any): Keyword arguments. - """ - # Get the filenames to process: - ti = kwargs["ti"] - filenames = [ - os.path.basename(os.path.splitext(path)[0]) - for path in ti.xcom_pull(task_ids="get_vep_todo_list", key="return_value") - ] - # Stop process if no files was found: - assert filenames, "No files found to process." - - # Based on the filenames, build the environment variables for the batch job: - task_env = [ - batch_v1.Environment( - variables={ - "INPUT_FILE": f"{filename}.vcf", - "OUTPUT_FILE": f"{filename}.json", - } - ) - for filename in filenames - ] - # Build the command to run in the container: - command = [ - "-c", - rf"vep --cache --offline --format vcf --force_overwrite \ - --no_stats \ - --dir_cache {pm.cache_dir} \ - --input_file {pm.input_dir}/$INPUT_FILE \ - --output_file {pm.output_dir}/$OUTPUT_FILE --json \ - --dir_plugins {pm.cache_dir}/VEP_plugins \ - --sift b \ - --polyphen b \ - --fasta {pm.cache_dir}/Homo_sapiens.GRCh38.dna.primary_assembly.fa.gz \ - --mane_select \ - --appris \ - --hgvsg \ - --pick_order mane_select,canonical \ - --per_gene \ - --uniprot \ - --check_existing \ - --exclude_null_alleles \ - --canonical \ - --plugin TSSDistance \ - --distance 500000 \ - --plugin LoF,loftee_path:{pm.cache_dir}/VEP_plugins,gerp_bigwig:{pm.cache_dir}/gerp_conservation_scores.homo_sapiens.GRCh38.bw,human_ancestor_fa:{pm.cache_dir}/human_ancestor.fa.gz,conservation_file:/opt/vep/loftee.sql \ - --plugin AlphaMissense,file={pm.cache_dir}/AlphaMissense_hg38.tsv.gz,transcript_match=1 \ - --plugin CADD,snv={pm.cache_dir}/CADD_GRCh38_whole_genome_SNVs.tsv.gz", - ] - task = create_task_spec(VEP_DOCKER_IMAGE, command) - batch_task = CloudBatchSubmitJobOperator( - task_id="vep_batch_job", - project_id=PROJECT_ID, - region=REGION, - job_name=f"vep-job-{time.strftime('%Y%m%d-%H%M%S')}", - job=create_batch_job(task, "VEPMACHINE", task_env, pm.get_mount_config()), - deferrable=False, - ) - batch_task.execute(context=kwargs) - - -with DAG( - dag_id=Path(__file__).stem, - description="Open Targets Genetics — create VCF file from datasets that contain variant information", - default_args=shared_dag_args, - **shared_dag_kwargs, -) as dag: - pm = PathManager( - VCF_MERGED_DST_PATH, - VEP_OUTPUT_BUCKET, - VEP_CACHE_BUCKET, - MOUNT_DIR, - ) - ( - create_vcf() - >> GCSListObjectsOperator( - task_id="get_vcf_per_source", - bucket=GCS_BUCKET, - prefix=VCF_DST_PATH.replace(f"gs://{GCS_BUCKET}/", ""), - trigger_rule=TriggerRule.ALL_SUCCESS, - match_glob="**.csv", - ) - >> merge_vcfs() - >> GCSListObjectsOperator( - task_id="get_vep_todo_list", - bucket=GCS_BUCKET, - prefix=VCF_MERGED_DST_PATH.replace(f"gs://{GCS_BUCKET}/", ""), - trigger_rule=TriggerRule.ALL_SUCCESS, - match_glob="**.vcf", - ) - >> vep_annotation(pm) - >> create_cluster( - CLUSTER_NAME, - autoscaling_policy=AUTOSCALING, - num_workers=4, - worker_machine_type="n1-highmem-8", - ) - >> install_dependencies(CLUSTER_NAME) - >> submit_step( - cluster_name=CLUSTER_NAME, - step_id="ot_variant_index", - task_id="ot_variant_index", - other_args=[ - f"step.vep_output_json_path={VEP_OUTPUT_BUCKET}", - f"step.variant_index_path={VARIANT_INDEX_BUCKET}", - f"step.gnomad_variant_annotations_path={GNOMAD_ANNOTATION_PATH}", - ], - ) - >> delete_cluster(CLUSTER_NAME) - ) diff --git a/src/airflow/docker-compose.yaml b/src/airflow/docker-compose.yaml deleted file mode 100644 index 8e8523490..000000000 --- a/src/airflow/docker-compose.yaml +++ /dev/null @@ -1,228 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# - -# Basic Airflow cluster configuration for LocalExecutor with PostgreSQL. -# -# WARNING: This configuration is for local development. Do not use it in a production deployment. -# -# This configuration supports basic configuration using environment variables or an .env file -# The following variables are supported: -# -# AIRFLOW_IMAGE_NAME - Docker image name used to run Airflow. -# Default: apache/airflow:slim-2.7.2-python3.10 -# AIRFLOW_UID - User ID in Airflow containers -# Default: 50000 -# AIRFLOW_PROJ_DIR - Base path to which all the files will be volumed. -# Default: . -# Those configurations are useful mostly in case of standalone testing/running Airflow in test/try-out mode -# -# _AIRFLOW_WWW_USER_USERNAME - Username for the administrator account (if requested). -# Default: airflow -# _AIRFLOW_WWW_USER_PASSWORD - Password for the administrator account (if requested). -# Default: airflow -# _PIP_ADDITIONAL_REQUIREMENTS - Additional PIP requirements to add when starting all containers. -# Use this option ONLY for quick checks. Installing requirements at container -# startup is done EVERY TIME the service is started. -# A better way is to build a custom image or extend the official image -# as described in https://airflow.apache.org/docs/docker-stack/build.html. -# Default: '' -# -# Feel free to modify this file to suit your needs. -version: "3.8" -x-airflow-common: &airflow-common - # In order to add custom dependencies or upgrade provider packages you can use your extended image. - # Comment the image line, place your Dockerfile in the directory where you placed the docker-compose.yaml - # and uncomment the "build" line below, Then run `docker-compose build` to build the images. - image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:slim-2.7.2-python3.10} - # build: . - environment: &airflow-common-env - AIRFLOW__CORE__EXECUTOR: LocalExecutor - AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow - # For backward compatibility, with Airflow <2.3 - AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow - AIRFLOW__CORE__FERNET_KEY: "" - AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION: "true" - AIRFLOW__CORE__LOAD_EXAMPLES: "false" - AIRFLOW__API__AUTH_BACKENDS: "airflow.api.auth.backend.basic_auth,airflow.api.auth.backend.session" - # yamllint disable rule:line-length - # Use simple http server on scheduler for health checks - # See https://airflow.apache.org/docs/apache-airflow/stable/administration-and-deployment/logging-monitoring/check-health.html#scheduler-health-check-server - # yamllint enable rule:line-length - AIRFLOW__SCHEDULER__ENABLE_HEALTH_CHECK: "true" - # WARNING: Use _PIP_ADDITIONAL_REQUIREMENTS option ONLY for a quick checks - # for other purpose (development, test and especially production usage) build/extend Airflow image. - _PIP_ADDITIONAL_REQUIREMENTS: ${_PIP_ADDITIONAL_REQUIREMENTS:-} - # GCLOUD Authentication - GOOGLE_APPLICATION_CREDENTIALS: ${GOOGLE_APPLICATION_CREDENTIALS:-} - AIRFLOW_CONN_GOOGLE_CLOUD_DEFAULT: ${AIRFLOW_CONN_GOOGLE_CLOUD_DEFAULT:-} - GCP_PROJECT_ID: ${GCP_PROJECT_ID:-} - GCP_GCS_BUCKET: ${GCP_GCS_BUCKET:-} - - volumes: - - ${AIRFLOW_PROJ_DIR:-.}/dags:/opt/airflow/dags - - ${AIRFLOW_PROJ_DIR:-.}/logs:/opt/airflow/logs - - ${AIRFLOW_PROJ_DIR:-.}/config:/opt/airflow/config - - ${AIRFLOW_PROJ_DIR:-.}/plugins:/opt/airflow/plugins - # GCLOUD Authentication - - ${GOOGLE_LOCAL_CREDENTIALS_PATH}:/${GOOGLE_DOCKER_CREDENTIALS_PATH}:ro - user: "${AIRFLOW_UID:-50000}:0" - depends_on: &airflow-common-depends-on - postgres: - condition: service_healthy - -services: - postgres: - image: postgres:13 - environment: - POSTGRES_USER: airflow - POSTGRES_PASSWORD: airflow - POSTGRES_DB: airflow - volumes: - - postgres-db-volume:/var/lib/postgresql/data - healthcheck: - test: ["CMD", "pg_isready", "-U", "airflow"] - interval: 10s - retries: 5 - start_period: 5s - restart: always - - airflow-webserver: - <<: *airflow-common - command: webserver - ports: - - "8080:8080" - healthcheck: - test: ["CMD", "curl", "--fail", "http://localhost:8080/health"] - interval: 30s - timeout: 10s - retries: 5 - start_period: 30s - restart: always - depends_on: - <<: *airflow-common-depends-on - airflow-init: - condition: service_completed_successfully - - airflow-scheduler: - <<: *airflow-common - command: scheduler - healthcheck: - test: ["CMD", "curl", "--fail", "http://localhost:8974/health"] - interval: 30s - timeout: 10s - retries: 5 - start_period: 30s - restart: always - depends_on: - <<: *airflow-common-depends-on - airflow-init: - condition: service_completed_successfully - - airflow-init: - <<: *airflow-common - entrypoint: /bin/bash - # yamllint disable rule:line-length - command: - - -c - - | - function ver() { - printf "%04d%04d%04d%04d" $${1//./ } - } - airflow_version=$$(AIRFLOW__LOGGING__LOGGING_LEVEL=INFO && gosu airflow airflow version) - airflow_version_comparable=$$(ver $${airflow_version}) - min_airflow_version=2.2.0 - min_airflow_version_comparable=$$(ver $${min_airflow_version}) - if (( airflow_version_comparable < min_airflow_version_comparable )); then - echo - echo -e "\033[1;31mERROR!!!: Too old Airflow version $${airflow_version}!\e[0m" - echo "The minimum Airflow version supported: $${min_airflow_version}. Only use this or higher!" - echo - exit 1 - fi - if [[ -z "${AIRFLOW_UID}" ]]; then - echo - echo -e "\033[1;33mWARNING!!!: AIRFLOW_UID not set!\e[0m" - echo "If you are on Linux, you SHOULD follow the instructions below to set " - echo "AIRFLOW_UID environment variable, otherwise files will be owned by root." - echo "For other operating systems you can get rid of the warning with manually created .env file:" - echo " See: https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html#setting-the-right-airflow-user" - echo - fi - one_meg=1048576 - mem_available=$$(($$(getconf _PHYS_PAGES) * $$(getconf PAGE_SIZE) / one_meg)) - cpus_available=$$(grep -cE 'cpu[0-9]+' /proc/stat) - disk_available=$$(df / | tail -1 | awk '{print $$4}') - warning_resources="false" - if (( mem_available < 4000 )) ; then - echo - echo -e "\033[1;33mWARNING!!!: Not enough memory available for Docker.\e[0m" - echo "At least 4GB of memory required. You have $$(numfmt --to iec $$((mem_available * one_meg)))" - echo - warning_resources="true" - fi - if (( cpus_available < 2 )); then - echo - echo -e "\033[1;33mWARNING!!!: Not enough CPUS available for Docker.\e[0m" - echo "At least 2 CPUs recommended. You have $${cpus_available}" - echo - warning_resources="true" - fi - if (( disk_available < one_meg * 10 )); then - echo - echo -e "\033[1;33mWARNING!!!: Not enough Disk space available for Docker.\e[0m" - echo "At least 10 GBs recommended. You have $$(numfmt --to iec $$((disk_available * 1024 )))" - echo - warning_resources="true" - fi - if [[ $${warning_resources} == "true" ]]; then - echo - echo -e "\033[1;33mWARNING!!!: You have not enough resources to run Airflow (see above)!\e[0m" - echo "Please follow the instructions to increase amount of resources available:" - echo " https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html#before-you-begin" - echo - fi - mkdir -p /sources/logs /sources/dags /sources/plugins - chown -R "${AIRFLOW_UID}:0" /sources/{logs,dags,plugins} - exec /entrypoint airflow version - # yamllint enable rule:line-length - environment: - <<: *airflow-common-env - _AIRFLOW_DB_MIGRATE: "true" - _AIRFLOW_WWW_USER_CREATE: "true" - _AIRFLOW_WWW_USER_USERNAME: ${_AIRFLOW_WWW_USER_USERNAME:-airflow} - _AIRFLOW_WWW_USER_PASSWORD: ${_AIRFLOW_WWW_USER_PASSWORD:-airflow} - _PIP_ADDITIONAL_REQUIREMENTS: "" - user: "0:0" - volumes: - - ${AIRFLOW_PROJ_DIR:-.}:/sources - - airflow-cli: - <<: *airflow-common - profiles: - - debug - environment: - <<: *airflow-common-env - CONNECTION_CHECK_MAX_COUNT: "0" - # Workaround for entrypoint issue. See: https://github.com/apache/airflow/issues/16252 - command: - - bash - - -c - - airflow - -volumes: - postgres-db-volume: diff --git a/src/airflow/logs/.gitkeep b/src/airflow/logs/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/airflow/plugins/.gitkeep b/src/airflow/plugins/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/airflow/requirements.txt b/src/airflow/requirements.txt deleted file mode 100644 index 540c20453..000000000 --- a/src/airflow/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -apache-airflow-providers-google==10.17.0 -apache-airflow-providers-apache-beam==5.6.1 -psycopg2-binary==2.9.9 diff --git a/tests/airflow/test_dag.py b/tests/airflow/test_dag.py deleted file mode 100644 index e18f91fb1..000000000 --- a/tests/airflow/test_dag.py +++ /dev/null @@ -1,51 +0,0 @@ -"""Check for airflow import errors. Inspiration from https://garystafford.medium.com/devops-for-dataops-building-a-ci-cd-pipeline-for-apache-airflow-dags-975e4a622f83.""" - -from __future__ import annotations - -import pytest - -from airflow.models import DagBag - - -@pytest.fixture(params=["./src/airflow/dags"]) -def dag_bag(request: pytest.FixtureRequest) -> DagBag: - """Return a DAG bag for testing.""" - return DagBag(dag_folder=request.param, include_examples=False) - - -def test_no_import_errors(dag_bag: DagBag) -> None: - """Test for import errors.""" - assert ( - not dag_bag.import_errors - ), f"DAG import failures. Errors: {dag_bag.import_errors}" - - -def test_requires_tags(dag_bag: DagBag) -> None: - """Tags should be defined for each DAG.""" - for _, dag in dag_bag.dags.items(): - assert dag.tags - - -def test_owner_len_greater_than_five(dag_bag: DagBag) -> None: - """Owner should be defined for each DAG and be longer than 5 characters.""" - for _, dag in dag_bag.dags.items(): - assert len(dag.owner) > 5 - - -def test_desc_len_greater_than_fifteen(dag_bag: DagBag) -> None: - """Description should be defined for each DAG and be longer than 30 characters.""" - for _, dag in dag_bag.dags.items(): - if isinstance(dag.description, str): - assert len(dag.description) > 30 - - -def test_owner_not_airflow(dag_bag: DagBag) -> None: - """Owner should not be 'airflow'.""" - for _, dag in dag_bag.dags.items(): - assert str.lower(dag.owner) != "airflow" - - -def test_three_or_less_retries(dag_bag: DagBag) -> None: - """Retries should be 3 or less.""" - for _, dag in dag_bag.dags.items(): - assert dag.default_args["retries"] <= 3