From 3237aee1bb8f52955528a324551b99f51d07501d Mon Sep 17 00:00:00 2001 From: aclum Date: Mon, 19 Aug 2024 15:56:59 -0700 Subject: [PATCH 01/52] Update workflows.yaml for berkeley --- configs/workflows.yaml | 62 +++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/configs/workflows.yaml b/configs/workflows.yaml index cce1ebb6..05ac3537 100644 --- a/configs/workflows.yaml +++ b/configs/workflows.yaml @@ -1,6 +1,6 @@ Workflows: - Name: Sequencing Noninterleaved - Collection: omics_processing_set + Collection: data_generation_set Enabled: True Analyte Category: Metagenome Filter Output Objects: @@ -8,20 +8,20 @@ Workflows: - Metagenome Raw Read 2 - Name: Sequencing Interleaved - Collection: omics_processing_set + Collection: data_generation_set Enabled: True Analyte Category: Metagenome Filter Output Objects: - Metagenome Raw Reads - Name: Reads QC - Type: nmdc:ReadQcAnalysisActivity + Type: nmdc:ReadQcAnalysis Enabled: True Analyte Category: Metagenome Git_repo: https://github.com/microbiomedata/ReadsQC Version: v1.0.8 WDL: rqcfilter.wdl - Collection: read_qc_analysis_activity_set + Collection: workflow_execution_set Filter Input Objects: - Metagenome Raw Reads Predecessors: @@ -30,14 +30,14 @@ Workflows: Input_prefix: nmdc_rqcfilter Inputs: input_files: do:Metagenome Raw Reads - proj: "{activity_id}" + proj: "{workflow_execution_id}" Activity: - name: "Read QC Activity for {id}" + name: "Read QC for {id}" input_read_bases: "{outputs.stats.input_read_bases}" input_read_count: "{outputs.stats.input_read_count}" output_read_bases: "{outputs.stats.output_read_bases}" output_read_count: "{outputs.stats.output_read_count}" - type: nmdc:ReadQcAnalysisActivity + type: nmdc:ReadQcAnalysis Outputs: - output: filtered_final name: Reads QC result fastq (clean data) @@ -53,16 +53,16 @@ Workflows: description: "Read filtering info for {id}" - Name: Reads QC Interleave - Type: nmdc:ReadQcAnalysisActivity + Type: nmdc:ReadQcAnalysis Enabled: True Analyte Category: Metagenome Git_repo: https://github.com/microbiomedata/ReadsQC Version: v1.0.8 - Collection: read_qc_analysis_activity_set + Collection: workflow_execution_set WDL: interleave_rqcfilter.wdl Input_prefix: nmdc_rqcfilter Inputs: - proj: "{activity_id}" + proj: "{workflow_execution_id}" input_fastq1: do:Metagenome Raw Read 1 input_fastq2: do:Metagenome Raw Read 2 Filter Input Objects: @@ -71,12 +71,12 @@ Workflows: Predecessors: - Sequencing Noninterleaved Activity: - name: "Read QC Activity for {id}" + name: "Read QC for {id}" input_read_bases: "{outputs.stats.input_read_bases}" input_read_count: "{outputs.stats.input_read_count}" output_read_bases: "{outputs.stats.output_read_bases}" output_read_count: "{outputs.stats.output_read_count}" - type: nmdc:ReadQcAnalysisActivity + type: nmdc:ReadQcAnalysis Outputs: - output: filtered_final name: Reads QC result fastq (clean data) @@ -98,15 +98,15 @@ Workflows: Git_repo: https://github.com/microbiomedata/metaAssembly Version: v1.0.3 WDL: jgi_assembly.wdl - Collection: metagenome_assembly_set + Collection: workflow_execution_set Predecessors: - Reads QC - Reads QC Interleave Input_prefix: jgi_metaASM Inputs: input_file: do:Filtered Sequencing Reads - rename_contig_prefix: "{activity_id}" - proj: "{activity_id}" + rename_contig_prefix: "{workflow_execution_id}" + proj: "{workflow_execution_id}" Activity: name: "Metagenome Assembly Activity for {id}" type: nmdc:MetagenomeAssembly @@ -162,23 +162,23 @@ Workflows: description: "Assembly info for {id}" - Name: Metagenome Annotation - Type: nmdc:MetagenomeAnnotationActivity + Type: nmdc:MetagenomeAnnotation Enabled: True Analyte Category: Metagenome Git_repo: https://github.com/microbiomedata/mg_annotation Version: v1.1.0 WDL: annotation_full.wdl - Collection: metagenome_annotation_activity_set + Collection: workflow_execution_set Predecessors: - Metagenome Assembly Input_prefix: annotation Inputs: input_file: do:Assembly Contigs imgap_project_id: "scaffold" - proj: "{activity_id}" + proj: "{workflow_execution_id}" Activity: - name: "Metagenome Annotation Analysis Activity for {id}" - type: nmdc:MetagenomeAnnotationActivity + name: "Metagenome Annotation Analysis for {id}" + type: nmdc:MetagenomeAnnotation Outputs: - output: proteins_faa data_object_type: Annotation Amino Acid FASTA @@ -285,13 +285,13 @@ Workflows: - Name: MAGs - Type: nmdc:MagsAnalysisActivity + Type: nmdc:MagsAnalysis Enabled: True Analyte Category: Metagenome Git_repo: https://github.com/microbiomedata/metaMAGs Version: v1.3.4 WDL: mbin_nmdc.wdl - Collection: mags_activity_set + Collection: workflow_execution_set Predecessors: - Metagenome Annotation Input_prefix: nmdc_mags @@ -301,7 +301,7 @@ Workflows: cath_funfam_file: do:CATH FunFams (Functional Families) Annotation GFF supfam_file: do:SUPERFam Annotation GFF cog_file: do:Clusters of Orthologous Groups (COG) Annotation GFF - proj_name: "{activity_id}" + proj_name: "{workflow_execution_id}" pfam_file: do:Pfam Annotation GFF product_names_file: do:Product Names tigrfam_file: do:TIGRFam Annotation GFF @@ -313,10 +313,10 @@ Workflows: proteins_file: do:Annotation Amino Acid FASTA map_file: do:Contig Mapping File gene_phylogeny_file: do:Gene Phylogeny tsv - proj: "{activity_id}" + proj: "{workflow_execution_id}" Activity: - name: "Metagenome Assembled Genomes Analysis Activity for {id}" - type: nmdc:MagsAnalysisActivity + name: "Metagenome Assembled Genomes Analysis for {id}" + type: nmdc:MagsAnalysis Outputs: - output: final_checkm data_object_type: CheckM Statistics @@ -341,23 +341,23 @@ Workflows: name: Metagenome Bins Info File - Name: Readbased Analysis - Type: nmdc:ReadBasedTaxonomyAnalysisActivity + Type: nmdc:ReadBasedTaxonomyAnalysis Enabled: True Analyte Category: Metagenome Git_repo: https://github.com/microbiomedata/ReadbasedAnalysis Version: v1.0.5 WDL: ReadbasedAnalysis.wdl - Collection: read_based_taxonomy_analysis_activity_set + Collection: workflow_execution_set Predecessors: - Reads QC - Reads QC Interleave Input_prefix: ReadbasedAnalysis Inputs: input_file: do:Filtered Sequencing Reads - proj: "{activity_id}" + proj: "{workflow_execution_id}" Activity: - name: "Readbased Taxonomy Analysis Activity for {id}" - type: nmdc:ReadBasedTaxonomyAnalysisActivity + name: "Readbased Taxonomy Analysis for {id}" + type: nmdc:ReadBasedTaxonomyAnalysis Outputs: - output: final_gottcha2_report_tsv data_object_type: GOTTCHA2 Classification Report From 8230b40acbea178009e38b8cd047aac9bfec87d0 Mon Sep 17 00:00:00 2001 From: aclum Date: Mon, 19 Aug 2024 16:49:08 -0700 Subject: [PATCH 02/52] Berkeley compatible workflows-mt.yaml --- configs/workflows-mt.yaml | 64 +++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/configs/workflows-mt.yaml b/configs/workflows-mt.yaml index f929bb50..fd0625e2 100644 --- a/configs/workflows-mt.yaml +++ b/configs/workflows-mt.yaml @@ -1,6 +1,6 @@ Workflows: - Name: Sequencing Noninterleaved - Collection: omics_processing_set + Collection: data_generation_set Enabled: True Analyte Category: Metatranscriptome Filter Output Objects: @@ -8,20 +8,20 @@ Workflows: - Metagenome Raw Read 2 - Name: Sequencing Interleaved - Collection: omics_processing_set + Collection: data_generation_set Enabled: True Analyte Category: Metatranscriptome Filter Output Objects: - Metagenome Raw Reads - Name: Metatranscriptome Reads QC - Type: nmdc:ReadQcAnalysisActivity + Type: nmdc:ReadQcAnalysis Enabled: True Analyte Category: Metatranscriptome Git_repo: https://github.com/microbiomedata/metaT_ReadsQC Version: v0.0.3 WDL: rqcfilter.wdl - Collection: read_qc_analysis_activity_set + Collection: workflow_execution_set Filter Input Objects: - Metagenome Raw Reads Predecessors: @@ -30,14 +30,14 @@ Workflows: Input_prefix: nmdc_rqcfilter Inputs: input_files: do:Metagenome Raw Reads - proj: "{activity_id}" - Activity: - name: "Read QC Activity for {id}" + proj: "{workflow_execution_id}" + Workflow_Execution: + name: "Read QC for {id}" input_read_bases: "{outputs.stats.input_read_bases}" input_read_count: "{outputs.stats.input_read_count}" output_read_bases: "{outputs.stats.output_read_bases}" output_read_count: "{outputs.stats.output_read_count}" - type: nmdc:ReadQcAnalysisActivity + type: nmdc:ReadQcAnalysis Outputs: - output: filtered_final name: Reads QC result fastq (clean data) @@ -57,16 +57,16 @@ Workflows: description: "rRNA fastq for {id}" - Name: Metatranscriptome Reads QC Interleave - Type: nmdc:ReadQcAnalysisActivity + Type: nmdc:ReadQcAnalysis Enabled: True Analyte Category: Metatranscriptome Git_repo: https://github.com/microbiomedata/metaT_ReadsQC Version: v0.0.3 - Collection: read_qc_analysis_activity_set + Collection: workflow_execution_set WDL: interleave_rqcfilter.wdl Input_prefix: nmdc_rqcfilter Inputs: - proj: "{activity_id}" + proj: "{workflow_execution_id}" input_fastq1: do:Metagenome Raw Read 1 input_fastq2: do:Metagenome Raw Read 2 Filter Input Objects: @@ -74,13 +74,13 @@ Workflows: - Metagenome Raw Read 2 Predecessors: - Sequencing Noninterleaved - Activity: - name: "Read QC Activity for {id}" + Workflow_Execution: + name: "Read QC for {id}" input_read_bases: "{outputs.stats.input_read_bases}" input_read_count: "{outputs.stats.input_read_count}" output_read_bases: "{outputs.stats.output_read_bases}" output_read_count: "{outputs.stats.output_read_count}" - type: nmdc:ReadQcAnalysisActivity + type: nmdc:ReadQcAnalysis Outputs: - output: filtered_final name: Reads QC result fastq (clean data) @@ -113,9 +113,9 @@ Workflows: Input_prefix: jgi_metaASM Inputs: input_files: do:Filtered Sequencing Reads - proj: "{activity_id}" - Activity: - name: "Metatranscriptome Assembly Activity for {id}" + proj: "{workflow_execution_id}" + Workflow_Execution: + name: "Metatranscriptome Assembly for {id}" type: nmdc:MetatranscriptomeAssembly asm_score: "{outputs.stats.asm_score}" contig_bp: "{outputs.stats.contig_bp}" @@ -153,23 +153,23 @@ Workflows: description: "Alignment index file for {id}" - Name: Metatranscriptome Annotation - Type: nmdc:MetatranscriptomeAnnotationActivity + Type: nmdc:MetatranscriptomeAnnotation Enabled: True Analyte Category: Metatranscriptome Git_repo: https://github.com/microbiomedata/mg_annotation Version: v1.1.0 WDL: annotation_full.wdl - Collection: metatranscriptome_annotation_set + Collection: workflow_execution_set Predecessors: - Metatranscriptome Assembly Input_prefix: annotation Inputs: input_file: do:Assembly Contigs imgap_project_id: "scaffold" - proj: "{activity_id}" - Activity: - name: "Metatranscriptome Annotation Analysis Activity for {id}" - type: nmdc:MetatranscriptomeAnnotationActivity + proj: "{workflow_execution_id}" + Workflow_Execution: + name: "Metatranscriptome Annotation Analysis for {id}" + type: nmdc:MetatranscriptomeAnnotation Outputs: - output: proteins_faa data_object_type: Annotation Amino Acid FASTA @@ -282,7 +282,7 @@ Workflows: Git_repo: https://github.com/microbiomedata/metaT_ReadCounts Version: v0.0.1 WDL: readcount.wdl - Collection: metatranscriptome_expression_analysis_set + Collection: workflow_execution_set Predecessors: - Metatranscriptome Annotation Input_prefix: nmdc_expression @@ -291,8 +291,8 @@ Workflows: map: do:Contig Mapping File bam: do:Assembly Coverage BAM rna_type: "aRNA" - proj: "{activity_id}" - Activity: + proj: "{workflow_execution_id}" + Workflow_Execution: name: "Metatranscriptome Expression Analysis for {id}" type: nmdc:MetatranscriptomeExpressionAnalysis Outputs: @@ -317,7 +317,7 @@ Workflows: Git_repo: https://github.com/microbiomedata/metaT_ReadCounts Version: v0.0.1 WDL: readcount.wdl - Collection: metatranscriptome_expression_analysis_set + Collection: workflow_execution_set Predecessors: - Metatranscriptome Annotation Input_prefix: nmdc_expression @@ -325,8 +325,8 @@ Workflows: gff_file: do:Functional Annotation GFF map: do:Contig Mapping File bam: do:Assembly Coverage BAM - proj: "{activity_id}" - Activity: + proj: "{workflow_execution_id}" + Workflow_Execution: name: "Metatranscriptome Expression Analysis for {id}" type: nmdc:MetatranscriptomeExpressionAnalysis Outputs: @@ -351,7 +351,7 @@ Workflows: Git_repo: https://github.com/microbiomedata/metaT_ReadCounts Version: v0.0.1 WDL: readcount.wdl - Collection: metatranscriptome_expression_analysis_set + Collection: workflow_execution_set Predecessors: - Metatranscriptome Annotation Input_prefix: nmdc_expression @@ -360,8 +360,8 @@ Workflows: map: do:Contig Mapping File bam: do:Assembly Coverage BAM rna_type: "non_stranded_RNA" - proj: "{activity_id}" - Activity: + proj: "{workflow_execution_id}" + Workflow_Execution: name: "Metatranscriptome Expression Analysis for {id}" type: nmdc:MetatranscriptomeExpressionAnalysis Outputs: From ad2f143c1ed7e85f69806be714b210213899ea63 Mon Sep 17 00:00:00 2001 From: aclum Date: Mon, 19 Aug 2024 16:50:13 -0700 Subject: [PATCH 03/52] Berkeley compatibility for workflows.yaml --- configs/workflows.yaml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/configs/workflows.yaml b/configs/workflows.yaml index 05ac3537..66d1c946 100644 --- a/configs/workflows.yaml +++ b/configs/workflows.yaml @@ -31,7 +31,7 @@ Workflows: Inputs: input_files: do:Metagenome Raw Reads proj: "{workflow_execution_id}" - Activity: + Workflow_Execution: name: "Read QC for {id}" input_read_bases: "{outputs.stats.input_read_bases}" input_read_count: "{outputs.stats.input_read_count}" @@ -70,7 +70,7 @@ Workflows: - Metagenome Raw Read 2 Predecessors: - Sequencing Noninterleaved - Activity: + Workflow_Execution: name: "Read QC for {id}" input_read_bases: "{outputs.stats.input_read_bases}" input_read_count: "{outputs.stats.input_read_count}" @@ -107,8 +107,8 @@ Workflows: input_file: do:Filtered Sequencing Reads rename_contig_prefix: "{workflow_execution_id}" proj: "{workflow_execution_id}" - Activity: - name: "Metagenome Assembly Activity for {id}" + Workflow_Execution: + name: "Metagenome Assembly for {id}" type: nmdc:MetagenomeAssembly asm_score: "{outputs.stats.asm_score}" contig_bp: "{outputs.stats.contig_bp}" @@ -176,7 +176,7 @@ Workflows: input_file: do:Assembly Contigs imgap_project_id: "scaffold" proj: "{workflow_execution_id}" - Activity: + Workflow_Execution: name: "Metagenome Annotation Analysis for {id}" type: nmdc:MetagenomeAnnotation Outputs: @@ -314,7 +314,7 @@ Workflows: map_file: do:Contig Mapping File gene_phylogeny_file: do:Gene Phylogeny tsv proj: "{workflow_execution_id}" - Activity: + Workflow_Execution: name: "Metagenome Assembled Genomes Analysis for {id}" type: nmdc:MagsAnalysis Outputs: @@ -355,7 +355,7 @@ Workflows: Inputs: input_file: do:Filtered Sequencing Reads proj: "{workflow_execution_id}" - Activity: + Workflow_Execution: name: "Readbased Taxonomy Analysis for {id}" type: nmdc:ReadBasedTaxonomyAnalysis Outputs: From afb2c483ae286aa69e9e0b87a18864b7e6436193 Mon Sep 17 00:00:00 2001 From: aclum Date: Mon, 19 Aug 2024 17:00:16 -0700 Subject: [PATCH 04/52] Berkeley update import.yaml --- configs/import.yaml | 181 ++++++++++++++++++++------------------------ 1 file changed, 84 insertions(+), 97 deletions(-) diff --git a/configs/import.yaml b/configs/import.yaml index 6ffaed52..7d1956c3 100644 --- a/configs/import.yaml +++ b/configs/import.yaml @@ -1,49 +1,36 @@ Workflows: - - Name: Sequencing - Import: true - Type: nmdc:MetagenomeSequencingActivity - Git_repo: https://github.com/microbiomedata/RawSequencingData - Version: v1.0.0 - Collection: metagenome_sequencing_activity_set - ActivityRange: MetagenomeSequencingActivity - Activity: - name: "Metagenome Sequencing Activity for {id}" - type: nmdc:MetagenomeSequencingActivity - Outputs: - - Metagenome Raw Reads - - Name: Reads QC Import: true - Type: nmdc:ReadQcAnalysisActivity + Type: nmdc:ReadQcAnalysis Git_repo: https://github.com/microbiomedata/ReadsQC Version: v1.0.8 - Collection: read_qc_analysis_activity_set - ActivityRange: ReadQcAnalysisActivity + Collection: workflow_execution_set + WorkflowExecutionRange: ReadQcAnalysis Inputs: - Metagenome Raw Reads - Activity: - name: "Read QC Activity for {id}" + Workflow_Execution: + name: "Read QC for {id}" input_read_bases: "{outputs.stats.input_read_bases}" input_read_count: "{outputs.stats.input_read_count}" output_read_bases: "{outputs.stats.output_read_bases}" output_read_count: "{outputs.stats.output_read_count}" - type: nmdc:ReadQcAnalysisActivity + type: nmdc:ReadQcAnalysis Outputs: - Filtered Sequencing Reads - QC Statistics - Name: Readbased Taxonomy Import: false - Type: nmdc:ReadBasedTaxonomyAnalysisActivity + Type: nmdc:ReadBasedTaxonomyAnalysis Git_repo: https://github.com/microbiomedata/ReadsQC Version: v1.0.5 - Collection: read_based_taxonomy_analysis_activity_set - ActivityRange: ReadBasedTaxonomyAnalysisActivity + Collection: workflow_execution_set + WorkflowExecutionRange: ReadBasedTaxonomyAnalysis Inputs: - Filtered Sequencing Reads - Activity: - name: Readbased Taxonomy Analysis Activity for {id} - type: nmdc:ReadBasedTaxonomyAnalysisActivity + Workflow_Execution: + name: Readbased Taxonomy Analysis for {id} + type: nmdc:ReadBasedTaxonomyAnalysis Outputs: - GOTTCHA2 Classification Report - GOTTCHA2 Report Full @@ -60,12 +47,12 @@ Workflows: Type: nmdc:MetagenomeAssembly Git_repo: https://github.com/microbiomedata/metaAssembly Version: v1.0.3 - Collection: metagenome_assembly_set - ActivityRange: MetagenomeAssembly + Collection: workflow_execution_set + WorkflowExecutionRange: MetagenomeAssembly Inputs: - Filtered Sequencing Reads - Activity: - name: "Metagenome Assembly Activity for {id}" + Workflow_Execution: + name: "Metagenome Assembly for {id}" type: nmdc:MetagenomeAssembly asm_score: "{outputs.stats.asm_score}" contig_bp: "{outputs.stats.contig_bp}" @@ -101,16 +88,16 @@ Workflows: - Name: Metagenome Annotation Import: false - Type: nmdc:MetagenomeAnnotationActivity + Type: nmdc:MetagenomeAnnotation Git_repo: https://github.com/microbiomedata/mg_annotation Version: v1.0.4 - Collection: metagenome_annotation_activity_set - ActivityRange: MetagenomeAnnotationActivity + Collection: workflow_execution_set + WorkflowExecutionRange: MetagenomeAnnotation Inputs: - Assembly Contigs - Activity: - name: "Metagenome Annotation Analysis Activity for {id}" - type: nmdc:MetagenomeAnnotationActivity + Workflow_Execution: + name: "Metagenome Annotation Analysis for {id}" + type: nmdc:MetagenomeAnnotation Outputs: - Annotation Amino Acid FASTA - Structural Annotation GFF @@ -137,11 +124,11 @@ Workflows: - Name: MAGs Import: false - Type: nmdc:MagsAnalysisActivity + Type: nmdc:MagsAnalysis Git_repo: https://github.com/microbiomedata/metaMAGs Version: v1.0.6 - Collection: mags_activity_set - ActivityRange: MagsAnalysisActivity + Collection: workflow_execution_set + WorkflowExecutionRange: MagsAnalysis Inputs: - Assembly Contigs - Functional Annotation GFF @@ -157,9 +144,9 @@ Workflows: - SMART Annotation GFF - Annotation Amino Acid FASTA - Gene Phylogeny tsv - Activity: - name: "Metagenome Assembled Genomes Analysis Activity for {id}" - type: nmdc:MagsAnalysisActivity + Workflow_Execution: + name: "Metagenome Assembled Genomes Analysis for {id}" + type: nmdc:MagsAnalysis Outputs: - CheckM Statistics - Metagenome Bins @@ -173,8 +160,8 @@ Data Objects: name: Raw sequencer read data import_suffix: .[A-Z]+-[A-Z]+.fastq.gz nmdc_suffix: .fastq.gz - input_to: [nmdc:ReadQcAnalysisActivity] - output_of: nmdc:MetagenomeSequencingActivity + input_to: [nmdc:ReadQcAnalysis] + output_of: nmdc:NucleotideSequencing mulitple: false action: none - data_object_type: CheckM Statistics @@ -183,7 +170,7 @@ Data Objects: import_suffix: _checkm_qa.out nmdc_suffix: _checkm_qa.out input_to: [] - output_of: nmdc:MagsAnalysisActivity + output_of: nmdc:MagsAnalysis mulitple: false action: rename - data_object_type: GTDBTK Bacterial Summary @@ -192,7 +179,7 @@ Data Objects: import_suffix: _gtdbtk.bac122.summary.tsv nmdc_suffix: _gtdbtk.bac122.summary.tsv input_to: [] - output_of: nmdc:MagsAnalysisActivity + output_of: nmdc:MagsAnalysis mulitple: false action: rename - data_object_type: GTDBTK Archaeal Summary @@ -201,7 +188,7 @@ Data Objects: import_suffix: _gtdbtk.ar122.summary.tsv nmdc_suffix: _gtdbtk.ar122.summary.tsv input_to: [] - output_of: nmdc:MagsAnalysisActivity + output_of: nmdc:MagsAnalysis mulitple: false action: rename - data_object_type: Annotation Amino Acid FASTA @@ -209,8 +196,8 @@ Data Objects: name: FASTA amino acid file for annotated proteins import_suffix: _proteins.faa nmdc_suffix: _proteins.faa - input_to: [nmdc:MagsAnalysisActivity] - output_of: nmdc:MetagenomeAnnotationActivity + input_to: [nmdc:MagsAnalysis] + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: Contig Mapping File @@ -219,7 +206,7 @@ Data Objects: import_suffix: _contig_names_mapping.tsv nmdc_suffix: _contig_names_mapping.tsv input_to: [] - output_of: nmdc:MetagenomeAnnotationActivity + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: Structural Annotation GFF @@ -228,7 +215,7 @@ Data Objects: import_suffix: _structural_annotation.gff nmdc_suffix: _structural_annotation.gff input_to: [] - output_of: nmdc:MetagenomeAnnotationActivity + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: Functional Annotation GFF @@ -236,8 +223,8 @@ Data Objects: name: GFF3 format file with functional annotations import_suffix: _functional_annotation.gff nmdc_suffix: _functional_annotation.gff - input_to: [nmdc:MagsAnalysisActivity] - output_of: nmdc:MetagenomeAnnotationActivity + input_to: [nmdc:MagsAnalysis] + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: Annotation KEGG Orthology @@ -245,8 +232,8 @@ Data Objects: name: Tab delimited file for KO annotation import_suffix: _ko.tsv nmdc_suffix: _ko.tsv - input_to: [nmdc:MagsAnalysisActivity] - output_of: nmdc:MetagenomeAnnotationActivity + input_to: [nmdc:MagsAnalysis] + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: Annotation Enzyme Commission @@ -254,8 +241,8 @@ Data Objects: name: Tab delimited file for EC annotation import_suffix: _ec.tsv nmdc_suffix: _ec.tsv - input_to: [nmdc:MagsAnalysisActivity] - output_of: nmdc:MetagenomeAnnotationActivity + input_to: [nmdc:MagsAnalysis] + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: Clusters of Orthologous Groups (COG) Annotation GFF @@ -263,8 +250,8 @@ Data Objects: name: GFF3 format file with COGs import_suffix: _cog.gff nmdc_suffix: _cog.gff - input_to: [nmdc:MagsAnalysisActivity] - output_of: nmdc:MetagenomeAnnotationActivity + input_to: [nmdc:MagsAnalysis] + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: Pfam Annotation GFF @@ -272,8 +259,8 @@ Data Objects: name: GFF3 format file with Pfam import_suffix: _pfam.gff nmdc_suffix: _pfam.gff - input_to: [nmdc:MagsAnalysisActivity] - output_of: nmdc:MetagenomeAnnotationActivity + input_to: [nmdc:MagsAnalysis] + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: TIGRFam Annotation GFF @@ -281,8 +268,8 @@ Data Objects: name: GFF3 format file with TIGRfam import_suffix: _tigrfam.gff nmdc_suffix: _tigrfam.gff - input_to: [nmdc:MagsAnalysisActivity] - output_of: nmdc:MetagenomeAnnotationActivity + input_to: [nmdc:MagsAnalysis] + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: SMART Annotation GFF @@ -290,8 +277,8 @@ Data Objects: name: GFF3 format file with SMART import_suffix: _smart.gff nmdc_suffix: _smart.gff - input_to: [nmdc:MagsAnalysisActivity] - output_of: nmdc:MetagenomeAnnotationActivity + input_to: [nmdc:MagsAnalysis] + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: SUPERFam Annotation GFF @@ -299,8 +286,8 @@ Data Objects: name: GFF3 format file with SUPERFam import_suffix: _supfam.gff nmdc_suffix: _supfam.gff - input_to: [nmdc:MagsAnalysisActivity] - output_of: nmdc:MetagenomeAnnotationActivity + input_to: [nmdc:MagsAnalysis] + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: CATH FunFams (Functional Families) Annotation GFF @@ -308,8 +295,8 @@ Data Objects: name: GFF3 format file with CATH FunFams import_suffix: _cath_funfam.gff nmdc_suffix: _cath_funfam.gff - input_to: [nmdc:MagsAnalysisActivity] - output_of: nmdc:MetagenomeAnnotationActivity + input_to: [nmdc:MagsAnalysis] + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: CRT Annotation GFF @@ -318,7 +305,7 @@ Data Objects: import_suffix: _crt.gff nmdc_suffix: _crt.gff input_to: [] - output_of: nmdc:MetagenomeAnnotationActivity + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: Genemark Annotation GFF @@ -327,7 +314,7 @@ Data Objects: import_suffix: _genemark.gff nmdc_suffix: _genemark.gff input_to: [] - output_of: nmdc:MetagenomeAnnotationActivity + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: Prodigal Annotation GFF @@ -336,7 +323,7 @@ Data Objects: import_suffix: _prodigal.gff nmdc_suffix: _prodigal.gff input_to: [] - output_of: nmdc:MetagenomeAnnotationActivity + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: TRNA Annotation GFF @@ -345,7 +332,7 @@ Data Objects: import_suffix: _trna.gff nmdc_suffix: _trna.gff input_to: [] - output_of: nmdc:MetagenomeAnnotationActivity + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: RFAM Annotation GFF @@ -354,7 +341,7 @@ Data Objects: import_suffix: _rfam.gff nmdc_suffix: _rfam.gff input_to: [] - output_of: nmdc:MetagenomeAnnotationActivity + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: KO_EC Annotation GFF @@ -363,7 +350,7 @@ Data Objects: import_suffix: _ko_ec.gff nmdc_suffix: _ko_ec.gff input_to: [] - output_of: nmdc:MetagenomeAnnotationActivity + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: Product Names @@ -371,8 +358,8 @@ Data Objects: name: Product names file import_suffix: _product_names.tsv nmdc_suffix: _product_names.tsv - input_to: [nmdc:MagsAnalysisActivity] - output_of: nmdc:MetagenomeAnnotationActivity + input_to: [nmdc:MagsAnalysis] + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: Gene Phylogeny tsv @@ -380,8 +367,8 @@ Data Objects: name: Gene Phylogeny file import_suffix: _gene_phylogeny.tsv nmdc_suffix: _gene_phylogeny.tsv - input_to: [nmdc:MagsAnalysisActivity] - output_of: nmdc:MetagenomeAnnotationActivity + input_to: [nmdc:MagsAnalysis] + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: Crispr Terms @@ -390,7 +377,7 @@ Data Objects: import_suffix: _crt.crisprs nmdc_suffix: _crt.crisprs input_to: [] - output_of: nmdc:MetagenomeAnnotationActivity + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: Annotation Statistics @@ -399,7 +386,7 @@ Data Objects: import_suffix: _stats.tsv nmdc_suffix: _stats.tsv input_to: [] - output_of: nmdc:MetagenomeAnnotationActivity + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: Annotation Info File @@ -408,7 +395,7 @@ Data Objects: import_suffix: _imgap.info nmdc_suffix: _imgap.info input_to: [] - output_of: nmdc:MetagenomeAnnotationActivity + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: Filtered Sequencing Reads @@ -416,8 +403,8 @@ Data Objects: name: Reads QC result fastq (clean data) import_suffix: filter-METAGENOME.fastq.gz nmdc_suffix: _filtered.fastq.gz - input_to: [nmdc:ReadBasedTaxonomyAnalysisActivity,nmdc:MetagenomeAssembly] - output_of: nmdc:ReadQcAnalysisActivity + input_to: [nmdc:ReadBasedTaxonomyAnalysis,nmdc:MetagenomeAssembly] + output_of: nmdc:ReadQcAnalysis mulitple: false action: rename - data_object_type: QC Statistics @@ -426,7 +413,7 @@ Data Objects: import_suffix: .filtered-report.txt nmdc_suffix: _filterStats.txt input_to: [] - output_of: nmdc:ReadQcAnalysisActivity + output_of: nmdc:ReadQcAnalysis mulitple: false action: rename - data_object_type: Read Filtering Info File @@ -435,7 +422,7 @@ Data Objects: import_suffix: _readsQC.info nmdc_suffix: _readsQC.info input_to: [] - output_of: nmdc:ReadQcAnalysisActivity + output_of: nmdc:ReadQcAnalysis mulitple: false action: rename - data_object_type: Assembly Contigs @@ -443,7 +430,7 @@ Data Objects: name: Final assembly contigs fasta import_suffix: assembly.contigs.fasta nmdc_suffix: _contigs.fna - input_to: [nmdc:MetagenomeAnnotationActivity,nmdc:MagsAnalysisActivity] + input_to: [nmdc:MetagenomeAnnotation,nmdc:MagsAnalysis] output_of: nmdc:MetagenomeAssembly mulitple: false action: rename @@ -488,7 +475,7 @@ Data Objects: name: Sorted bam file of reads mapping back to the final assembly import_suffix: pairedMapped.sam.gz nmdc_suffix: _pairedMapped_sorted.sam.gz - input_to: [nmdc:MagsAnalysisActivity] + input_to: [nmdc:MagsAnalysis] output_of: nmdc:MetagenomeAssembly mulitple: false action: rename @@ -498,7 +485,7 @@ Data Objects: import_suffix: _gottcha2_full.tsv nmdc_suffix: _gottcha2_full.tsv input_to: [] - output_of: nmdc:ReadBasedTaxonomyAnalysisActivity + output_of: nmdc:ReadBasedTaxonomyAnalysis mulitple: false action: rename - data_object_type: GOTTCHA2 Classification Report @@ -507,7 +494,7 @@ Data Objects: import_suffix: _gottcha2_classification.tsv nmdc_suffix: _gottcha2_classification.tsv input_to: [] - output_of: nmdc:ReadBasedTaxonomyAnalysisActivity + output_of: nmdc:ReadBasedTaxonomyAnalysis mulitple: false action: rename - data_object_type: GOTTCHA2 Krona Plot @@ -516,7 +503,7 @@ Data Objects: import_suffix: _gottcha2_krona.html nmdc_suffix: _gottcha2_krona.html input_to: [] - output_of: nmdc:ReadBasedTaxonomyAnalysisActivity + output_of: nmdc:ReadBasedTaxonomyAnalysis mulitple: false action: rename - data_object_type: Centrifuge Taxonomic Classification @@ -525,7 +512,7 @@ Data Objects: import_suffix: _centrifuge_classification.tsv nmdc_suffix: _centrifuge_classification.tsv input_to: [] - output_of: nmdc:ReadBasedTaxonomyAnalysisActivity + output_of: nmdc:ReadBasedTaxonomyAnalysis mulitple: false action: rename - data_object_type: Centrifuge output report file @@ -534,7 +521,7 @@ Data Objects: import_suffix: _centrifuge_report.tsv nmdc_suffix: _centrifuge_report.tsv input_to: [] - output_of: nmdc:ReadbasedTaxonomyAnalysisActivity + output_of: nmdc:ReadBasedTaxonomyAnalysis mulitple: false action: rename - data_object_type: Centrifuge Krona Plot @@ -543,7 +530,7 @@ Data Objects: import_suffix: _centrifuge_krona.html nmdc_suffix: _centrifuge_krona.html input_to: [] - output_of: nmdc:ReadbasedTaxonomyAnalysisActivity + output_of: nmdc:ReadBasedTaxonomyAnalysis mulitple: false action: rename - data_object_type: Kraken2 Classification Report @@ -552,7 +539,7 @@ Data Objects: import_suffix: _kraken2_report.tsv nmdc_suffix: _kraken2_report.tsv input_to: [] - output_of: nmdc:ReadbasedTaxonomyAnalysisActivity + output_of: nmdc:ReadBasedTaxonomyAnalysis mulitple: false action: rename - data_object_type: Kraken2 Taxonomic Classification @@ -561,7 +548,7 @@ Data Objects: import_suffix: _kraken2_classification.tsv nmdc_suffix: _kraken2_classification.tsv input_to: [] - output_of: nmdc:ReadbasedTaxonomyAnalysisActivity + output_of: nmdc:ReadBasedTaxonomyAnalysis mulitple: false action: rename - data_object_type: Kraken2 Krona Plot @@ -570,7 +557,7 @@ Data Objects: import_suffix: _kraken2_krona.html nmdc_suffix: _kraken2_krona.html input_to: [] - output_of: nmdc:ReadbasedTaxonomyAnalysisActivity + output_of: nmdc:ReadBasedTaxonomyAnalysis mulitple: false action: rename Multiples: @@ -580,7 +567,7 @@ Data Objects: import_suffix: _[0-9]+.tar.gz nmdc_suffix: _hqmq_bin.zip input_to: [] - output_of: nmdc:MagsAnalysisActivity + output_of: nmdc:MagsAnalysis mulitple: true action: zip From 9fa37379b2fbbab1d70938329599374514feabb5 Mon Sep 17 00:00:00 2001 From: aclum Date: Mon, 19 Aug 2024 17:09:45 -0700 Subject: [PATCH 05/52] Berkeley pdate import_test.yaml --- tests/import_test.yaml | 181 +++++++++++++++++++---------------------- 1 file changed, 84 insertions(+), 97 deletions(-) diff --git a/tests/import_test.yaml b/tests/import_test.yaml index af06137f..a852d842 100644 --- a/tests/import_test.yaml +++ b/tests/import_test.yaml @@ -1,49 +1,36 @@ Workflows: - - Name: Sequencing - Import: true - Type: nmdc:MetagenomeSequencingActivity - Git_repo: https://github.com/microbiomedata/RawSequencingData - Version: v1.0.0 - Collection: metagenome_sequencing_activity_set - ActivityRange: MetagenomeSequencingActivity - Activity: - name: "Metagenome Sequencing Activity for {id}" - type: nmdc:MetagenomeSequencingActivity - Outputs: - - Metagenome Raw Reads - - Name: Reads QC Import: true - Type: nmdc:ReadQcAnalysisActivity + Type: nmdc:ReadQcAnalysis Git_repo: https://github.com/microbiomedata/ReadsQC Version: v1.0.8 - Collection: read_qc_analysis_activity_set - ActivityRange: ReadQcAnalysisActivity + Collection: workflow_execution_set + WorkflowExecutionRange: ReadQcAnalysis Inputs: - Metagenome Raw Reads - Activity: - name: "Read QC Activity for {id}" + Workflow_Execution: + name: "Read QC for {id}" input_read_bases: "{outputs.stats.input_read_bases}" input_read_count: "{outputs.stats.input_read_count}" output_read_bases: "{outputs.stats.output_read_bases}" output_read_count: "{outputs.stats.output_read_count}" - type: nmdc:ReadQcAnalysisActivity + type: nmdc:ReadQcAnalysis Outputs: - Filtered Sequencing Reads - QC Statistics - Name: Readbased Taxonomy Import: false - Type: nmdc:ReadBasedTaxonomyAnalysisActivity + Type: nmdc:ReadBasedTaxonomyAnalysis Git_repo: https://github.com/microbiomedata/ReadsQC Version: v1.0.5 - Collection: read_based_taxonomy_analysis_activity_set - ActivityRange: ReadBasedTaxonomyAnalysisActivity + Collection: workflow_execution_set + WorkflowExecutionRange: ReadBasedTaxonomyAnalysis Inputs: - Filtered Sequencing Reads - Activity: - name: Readbased Taxonomy Analysis Activity for {id} - type: nmdc:ReadBasedTaxonomyAnalysisActivity + Workflow_Execution: + name: Readbased Taxonomy Analysis for {id} + type: nmdc:ReadBasedTaxonomyAnalysis Outputs: - GOTTCHA2 Classification Report - GOTTCHA2 Report Full @@ -60,12 +47,12 @@ Workflows: Type: nmdc:MetagenomeAssembly Git_repo: https://github.com/microbiomedata/metaAssembly Version: v1.0.3 - Collection: metagenome_assembly_set - ActivityRange: MetagenomeAssembly + Collection: workflow_execution_set + WorkflowExecutionRange: MetagenomeAssembly Inputs: - Filtered Sequencing Reads - Activity: - name: "Metagenome Assembly Activity for {id}" + Workflow_Execution: + name: "Metagenome Assembly for {id}" type: nmdc:MetagenomeAssembly asm_score: "{outputs.stats.asm_score}" contig_bp: "{outputs.stats.contig_bp}" @@ -101,16 +88,16 @@ Workflows: - Name: Metagenome Annotation Import: true - Type: nmdc:MetagenomeAnnotationActivity + Type: nmdc:MetagenomeAnnotation Git_repo: https://github.com/microbiomedata/mg_annotation Version: v1.0.4 - Collection: metagenome_annotation_activity_set - ActivityRange: MetagenomeAnnotationActivity + Collection: workflow_execution_set + WorkflowExecutionRange: MetagenomeAnnotation Inputs: - Assembly Contigs - Activity: - name: "Metagenome Annotation Analysis Activity for {id}" - type: nmdc:MetagenomeAnnotationActivity + Workflow_Execution: + name: "Metagenome Annotation Analysis for {id}" + type: nmdc:MetagenomeAnnotation Outputs: - Annotation Amino Acid FASTA - Structural Annotation GFF @@ -137,11 +124,11 @@ Workflows: - Name: MAGs Import: true - Type: nmdc:MagsAnalysisActivity + Type: nmdc:MagsAnalysis Git_repo: https://github.com/microbiomedata/metaMAGs Version: v1.0.6 - Collection: mags_activity_set - ActivityRange: MagsAnalysisActivity + Collection: workflow_execution_set + WorkflowExecutionRange: MagsAnalysis Inputs: - Assembly Contigs - Functional Annotation GFF @@ -157,9 +144,9 @@ Workflows: - SMART Annotation GFF - Annotation Amino Acid FASTA - Gene Phylogeny tsv - Activity: - name: "Metagenome Assembled Genomes Analysis Activity for {id}" - type: nmdc:MagsAnalysisActivity + Workflow_Execution: + name: "Metagenome Assembled Genomes Analysis for {id}" + type: nmdc:MagsAnalysis Outputs: - CheckM Statistics - Metagenome Bins @@ -173,8 +160,8 @@ Data Objects: name: Raw sequencer read data import_suffix: .[A-Z]+-[A-Z]+.fastq.gz nmdc_suffix: .fastq.gz - input_to: [nmdc:ReadQcAnalysisActivity] - output_of: nmdc:MetagenomeSequencingActivity + input_to: [nmdc:ReadQcAnalysis] + output_of: nmdc:NucleotideSequencing mulitple: false action: none - data_object_type: CheckM Statistics @@ -183,7 +170,7 @@ Data Objects: import_suffix: _checkm_qa.out nmdc_suffix: _checkm_qa.out input_to: [] - output_of: nmdc:MagsAnalysisActivity + output_of: nmdc:MagsAnalysis mulitple: false action: rename - data_object_type: GTDBTK Bacterial Summary @@ -192,7 +179,7 @@ Data Objects: import_suffix: _gtdbtk.bac122.summary.tsv nmdc_suffix: _gtdbtk.bac122.summary.tsv input_to: [] - output_of: nmdc:MagsAnalysisActivity + output_of: nmdc:MagsAnalysis mulitple: false action: rename - data_object_type: GTDBTK Archaeal Summary @@ -201,7 +188,7 @@ Data Objects: import_suffix: _gtdbtk.ar122.summary.tsv nmdc_suffix: _gtdbtk.ar122.summary.tsv input_to: [] - output_of: nmdc:MagsAnalysisActivity + output_of: nmdc:MagsAnalysis mulitple: false action: rename - data_object_type: Annotation Amino Acid FASTA @@ -209,8 +196,8 @@ Data Objects: name: FASTA amino acid file for annotated proteins import_suffix: _proteins.faa nmdc_suffix: _proteins.faa - input_to: [nmdc:MagsAnalysisActivity] - output_of: nmdc:MetagenomeAnnotationActivity + input_to: [nmdc:MagsAnalysis] + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: Contig Mapping File @@ -219,7 +206,7 @@ Data Objects: import_suffix: _contig_names_mapping.tsv nmdc_suffix: _contig_names_mapping.tsv input_to: [] - output_of: nmdc:MetagenomeAnnotationActivity + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: Structural Annotation GFF @@ -228,7 +215,7 @@ Data Objects: import_suffix: _structural_annotation.gff nmdc_suffix: _structural_annotation.gff input_to: [] - output_of: nmdc:MetagenomeAnnotationActivity + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: Functional Annotation GFF @@ -236,8 +223,8 @@ Data Objects: name: GFF3 format file with functional annotations import_suffix: _functional_annotation.gff nmdc_suffix: _functional_annotation.gff - input_to: [nmdc:MagsAnalysisActivity] - output_of: nmdc:MetagenomeAnnotationActivity + input_to: [nmdc:MagsAnalysis] + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: Annotation KEGG Orthology @@ -245,8 +232,8 @@ Data Objects: name: Tab delimited file for KO annotation import_suffix: _ko.tsv nmdc_suffix: _ko.tsv - input_to: [nmdc:MagsAnalysisActivity] - output_of: nmdc:MetagenomeAnnotationActivity + input_to: [nmdc:MagsAnalysis] + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: Annotation Enzyme Commission @@ -254,8 +241,8 @@ Data Objects: name: Tab delimited file for EC annotation import_suffix: _ec.tsv nmdc_suffix: _ec.tsv - input_to: [nmdc:MagsAnalysisActivity] - output_of: nmdc:MetagenomeAnnotationActivity + input_to: [nmdc:MagsAnalysis] + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: Clusters of Orthologous Groups (COG) Annotation GFF @@ -263,8 +250,8 @@ Data Objects: name: GFF3 format file with COGs import_suffix: _cog.gff nmdc_suffix: _cog.gff - input_to: [nmdc:MagsAnalysisActivity] - output_of: nmdc:MetagenomeAnnotationActivity + input_to: [nmdc:MagsAnalysis] + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: Pfam Annotation GFF @@ -272,8 +259,8 @@ Data Objects: name: GFF3 format file with Pfam import_suffix: _pfam.gff nmdc_suffix: _pfam.gff - input_to: [nmdc:MagsAnalysisActivity] - output_of: nmdc:MetagenomeAnnotationActivity + input_to: [nmdc:MagsAnalysis] + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: TIGRFam Annotation GFF @@ -281,8 +268,8 @@ Data Objects: name: GFF3 format file with TIGRfam import_suffix: _tigrfam.gff nmdc_suffix: _tigrfam.gff - input_to: [nmdc:MagsAnalysisActivity] - output_of: nmdc:MetagenomeAnnotationActivity + input_to: [nmdc:MagsAnalysis] + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: SMART Annotation GFF @@ -290,8 +277,8 @@ Data Objects: name: GFF3 format file with SMART import_suffix: _smart.gff nmdc_suffix: _smart.gff - input_to: [nmdc:MagsAnalysisActivity] - output_of: nmdc:MetagenomeAnnotationActivity + input_to: [nmdc:MagsAnalysis] + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: SUPERFam Annotation GFF @@ -299,8 +286,8 @@ Data Objects: name: GFF3 format file with SUPERFam import_suffix: _supfam.gff nmdc_suffix: _supfam.gff - input_to: [nmdc:MagsAnalysisActivity] - output_of: nmdc:MetagenomeAnnotationActivity + input_to: [nmdc:MagsAnalysis] + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: CATH FunFams (Functional Families) Annotation GFF @@ -308,8 +295,8 @@ Data Objects: name: GFF3 format file with CATH FunFams import_suffix: _cath_funfam.gff nmdc_suffix: _cath_funfam.gff - input_to: [nmdc:MagsAnalysisActivity] - output_of: nmdc:MetagenomeAnnotationActivity + input_to: [nmdc:MagsAnalysis] + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: CRT Annotation GFF @@ -318,7 +305,7 @@ Data Objects: import_suffix: _crt.gff nmdc_suffix: _crt.gff input_to: [] - output_of: nmdc:MetagenomeAnnotationActivity + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: Genemark Annotation GFF @@ -327,7 +314,7 @@ Data Objects: import_suffix: _genemark.gff nmdc_suffix: _genemark.gff input_to: [] - output_of: nmdc:MetagenomeAnnotationActivity + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: Prodigal Annotation GFF @@ -336,7 +323,7 @@ Data Objects: import_suffix: _prodigal.gff nmdc_suffix: _prodigal.gff input_to: [] - output_of: nmdc:MetagenomeAnnotationActivity + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: TRNA Annotation GFF @@ -345,7 +332,7 @@ Data Objects: import_suffix: _trna.gff nmdc_suffix: _trna.gff input_to: [] - output_of: nmdc:MetagenomeAnnotationActivity + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: RFAM Annotation GFF @@ -354,7 +341,7 @@ Data Objects: import_suffix: _rfam.gff nmdc_suffix: _rfam.gff input_to: [] - output_of: nmdc:MetagenomeAnnotationActivity + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: KO_EC Annotation GFF @@ -363,7 +350,7 @@ Data Objects: import_suffix: _ko_ec.gff nmdc_suffix: _ko_ec.gff input_to: [] - output_of: nmdc:MetagenomeAnnotationActivity + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: Product Names @@ -371,8 +358,8 @@ Data Objects: name: Product names file import_suffix: _product_names.tsv nmdc_suffix: _product_names.tsv - input_to: [nmdc:MagsAnalysisActivity] - output_of: nmdc:MetagenomeAnnotationActivity + input_to: [nmdc:MagsAnalysis] + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: Gene Phylogeny tsv @@ -380,8 +367,8 @@ Data Objects: name: Gene Phylogeny file import_suffix: _gene_phylogeny.tsv nmdc_suffix: _gene_phylogeny.tsv - input_to: [nmdc:MagsAnalysisActivity] - output_of: nmdc:MetagenomeAnnotationActivity + input_to: [nmdc:MagsAnalysis] + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: Crispr Terms @@ -390,7 +377,7 @@ Data Objects: import_suffix: _crt.crisprs nmdc_suffix: _crt.crisprs input_to: [] - output_of: nmdc:MetagenomeAnnotationActivity + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: Annotation Statistics @@ -399,7 +386,7 @@ Data Objects: import_suffix: _stats.tsv nmdc_suffix: _stats.tsv input_to: [] - output_of: nmdc:MetagenomeAnnotationActivity + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: Annotation Info File @@ -408,7 +395,7 @@ Data Objects: import_suffix: _imgap.info nmdc_suffix: _imgap.info input_to: [] - output_of: nmdc:MetagenomeAnnotationActivity + output_of: nmdc:MetagenomeAnnotation mulitple: false action: rename - data_object_type: Filtered Sequencing Reads @@ -416,8 +403,8 @@ Data Objects: name: Reads QC result fastq (clean data) import_suffix: filter-METAGENOME.fastq.gz nmdc_suffix: _filtered.fastq.gz - input_to: [nmdc:ReadBasedTaxonomyAnalysisActivity,nmdc:MetagenomeAssembly] - output_of: nmdc:ReadQcAnalysisActivity + input_to: [nmdc:ReadBasedTaxonomyAnalysis,nmdc:MetagenomeAssembly] + output_of: nmdc:ReadQcAnalysis mulitple: false action: rename - data_object_type: QC Statistics @@ -426,7 +413,7 @@ Data Objects: import_suffix: .filtered-report.txt nmdc_suffix: _filterStats.txt input_to: [] - output_of: nmdc:ReadQcAnalysisActivity + output_of: nmdc:ReadQcAnalysis mulitple: false action: rename - data_object_type: Read Filtering Info File @@ -435,7 +422,7 @@ Data Objects: import_suffix: _readsQC.info nmdc_suffix: _readsQC.info input_to: [] - output_of: nmdc:ReadQcAnalysisActivity + output_of: nmdc:ReadQcAnalysis mulitple: false action: rename - data_object_type: Assembly Contigs @@ -443,7 +430,7 @@ Data Objects: name: Final assembly contigs fasta import_suffix: assembly.contigs.fasta nmdc_suffix: _contigs.fna - input_to: [nmdc:MetagenomeAnnotationActivity,nmdc:MagsAnalysisActivity] + input_to: [nmdc:MetagenomeAnnotation,nmdc:MagsAnalysis] output_of: nmdc:MetagenomeAssembly mulitple: false action: rename @@ -488,7 +475,7 @@ Data Objects: name: Sorted bam file of reads mapping back to the final assembly import_suffix: pairedMapped.sam.gz nmdc_suffix: _pairedMapped_sorted.sam.gz - input_to: [nmdc:MagsAnalysisActivity] + input_to: [nmdc:MagsAnalysis] output_of: nmdc:MetagenomeAssembly mulitple: false action: rename @@ -498,7 +485,7 @@ Data Objects: import_suffix: _gottcha2_full.tsv nmdc_suffix: _gottcha2_full.tsv input_to: [] - output_of: nmdc:ReadBasedTaxonomyAnalysisActivity + output_of: nmdc:ReadBasedTaxonomyAnalysis mulitple: false action: rename - data_object_type: GOTTCHA2 Classification Report @@ -507,7 +494,7 @@ Data Objects: import_suffix: _gottcha2_classification.tsv nmdc_suffix: _gottcha2_classification.tsv input_to: [] - output_of: nmdc:ReadBasedTaxonomyAnalysisActivity + output_of: nmdc:ReadBasedTaxonomyAnalysis mulitple: false action: rename - data_object_type: GOTTCHA2 Krona Plot @@ -516,7 +503,7 @@ Data Objects: import_suffix: _gottcha2_krona.html nmdc_suffix: _gottcha2_krona.html input_to: [] - output_of: nmdc:ReadBasedTaxonomyAnalysisActivity + output_of: nmdc:ReadBasedTaxonomyAnalysis mulitple: false action: rename - data_object_type: Centrifuge Taxonomic Classification @@ -525,7 +512,7 @@ Data Objects: import_suffix: _centrifuge_classification.tsv nmdc_suffix: _centrifuge_classification.tsv input_to: [] - output_of: nmdc:ReadBasedTaxonomyAnalysisActivity + output_of: nmdc:ReadBasedTaxonomyAnalysis mulitple: false action: rename - data_object_type: Centrifuge output report file @@ -534,7 +521,7 @@ Data Objects: import_suffix: _centrifuge_report.tsv nmdc_suffix: _centrifuge_report.tsv input_to: [] - output_of: nmdc:ReadbasedTaxonomyAnalysisActivity + output_of: nmdc:ReadBasedTaxonomyAnalysis mulitple: false action: rename - data_object_type: Centrifuge Krona Plot @@ -543,7 +530,7 @@ Data Objects: import_suffix: _centrifuge_krona.html nmdc_suffix: _centrifuge_krona.html input_to: [] - output_of: nmdc:ReadbasedTaxonomyAnalysisActivity + output_of: nmdc:ReadBasedTaxonomyAnalysis mulitple: false action: rename - data_object_type: Kraken2 Classification Report @@ -552,7 +539,7 @@ Data Objects: import_suffix: _kraken2_report.tsv nmdc_suffix: _kraken2_report.tsv input_to: [] - output_of: nmdc:ReadbasedTaxonomyAnalysisActivity + output_of: nmdc:ReadBasedTaxonomyAnalysis mulitple: false action: rename - data_object_type: Kraken2 Taxonomic Classification @@ -561,7 +548,7 @@ Data Objects: import_suffix: _kraken2_classification.tsv nmdc_suffix: _kraken2_classification.tsv input_to: [] - output_of: nmdc:ReadbasedTaxonomyAnalysisActivity + output_of: nmdc:ReadBasedTaxonomyAnalysis mulitple: false action: rename - data_object_type: Kraken2 Krona Plot @@ -570,7 +557,7 @@ Data Objects: import_suffix: _kraken2_krona.html nmdc_suffix: _kraken2_krona.html input_to: [] - output_of: nmdc:ReadbasedTaxonomyAnalysisActivity + output_of: nmdc:ReadBasedTaxonomyAnalysis mulitple: false action: rename Multiples: @@ -580,7 +567,7 @@ Data Objects: import_suffix: _[0-9]+.tar.gz nmdc_suffix: _hqmq_bin.zip input_to: [] - output_of: nmdc:MagsAnalysisActivity + output_of: nmdc:MagsAnalysis mulitple: true action: zip From a4b9cfd92f453fcdd37deda4e858921af8e2dc23 Mon Sep 17 00:00:00 2001 From: aclum Date: Mon, 19 Aug 2024 17:15:13 -0700 Subject: [PATCH 06/52] Update test_activities.py --- tests/test_activities.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/test_activities.py b/tests/test_activities.py index 770adffb..15becfa3 100644 --- a/tests/test_activities.py +++ b/tests/test_activities.py @@ -8,6 +8,8 @@ test_dir = os.path.dirname(__file__) test_data = os.path.join(test_dir, "..", "test_data") +#TODO +#is cols_used? if so, update collection set for berkeley cols = [ 'data_object_set', 'metagenome_sequencing_activity_set', @@ -95,4 +97,4 @@ def test_workflows(): for wf in wfs: wfm[wf.name] = wf assert "MAGs" in wfm - assert len(wfm["MAGs"].optional_inputs) == 1 \ No newline at end of file + assert len(wfm["MAGs"].optional_inputs) == 1 From 576710072b3978a492f8baa59be7efd64db36552 Mon Sep 17 00:00:00 2001 From: aclum Date: Mon, 19 Aug 2024 17:26:43 -0700 Subject: [PATCH 07/52] Berkeley Update activity_mapper.py to match config changes --- nmdc_automation/import_automation/activity_mapper.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nmdc_automation/import_automation/activity_mapper.py b/nmdc_automation/import_automation/activity_mapper.py index db85e650..65385cc3 100644 --- a/nmdc_automation/import_automation/activity_mapper.py +++ b/nmdc_automation/import_automation/activity_mapper.py @@ -207,13 +207,13 @@ def activity_mapper(self) -> None: # Lookup the nmdc database class database_activity_set = getattr(self.nmdc_db, workflow["Collection"]) # Lookup the nmdc schema range class - database_activity_range = getattr(nmdc, workflow["ActivityRange"]) + database_activity_range = getattr(nmdc, workflow["WorkflowExecutionRange"]) # Mint an ID activity_id = self.get_activity_id(workflow["Type"]) database_activity_set.append( database_activity_range( id=activity_id, - name=workflow["Activity"]["name"].replace("{id}", activity_id), + name=workflow["Workflow_Execution"]["name"].replace("{id}", activity_id), git_url=workflow["Git_repo"], version=workflow["Version"], part_of=[self.omics_id], From 2f47fbffdc895d37e5d029355856711a619bbc70 Mon Sep 17 00:00:00 2001 From: aclum Date: Mon, 19 Aug 2024 17:45:31 -0700 Subject: [PATCH 08/52] bump nmdc-schema verison to berkeley --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 2fea4ead..042fb7d7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,7 +12,7 @@ python = "^3.9" pymongo = "^4.3.3" pyYAML = "^6.0" requests = "^2.28.2" -nmdc-schema = "^7.5.0" +nmdc-schema = "^v11.0.0rc19" deepdiff = "^6.2.1" pytz = "^2023.3" python-dotenv = "^1.0.0" From 99db9ee146c815262741faecfe9fb81efc08f381 Mon Sep 17 00:00:00 2001 From: aclum Date: Mon, 19 Aug 2024 17:49:30 -0700 Subject: [PATCH 09/52] updating poetry.lock file --- poetry.lock | 1691 ++++++++++++++++++++++++++++++++++----------------- 1 file changed, 1127 insertions(+), 564 deletions(-) diff --git a/poetry.lock b/poetry.lock index b179ad26..41e5d128 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,14 +1,14 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. [[package]] name = "annotated-types" -version = "0.6.0" +version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" files = [ - {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, - {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, + {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]] @@ -42,32 +42,67 @@ test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock [[package]] name = "attrs" -version = "23.2.0" +version = "24.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, - {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, + {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, + {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, +] + +[package.extras] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] + +[[package]] +name = "babel" +version = "2.16.0" +description = "Internationalization utilities" +optional = false +python-versions = ">=3.8" +files = [ + {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, + {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, +] + +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] + +[[package]] +name = "beautifulsoup4" +version = "4.12.3" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, ] +[package.dependencies] +soupsieve = ">1.2" + [package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] -tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] +html5lib = ["html5lib"] +lxml = ["lxml"] [[package]] name = "certifi" -version = "2024.2.2" +version = "2024.7.4" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, + {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, + {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, ] [[package]] @@ -220,63 +255,83 @@ files = [ [[package]] name = "coverage" -version = "7.5.0" +version = "7.6.1" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:432949a32c3e3f820af808db1833d6d1631664d53dd3ce487aa25d574e18ad1c"}, - {file = "coverage-7.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2bd7065249703cbeb6d4ce679c734bef0ee69baa7bff9724361ada04a15b7e3b"}, - {file = "coverage-7.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbfe6389c5522b99768a93d89aca52ef92310a96b99782973b9d11e80511f932"}, - {file = "coverage-7.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39793731182c4be939b4be0cdecde074b833f6171313cf53481f869937129ed3"}, - {file = "coverage-7.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85a5dbe1ba1bf38d6c63b6d2c42132d45cbee6d9f0c51b52c59aa4afba057517"}, - {file = "coverage-7.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:357754dcdfd811462a725e7501a9b4556388e8ecf66e79df6f4b988fa3d0b39a"}, - {file = "coverage-7.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a81eb64feded34f40c8986869a2f764f0fe2db58c0530d3a4afbcde50f314880"}, - {file = "coverage-7.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:51431d0abbed3a868e967f8257c5faf283d41ec882f58413cf295a389bb22e58"}, - {file = "coverage-7.5.0-cp310-cp310-win32.whl", hash = "sha256:f609ebcb0242d84b7adeee2b06c11a2ddaec5464d21888b2c8255f5fd6a98ae4"}, - {file = "coverage-7.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:6782cd6216fab5a83216cc39f13ebe30adfac2fa72688c5a4d8d180cd52e8f6a"}, - {file = "coverage-7.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e768d870801f68c74c2b669fc909839660180c366501d4cc4b87efd6b0eee375"}, - {file = "coverage-7.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:84921b10aeb2dd453247fd10de22907984eaf80901b578a5cf0bb1e279a587cb"}, - {file = "coverage-7.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:710c62b6e35a9a766b99b15cdc56d5aeda0914edae8bb467e9c355f75d14ee95"}, - {file = "coverage-7.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c379cdd3efc0658e652a14112d51a7668f6bfca7445c5a10dee7eabecabba19d"}, - {file = "coverage-7.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fea9d3ca80bcf17edb2c08a4704259dadac196fe5e9274067e7a20511fad1743"}, - {file = "coverage-7.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:41327143c5b1d715f5f98a397608f90ab9ebba606ae4e6f3389c2145410c52b1"}, - {file = "coverage-7.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:565b2e82d0968c977e0b0f7cbf25fd06d78d4856289abc79694c8edcce6eb2de"}, - {file = "coverage-7.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cf3539007202ebfe03923128fedfdd245db5860a36810136ad95a564a2fdffff"}, - {file = "coverage-7.5.0-cp311-cp311-win32.whl", hash = "sha256:bf0b4b8d9caa8d64df838e0f8dcf68fb570c5733b726d1494b87f3da85db3a2d"}, - {file = "coverage-7.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c6384cc90e37cfb60435bbbe0488444e54b98700f727f16f64d8bfda0b84656"}, - {file = "coverage-7.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fed7a72d54bd52f4aeb6c6e951f363903bd7d70bc1cad64dd1f087980d309ab9"}, - {file = "coverage-7.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cbe6581fcff7c8e262eb574244f81f5faaea539e712a058e6707a9d272fe5b64"}, - {file = "coverage-7.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad97ec0da94b378e593ef532b980c15e377df9b9608c7c6da3506953182398af"}, - {file = "coverage-7.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd4bacd62aa2f1a1627352fe68885d6ee694bdaebb16038b6e680f2924a9b2cc"}, - {file = "coverage-7.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:adf032b6c105881f9d77fa17d9eebe0ad1f9bfb2ad25777811f97c5362aa07f2"}, - {file = "coverage-7.5.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4ba01d9ba112b55bfa4b24808ec431197bb34f09f66f7cb4fd0258ff9d3711b1"}, - {file = "coverage-7.5.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f0bfe42523893c188e9616d853c47685e1c575fe25f737adf473d0405dcfa7eb"}, - {file = "coverage-7.5.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a9a7ef30a1b02547c1b23fa9a5564f03c9982fc71eb2ecb7f98c96d7a0db5cf2"}, - {file = "coverage-7.5.0-cp312-cp312-win32.whl", hash = "sha256:3c2b77f295edb9fcdb6a250f83e6481c679335ca7e6e4a955e4290350f2d22a4"}, - {file = "coverage-7.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:427e1e627b0963ac02d7c8730ca6d935df10280d230508c0ba059505e9233475"}, - {file = "coverage-7.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9dd88fce54abbdbf4c42fb1fea0e498973d07816f24c0e27a1ecaf91883ce69e"}, - {file = "coverage-7.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a898c11dca8f8c97b467138004a30133974aacd572818c383596f8d5b2eb04a9"}, - {file = "coverage-7.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07dfdd492d645eea1bd70fb1d6febdcf47db178b0d99161d8e4eed18e7f62fe7"}, - {file = "coverage-7.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3d117890b6eee85887b1eed41eefe2e598ad6e40523d9f94c4c4b213258e4a4"}, - {file = "coverage-7.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6afd2e84e7da40fe23ca588379f815fb6dbbb1b757c883935ed11647205111cb"}, - {file = "coverage-7.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a9960dd1891b2ddf13a7fe45339cd59ecee3abb6b8326d8b932d0c5da208104f"}, - {file = "coverage-7.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ced268e82af993d7801a9db2dbc1d2322e786c5dc76295d8e89473d46c6b84d4"}, - {file = "coverage-7.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e7c211f25777746d468d76f11719e64acb40eed410d81c26cefac641975beb88"}, - {file = "coverage-7.5.0-cp38-cp38-win32.whl", hash = "sha256:262fffc1f6c1a26125d5d573e1ec379285a3723363f3bd9c83923c9593a2ac25"}, - {file = "coverage-7.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:eed462b4541c540d63ab57b3fc69e7d8c84d5957668854ee4e408b50e92ce26a"}, - {file = "coverage-7.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d0194d654e360b3e6cc9b774e83235bae6b9b2cac3be09040880bb0e8a88f4a1"}, - {file = "coverage-7.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:33c020d3322662e74bc507fb11488773a96894aa82a622c35a5a28673c0c26f5"}, - {file = "coverage-7.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbdf2cae14a06827bec50bd58e49249452d211d9caddd8bd80e35b53cb04631"}, - {file = "coverage-7.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3235d7c781232e525b0761730e052388a01548bd7f67d0067a253887c6e8df46"}, - {file = "coverage-7.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2de4e546f0ec4b2787d625e0b16b78e99c3e21bc1722b4977c0dddf11ca84e"}, - {file = "coverage-7.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d0e206259b73af35c4ec1319fd04003776e11e859936658cb6ceffdeba0f5be"}, - {file = "coverage-7.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2055c4fb9a6ff624253d432aa471a37202cd8f458c033d6d989be4499aed037b"}, - {file = "coverage-7.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:075299460948cd12722a970c7eae43d25d37989da682997687b34ae6b87c0ef0"}, - {file = "coverage-7.5.0-cp39-cp39-win32.whl", hash = "sha256:280132aada3bc2f0fac939a5771db4fbb84f245cb35b94fae4994d4c1f80dae7"}, - {file = "coverage-7.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:c58536f6892559e030e6924896a44098bc1290663ea12532c78cef71d0df8493"}, - {file = "coverage-7.5.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:2b57780b51084d5223eee7b59f0d4911c31c16ee5aa12737c7a02455829ff067"}, - {file = "coverage-7.5.0.tar.gz", hash = "sha256:cf62d17310f34084c59c01e027259076479128d11e4661bb6c9acb38c5e19bb8"}, + {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"}, + {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"}, + {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"}, + {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"}, + {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"}, + {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"}, + {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"}, + {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"}, + {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"}, + {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"}, + {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"}, + {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"}, + {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"}, + {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"}, + {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"}, + {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"}, + {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"}, + {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"}, + {file = "coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0"}, + {file = "coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989"}, + {file = "coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7"}, + {file = "coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8"}, + {file = "coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255"}, + {file = "coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36"}, + {file = "coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c"}, + {file = "coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca"}, + {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"}, + {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, ] [package.dependencies] @@ -287,13 +342,13 @@ toml = ["tomli"] [[package]] name = "curies" -version = "0.7.9" +version = "0.7.10" description = "Idiomatic conversion between URIs and compact URIs (CURIEs)." optional = false python-versions = ">=3.8" files = [ - {file = "curies-0.7.9-py3-none-any.whl", hash = "sha256:e4c5beb91642376953c94db0ee2fb5d2b011c3b16749516436114ba61442f260"}, - {file = "curies-0.7.9.tar.gz", hash = "sha256:3b63c5fea7b0e967629a3a384b1a8c59b56c503487c1dcbacddeab59e25db4d8"}, + {file = "curies-0.7.10-py3-none-any.whl", hash = "sha256:ad80f420dd76b6f3e921a245370ff6ab7473c48c29c17254970c03cd2e58af5f"}, + {file = "curies-0.7.10.tar.gz", hash = "sha256:98a7ceb94710fab3a02727a7f85ba0719dd22be5fc8b5f2ad1d7d4cfc47d64ce"}, ] [package.dependencies] @@ -364,6 +419,16 @@ idna = ["idna (>=3.6)"] trio = ["trio (>=0.23)"] wmi = ["wmi (>=1.5.1)"] +[[package]] +name = "editorconfig" +version = "0.12.4" +description = "EditorConfig File Locator and Interpreter for Python" +optional = false +python-versions = "*" +files = [ + {file = "EditorConfig-0.12.4.tar.gz", hash = "sha256:24857fa1793917dd9ccf0c7810a07e05404ce9b823521c7dce22a4fb5d125f80"}, +] + [[package]] name = "et-xmlfile" version = "1.1.0" @@ -377,13 +442,13 @@ files = [ [[package]] name = "exceptiongroup" -version = "1.2.1" +version = "1.2.2" 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"}, + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, ] [package.extras] @@ -391,18 +456,18 @@ test = ["pytest (>=6)"] [[package]] name = "flake8" -version = "7.0.0" +version = "7.1.1" description = "the modular source code checker: pep8 pyflakes and co" optional = false python-versions = ">=3.8.1" files = [ - {file = "flake8-7.0.0-py2.py3-none-any.whl", hash = "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3"}, - {file = "flake8-7.0.0.tar.gz", hash = "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132"}, + {file = "flake8-7.1.1-py2.py3-none-any.whl", hash = "sha256:597477df7860daa5aa0fdd84bf5208a043ab96b8e96ab708770ae0364dd03213"}, + {file = "flake8-7.1.1.tar.gz", hash = "sha256:049d058491e228e03e67b390f311bbf88fce2dbaa8fa673e7aea87b7198b8d38"}, ] [package.dependencies] mccabe = ">=0.7.0,<0.8.0" -pycodestyle = ">=2.11.0,<2.12.0" +pycodestyle = ">=2.12.0,<2.13.0" pyflakes = ">=3.2.0,<3.3.0" [[package]] @@ -416,6 +481,23 @@ files = [ {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, ] +[[package]] +name = "ghp-import" +version = "2.1.0" +description = "Copy your docs directly to the gh-pages branch." +optional = false +python-versions = "*" +files = [ + {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, + {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, +] + +[package.dependencies] +python-dateutil = ">=2.8.1" + +[package.extras] +dev = ["flake8", "markdown", "twine", "wheel"] + [[package]] name = "graphviz" version = "0.20.3" @@ -525,6 +607,25 @@ files = [ {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] +[[package]] +name = "importlib-metadata" +version = "8.3.0" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_metadata-8.3.0-py3-none-any.whl", hash = "sha256:42817a4a0be5845d22c6e212db66a94ad261e2318d80b3e0d363894a79df2b67"}, + {file = "importlib_metadata-8.3.0.tar.gz", hash = "sha256:9c8fa6e8ea0f9516ad5c8db9246a731c948193c7754d3babb0114a05b27dd364"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] + [[package]] name = "iniconfig" version = "2.0.0" @@ -566,13 +667,13 @@ arrow = ">=0.15.0" [[package]] name = "jinja2" -version = "3.1.3" +version = "3.1.4" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, - {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, ] [package.dependencies] @@ -581,6 +682,20 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "jsbeautifier" +version = "1.15.1" +description = "JavaScript unobfuscator and beautifier." +optional = false +python-versions = "*" +files = [ + {file = "jsbeautifier-1.15.1.tar.gz", hash = "sha256:ebd733b560704c602d744eafc839db60a1ee9326e30a2a80c4adb8718adc1b24"}, +] + +[package.dependencies] +editorconfig = ">=0.12.2" +six = ">=1.13.0" + [[package]] name = "json-flattener" version = "0.1.9" @@ -651,24 +766,24 @@ ply = "*" [[package]] name = "jsonpointer" -version = "2.4" +version = "3.0.0" description = "Identify specific nodes in a JSON document (RFC 6901)" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +python-versions = ">=3.7" files = [ - {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, - {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, + {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, + {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, ] [[package]] name = "jsonschema" -version = "4.21.1" +version = "4.23.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema-4.21.1-py3-none-any.whl", hash = "sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f"}, - {file = "jsonschema-4.21.1.tar.gz", hash = "sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5"}, + {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, + {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, ] [package.dependencies] @@ -687,7 +802,7 @@ webcolors = {version = ">=1.11", optional = true, markers = "extra == \"format\" [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)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=24.6.0)"] [[package]] name = "jsonschema-specifications" @@ -705,13 +820,13 @@ referencing = ">=0.31.0" [[package]] name = "linkml" -version = "1.7.8" +version = "1.8.2" description = "Linked Open Data Modeling Language" optional = false python-versions = "<4.0.0,>=3.8.1" files = [ - {file = "linkml-1.7.8-py3-none-any.whl", hash = "sha256:4b8ebe33b422517b08ca01802dc2899ac133c502a71d811c58fa6f4263130709"}, - {file = "linkml-1.7.8.tar.gz", hash = "sha256:af48ee1ad6751c8d20de2832dbeefe225da9be5f39a7f8ea7821a691cf7c0148"}, + {file = "linkml-1.8.2-py3-none-any.whl", hash = "sha256:441e284f25d8d68a1ca58456651ccac29dc0319f9d18abceb677728eaeacc655"}, + {file = "linkml-1.8.2.tar.gz", hash = "sha256:29e42e46e2777eb8b77e38775686b4ab385d5955bc5a0e6ec7c8f39dd4827544"}, ] [package.dependencies] @@ -724,7 +839,7 @@ jinja2 = ">=3.1.0" jsonasobj2 = ">=1.0.3,<2.0.0" jsonschema = {version = ">=4.0.0", extras = ["format"]} linkml-dataops = "*" -linkml-runtime = ">=1.7.4" +linkml-runtime = ">=1.8.1,<2.0.0" openpyxl = "*" parse = "*" prefixcommons = ">=0.1.7" @@ -765,13 +880,13 @@ linkml-runtime = ">=1.1.6" [[package]] name = "linkml-runtime" -version = "1.7.5" +version = "1.8.1" description = "Runtime environment for LinkML, the Linked open data modeling language" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "linkml_runtime-1.7.5-py3-none-any.whl", hash = "sha256:c58000c7c68fa97b7d76c50421a85a64e25f07eec5bcac464bc00c4cd79007a6"}, - {file = "linkml_runtime-1.7.5.tar.gz", hash = "sha256:b31197a5398359441ae1ed43470c54377a1d08db961366dda670300dddcd71d7"}, + {file = "linkml_runtime-1.8.1-py3-none-any.whl", hash = "sha256:bb825462d1609cea055ccf23ee772c846d3e14d34dc8286fa64a132cbf4aa3d2"}, + {file = "linkml_runtime-1.8.1.tar.gz", hash = "sha256:2839143c1518579bc4baeaec3b1b854d241e1b792ccecc756bb860c66a633a44"}, ] [package.dependencies] @@ -789,6 +904,24 @@ pyyaml = "*" rdflib = ">=6.0.0" requests = "*" +[[package]] +name = "markdown" +version = "3.7" +description = "Python implementation of John Gruber's Markdown." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"}, + {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} + +[package.extras] +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 = "markupsafe" version = "2.1.5" @@ -869,6 +1002,144 @@ files = [ {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] +[[package]] +name = "mergedeep" +version = "1.3.4" +description = "A deep merge function for 🐍." +optional = false +python-versions = ">=3.6" +files = [ + {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, + {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, +] + +[[package]] +name = "mkdocs" +version = "1.6.0" +description = "Project documentation with Markdown." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs-1.6.0-py3-none-any.whl", hash = "sha256:1eb5cb7676b7d89323e62b56235010216319217d4af5ddc543a91beb8d125ea7"}, + {file = "mkdocs-1.6.0.tar.gz", hash = "sha256:a73f735824ef83a4f3bcb7a231dcab23f5a838f88b7efc54a0eef5fbdbc3c512"}, +] + +[package.dependencies] +click = ">=7.0" +colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""} +ghp-import = ">=1.0" +importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} +jinja2 = ">=2.11.1" +markdown = ">=3.3.6" +markupsafe = ">=2.0.1" +mergedeep = ">=1.3.4" +mkdocs-get-deps = ">=0.2.0" +packaging = ">=20.5" +pathspec = ">=0.11.1" +pyyaml = ">=5.1" +pyyaml-env-tag = ">=0.1" +watchdog = ">=2.0" + +[package.extras] +i18n = ["babel (>=2.9.0)"] +min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.4)", "jinja2 (==2.11.1)", "markdown (==3.3.6)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "mkdocs-get-deps (==0.2.0)", "packaging (==20.5)", "pathspec (==0.11.1)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "watchdog (==2.0)"] + +[[package]] +name = "mkdocs-get-deps" +version = "0.2.0" +description = "MkDocs extension that lists all dependencies according to a mkdocs.yml file" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134"}, + {file = "mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.3", markers = "python_version < \"3.10\""} +mergedeep = ">=1.3.4" +platformdirs = ">=2.2.0" +pyyaml = ">=5.1" + +[[package]] +name = "mkdocs-material" +version = "9.5.32" +description = "Documentation that simply works" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs_material-9.5.32-py3-none-any.whl", hash = "sha256:f3704f46b63d31b3cd35c0055a72280bed825786eccaf19c655b44e0cd2c6b3f"}, + {file = "mkdocs_material-9.5.32.tar.gz", hash = "sha256:38ed66e6d6768dde4edde022554553e48b2db0d26d1320b19e2e2b9da0be1120"}, +] + +[package.dependencies] +babel = ">=2.10,<3.0" +colorama = ">=0.4,<1.0" +jinja2 = ">=3.0,<4.0" +markdown = ">=3.2,<4.0" +mkdocs = ">=1.6,<2.0" +mkdocs-material-extensions = ">=1.3,<2.0" +paginate = ">=0.5,<1.0" +pygments = ">=2.16,<3.0" +pymdown-extensions = ">=10.2,<11.0" +regex = ">=2022.4" +requests = ">=2.26,<3.0" + +[package.extras] +git = ["mkdocs-git-committers-plugin-2 (>=1.1,<2.0)", "mkdocs-git-revision-date-localized-plugin (>=1.2.4,<2.0)"] +imaging = ["cairosvg (>=2.6,<3.0)", "pillow (>=10.2,<11.0)"] +recommended = ["mkdocs-minify-plugin (>=0.7,<1.0)", "mkdocs-redirects (>=1.2,<2.0)", "mkdocs-rss-plugin (>=1.6,<2.0)"] + +[[package]] +name = "mkdocs-material-extensions" +version = "1.3.1" +description = "Extension pack for Python Markdown and MkDocs Material." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"}, + {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, +] + +[[package]] +name = "mkdocs-mermaid2-plugin" +version = "0.6.0" +description = "A MkDocs plugin for including mermaid graphs in markdown sources" +optional = false +python-versions = ">=3.5" +files = [ + {file = "mkdocs-mermaid2-plugin-0.6.0.tar.gz", hash = "sha256:99cca6db7c6b4a954a701dcb6b507191bc32a7b0b47eacf2885c1bacf77d1af1"}, + {file = "mkdocs_mermaid2_plugin-0.6.0-py3-none-any.whl", hash = "sha256:ffbe8a7daa7ed718cb800c44c5ce4c0ff413caebf7b8b63d9c4a998dfd78a64d"}, +] + +[package.dependencies] +beautifulsoup4 = ">=4.6.3" +jsbeautifier = "*" +mkdocs = ">=1.0.4" +mkdocs-material = "*" +pymdown-extensions = ">=8.0" +pyyaml = "*" +requests = "*" +setuptools = ">=18.5" + +[[package]] +name = "mkdocs-redirects" +version = "1.2.1" +description = "A MkDocs plugin for dynamic page redirects to prevent broken links." +optional = false +python-versions = ">=3.6" +files = [ + {file = "mkdocs-redirects-1.2.1.tar.gz", hash = "sha256:9420066d70e2a6bb357adf86e67023dcdca1857f97f07c7fe450f8f1fb42f861"}, +] + +[package.dependencies] +mkdocs = ">=1.1.1" + +[package.extras] +dev = ["autoflake", "black", "isort", "pytest", "twine (>=1.13.0)"] +release = ["twine (>=1.13.0)"] +test = ["autoflake", "black", "isort", "pytest"] + [[package]] name = "mongomock" version = "4.1.2" @@ -886,73 +1157,151 @@ sentinels = "*" [[package]] name = "nmdc-schema" -version = "7.8.0" +version = "11.0.0rc19" description = "Schema resources for the National Microbiome Data Collaborative (NMDC)" optional = false -python-versions = ">=3.9,<4.0" +python-versions = "<4.0,>=3.9" files = [ - {file = "nmdc_schema-7.8.0-py3-none-any.whl", hash = "sha256:c54c52e71d81175a2bd2dad9228ecd13ddc589cd85be4aaa256e82f3f11b7fce"}, - {file = "nmdc_schema-7.8.0.tar.gz", hash = "sha256:6f0a8ca18c313aa2ffe9fef23430f7d42f08aa2a62eec09d21db4ef5087a5b51"}, + {file = "nmdc_schema-11.0.0rc19-py3-none-any.whl", hash = "sha256:dac17c22aa35497244ab5d200f3493fc23ec161b4b6c2c08a51db8debbb9c11c"}, + {file = "nmdc_schema-11.0.0rc19.tar.gz", hash = "sha256:5139c4b3d4c7e8ea98dbb802e8ae28d9b455c52beaae24b9f93184351a9692f1"}, ] [package.dependencies] -linkml = ">=1.5.6,<2.0.0" -linkml-runtime = ">=1.5.4,<2.0.0" +linkml = ">=1.7.10,<2.0.0" +linkml-runtime = ">=1.7.7,<2.0.0" +mkdocs = ">=1.4.2,<2.0.0" +mkdocs-mermaid2-plugin = ">=0.6.0,<0.7.0" +mkdocs-redirects = ">=1.2.1,<2.0.0" +pymongo = ">=4.7.2,<5.0.0" +ruamel-yaml = ">=0.18.6,<0.19.0" + +[package.extras] +docs = ["mkdocs-material (>=9.0.12,<10.0.0)"] [[package]] name = "numpy" -version = "1.26.4" +version = "2.0.1" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, - {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, - {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, - {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, - {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, - {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, - {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, - {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, - {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, - {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, - {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, - {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, - {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, - {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, - {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, - {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, - {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, + {file = "numpy-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0fbb536eac80e27a2793ffd787895242b7f18ef792563d742c2d673bfcb75134"}, + {file = "numpy-2.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:69ff563d43c69b1baba77af455dd0a839df8d25e8590e79c90fcbe1499ebde42"}, + {file = "numpy-2.0.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:1b902ce0e0a5bb7704556a217c4f63a7974f8f43e090aff03fcf262e0b135e02"}, + {file = "numpy-2.0.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:f1659887361a7151f89e79b276ed8dff3d75877df906328f14d8bb40bb4f5101"}, + {file = "numpy-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4658c398d65d1b25e1760de3157011a80375da861709abd7cef3bad65d6543f9"}, + {file = "numpy-2.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4127d4303b9ac9f94ca0441138acead39928938660ca58329fe156f84b9f3015"}, + {file = "numpy-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e5eeca8067ad04bc8a2a8731183d51d7cbaac66d86085d5f4766ee6bf19c7f87"}, + {file = "numpy-2.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9adbd9bb520c866e1bfd7e10e1880a1f7749f1f6e5017686a5fbb9b72cf69f82"}, + {file = "numpy-2.0.1-cp310-cp310-win32.whl", hash = "sha256:7b9853803278db3bdcc6cd5beca37815b133e9e77ff3d4733c247414e78eb8d1"}, + {file = "numpy-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:81b0893a39bc5b865b8bf89e9ad7807e16717f19868e9d234bdaf9b1f1393868"}, + {file = "numpy-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75b4e316c5902d8163ef9d423b1c3f2f6252226d1aa5cd8a0a03a7d01ffc6268"}, + {file = "numpy-2.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6e4eeb6eb2fced786e32e6d8df9e755ce5be920d17f7ce00bc38fcde8ccdbf9e"}, + {file = "numpy-2.0.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a1e01dcaab205fbece13c1410253a9eea1b1c9b61d237b6fa59bcc46e8e89343"}, + {file = "numpy-2.0.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:a8fc2de81ad835d999113ddf87d1ea2b0f4704cbd947c948d2f5513deafe5a7b"}, + {file = "numpy-2.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a3d94942c331dd4e0e1147f7a8699a4aa47dffc11bf8a1523c12af8b2e91bbe"}, + {file = "numpy-2.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15eb4eca47d36ec3f78cde0a3a2ee24cf05ca7396ef808dda2c0ddad7c2bde67"}, + {file = "numpy-2.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b83e16a5511d1b1f8a88cbabb1a6f6a499f82c062a4251892d9ad5d609863fb7"}, + {file = "numpy-2.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f87fec1f9bc1efd23f4227becff04bd0e979e23ca50cc92ec88b38489db3b55"}, + {file = "numpy-2.0.1-cp311-cp311-win32.whl", hash = "sha256:36d3a9405fd7c511804dc56fc32974fa5533bdeb3cd1604d6b8ff1d292b819c4"}, + {file = "numpy-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:08458fbf403bff5e2b45f08eda195d4b0c9b35682311da5a5a0a0925b11b9bd8"}, + {file = "numpy-2.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6bf4e6f4a2a2e26655717a1983ef6324f2664d7011f6ef7482e8c0b3d51e82ac"}, + {file = "numpy-2.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6fddc5fe258d3328cd8e3d7d3e02234c5d70e01ebe377a6ab92adb14039cb4"}, + {file = "numpy-2.0.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5daab361be6ddeb299a918a7c0864fa8618af66019138263247af405018b04e1"}, + {file = "numpy-2.0.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:ea2326a4dca88e4a274ba3a4405eb6c6467d3ffbd8c7d38632502eaae3820587"}, + {file = "numpy-2.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:529af13c5f4b7a932fb0e1911d3a75da204eff023ee5e0e79c1751564221a5c8"}, + {file = "numpy-2.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6790654cb13eab303d8402354fabd47472b24635700f631f041bd0b65e37298a"}, + {file = "numpy-2.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cbab9fc9c391700e3e1287666dfd82d8666d10e69a6c4a09ab97574c0b7ee0a7"}, + {file = "numpy-2.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:99d0d92a5e3613c33a5f01db206a33f8fdf3d71f2912b0de1739894668b7a93b"}, + {file = "numpy-2.0.1-cp312-cp312-win32.whl", hash = "sha256:173a00b9995f73b79eb0191129f2455f1e34c203f559dd118636858cc452a1bf"}, + {file = "numpy-2.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:bb2124fdc6e62baae159ebcfa368708867eb56806804d005860b6007388df171"}, + {file = "numpy-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bfc085b28d62ff4009364e7ca34b80a9a080cbd97c2c0630bb5f7f770dae9414"}, + {file = "numpy-2.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8fae4ebbf95a179c1156fab0b142b74e4ba4204c87bde8d3d8b6f9c34c5825ef"}, + {file = "numpy-2.0.1-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:72dc22e9ec8f6eaa206deb1b1355eb2e253899d7347f5e2fae5f0af613741d06"}, + {file = "numpy-2.0.1-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:ec87f5f8aca726117a1c9b7083e7656a9d0d606eec7299cc067bb83d26f16e0c"}, + {file = "numpy-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f682ea61a88479d9498bf2091fdcd722b090724b08b31d63e022adc063bad59"}, + {file = "numpy-2.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8efc84f01c1cd7e34b3fb310183e72fcdf55293ee736d679b6d35b35d80bba26"}, + {file = "numpy-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3fdabe3e2a52bc4eff8dc7a5044342f8bd9f11ef0934fcd3289a788c0eb10018"}, + {file = "numpy-2.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:24a0e1befbfa14615b49ba9659d3d8818a0f4d8a1c5822af8696706fbda7310c"}, + {file = "numpy-2.0.1-cp39-cp39-win32.whl", hash = "sha256:f9cf5ea551aec449206954b075db819f52adc1638d46a6738253a712d553c7b4"}, + {file = "numpy-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:e9e81fa9017eaa416c056e5d9e71be93d05e2c3c2ab308d23307a8bc4443c368"}, + {file = "numpy-2.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:61728fba1e464f789b11deb78a57805c70b2ed02343560456190d0501ba37b0f"}, + {file = "numpy-2.0.1-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:12f5d865d60fb9734e60a60f1d5afa6d962d8d4467c120a1c0cda6eb2964437d"}, + {file = "numpy-2.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eacf3291e263d5a67d8c1a581a8ebbcfd6447204ef58828caf69a5e3e8c75990"}, + {file = "numpy-2.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2c3a346ae20cfd80b6cfd3e60dc179963ef2ea58da5ec074fd3d9e7a1e7ba97f"}, + {file = "numpy-2.0.1.tar.gz", hash = "sha256:485b87235796410c3519a699cfe1faab097e509e90ebb05dcd098db2ae87e7b3"}, +] + +[[package]] +name = "numpy" +version = "2.1.0" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.10" +files = [ + {file = "numpy-2.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6326ab99b52fafdcdeccf602d6286191a79fe2fda0ae90573c5814cd2b0bc1b8"}, + {file = "numpy-2.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0937e54c09f7a9a68da6889362ddd2ff584c02d015ec92672c099b61555f8911"}, + {file = "numpy-2.1.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:30014b234f07b5fec20f4146f69e13cfb1e33ee9a18a1879a0142fbb00d47673"}, + {file = "numpy-2.1.0-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:899da829b362ade41e1e7eccad2cf274035e1cb36ba73034946fccd4afd8606b"}, + {file = "numpy-2.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08801848a40aea24ce16c2ecde3b756f9ad756586fb2d13210939eb69b023f5b"}, + {file = "numpy-2.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:398049e237d1aae53d82a416dade04defed1a47f87d18d5bd615b6e7d7e41d1f"}, + {file = "numpy-2.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0abb3916a35d9090088a748636b2c06dc9a6542f99cd476979fb156a18192b84"}, + {file = "numpy-2.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:10e2350aea18d04832319aac0f887d5fcec1b36abd485d14f173e3e900b83e33"}, + {file = "numpy-2.1.0-cp310-cp310-win32.whl", hash = "sha256:f6b26e6c3b98adb648243670fddc8cab6ae17473f9dc58c51574af3e64d61211"}, + {file = "numpy-2.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:f505264735ee074250a9c78247ee8618292091d9d1fcc023290e9ac67e8f1afa"}, + {file = "numpy-2.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:76368c788ccb4f4782cf9c842b316140142b4cbf22ff8db82724e82fe1205dce"}, + {file = "numpy-2.1.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:f8e93a01a35be08d31ae33021e5268f157a2d60ebd643cfc15de6ab8e4722eb1"}, + {file = "numpy-2.1.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:9523f8b46485db6939bd069b28b642fec86c30909cea90ef550373787f79530e"}, + {file = "numpy-2.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54139e0eb219f52f60656d163cbe67c31ede51d13236c950145473504fa208cb"}, + {file = "numpy-2.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5ebbf9fbdabed208d4ecd2e1dfd2c0741af2f876e7ae522c2537d404ca895c3"}, + {file = "numpy-2.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:378cb4f24c7d93066ee4103204f73ed046eb88f9ad5bb2275bb9fa0f6a02bd36"}, + {file = "numpy-2.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8f699a709120b220dfe173f79c73cb2a2cab2c0b88dd59d7b49407d032b8ebd"}, + {file = "numpy-2.1.0-cp311-cp311-win32.whl", hash = "sha256:ffbd6faeb190aaf2b5e9024bac9622d2ee549b7ec89ef3a9373fa35313d44e0e"}, + {file = "numpy-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:0af3a5987f59d9c529c022c8c2a64805b339b7ef506509fba7d0556649b9714b"}, + {file = "numpy-2.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fe76d75b345dc045acdbc006adcb197cc680754afd6c259de60d358d60c93736"}, + {file = "numpy-2.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f358ea9e47eb3c2d6eba121ab512dfff38a88db719c38d1e67349af210bc7529"}, + {file = "numpy-2.1.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:dd94ce596bda40a9618324547cfaaf6650b1a24f5390350142499aa4e34e53d1"}, + {file = "numpy-2.1.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:b47c551c6724960479cefd7353656498b86e7232429e3a41ab83be4da1b109e8"}, + {file = "numpy-2.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0756a179afa766ad7cb6f036de622e8a8f16ffdd55aa31f296c870b5679d745"}, + {file = "numpy-2.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24003ba8ff22ea29a8c306e61d316ac74111cebf942afbf692df65509a05f111"}, + {file = "numpy-2.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b34fa5e3b5d6dc7e0a4243fa0f81367027cb6f4a7215a17852979634b5544ee0"}, + {file = "numpy-2.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c4f982715e65036c34897eb598d64aef15150c447be2cfc6643ec7a11af06574"}, + {file = "numpy-2.1.0-cp312-cp312-win32.whl", hash = "sha256:c4cd94dfefbefec3f8b544f61286584292d740e6e9d4677769bc76b8f41deb02"}, + {file = "numpy-2.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0cdef204199278f5c461a0bed6ed2e052998276e6d8ab2963d5b5c39a0500bc"}, + {file = "numpy-2.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8ab81ccd753859ab89e67199b9da62c543850f819993761c1e94a75a814ed667"}, + {file = "numpy-2.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:442596f01913656d579309edcd179a2a2f9977d9a14ff41d042475280fc7f34e"}, + {file = "numpy-2.1.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:848c6b5cad9898e4b9ef251b6f934fa34630371f2e916261070a4eb9092ffd33"}, + {file = "numpy-2.1.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:54c6a63e9d81efe64bfb7bcb0ec64332a87d0b87575f6009c8ba67ea6374770b"}, + {file = "numpy-2.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:652e92fc409e278abdd61e9505649e3938f6d04ce7ef1953f2ec598a50e7c195"}, + {file = "numpy-2.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ab32eb9170bf8ffcbb14f11613f4a0b108d3ffee0832457c5d4808233ba8977"}, + {file = "numpy-2.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:8fb49a0ba4d8f41198ae2d52118b050fd34dace4b8f3fb0ee34e23eb4ae775b1"}, + {file = "numpy-2.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:44e44973262dc3ae79e9063a1284a73e09d01b894b534a769732ccd46c28cc62"}, + {file = "numpy-2.1.0-cp313-cp313-win32.whl", hash = "sha256:ab83adc099ec62e044b1fbb3a05499fa1e99f6d53a1dde102b2d85eff66ed324"}, + {file = "numpy-2.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:de844aaa4815b78f6023832590d77da0e3b6805c644c33ce94a1e449f16d6ab5"}, + {file = "numpy-2.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:343e3e152bf5a087511cd325e3b7ecfd5b92d369e80e74c12cd87826e263ec06"}, + {file = "numpy-2.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f07fa2f15dabe91259828ce7d71b5ca9e2eb7c8c26baa822c825ce43552f4883"}, + {file = "numpy-2.1.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5474dad8c86ee9ba9bb776f4b99ef2d41b3b8f4e0d199d4f7304728ed34d0300"}, + {file = "numpy-2.1.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:1f817c71683fd1bb5cff1529a1d085a57f02ccd2ebc5cd2c566f9a01118e3b7d"}, + {file = "numpy-2.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a3336fbfa0d38d3deacd3fe7f3d07e13597f29c13abf4d15c3b6dc2291cbbdd"}, + {file = "numpy-2.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a894c51fd8c4e834f00ac742abad73fc485df1062f1b875661a3c1e1fb1c2f6"}, + {file = "numpy-2.1.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:9156ca1f79fc4acc226696e95bfcc2b486f165a6a59ebe22b2c1f82ab190384a"}, + {file = "numpy-2.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:624884b572dff8ca8f60fab591413f077471de64e376b17d291b19f56504b2bb"}, + {file = "numpy-2.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:15ef8b2177eeb7e37dd5ef4016f30b7659c57c2c0b57a779f1d537ff33a72c7b"}, + {file = "numpy-2.1.0-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:e5f0642cdf4636198a4990de7a71b693d824c56a757862230454629cf62e323d"}, + {file = "numpy-2.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15976718c004466406342789f31b6673776360f3b1e3c575f25302d7e789575"}, + {file = "numpy-2.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:6c1de77ded79fef664d5098a66810d4d27ca0224e9051906e634b3f7ead134c2"}, + {file = "numpy-2.1.0.tar.gz", hash = "sha256:7dc90da0081f7e1da49ec4e398ede6a8e9cc4f5ebe5f9e06b443ed889ee9aaa2"}, ] [[package]] name = "openpyxl" -version = "3.1.2" +version = "3.1.5" description = "A Python library to read/write Excel 2010 xlsx/xlsm files" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "openpyxl-3.1.2-py2.py3-none-any.whl", hash = "sha256:f91456ead12ab3c6c2e9491cf33ba6d08357d802192379bb482f1033ade496f5"}, - {file = "openpyxl-3.1.2.tar.gz", hash = "sha256:a6f5977418eff3b2d5500d54d9db50c8277a368436f4e4f8ddb1be3422870184"}, + {file = "openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2"}, + {file = "openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050"}, ] [package.dependencies] @@ -974,13 +1323,23 @@ dev = ["black", "mypy", "pytest"] [[package]] name = "packaging" -version = "24.0" +version = "24.1" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, +] + +[[package]] +name = "paginate" +version = "0.5.6" +description = "Divides large result sets into pages for easier browsing" +optional = false +python-versions = "*" +files = [ + {file = "paginate-0.5.6.tar.gz", hash = "sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d"}, ] [[package]] @@ -1058,15 +1417,42 @@ xml = ["lxml (>=4.9.2)"] [[package]] name = "parse" -version = "1.20.1" +version = "1.20.2" description = "parse() is the opposite of format()" optional = false python-versions = "*" files = [ - {file = "parse-1.20.1-py2.py3-none-any.whl", hash = "sha256:76ddd5214255ae711db4c512be636151fbabaa948c6f30115aecc440422ca82c"}, - {file = "parse-1.20.1.tar.gz", hash = "sha256:09002ca350ad42e76629995f71f7b518670bcf93548bdde3684fd55d2be51975"}, + {file = "parse-1.20.2-py2.py3-none-any.whl", hash = "sha256:967095588cb802add9177d0c0b6133b5ba33b1ea9007ca800e526f42a85af558"}, + {file = "parse-1.20.2.tar.gz", hash = "sha256:b41d604d16503c79d81af5165155c0b20f6c8d6c559efa66b4b695c3e5a0a0ce"}, +] + +[[package]] +name = "pathspec" +version = "0.12.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, +] + +[[package]] +name = "platformdirs" +version = "4.2.2" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." +optional = false +python-versions = ">=3.8" +files = [ + {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, + {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, ] +[package.extras] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] +type = ["mypy (>=1.8)"] + [[package]] name = "pluggy" version = "1.5.0" @@ -1112,13 +1498,13 @@ requests = ">=2.28.1,<3.0.0" [[package]] name = "prefixmaps" -version = "0.2.4" +version = "0.2.5" description = "A python library for retrieving semantic prefix maps" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "prefixmaps-0.2.4-py3-none-any.whl", hash = "sha256:89bf0e6fb08c276f754f9624c42adf2e87c64ee92a3dde1f7eff01f22d85b512"}, - {file = "prefixmaps-0.2.4.tar.gz", hash = "sha256:ae86a1b31189d0516d199756d5808f75f44b39e86546c356cc78c0fe8d2078af"}, + {file = "prefixmaps-0.2.5-py3-none-any.whl", hash = "sha256:68caa04b3a6a8e058aa1c55affe32c62e44b564d031d63f768e267b796a1f3ee"}, + {file = "prefixmaps-0.2.5.tar.gz", hash = "sha256:aaccd2425ade2ea97a502c58be49fe8f3536e3d5e919712ae0358a39fc800799"}, ] [package.dependencies] @@ -1127,120 +1513,133 @@ pyyaml = ">=5.3.1" [[package]] name = "pycodestyle" -version = "2.11.1" +version = "2.12.1" description = "Python style guide checker" optional = false python-versions = ">=3.8" files = [ - {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"}, - {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"}, + {file = "pycodestyle-2.12.1-py2.py3-none-any.whl", hash = "sha256:46f0fb92069a7c28ab7bb558f05bfc0110dac69a0cd23c61ea0040283a9d78b3"}, + {file = "pycodestyle-2.12.1.tar.gz", hash = "sha256:6838eae08bbce4f6accd5d5572075c63626a15ee3e6f842df996bf62f6d73521"}, ] [[package]] name = "pydantic" -version = "2.7.1" +version = "2.8.2" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.7.1-py3-none-any.whl", hash = "sha256:e029badca45266732a9a79898a15ae2e8b14840b1eabbb25844be28f0b33f3d5"}, - {file = "pydantic-2.7.1.tar.gz", hash = "sha256:e9dbb5eada8abe4d9ae5f46b9939aead650cd2b68f249bb3a8139dbe125803cc"}, + {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"}, + {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"}, ] [package.dependencies] annotated-types = ">=0.4.0" -pydantic-core = "2.18.2" -typing-extensions = ">=4.6.1" +pydantic-core = "2.20.1" +typing-extensions = [ + {version = ">=4.6.1", markers = "python_version < \"3.13\""}, + {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, +] [package.extras] email = ["email-validator (>=2.0.0)"] [[package]] name = "pydantic-core" -version = "2.18.2" +version = "2.20.1" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.18.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9e08e867b306f525802df7cd16c44ff5ebbe747ff0ca6cf3fde7f36c05a59a81"}, - {file = "pydantic_core-2.18.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f0a21cbaa69900cbe1a2e7cad2aa74ac3cf21b10c3efb0fa0b80305274c0e8a2"}, - {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0680b1f1f11fda801397de52c36ce38ef1c1dc841a0927a94f226dea29c3ae3d"}, - {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:95b9d5e72481d3780ba3442eac863eae92ae43a5f3adb5b4d0a1de89d42bb250"}, - {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fcf5cd9c4b655ad666ca332b9a081112cd7a58a8b5a6ca7a3104bc950f2038"}, - {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b5155ff768083cb1d62f3e143b49a8a3432e6789a3abee8acd005c3c7af1c74"}, - {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:553ef617b6836fc7e4df130bb851e32fe357ce36336d897fd6646d6058d980af"}, - {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b89ed9eb7d616ef5714e5590e6cf7f23b02d0d539767d33561e3675d6f9e3857"}, - {file = "pydantic_core-2.18.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:75f7e9488238e920ab6204399ded280dc4c307d034f3924cd7f90a38b1829563"}, - {file = "pydantic_core-2.18.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ef26c9e94a8c04a1b2924149a9cb081836913818e55681722d7f29af88fe7b38"}, - {file = "pydantic_core-2.18.2-cp310-none-win32.whl", hash = "sha256:182245ff6b0039e82b6bb585ed55a64d7c81c560715d1bad0cbad6dfa07b4027"}, - {file = "pydantic_core-2.18.2-cp310-none-win_amd64.whl", hash = "sha256:e23ec367a948b6d812301afc1b13f8094ab7b2c280af66ef450efc357d2ae543"}, - {file = "pydantic_core-2.18.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:219da3f096d50a157f33645a1cf31c0ad1fe829a92181dd1311022f986e5fbe3"}, - {file = "pydantic_core-2.18.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cc1cfd88a64e012b74e94cd00bbe0f9c6df57049c97f02bb07d39e9c852e19a4"}, - {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05b7133a6e6aeb8df37d6f413f7705a37ab4031597f64ab56384c94d98fa0e90"}, - {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:224c421235f6102e8737032483f43c1a8cfb1d2f45740c44166219599358c2cd"}, - {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b14d82cdb934e99dda6d9d60dc84a24379820176cc4a0d123f88df319ae9c150"}, - {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2728b01246a3bba6de144f9e3115b532ee44bd6cf39795194fb75491824a1413"}, - {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:470b94480bb5ee929f5acba6995251ada5e059a5ef3e0dfc63cca287283ebfa6"}, - {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:997abc4df705d1295a42f95b4eec4950a37ad8ae46d913caeee117b6b198811c"}, - {file = "pydantic_core-2.18.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75250dbc5290e3f1a0f4618db35e51a165186f9034eff158f3d490b3fed9f8a0"}, - {file = "pydantic_core-2.18.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4456f2dca97c425231d7315737d45239b2b51a50dc2b6f0c2bb181fce6207664"}, - {file = "pydantic_core-2.18.2-cp311-none-win32.whl", hash = "sha256:269322dcc3d8bdb69f054681edff86276b2ff972447863cf34c8b860f5188e2e"}, - {file = "pydantic_core-2.18.2-cp311-none-win_amd64.whl", hash = "sha256:800d60565aec896f25bc3cfa56d2277d52d5182af08162f7954f938c06dc4ee3"}, - {file = "pydantic_core-2.18.2-cp311-none-win_arm64.whl", hash = "sha256:1404c69d6a676245199767ba4f633cce5f4ad4181f9d0ccb0577e1f66cf4c46d"}, - {file = "pydantic_core-2.18.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:fb2bd7be70c0fe4dfd32c951bc813d9fe6ebcbfdd15a07527796c8204bd36242"}, - {file = "pydantic_core-2.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6132dd3bd52838acddca05a72aafb6eab6536aa145e923bb50f45e78b7251043"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d904828195733c183d20a54230c0df0eb46ec746ea1a666730787353e87182"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c9bd70772c720142be1020eac55f8143a34ec9f82d75a8e7a07852023e46617f"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b8ed04b3582771764538f7ee7001b02e1170223cf9b75dff0bc698fadb00cf3"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e6dac87ddb34aaec85f873d737e9d06a3555a1cc1a8e0c44b7f8d5daeb89d86f"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ca4ae5a27ad7a4ee5170aebce1574b375de390bc01284f87b18d43a3984df72"}, - {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:886eec03591b7cf058467a70a87733b35f44707bd86cf64a615584fd72488b7c"}, - {file = "pydantic_core-2.18.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ca7b0c1f1c983e064caa85f3792dd2fe3526b3505378874afa84baf662e12241"}, - {file = "pydantic_core-2.18.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b4356d3538c3649337df4074e81b85f0616b79731fe22dd11b99499b2ebbdf3"}, - {file = "pydantic_core-2.18.2-cp312-none-win32.whl", hash = "sha256:8b172601454f2d7701121bbec3425dd71efcb787a027edf49724c9cefc14c038"}, - {file = "pydantic_core-2.18.2-cp312-none-win_amd64.whl", hash = "sha256:b1bd7e47b1558ea872bd16c8502c414f9e90dcf12f1395129d7bb42a09a95438"}, - {file = "pydantic_core-2.18.2-cp312-none-win_arm64.whl", hash = "sha256:98758d627ff397e752bc339272c14c98199c613f922d4a384ddc07526c86a2ec"}, - {file = "pydantic_core-2.18.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:9fdad8e35f278b2c3eb77cbdc5c0a49dada440657bf738d6905ce106dc1de439"}, - {file = "pydantic_core-2.18.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1d90c3265ae107f91a4f279f4d6f6f1d4907ac76c6868b27dc7fb33688cfb347"}, - {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390193c770399861d8df9670fb0d1874f330c79caaca4642332df7c682bf6b91"}, - {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:82d5d4d78e4448683cb467897fe24e2b74bb7b973a541ea1dcfec1d3cbce39fb"}, - {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4774f3184d2ef3e14e8693194f661dea5a4d6ca4e3dc8e39786d33a94865cefd"}, - {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4d938ec0adf5167cb335acb25a4ee69a8107e4984f8fbd2e897021d9e4ca21b"}, - {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0e8b1be28239fc64a88a8189d1df7fad8be8c1ae47fcc33e43d4be15f99cc70"}, - {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:868649da93e5a3d5eacc2b5b3b9235c98ccdbfd443832f31e075f54419e1b96b"}, - {file = "pydantic_core-2.18.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:78363590ef93d5d226ba21a90a03ea89a20738ee5b7da83d771d283fd8a56761"}, - {file = "pydantic_core-2.18.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:852e966fbd035a6468fc0a3496589b45e2208ec7ca95c26470a54daed82a0788"}, - {file = "pydantic_core-2.18.2-cp38-none-win32.whl", hash = "sha256:6a46e22a707e7ad4484ac9ee9f290f9d501df45954184e23fc29408dfad61350"}, - {file = "pydantic_core-2.18.2-cp38-none-win_amd64.whl", hash = "sha256:d91cb5ea8b11607cc757675051f61b3d93f15eca3cefb3e6c704a5d6e8440f4e"}, - {file = "pydantic_core-2.18.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:ae0a8a797a5e56c053610fa7be147993fe50960fa43609ff2a9552b0e07013e8"}, - {file = "pydantic_core-2.18.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:042473b6280246b1dbf530559246f6842b56119c2926d1e52b631bdc46075f2a"}, - {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a388a77e629b9ec814c1b1e6b3b595fe521d2cdc625fcca26fbc2d44c816804"}, - {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25add29b8f3b233ae90ccef2d902d0ae0432eb0d45370fe315d1a5cf231004b"}, - {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f459a5ce8434614dfd39bbebf1041952ae01da6bed9855008cb33b875cb024c0"}, - {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eff2de745698eb46eeb51193a9f41d67d834d50e424aef27df2fcdee1b153845"}, - {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8309f67285bdfe65c372ea3722b7a5642680f3dba538566340a9d36e920b5f0"}, - {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f93a8a2e3938ff656a7c1bc57193b1319960ac015b6e87d76c76bf14fe0244b4"}, - {file = "pydantic_core-2.18.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:22057013c8c1e272eb8d0eebc796701167d8377441ec894a8fed1af64a0bf399"}, - {file = "pydantic_core-2.18.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cfeecd1ac6cc1fb2692c3d5110781c965aabd4ec5d32799773ca7b1456ac636b"}, - {file = "pydantic_core-2.18.2-cp39-none-win32.whl", hash = "sha256:0d69b4c2f6bb3e130dba60d34c0845ba31b69babdd3f78f7c0c8fae5021a253e"}, - {file = "pydantic_core-2.18.2-cp39-none-win_amd64.whl", hash = "sha256:d9319e499827271b09b4e411905b24a426b8fb69464dfa1696258f53a3334641"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a1874c6dd4113308bd0eb568418e6114b252afe44319ead2b4081e9b9521fe75"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:ccdd111c03bfd3666bd2472b674c6899550e09e9f298954cfc896ab92b5b0e6d"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e18609ceaa6eed63753037fc06ebb16041d17d28199ae5aba0052c51449650a9"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e5c584d357c4e2baf0ff7baf44f4994be121e16a2c88918a5817331fc7599d7"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43f0f463cf89ace478de71a318b1b4f05ebc456a9b9300d027b4b57c1a2064fb"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e1b395e58b10b73b07b7cf740d728dd4ff9365ac46c18751bf8b3d8cca8f625a"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0098300eebb1c837271d3d1a2cd2911e7c11b396eac9661655ee524a7f10587b"}, - {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:36789b70d613fbac0a25bb07ab3d9dba4d2e38af609c020cf4d888d165ee0bf3"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3f9a801e7c8f1ef8718da265bba008fa121243dfe37c1cea17840b0944dfd72c"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:3a6515ebc6e69d85502b4951d89131ca4e036078ea35533bb76327f8424531ce"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20aca1e2298c56ececfd8ed159ae4dde2df0781988c97ef77d5c16ff4bd5b400"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:223ee893d77a310a0391dca6df00f70bbc2f36a71a895cecd9a0e762dc37b349"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2334ce8c673ee93a1d6a65bd90327588387ba073c17e61bf19b4fd97d688d63c"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:cbca948f2d14b09d20268cda7b0367723d79063f26c4ffc523af9042cad95592"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b3ef08e20ec49e02d5c6717a91bb5af9b20f1805583cb0adfe9ba2c6b505b5ae"}, - {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6fdc8627910eed0c01aed6a390a252fe3ea6d472ee70fdde56273f198938374"}, - {file = "pydantic_core-2.18.2.tar.gz", hash = "sha256:2e29d20810dfc3043ee13ac7d9e25105799817683348823f305ab3f349b9386e"}, + {file = "pydantic_core-2.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3"}, + {file = "pydantic_core-2.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840"}, + {file = "pydantic_core-2.20.1-cp310-none-win32.whl", hash = "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250"}, + {file = "pydantic_core-2.20.1-cp310-none-win_amd64.whl", hash = "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c"}, + {file = "pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312"}, + {file = "pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b"}, + {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"}, + {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b"}, + {file = "pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a"}, + {file = "pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2"}, + {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"}, + {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"}, + {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"}, + {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"}, + {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"}, + {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"}, + {file = "pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686"}, + {file = "pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83"}, + {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203"}, + {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0"}, + {file = "pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e"}, + {file = "pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20"}, + {file = "pydantic_core-2.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91"}, + {file = "pydantic_core-2.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd"}, + {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa"}, + {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987"}, + {file = "pydantic_core-2.20.1-cp38-none-win32.whl", hash = "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a"}, + {file = "pydantic_core-2.20.1-cp38-none-win_amd64.whl", hash = "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434"}, + {file = "pydantic_core-2.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c"}, + {file = "pydantic_core-2.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1"}, + {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09"}, + {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab"}, + {file = "pydantic_core-2.20.1-cp39-none-win32.whl", hash = "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2"}, + {file = "pydantic_core-2.20.1-cp39-none-win_amd64.whl", hash = "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"}, + {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"}, ] [package.dependencies] @@ -1257,6 +1656,20 @@ files = [ {file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"}, ] +[[package]] +name = "pygments" +version = "2.18.0" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + [[package]] name = "pyjsg" version = "0.11.10" @@ -1272,73 +1685,81 @@ files = [ antlr4-python3-runtime = ">=4.9.3,<4.10.0" jsonasobj = ">=1.2.1" +[[package]] +name = "pymdown-extensions" +version = "10.9" +description = "Extension pack for Python Markdown." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pymdown_extensions-10.9-py3-none-any.whl", hash = "sha256:d323f7e90d83c86113ee78f3fe62fc9dee5f56b54d912660703ea1816fed5626"}, + {file = "pymdown_extensions-10.9.tar.gz", hash = "sha256:6ff740bcd99ec4172a938970d42b96128bdc9d4b9bcad72494f29921dc69b753"}, +] + +[package.dependencies] +markdown = ">=3.6" +pyyaml = "*" + +[package.extras] +extra = ["pygments (>=2.12)"] + [[package]] name = "pymongo" -version = "4.7.0" +version = "4.8.0" description = "Python driver for MongoDB " optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pymongo-4.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8449b6af19cac09cce9d0834c196b29b72b29e05724f4ea208b3f602fdd47086"}, - {file = "pymongo-4.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb00787bed1939ef21ffcb09b3034b193c3c6e9838724e2c05ef881cb2b03a33"}, - {file = "pymongo-4.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8c4cbe5a1258b9f3a49f83781c8b2fb58f39a682779a3c81dc444a609cb15ba"}, - {file = "pymongo-4.7.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12db8e8768bd0d4a433eea3463f05648c3f65f262776c777a0e19e7c55f27a73"}, - {file = "pymongo-4.7.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7be2e57df38fa9b1b6f9ebe5bedd38118b511d3bdf0d9e77158c476542c9153d"}, - {file = "pymongo-4.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b2b49670b32df8cf6650133cf439593f0291228ce971094c62c3a478024c7d1"}, - {file = "pymongo-4.7.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5366f28b2115120611536914540b0d247a89b09bb80bbc78893f246a584165b9"}, - {file = "pymongo-4.7.0-cp310-cp310-win32.whl", hash = "sha256:6c993fff4c110f6de4d76b76af97733efecae83b688cb27d1a3c5431415e3803"}, - {file = "pymongo-4.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:66b490775aa4542e0585ffdff1d0c6c4279536c852334f34a6a9a5c882beafd4"}, - {file = "pymongo-4.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9584be3d20ee26b53c0b1e25ba38196b7f65f594f48211b5ab3fa12b428ec6a9"}, - {file = "pymongo-4.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:db2885773af0c10420e6bb86e84ee780bc3817d45a29ef24d8f6376ae2351eec"}, - {file = "pymongo-4.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8af3de7fea21b1ced0770766ec37a5900a62b45fe4b8f1dfa521226d591dbf66"}, - {file = "pymongo-4.7.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:78b0ba6d60c7f2ac779909ac53383c83584826a304206559599c46a33366622a"}, - {file = "pymongo-4.7.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c82105c91cf95821039aca48350630435e7be18989496b6292aaa8779fa5fb6"}, - {file = "pymongo-4.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44eb2a3adaa0916f2fb6812d4d805956fd376b7fceae3b62f5dfae5e29330786"}, - {file = "pymongo-4.7.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2161278182f3163d15afc3c578097ec20c844ac7180e41134a2a2b5c9ae77b9d"}, - {file = "pymongo-4.7.0-cp311-cp311-win32.whl", hash = "sha256:98cb932ab936d702e28cf8da1982dcf5e7cfc35736b7516c0df7aaa46c63e0e2"}, - {file = "pymongo-4.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:3f1d57edc2a4bd96ae5741e4d83d3d54695174fd9068c88c89e12f7262be4de4"}, - {file = "pymongo-4.7.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:36d05d1ff861dda7c9e84d9848ea6f2b5d2245ae1093865d14597de29ba95b37"}, - {file = "pymongo-4.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0ad32bb7e5f889fc5994001f7bb8bf945b52e10e428a563dfce0661961eae224"}, - {file = "pymongo-4.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8885f825203fa14ce863b462effcd93e07bfc6e582b3b93cfcde5ae42ccc9923"}, - {file = "pymongo-4.7.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cf4187bc91bd10e29857775651101d0ec26e580d6b46a8c5cbf93928358ac3c3"}, - {file = "pymongo-4.7.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aebd99aaea95c48fba24bc3d7b72e7bf70e06df4c647de938c4d3dce2fd25a1c"}, - {file = "pymongo-4.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52facf98dcba501b2ae337d21f065cc30ceb25b97ce8f17878c1ae9d781f7f26"}, - {file = "pymongo-4.7.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f807dadc8030a5b55915f78fac25393af47bee8ccb62b5a6c5c622274ff4adf1"}, - {file = "pymongo-4.7.0-cp312-cp312-win32.whl", hash = "sha256:7a3c9218c5bc4384fa079f41b744473ada6a5f549fc11a4ae0fe7287746acc04"}, - {file = "pymongo-4.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:97ccb53d9310d5963df1a4543f1cfabdfd914638a5c8438234f6ed70d9303222"}, - {file = "pymongo-4.7.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:41d647fdaedba2f5b5c92299575814c164af44696fed3a4fc0d0df4f29eabcb2"}, - {file = "pymongo-4.7.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f53cf5bf65dda3fc1b5ec5f760233a41b282db3157d135e9272101f0492825f"}, - {file = "pymongo-4.7.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6673daf8fc23a96934cbb7a3626dcfa3ae21510492047e6003dfe3f26e62886b"}, - {file = "pymongo-4.7.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d7fc4891f5482e42c35be6931e9cf6b635d7d95056ff45b56bae5f0384830f"}, - {file = "pymongo-4.7.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fc34b4d92d5d8671be6b728076f275ccfe8495c7e6b74750b634190e17ede68"}, - {file = "pymongo-4.7.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4d584b249c79acae86729d216a5185d833a90477d566f094b47d39620493870"}, - {file = "pymongo-4.7.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3784063fa43a0019b6a73e1e63b7fcbff4ded4d0ec5442202aa3caa12be9ef8"}, - {file = "pymongo-4.7.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:bd514420eb09bba897016b7f1a2c17f9f3f1a7bc320c0505c59c3225e024b51c"}, - {file = "pymongo-4.7.0-cp37-cp37m-win32.whl", hash = "sha256:31ed6426fc68d500e2f27346e4ce3cc4fd3438adc99a3aaae41578c8a3b1f467"}, - {file = "pymongo-4.7.0-cp37-cp37m-win_amd64.whl", hash = "sha256:69865d5739822c277d075a50601077767706e9f0862562e116ef13969d09fc9e"}, - {file = "pymongo-4.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fbad9290b32ff1fc38bcac42699b8ea6a7c49cab081ba54761f3109bc5703248"}, - {file = "pymongo-4.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5307bfda4f39d9f1b3df9ab96b22d44bca458e44286ce806d716a2ffed2c46da"}, - {file = "pymongo-4.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f1a2ee91a97904cd21bddfce58d1868b6ea67b99bdd81dfe9cebfe35d0d751b"}, - {file = "pymongo-4.7.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cefa4e9be8bffa80de1bd70ae5ee79973e5db10befabcb25289fb52231a0dcff"}, - {file = "pymongo-4.7.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7b8bd94c63cef8f5bfbb29568934213d9730381db94f467f979c9e5aaa27130"}, - {file = "pymongo-4.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8ff95728965e633591862bfc197018d25bc349b5cd8da080acb52a2d17a6e95"}, - {file = "pymongo-4.7.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07265c14aa40259771255dbf59f9160a3690e82522ed02ab07e0e5c3045bad5b"}, - {file = "pymongo-4.7.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7214b7599a9f2e4ed01ecdc034cbe8f2926954bfdad9277390dd1bccf9fd6553"}, - {file = "pymongo-4.7.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1864f224b1793ef8698f779a7808e2b8c4a8f26bd0612c578412f62d6e99be46"}, - {file = "pymongo-4.7.0-cp38-cp38-win32.whl", hash = "sha256:2bfaf7a7eb6a91dfe58f384be16fd895e040d17236ee82217d1be9fc56869dc8"}, - {file = "pymongo-4.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:2545c2be5ed25b1e9419cde4269d6a744076f80eaf86695d2dd888bddac29dd7"}, - {file = "pymongo-4.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e7a00cee5b7a4160eed9cb43a2539037f572f01ed7261c2d1b4f7217060dba61"}, - {file = "pymongo-4.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c85f9824a7e90bf49aeed953e63942bff499116312e555ccb51bd3bf7ebe9342"}, - {file = "pymongo-4.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:030dba8b3e1cb29f874739247e1eba1d01118a11583c62145c707a6e725d416a"}, - {file = "pymongo-4.7.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0dc2e365b14cb768898429e4331c58587be7143ad230858d19e8dd032f0adadc"}, - {file = "pymongo-4.7.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50865177882df0badc879c5b20f20cdc9c73494f0e2b19a40534af9c90018b4e"}, - {file = "pymongo-4.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c4b0d8393fb991b3dd934e891e064ae804e9267fce9d01d2f16b25e20564e3d"}, - {file = "pymongo-4.7.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7530ea1da6fe0bb1960390ba6523483dfdb2a6239d0e8058b1505cc2a79c75f8"}, - {file = "pymongo-4.7.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36536a41f08180adc647a21ca12dba859a23d841d28ca8fd3976c8781ed8290b"}, - {file = "pymongo-4.7.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b3a49be20a403d86eb1c559350fb56f28a859041756159eeb00e89f59b6e1288"}, - {file = "pymongo-4.7.0-cp39-cp39-win32.whl", hash = "sha256:a292ee4babdd632531effaac95da5f211caafa6a039c097a1b18a4dc0d52488b"}, - {file = "pymongo-4.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:cb809ff53ab3110ebc43a5e47aa945bb97e4ed9bc9beb07f935f5c83d9077e67"}, - {file = "pymongo-4.7.0.tar.gz", hash = "sha256:431093ef808944a14698b2a719b739fa7721778769e80c08423568991aa29c42"}, + {file = "pymongo-4.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f2b7bec27e047e84947fbd41c782f07c54c30c76d14f3b8bf0c89f7413fac67a"}, + {file = "pymongo-4.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c68fe128a171493018ca5c8020fc08675be130d012b7ab3efe9e22698c612a1"}, + {file = "pymongo-4.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:920d4f8f157a71b3cb3f39bc09ce070693d6e9648fb0e30d00e2657d1dca4e49"}, + {file = "pymongo-4.8.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52b4108ac9469febba18cea50db972605cc43978bedaa9fea413378877560ef8"}, + {file = "pymongo-4.8.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:180d5eb1dc28b62853e2f88017775c4500b07548ed28c0bd9c005c3d7bc52526"}, + {file = "pymongo-4.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aec2b9088cdbceb87e6ca9c639d0ff9b9d083594dda5ca5d3c4f6774f4c81b33"}, + {file = "pymongo-4.8.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0cf61450feadca81deb1a1489cb1a3ae1e4266efd51adafecec0e503a8dcd84"}, + {file = "pymongo-4.8.0-cp310-cp310-win32.whl", hash = "sha256:8b18c8324809539c79bd6544d00e0607e98ff833ca21953df001510ca25915d1"}, + {file = "pymongo-4.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e5df28f74002e37bcbdfdc5109799f670e4dfef0fb527c391ff84f078050e7b5"}, + {file = "pymongo-4.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6b50040d9767197b77ed420ada29b3bf18a638f9552d80f2da817b7c4a4c9c68"}, + {file = "pymongo-4.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:417369ce39af2b7c2a9c7152c1ed2393edfd1cbaf2a356ba31eb8bcbd5c98dd7"}, + {file = "pymongo-4.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf821bd3befb993a6db17229a2c60c1550e957de02a6ff4dd0af9476637b2e4d"}, + {file = "pymongo-4.8.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9365166aa801c63dff1a3cb96e650be270da06e3464ab106727223123405510f"}, + {file = "pymongo-4.8.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc8b8582f4209c2459b04b049ac03c72c618e011d3caa5391ff86d1bda0cc486"}, + {file = "pymongo-4.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16e5019f75f6827bb5354b6fef8dfc9d6c7446894a27346e03134d290eb9e758"}, + {file = "pymongo-4.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b5802151fc2b51cd45492c80ed22b441d20090fb76d1fd53cd7760b340ff554"}, + {file = "pymongo-4.8.0-cp311-cp311-win32.whl", hash = "sha256:4bf58e6825b93da63e499d1a58de7de563c31e575908d4e24876234ccb910eba"}, + {file = "pymongo-4.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:b747c0e257b9d3e6495a018309b9e0c93b7f0d65271d1d62e572747f4ffafc88"}, + {file = "pymongo-4.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e6a720a3d22b54183352dc65f08cd1547204d263e0651b213a0a2e577e838526"}, + {file = "pymongo-4.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:31e4d21201bdf15064cf47ce7b74722d3e1aea2597c6785882244a3bb58c7eab"}, + {file = "pymongo-4.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6b804bb4f2d9dc389cc9e827d579fa327272cdb0629a99bfe5b83cb3e269ebf"}, + {file = "pymongo-4.8.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f2fbdb87fe5075c8beb17a5c16348a1ea3c8b282a5cb72d173330be2fecf22f5"}, + {file = "pymongo-4.8.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd39455b7ee70aabee46f7399b32ab38b86b236c069ae559e22be6b46b2bbfc4"}, + {file = "pymongo-4.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:940d456774b17814bac5ea7fc28188c7a1338d4a233efbb6ba01de957bded2e8"}, + {file = "pymongo-4.8.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:236bbd7d0aef62e64caf4b24ca200f8c8670d1a6f5ea828c39eccdae423bc2b2"}, + {file = "pymongo-4.8.0-cp312-cp312-win32.whl", hash = "sha256:47ec8c3f0a7b2212dbc9be08d3bf17bc89abd211901093e3ef3f2adea7de7a69"}, + {file = "pymongo-4.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:e84bc7707492f06fbc37a9f215374d2977d21b72e10a67f1b31893ec5a140ad8"}, + {file = "pymongo-4.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:519d1bab2b5e5218c64340b57d555d89c3f6c9d717cecbf826fb9d42415e7750"}, + {file = "pymongo-4.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:87075a1feb1e602e539bdb1ef8f4324a3427eb0d64208c3182e677d2c0718b6f"}, + {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f53429515d2b3e86dcc83dadecf7ff881e538c168d575f3688698a8707b80a"}, + {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fdc20cd1e1141b04696ffcdb7c71e8a4a665db31fe72e51ec706b3bdd2d09f36"}, + {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:284d0717d1a7707744018b0b6ee7801b1b1ff044c42f7be7a01bb013de639470"}, + {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5bf0eb8b6ef40fa22479f09375468c33bebb7fe49d14d9c96c8fd50355188b0"}, + {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ecd71b9226bd1d49416dc9f999772038e56f415a713be51bf18d8676a0841c8"}, + {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0061af6e8c5e68b13f1ec9ad5251247726653c5af3c0bbdfbca6cf931e99216"}, + {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:658d0170f27984e0d89c09fe5c42296613b711a3ffd847eb373b0dbb5b648d5f"}, + {file = "pymongo-4.8.0-cp38-cp38-win32.whl", hash = "sha256:3ed1c316718a2836f7efc3d75b4b0ffdd47894090bc697de8385acd13c513a70"}, + {file = "pymongo-4.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:7148419eedfea9ecb940961cfe465efaba90595568a1fb97585fb535ea63fe2b"}, + {file = "pymongo-4.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8400587d594761e5136a3423111f499574be5fd53cf0aefa0d0f05b180710b0"}, + {file = "pymongo-4.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af3e98dd9702b73e4e6fd780f6925352237f5dce8d99405ff1543f3771201704"}, + {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de3a860f037bb51f968de320baef85090ff0bbb42ec4f28ec6a5ddf88be61871"}, + {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0fc18b3a093f3db008c5fea0e980dbd3b743449eee29b5718bc2dc15ab5088bb"}, + {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18c9d8f975dd7194c37193583fd7d1eb9aea0c21ee58955ecf35362239ff31ac"}, + {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:408b2f8fdbeca3c19e4156f28fff1ab11c3efb0407b60687162d49f68075e63c"}, + {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6564780cafd6abeea49759fe661792bd5a67e4f51bca62b88faab497ab5fe89"}, + {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d18d86bc9e103f4d3d4f18b85a0471c0e13ce5b79194e4a0389a224bb70edd53"}, + {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9097c331577cecf8034422956daaba7ec74c26f7b255d718c584faddd7fa2e3c"}, + {file = "pymongo-4.8.0-cp39-cp39-win32.whl", hash = "sha256:d5428dbcd43d02f6306e1c3c95f692f68b284e6ee5390292242f509004c9e3a8"}, + {file = "pymongo-4.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:ef7225755ed27bfdb18730c68f6cb023d06c28f2b734597480fb4c0e500feb6f"}, + {file = "pymongo-4.8.0.tar.gz", hash = "sha256:454f2295875744dc70f1881e4b2eb99cdad008a33574bc8aaf120530f66c0cde"}, ] [package.dependencies] @@ -1346,6 +1767,7 @@ dnspython = ">=1.16.0,<3.0.0" [package.extras] aws = ["pymongo-auth-aws (>=1.1.0,<2.0.0)"] +docs = ["furo (==2023.9.10)", "readthedocs-sphinx-search (>=0.3,<1.0)", "sphinx (>=5.3,<8)", "sphinx-rtd-theme (>=2,<3)", "sphinxcontrib-shellcheck (>=1,<2)"] encryption = ["certifi", "pymongo-auth-aws (>=1.1.0,<2.0.0)", "pymongocrypt (>=1.6.0,<2.0.0)"] gssapi = ["pykerberos", "winkerberos (>=0.5.0)"] ocsp = ["certifi", "cryptography (>=2.5)", "pyopenssl (>=17.2.0)", "requests (<3.0.0)", "service-identity (>=18.1.0)"] @@ -1613,63 +2035,80 @@ files = [ [[package]] name = "pyyaml" -version = "6.0.1" +version = "6.0.2" description = "YAML parser and emitter for Python" optional = false +python-versions = ">=3.8" +files = [ + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, +] + +[[package]] +name = "pyyaml-env-tag" +version = "0.1" +description = "A custom YAML tag for referencing environment variables in YAML files. " +optional = false python-versions = ">=3.6" files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, + {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, + {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, ] +[package.dependencies] +pyyaml = "*" + [[package]] name = "rdflib" version = "7.0.0" @@ -1722,28 +2161,116 @@ rdflib-jsonld = "0.6.1" [[package]] name = "referencing" -version = "0.35.0" +version = "0.35.1" description = "JSON Referencing + Python" optional = false python-versions = ">=3.8" files = [ - {file = "referencing-0.35.0-py3-none-any.whl", hash = "sha256:8080727b30e364e5783152903672df9b6b091c926a146a759080b62ca3126cd6"}, - {file = "referencing-0.35.0.tar.gz", hash = "sha256:191e936b0c696d0af17ad7430a3dc68e88bc11be6514f4757dc890f04ab05889"}, + {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.7.24" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.8" +files = [ + {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b0d3f567fafa0633aee87f08b9276c7062da9616931382993c03808bb68ce"}, + {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3426de3b91d1bc73249042742f45c2148803c111d1175b283270177fdf669024"}, + {file = "regex-2024.7.24-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f273674b445bcb6e4409bf8d1be67bc4b58e8b46fd0d560055d515b8830063cd"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23acc72f0f4e1a9e6e9843d6328177ae3074b4182167e34119ec7233dfeccf53"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65fd3d2e228cae024c411c5ccdffae4c315271eee4a8b839291f84f796b34eca"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c414cbda77dbf13c3bc88b073a1a9f375c7b0cb5e115e15d4b73ec3a2fbc6f59"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf7a89eef64b5455835f5ed30254ec19bf41f7541cd94f266ab7cbd463f00c41"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19c65b00d42804e3fbea9708f0937d157e53429a39b7c61253ff15670ff62cb5"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7a5486ca56c8869070a966321d5ab416ff0f83f30e0e2da1ab48815c8d165d46"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6f51f9556785e5a203713f5efd9c085b4a45aecd2a42573e2b5041881b588d1f"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a4997716674d36a82eab3e86f8fa77080a5d8d96a389a61ea1d0e3a94a582cf7"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c0abb5e4e8ce71a61d9446040c1e86d4e6d23f9097275c5bd49ed978755ff0fe"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:18300a1d78cf1290fa583cd8b7cde26ecb73e9f5916690cf9d42de569c89b1ce"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:416c0e4f56308f34cdb18c3f59849479dde5b19febdcd6e6fa4d04b6c31c9faa"}, + {file = "regex-2024.7.24-cp310-cp310-win32.whl", hash = "sha256:fb168b5924bef397b5ba13aabd8cf5df7d3d93f10218d7b925e360d436863f66"}, + {file = "regex-2024.7.24-cp310-cp310-win_amd64.whl", hash = "sha256:6b9fc7e9cc983e75e2518496ba1afc524227c163e43d706688a6bb9eca41617e"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:382281306e3adaaa7b8b9ebbb3ffb43358a7bbf585fa93821300a418bb975281"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4fdd1384619f406ad9037fe6b6eaa3de2749e2e12084abc80169e8e075377d3b"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3d974d24edb231446f708c455fd08f94c41c1ff4f04bcf06e5f36df5ef50b95a"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2ec4419a3fe6cf8a4795752596dfe0adb4aea40d3683a132bae9c30b81e8d73"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb563dd3aea54c797adf513eeec819c4213d7dbfc311874eb4fd28d10f2ff0f2"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45104baae8b9f67569f0f1dca5e1f1ed77a54ae1cd8b0b07aba89272710db61e"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:994448ee01864501912abf2bad9203bffc34158e80fe8bfb5b031f4f8e16da51"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fac296f99283ac232d8125be932c5cd7644084a30748fda013028c815ba3364"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e37e809b9303ec3a179085415cb5f418ecf65ec98cdfe34f6a078b46ef823ee"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:01b689e887f612610c869421241e075c02f2e3d1ae93a037cb14f88ab6a8934c"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f6442f0f0ff81775eaa5b05af8a0ffa1dda36e9cf6ec1e0d3d245e8564b684ce"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:871e3ab2838fbcb4e0865a6e01233975df3a15e6fce93b6f99d75cacbd9862d1"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c918b7a1e26b4ab40409820ddccc5d49871a82329640f5005f73572d5eaa9b5e"}, + {file = "regex-2024.7.24-cp311-cp311-win32.whl", hash = "sha256:2dfbb8baf8ba2c2b9aa2807f44ed272f0913eeeba002478c4577b8d29cde215c"}, + {file = "regex-2024.7.24-cp311-cp311-win_amd64.whl", hash = "sha256:538d30cd96ed7d1416d3956f94d54e426a8daf7c14527f6e0d6d425fcb4cca52"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fe4ebef608553aff8deb845c7f4f1d0740ff76fa672c011cc0bacb2a00fbde86"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:74007a5b25b7a678459f06559504f1eec2f0f17bca218c9d56f6a0a12bfffdad"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7df9ea48641da022c2a3c9c641650cd09f0cd15e8908bf931ad538f5ca7919c9"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1141a1dcc32904c47f6846b040275c6e5de0bf73f17d7a409035d55b76f289"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80c811cfcb5c331237d9bad3bea2c391114588cf4131707e84d9493064d267f9"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7214477bf9bd195894cf24005b1e7b496f46833337b5dedb7b2a6e33f66d962c"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d55588cba7553f0b6ec33130bc3e114b355570b45785cebdc9daed8c637dd440"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:558a57cfc32adcf19d3f791f62b5ff564922942e389e3cfdb538a23d65a6b610"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a512eed9dfd4117110b1881ba9a59b31433caed0c4101b361f768e7bcbaf93c5"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:86b17ba823ea76256b1885652e3a141a99a5c4422f4a869189db328321b73799"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5eefee9bfe23f6df09ffb6dfb23809f4d74a78acef004aa904dc7c88b9944b05"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:731fcd76bbdbf225e2eb85b7c38da9633ad3073822f5ab32379381e8c3c12e94"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eaef80eac3b4cfbdd6de53c6e108b4c534c21ae055d1dbea2de6b3b8ff3def38"}, + {file = "regex-2024.7.24-cp312-cp312-win32.whl", hash = "sha256:185e029368d6f89f36e526764cf12bf8d6f0e3a2a7737da625a76f594bdfcbfc"}, + {file = "regex-2024.7.24-cp312-cp312-win_amd64.whl", hash = "sha256:2f1baff13cc2521bea83ab2528e7a80cbe0ebb2c6f0bfad15be7da3aed443908"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:66b4c0731a5c81921e938dcf1a88e978264e26e6ac4ec96a4d21ae0354581ae0"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:88ecc3afd7e776967fa16c80f974cb79399ee8dc6c96423321d6f7d4b881c92b"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:64bd50cf16bcc54b274e20235bf8edbb64184a30e1e53873ff8d444e7ac656b2"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb462f0e346fcf41a901a126b50f8781e9a474d3927930f3490f38a6e73b6950"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a82465ebbc9b1c5c50738536fdfa7cab639a261a99b469c9d4c7dcbb2b3f1e57"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:68a8f8c046c6466ac61a36b65bb2395c74451df2ffb8458492ef49900efed293"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac8e84fff5d27420f3c1e879ce9929108e873667ec87e0c8eeb413a5311adfe"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba2537ef2163db9e6ccdbeb6f6424282ae4dea43177402152c67ef869cf3978b"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:43affe33137fcd679bdae93fb25924979517e011f9dea99163f80b82eadc7e53"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:c9bb87fdf2ab2370f21e4d5636e5317775e5d51ff32ebff2cf389f71b9b13750"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:945352286a541406f99b2655c973852da7911b3f4264e010218bbc1cc73168f2"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:8bc593dcce679206b60a538c302d03c29b18e3d862609317cb560e18b66d10cf"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3f3b6ca8eae6d6c75a6cff525c8530c60e909a71a15e1b731723233331de4169"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c51edc3541e11fbe83f0c4d9412ef6c79f664a3745fab261457e84465ec9d5a8"}, + {file = "regex-2024.7.24-cp38-cp38-win32.whl", hash = "sha256:d0a07763776188b4db4c9c7fb1b8c494049f84659bb387b71c73bbc07f189e96"}, + {file = "regex-2024.7.24-cp38-cp38-win_amd64.whl", hash = "sha256:8fd5afd101dcf86a270d254364e0e8dddedebe6bd1ab9d5f732f274fa00499a5"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0ffe3f9d430cd37d8fa5632ff6fb36d5b24818c5c986893063b4e5bdb84cdf24"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:25419b70ba00a16abc90ee5fce061228206173231f004437730b67ac77323f0d"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:33e2614a7ce627f0cdf2ad104797d1f68342d967de3695678c0cb84f530709f8"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d33a0021893ede5969876052796165bab6006559ab845fd7b515a30abdd990dc"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04ce29e2c5fedf296b1a1b0acc1724ba93a36fb14031f3abfb7abda2806c1535"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b16582783f44fbca6fcf46f61347340c787d7530d88b4d590a397a47583f31dd"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:836d3cc225b3e8a943d0b02633fb2f28a66e281290302a79df0e1eaa984ff7c1"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:438d9f0f4bc64e8dea78274caa5af971ceff0f8771e1a2333620969936ba10be"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:973335b1624859cb0e52f96062a28aa18f3a5fc77a96e4a3d6d76e29811a0e6e"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c5e69fd3eb0b409432b537fe3c6f44ac089c458ab6b78dcec14478422879ec5f"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fbf8c2f00904eaf63ff37718eb13acf8e178cb940520e47b2f05027f5bb34ce3"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2757ace61bc4061b69af19e4689fa4416e1a04840f33b441034202b5cd02d4"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:44fc61b99035fd9b3b9453f1713234e5a7c92a04f3577252b45feefe1b327759"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:84c312cdf839e8b579f504afcd7b65f35d60b6285d892b19adea16355e8343c9"}, + {file = "regex-2024.7.24-cp39-cp39-win32.whl", hash = "sha256:ca5b2028c2f7af4e13fb9fc29b28d0ce767c38c7facdf64f6c2cd040413055f1"}, + {file = "regex-2024.7.24-cp39-cp39-win_amd64.whl", hash = "sha256:7c479f5ae937ec9985ecaf42e2e10631551d909f203e31308c12d703922742f9"}, + {file = "regex-2024.7.24.tar.gz", hash = "sha256:9cfd009eed1a46b27c14039ad5bbc5e71b6367c5b2e6d5f5da0ea91600817506"}, +] + [[package]] name = "requests" -version = "2.31.0" +version = "2.32.3" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [package.dependencies] @@ -1800,110 +2327,114 @@ files = [ [[package]] name = "rpds-py" -version = "0.18.0" +version = "0.20.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.18.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:5b4e7d8d6c9b2e8ee2d55c90b59c707ca59bc30058269b3db7b1f8df5763557e"}, - {file = "rpds_py-0.18.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c463ed05f9dfb9baebef68048aed8dcdc94411e4bf3d33a39ba97e271624f8f7"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01e36a39af54a30f28b73096dd39b6802eddd04c90dbe161c1b8dbe22353189f"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d62dec4976954a23d7f91f2f4530852b0c7608116c257833922a896101336c51"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd18772815d5f008fa03d2b9a681ae38d5ae9f0e599f7dda233c439fcaa00d40"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:923d39efa3cfb7279a0327e337a7958bff00cc447fd07a25cddb0a1cc9a6d2da"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39514da80f971362f9267c600b6d459bfbbc549cffc2cef8e47474fddc9b45b1"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a34d557a42aa28bd5c48a023c570219ba2593bcbbb8dc1b98d8cf5d529ab1434"}, - {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:93df1de2f7f7239dc9cc5a4a12408ee1598725036bd2dedadc14d94525192fc3"}, - {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:34b18ba135c687f4dac449aa5157d36e2cbb7c03cbea4ddbd88604e076aa836e"}, - {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c0b5dcf9193625afd8ecc92312d6ed78781c46ecbf39af9ad4681fc9f464af88"}, - {file = "rpds_py-0.18.0-cp310-none-win32.whl", hash = "sha256:c4325ff0442a12113a6379af66978c3fe562f846763287ef66bdc1d57925d337"}, - {file = "rpds_py-0.18.0-cp310-none-win_amd64.whl", hash = "sha256:7223a2a5fe0d217e60a60cdae28d6949140dde9c3bcc714063c5b463065e3d66"}, - {file = "rpds_py-0.18.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3a96e0c6a41dcdba3a0a581bbf6c44bb863f27c541547fb4b9711fd8cf0ffad4"}, - {file = "rpds_py-0.18.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30f43887bbae0d49113cbaab729a112251a940e9b274536613097ab8b4899cf6"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcb25daa9219b4cf3a0ab24b0eb9a5cc8949ed4dc72acb8fa16b7e1681aa3c58"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d68c93e381010662ab873fea609bf6c0f428b6d0bb00f2c6939782e0818d37bf"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b34b7aa8b261c1dbf7720b5d6f01f38243e9b9daf7e6b8bc1fd4657000062f2c"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e6d75ab12b0bbab7215e5d40f1e5b738aa539598db27ef83b2ec46747df90e1"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8612cd233543a3781bc659c731b9d607de65890085098986dfd573fc2befe5"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aec493917dd45e3c69d00a8874e7cbed844efd935595ef78a0f25f14312e33c6"}, - {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:661d25cbffaf8cc42e971dd570d87cb29a665f49f4abe1f9e76be9a5182c4688"}, - {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1df3659d26f539ac74fb3b0c481cdf9d725386e3552c6fa2974f4d33d78e544b"}, - {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a1ce3ba137ed54f83e56fb983a5859a27d43a40188ba798993812fed73c70836"}, - {file = "rpds_py-0.18.0-cp311-none-win32.whl", hash = "sha256:69e64831e22a6b377772e7fb337533c365085b31619005802a79242fee620bc1"}, - {file = "rpds_py-0.18.0-cp311-none-win_amd64.whl", hash = "sha256:998e33ad22dc7ec7e030b3df701c43630b5bc0d8fbc2267653577e3fec279afa"}, - {file = "rpds_py-0.18.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7f2facbd386dd60cbbf1a794181e6aa0bd429bd78bfdf775436020172e2a23f0"}, - {file = "rpds_py-0.18.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1d9a5be316c15ffb2b3c405c4ff14448c36b4435be062a7f578ccd8b01f0c4d8"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd5bf1af8efe569654bbef5a3e0a56eca45f87cfcffab31dd8dde70da5982475"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5417558f6887e9b6b65b4527232553c139b57ec42c64570569b155262ac0754f"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:56a737287efecafc16f6d067c2ea0117abadcd078d58721f967952db329a3e5c"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8f03bccbd8586e9dd37219bce4d4e0d3ab492e6b3b533e973fa08a112cb2ffc9"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4457a94da0d5c53dc4b3e4de1158bdab077db23c53232f37a3cb7afdb053a4e3"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0ab39c1ba9023914297dd88ec3b3b3c3f33671baeb6acf82ad7ce883f6e8e157"}, - {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9d54553c1136b50fd12cc17e5b11ad07374c316df307e4cfd6441bea5fb68496"}, - {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0af039631b6de0397ab2ba16eaf2872e9f8fca391b44d3d8cac317860a700a3f"}, - {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:84ffab12db93b5f6bad84c712c92060a2d321b35c3c9960b43d08d0f639d60d7"}, - {file = "rpds_py-0.18.0-cp312-none-win32.whl", hash = "sha256:685537e07897f173abcf67258bee3c05c374fa6fff89d4c7e42fb391b0605e98"}, - {file = "rpds_py-0.18.0-cp312-none-win_amd64.whl", hash = "sha256:e003b002ec72c8d5a3e3da2989c7d6065b47d9eaa70cd8808b5384fbb970f4ec"}, - {file = "rpds_py-0.18.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:08f9ad53c3f31dfb4baa00da22f1e862900f45908383c062c27628754af2e88e"}, - {file = "rpds_py-0.18.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0013fe6b46aa496a6749c77e00a3eb07952832ad6166bd481c74bda0dcb6d58"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e32a92116d4f2a80b629778280103d2a510a5b3f6314ceccd6e38006b5e92dcb"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e541ec6f2ec456934fd279a3120f856cd0aedd209fc3852eca563f81738f6861"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bed88b9a458e354014d662d47e7a5baafd7ff81c780fd91584a10d6ec842cb73"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2644e47de560eb7bd55c20fc59f6daa04682655c58d08185a9b95c1970fa1e07"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e8916ae4c720529e18afa0b879473049e95949bf97042e938530e072fde061d"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:465a3eb5659338cf2a9243e50ad9b2296fa15061736d6e26240e713522b6235c"}, - {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ea7d4a99f3b38c37eac212dbd6ec42b7a5ec51e2c74b5d3223e43c811609e65f"}, - {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:67071a6171e92b6da534b8ae326505f7c18022c6f19072a81dcf40db2638767c"}, - {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:41ef53e7c58aa4ef281da975f62c258950f54b76ec8e45941e93a3d1d8580594"}, - {file = "rpds_py-0.18.0-cp38-none-win32.whl", hash = "sha256:fdea4952db2793c4ad0bdccd27c1d8fdd1423a92f04598bc39425bcc2b8ee46e"}, - {file = "rpds_py-0.18.0-cp38-none-win_amd64.whl", hash = "sha256:7cd863afe7336c62ec78d7d1349a2f34c007a3cc6c2369d667c65aeec412a5b1"}, - {file = "rpds_py-0.18.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5307def11a35f5ae4581a0b658b0af8178c65c530e94893345bebf41cc139d33"}, - {file = "rpds_py-0.18.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77f195baa60a54ef9d2de16fbbfd3ff8b04edc0c0140a761b56c267ac11aa467"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39f5441553f1c2aed4de4377178ad8ff8f9d733723d6c66d983d75341de265ab"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a00312dea9310d4cb7dbd7787e722d2e86a95c2db92fbd7d0155f97127bcb40"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f2fc11e8fe034ee3c34d316d0ad8808f45bc3b9ce5857ff29d513f3ff2923a1"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:586f8204935b9ec884500498ccc91aa869fc652c40c093bd9e1471fbcc25c022"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddc2f4dfd396c7bfa18e6ce371cba60e4cf9d2e5cdb71376aa2da264605b60b9"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ddcba87675b6d509139d1b521e0c8250e967e63b5909a7e8f8944d0f90ff36f"}, - {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7bd339195d84439cbe5771546fe8a4e8a7a045417d8f9de9a368c434e42a721e"}, - {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d7c36232a90d4755b720fbd76739d8891732b18cf240a9c645d75f00639a9024"}, - {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6b0817e34942b2ca527b0e9298373e7cc75f429e8da2055607f4931fded23e20"}, - {file = "rpds_py-0.18.0-cp39-none-win32.whl", hash = "sha256:99f70b740dc04d09e6b2699b675874367885217a2e9f782bdf5395632ac663b7"}, - {file = "rpds_py-0.18.0-cp39-none-win_amd64.whl", hash = "sha256:6ef687afab047554a2d366e112dd187b62d261d49eb79b77e386f94644363294"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ad36cfb355e24f1bd37cac88c112cd7730873f20fb0bdaf8ba59eedf8216079f"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:36b3ee798c58ace201289024b52788161e1ea133e4ac93fba7d49da5fec0ef9e"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8a2f084546cc59ea99fda8e070be2fd140c3092dc11524a71aa8f0f3d5a55ca"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e4461d0f003a0aa9be2bdd1b798a041f177189c1a0f7619fe8c95ad08d9a45d7"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8db715ebe3bb7d86d77ac1826f7d67ec11a70dbd2376b7cc214199360517b641"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:793968759cd0d96cac1e367afd70c235867831983f876a53389ad869b043c948"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66e6a3af5a75363d2c9a48b07cb27c4ea542938b1a2e93b15a503cdfa8490795"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ef0befbb5d79cf32d0266f5cff01545602344eda89480e1dd88aca964260b18"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d4acf42190d449d5e89654d5c1ed3a4f17925eec71f05e2a41414689cda02d1"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a5f446dd5055667aabaee78487f2b5ab72e244f9bc0b2ffebfeec79051679984"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9dbbeb27f4e70bfd9eec1be5477517365afe05a9b2c441a0b21929ee61048124"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:22806714311a69fd0af9b35b7be97c18a0fc2826e6827dbb3a8c94eac6cf7eeb"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b34ae4636dfc4e76a438ab826a0d1eed2589ca7d9a1b2d5bb546978ac6485461"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c8370641f1a7f0e0669ddccca22f1da893cef7628396431eb445d46d893e5cd"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c8362467a0fdeccd47935f22c256bec5e6abe543bf0d66e3d3d57a8fb5731863"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11a8c85ef4a07a7638180bf04fe189d12757c696eb41f310d2426895356dcf05"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b316144e85316da2723f9d8dc75bada12fa58489a527091fa1d5a612643d1a0e"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf1ea2e34868f6fbf070e1af291c8180480310173de0b0c43fc38a02929fc0e3"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e546e768d08ad55b20b11dbb78a745151acbd938f8f00d0cfbabe8b0199b9880"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4901165d170a5fde6f589acb90a6b33629ad1ec976d4529e769c6f3d885e3e80"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:618a3d6cae6ef8ec88bb76dd80b83cfe415ad4f1d942ca2a903bf6b6ff97a2da"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ed4eb745efbff0a8e9587d22a84be94a5eb7d2d99c02dacf7bd0911713ed14dd"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c81e5f372cd0dc5dc4809553d34f832f60a46034a5f187756d9b90586c2c307"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:43fbac5f22e25bee1d482c97474f930a353542855f05c1161fd804c9dc74a09d"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d7faa6f14017c0b1e69f5e2c357b998731ea75a442ab3841c0dbbbfe902d2c4"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:08231ac30a842bd04daabc4d71fddd7e6d26189406d5a69535638e4dcb88fe76"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:044a3e61a7c2dafacae99d1e722cc2d4c05280790ec5a05031b3876809d89a5c"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f26b5bd1079acdb0c7a5645e350fe54d16b17bfc5e71f371c449383d3342e17"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:482103aed1dfe2f3b71a58eff35ba105289b8d862551ea576bd15479aba01f66"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1374f4129f9bcca53a1bba0bb86bf78325a0374577cf7e9e4cd046b1e6f20e24"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:635dc434ff724b178cb192c70016cc0ad25a275228f749ee0daf0eddbc8183b1"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:bc362ee4e314870a70f4ae88772d72d877246537d9f8cb8f7eacf10884862432"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4832d7d380477521a8c1644bbab6588dfedea5e30a7d967b5fb75977c45fd77f"}, - {file = "rpds_py-0.18.0.tar.gz", hash = "sha256:42821446ee7a76f5d9f71f9e33a4fb2ffd724bb3e7f93386150b61a43115788d"}, + {file = "rpds_py-0.20.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3ad0fda1635f8439cde85c700f964b23ed5fc2d28016b32b9ee5fe30da5c84e2"}, + {file = "rpds_py-0.20.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9bb4a0d90fdb03437c109a17eade42dfbf6190408f29b2744114d11586611d6f"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6377e647bbfd0a0b159fe557f2c6c602c159fc752fa316572f012fc0bf67150"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb851b7df9dda52dc1415ebee12362047ce771fc36914586b2e9fcbd7d293b3e"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e0f80b739e5a8f54837be5d5c924483996b603d5502bfff79bf33da06164ee2"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a8c94dad2e45324fc74dce25e1645d4d14df9a4e54a30fa0ae8bad9a63928e3"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e604fe73ba048c06085beaf51147eaec7df856824bfe7b98657cf436623daf"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:df3de6b7726b52966edf29663e57306b23ef775faf0ac01a3e9f4012a24a4140"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf258ede5bc22a45c8e726b29835b9303c285ab46fc7c3a4cc770736b5304c9f"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:55fea87029cded5df854ca7e192ec7bdb7ecd1d9a3f63d5c4eb09148acf4a7ce"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ae94bd0b2f02c28e199e9bc51485d0c5601f58780636185660f86bf80c89af94"}, + {file = "rpds_py-0.20.0-cp310-none-win32.whl", hash = "sha256:28527c685f237c05445efec62426d285e47a58fb05ba0090a4340b73ecda6dee"}, + {file = "rpds_py-0.20.0-cp310-none-win_amd64.whl", hash = "sha256:238a2d5b1cad28cdc6ed15faf93a998336eb041c4e440dd7f902528b8891b399"}, + {file = "rpds_py-0.20.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac2f4f7a98934c2ed6505aead07b979e6f999389f16b714448fb39bbaa86a489"}, + {file = "rpds_py-0.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:220002c1b846db9afd83371d08d239fdc865e8f8c5795bbaec20916a76db3318"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d7919548df3f25374a1f5d01fbcd38dacab338ef5f33e044744b5c36729c8db"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:758406267907b3781beee0f0edfe4a179fbd97c0be2e9b1154d7f0a1279cf8e5"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d61339e9f84a3f0767b1995adfb171a0d00a1185192718a17af6e124728e0f5"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1259c7b3705ac0a0bd38197565a5d603218591d3f6cee6e614e380b6ba61c6f6"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c1dc0f53856b9cc9a0ccca0a7cc61d3d20a7088201c0937f3f4048c1718a209"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7e60cb630f674a31f0368ed32b2a6b4331b8350d67de53c0359992444b116dd3"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dbe982f38565bb50cb7fb061ebf762c2f254ca3d8c20d4006878766e84266272"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:514b3293b64187172bc77c8fb0cdae26981618021053b30d8371c3a902d4d5ad"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d0a26ffe9d4dd35e4dfdd1e71f46401cff0181c75ac174711ccff0459135fa58"}, + {file = "rpds_py-0.20.0-cp311-none-win32.whl", hash = "sha256:89c19a494bf3ad08c1da49445cc5d13d8fefc265f48ee7e7556839acdacf69d0"}, + {file = "rpds_py-0.20.0-cp311-none-win_amd64.whl", hash = "sha256:c638144ce971df84650d3ed0096e2ae7af8e62ecbbb7b201c8935c370df00a2c"}, + {file = "rpds_py-0.20.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a84ab91cbe7aab97f7446652d0ed37d35b68a465aeef8fc41932a9d7eee2c1a6"}, + {file = "rpds_py-0.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:56e27147a5a4c2c21633ff8475d185734c0e4befd1c989b5b95a5d0db699b21b"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2580b0c34583b85efec8c5c5ec9edf2dfe817330cc882ee972ae650e7b5ef739"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b80d4a7900cf6b66bb9cee5c352b2d708e29e5a37fe9bf784fa97fc11504bf6c"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50eccbf054e62a7b2209b28dc7a22d6254860209d6753e6b78cfaeb0075d7bee"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:49a8063ea4296b3a7e81a5dfb8f7b2d73f0b1c20c2af401fb0cdf22e14711a96"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea438162a9fcbee3ecf36c23e6c68237479f89f962f82dae83dc15feeceb37e4"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:18d7585c463087bddcfa74c2ba267339f14f2515158ac4db30b1f9cbdb62c8ef"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d4c7d1a051eeb39f5c9547e82ea27cbcc28338482242e3e0b7768033cb083821"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4df1e3b3bec320790f699890d41c59d250f6beda159ea3c44c3f5bac1976940"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2cf126d33a91ee6eedc7f3197b53e87a2acdac63602c0f03a02dd69e4b138174"}, + {file = "rpds_py-0.20.0-cp312-none-win32.whl", hash = "sha256:8bc7690f7caee50b04a79bf017a8d020c1f48c2a1077ffe172abec59870f1139"}, + {file = "rpds_py-0.20.0-cp312-none-win_amd64.whl", hash = "sha256:0e13e6952ef264c40587d510ad676a988df19adea20444c2b295e536457bc585"}, + {file = "rpds_py-0.20.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:aa9a0521aeca7d4941499a73ad7d4f8ffa3d1affc50b9ea11d992cd7eff18a29"}, + {file = "rpds_py-0.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1f1d51eccb7e6c32ae89243cb352389228ea62f89cd80823ea7dd1b98e0b91"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a86a9b96070674fc88b6f9f71a97d2c1d3e5165574615d1f9168ecba4cecb24"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6c8ef2ebf76df43f5750b46851ed1cdf8f109d7787ca40035fe19fbdc1acc5a7"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b25f024b421d5859d156750ea9a65651793d51b76a2e9238c05c9d5f203a9"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57eb94a8c16ab08fef6404301c38318e2c5a32216bf5de453e2714c964c125c8"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1940dae14e715e2e02dfd5b0f64a52e8374a517a1e531ad9412319dc3ac7879"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d20277fd62e1b992a50c43f13fbe13277a31f8c9f70d59759c88f644d66c619f"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:06db23d43f26478303e954c34c75182356ca9aa7797d22c5345b16871ab9c45c"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b2a5db5397d82fa847e4c624b0c98fe59d2d9b7cf0ce6de09e4d2e80f8f5b3f2"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a35df9f5548fd79cb2f52d27182108c3e6641a4feb0f39067911bf2adaa3e57"}, + {file = "rpds_py-0.20.0-cp313-none-win32.whl", hash = "sha256:fd2d84f40633bc475ef2d5490b9c19543fbf18596dcb1b291e3a12ea5d722f7a"}, + {file = "rpds_py-0.20.0-cp313-none-win_amd64.whl", hash = "sha256:9bc2d153989e3216b0559251b0c260cfd168ec78b1fac33dd485750a228db5a2"}, + {file = "rpds_py-0.20.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:f2fbf7db2012d4876fb0d66b5b9ba6591197b0f165db8d99371d976546472a24"}, + {file = "rpds_py-0.20.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1e5f3cd7397c8f86c8cc72d5a791071431c108edd79872cdd96e00abd8497d29"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce9845054c13696f7af7f2b353e6b4f676dab1b4b215d7fe5e05c6f8bb06f965"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c3e130fd0ec56cb76eb49ef52faead8ff09d13f4527e9b0c400307ff72b408e1"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b16aa0107ecb512b568244ef461f27697164d9a68d8b35090e9b0c1c8b27752"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa7f429242aae2947246587d2964fad750b79e8c233a2367f71b554e9447949c"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af0fc424a5842a11e28956e69395fbbeab2c97c42253169d87e90aac2886d751"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b8c00a3b1e70c1d3891f0db1b05292747f0dbcfb49c43f9244d04c70fbc40eb8"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:40ce74fc86ee4645d0a225498d091d8bc61f39b709ebef8204cb8b5a464d3c0e"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4fe84294c7019456e56d93e8ababdad5a329cd25975be749c3f5f558abb48253"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:338ca4539aad4ce70a656e5187a3a31c5204f261aef9f6ab50e50bcdffaf050a"}, + {file = "rpds_py-0.20.0-cp38-none-win32.whl", hash = "sha256:54b43a2b07db18314669092bb2de584524d1ef414588780261e31e85846c26a5"}, + {file = "rpds_py-0.20.0-cp38-none-win_amd64.whl", hash = "sha256:a1862d2d7ce1674cffa6d186d53ca95c6e17ed2b06b3f4c476173565c862d232"}, + {file = "rpds_py-0.20.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3fde368e9140312b6e8b6c09fb9f8c8c2f00999d1823403ae90cc00480221b22"}, + {file = "rpds_py-0.20.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9824fb430c9cf9af743cf7aaf6707bf14323fb51ee74425c380f4c846ea70789"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11ef6ce74616342888b69878d45e9f779b95d4bd48b382a229fe624a409b72c5"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c52d3f2f82b763a24ef52f5d24358553e8403ce05f893b5347098014f2d9eff2"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d35cef91e59ebbeaa45214861874bc6f19eb35de96db73e467a8358d701a96c"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d72278a30111e5b5525c1dd96120d9e958464316f55adb030433ea905866f4de"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c29cbbba378759ac5786730d1c3cb4ec6f8ababf5c42a9ce303dc4b3d08cda"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6632f2d04f15d1bd6fe0eedd3b86d9061b836ddca4c03d5cf5c7e9e6b7c14580"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d0b67d87bb45ed1cd020e8fbf2307d449b68abc45402fe1a4ac9e46c3c8b192b"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ec31a99ca63bf3cd7f1a5ac9fe95c5e2d060d3c768a09bc1d16e235840861420"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22e6c9976e38f4d8c4a63bd8a8edac5307dffd3ee7e6026d97f3cc3a2dc02a0b"}, + {file = "rpds_py-0.20.0-cp39-none-win32.whl", hash = "sha256:569b3ea770c2717b730b61998b6c54996adee3cef69fc28d444f3e7920313cf7"}, + {file = "rpds_py-0.20.0-cp39-none-win_amd64.whl", hash = "sha256:e6900ecdd50ce0facf703f7a00df12374b74bbc8ad9fe0f6559947fb20f82364"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:617c7357272c67696fd052811e352ac54ed1d9b49ab370261a80d3b6ce385045"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9426133526f69fcaba6e42146b4e12d6bc6c839b8b555097020e2b78ce908dcc"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:deb62214c42a261cb3eb04d474f7155279c1a8a8c30ac89b7dcb1721d92c3c02"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fcaeb7b57f1a1e071ebd748984359fef83ecb026325b9d4ca847c95bc7311c92"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d454b8749b4bd70dd0a79f428731ee263fa6995f83ccb8bada706e8d1d3ff89d"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d807dc2051abe041b6649681dce568f8e10668e3c1c6543ebae58f2d7e617855"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c20f0ddeb6e29126d45f89206b8291352b8c5b44384e78a6499d68b52ae511"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b7f19250ceef892adf27f0399b9e5afad019288e9be756d6919cb58892129f51"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4f1ed4749a08379555cebf4650453f14452eaa9c43d0a95c49db50c18b7da075"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:dcedf0b42bcb4cfff4101d7771a10532415a6106062f005ab97d1d0ab5681c60"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:39ed0d010457a78f54090fafb5d108501b5aa5604cc22408fc1c0c77eac14344"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:bb273176be34a746bdac0b0d7e4e2c467323d13640b736c4c477881a3220a989"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f918a1a130a6dfe1d7fe0f105064141342e7dd1611f2e6a21cd2f5c8cb1cfb3e"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f60012a73aa396be721558caa3a6fd49b3dd0033d1675c6d59c4502e870fcf0c"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d2b1ad682a3dfda2a4e8ad8572f3100f95fad98cb99faf37ff0ddfe9cbf9d03"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:614fdafe9f5f19c63ea02817fa4861c606a59a604a77c8cdef5aa01d28b97921"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa518bcd7600c584bf42e6617ee8132869e877db2f76bcdc281ec6a4113a53ab"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0475242f447cc6cb8a9dd486d68b2ef7fbee84427124c232bff5f63b1fe11e5"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f90a4cd061914a60bd51c68bcb4357086991bd0bb93d8aa66a6da7701370708f"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:def7400461c3a3f26e49078302e1c1b38f6752342c77e3cf72ce91ca69fb1bc1"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:65794e4048ee837494aea3c21a28ad5fc080994dfba5b036cf84de37f7ad5074"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:faefcc78f53a88f3076b7f8be0a8f8d35133a3ecf7f3770895c25f8813460f08"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:5b4f105deeffa28bbcdff6c49b34e74903139afa690e35d2d9e3c2c2fba18cec"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fdfc3a892927458d98f3d55428ae46b921d1f7543b89382fdb483f5640daaec8"}, + {file = "rpds_py-0.20.0.tar.gz", hash = "sha256:d72a210824facfdaf8768cf2d7ca25a042c30320b3020de2fa04640920d4e121"}, ] [[package]] @@ -1933,24 +2464,24 @@ python-versions = ">=3.6" files = [ {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:d92f81886165cb14d7b067ef37e142256f1c6a90a65cd156b063a43da1708cfd"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win32.whl", hash = "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win_amd64.whl", hash = "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:b5edda50e5e9e15e54a6a8a0070302b00c518a9d32accc2346ad6c984aacd279"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_24_aarch64.whl", hash = "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win32.whl", hash = "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win_amd64.whl", hash = "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:7048c338b6c86627afb27faecf418768acb6331fc24cfa56c93e8c9780f815fa"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_24_aarch64.whl", hash = "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win32.whl", hash = "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa"}, @@ -1958,7 +2489,7 @@ files = [ {file = "ruamel.yaml.clib-0.2.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3fcc54cb0c8b811ff66082de1680b4b14cf8a81dce0d4fbf665c2265a81e07a1"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3"}, @@ -1966,7 +2497,7 @@ files = [ {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win_amd64.whl", hash = "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:665f58bfd29b167039f714c6998178d27ccd83984084c286110ef26b230f259f"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d"}, @@ -1974,7 +2505,7 @@ files = [ {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:9eb5dee2772b0f704ca2e45b1713e4e5198c18f515b52743576d196348f374d3"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880"}, @@ -2056,6 +2587,17 @@ files = [ {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, ] +[[package]] +name = "soupsieve" +version = "2.6" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.8" +files = [ + {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, + {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, +] + [[package]] name = "sparqlslurper" version = "0.5.1" @@ -2094,64 +2636,64 @@ pandas = ["pandas (>=1.3.5)"] [[package]] name = "sqlalchemy" -version = "2.0.29" +version = "2.0.32" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.29-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4c142852ae192e9fe5aad5c350ea6befe9db14370b34047e1f0f7cf99e63c63b"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:99a1e69d4e26f71e750e9ad6fdc8614fbddb67cfe2173a3628a2566034e223c7"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ef3fbccb4058355053c51b82fd3501a6e13dd808c8d8cd2561e610c5456013c"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d6753305936eddc8ed190e006b7bb33a8f50b9854823485eed3a886857ab8d1"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0f3ca96af060a5250a8ad5a63699180bc780c2edf8abf96c58af175921df847a"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c4520047006b1d3f0d89e0532978c0688219857eb2fee7c48052560ae76aca1e"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-win32.whl", hash = "sha256:b2a0e3cf0caac2085ff172c3faacd1e00c376e6884b5bc4dd5b6b84623e29e4f"}, - {file = "SQLAlchemy-2.0.29-cp310-cp310-win_amd64.whl", hash = "sha256:01d10638a37460616708062a40c7b55f73e4d35eaa146781c683e0fa7f6c43fb"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:308ef9cb41d099099fffc9d35781638986870b29f744382904bf9c7dadd08513"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:296195df68326a48385e7a96e877bc19aa210e485fa381c5246bc0234c36c78e"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a13b917b4ffe5a0a31b83d051d60477819ddf18276852ea68037a144a506efb9"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f6d971255d9ddbd3189e2e79d743ff4845c07f0633adfd1de3f63d930dbe673"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:61405ea2d563407d316c63a7b5271ae5d274a2a9fbcd01b0aa5503635699fa1e"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:de7202ffe4d4a8c1e3cde1c03e01c1a3772c92858837e8f3879b497158e4cb44"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-win32.whl", hash = "sha256:b5d7ed79df55a731749ce65ec20d666d82b185fa4898430b17cb90c892741520"}, - {file = "SQLAlchemy-2.0.29-cp311-cp311-win_amd64.whl", hash = "sha256:205f5a2b39d7c380cbc3b5dcc8f2762fb5bcb716838e2d26ccbc54330775b003"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d96710d834a6fb31e21381c6d7b76ec729bd08c75a25a5184b1089141356171f"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:52de4736404e53c5c6a91ef2698c01e52333988ebdc218f14c833237a0804f1b"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c7b02525ede2a164c5fa5014915ba3591730f2cc831f5be9ff3b7fd3e30958e"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dfefdb3e54cd15f5d56fd5ae32f1da2d95d78319c1f6dfb9bcd0eb15d603d5d"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a88913000da9205b13f6f195f0813b6ffd8a0c0c2bd58d499e00a30eb508870c"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fecd5089c4be1bcc37c35e9aa678938d2888845a134dd016de457b942cf5a758"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-win32.whl", hash = "sha256:8197d6f7a3d2b468861ebb4c9f998b9df9e358d6e1cf9c2a01061cb9b6cf4e41"}, - {file = "SQLAlchemy-2.0.29-cp312-cp312-win_amd64.whl", hash = "sha256:9b19836ccca0d321e237560e475fd99c3d8655d03da80c845c4da20dda31b6e1"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:87a1d53a5382cdbbf4b7619f107cc862c1b0a4feb29000922db72e5a66a5ffc0"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a0732dffe32333211801b28339d2a0babc1971bc90a983e3035e7b0d6f06b93"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90453597a753322d6aa770c5935887ab1fc49cc4c4fdd436901308383d698b4b"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ea311d4ee9a8fa67f139c088ae9f905fcf0277d6cd75c310a21a88bf85e130f5"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5f20cb0a63a3e0ec4e169aa8890e32b949c8145983afa13a708bc4b0a1f30e03"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-win32.whl", hash = "sha256:e5bbe55e8552019c6463709b39634a5fc55e080d0827e2a3a11e18eb73f5cdbd"}, - {file = "SQLAlchemy-2.0.29-cp37-cp37m-win_amd64.whl", hash = "sha256:c2f9c762a2735600654c654bf48dad388b888f8ce387b095806480e6e4ff6907"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7e614d7a25a43a9f54fcce4675c12761b248547f3d41b195e8010ca7297c369c"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:471fcb39c6adf37f820350c28aac4a7df9d3940c6548b624a642852e727ea586"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:988569c8732f54ad3234cf9c561364221a9e943b78dc7a4aaf35ccc2265f1930"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dddaae9b81c88083e6437de95c41e86823d150f4ee94bf24e158a4526cbead01"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:334184d1ab8f4c87f9652b048af3f7abea1c809dfe526fb0435348a6fef3d380"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:38b624e5cf02a69b113c8047cf7f66b5dfe4a2ca07ff8b8716da4f1b3ae81567"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-win32.whl", hash = "sha256:bab41acf151cd68bc2b466deae5deeb9e8ae9c50ad113444151ad965d5bf685b"}, - {file = "SQLAlchemy-2.0.29-cp38-cp38-win_amd64.whl", hash = "sha256:52c8011088305476691b8750c60e03b87910a123cfd9ad48576d6414b6ec2a1d"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3071ad498896907a5ef756206b9dc750f8e57352113c19272bdfdc429c7bd7de"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dba622396a3170974f81bad49aacebd243455ec3cc70615aeaef9e9613b5bca5"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b184e3de58009cc0bf32e20f137f1ec75a32470f5fede06c58f6c355ed42a72"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c37f1050feb91f3d6c32f864d8e114ff5545a4a7afe56778d76a9aec62638ba"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bda7ce59b06d0f09afe22c56714c65c957b1068dee3d5e74d743edec7daba552"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:25664e18bef6dc45015b08f99c63952a53a0a61f61f2e48a9e70cec27e55f699"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-win32.whl", hash = "sha256:77d29cb6c34b14af8a484e831ab530c0f7188f8efed1c6a833a2c674bf3c26ec"}, - {file = "SQLAlchemy-2.0.29-cp39-cp39-win_amd64.whl", hash = "sha256:04c487305ab035a9548f573763915189fc0fe0824d9ba28433196f8436f1449c"}, - {file = "SQLAlchemy-2.0.29-py3-none-any.whl", hash = "sha256:dc4ee2d4ee43251905f88637d5281a8d52e916a021384ec10758826f5cbae305"}, - {file = "SQLAlchemy-2.0.29.tar.gz", hash = "sha256:bd9566b8e58cabd700bc367b60e90d9349cd16f0984973f98a9a09f9c64e86f0"}, -] - -[package.dependencies] -greenlet = {version = "!=0.4.17", markers = "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\""} + {file = "SQLAlchemy-2.0.32-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0c9045ecc2e4db59bfc97b20516dfdf8e41d910ac6fb667ebd3a79ea54084619"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1467940318e4a860afd546ef61fefb98a14d935cd6817ed07a228c7f7c62f389"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5954463675cb15db8d4b521f3566a017c8789222b8316b1e6934c811018ee08b"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:167e7497035c303ae50651b351c28dc22a40bb98fbdb8468cdc971821b1ae533"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b27dfb676ac02529fb6e343b3a482303f16e6bc3a4d868b73935b8792edb52d0"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bf2360a5e0f7bd75fa80431bf8ebcfb920c9f885e7956c7efde89031695cafb8"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-win32.whl", hash = "sha256:306fe44e754a91cd9d600a6b070c1f2fadbb4a1a257b8781ccf33c7067fd3e4d"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-win_amd64.whl", hash = "sha256:99db65e6f3ab42e06c318f15c98f59a436f1c78179e6a6f40f529c8cc7100b22"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:21b053be28a8a414f2ddd401f1be8361e41032d2ef5884b2f31d31cb723e559f"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b178e875a7a25b5938b53b006598ee7645172fccafe1c291a706e93f48499ff5"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723a40ee2cc7ea653645bd4cf024326dea2076673fc9d3d33f20f6c81db83e1d"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:295ff8689544f7ee7e819529633d058bd458c1fd7f7e3eebd0f9268ebc56c2a0"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:49496b68cd190a147118af585173ee624114dfb2e0297558c460ad7495f9dfe2"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:acd9b73c5c15f0ec5ce18128b1fe9157ddd0044abc373e6ecd5ba376a7e5d961"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-win32.whl", hash = "sha256:9365a3da32dabd3e69e06b972b1ffb0c89668994c7e8e75ce21d3e5e69ddef28"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-win_amd64.whl", hash = "sha256:8bd63d051f4f313b102a2af1cbc8b80f061bf78f3d5bd0843ff70b5859e27924"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6bab3db192a0c35e3c9d1560eb8332463e29e5507dbd822e29a0a3c48c0a8d92"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:19d98f4f58b13900d8dec4ed09dd09ef292208ee44cc9c2fe01c1f0a2fe440e9"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd33c61513cb1b7371fd40cf221256456d26a56284e7d19d1f0b9f1eb7dd7e8"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d6ba0497c1d066dd004e0f02a92426ca2df20fac08728d03f67f6960271feec"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2b6be53e4fde0065524f1a0a7929b10e9280987b320716c1509478b712a7688c"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:916a798f62f410c0b80b63683c8061f5ebe237b0f4ad778739304253353bc1cb"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-win32.whl", hash = "sha256:31983018b74908ebc6c996a16ad3690301a23befb643093fcfe85efd292e384d"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-win_amd64.whl", hash = "sha256:4363ed245a6231f2e2957cccdda3c776265a75851f4753c60f3004b90e69bfeb"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b8afd5b26570bf41c35c0121801479958b4446751a3971fb9a480c1afd85558e"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c750987fc876813f27b60d619b987b057eb4896b81117f73bb8d9918c14f1cad"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ada0102afff4890f651ed91120c1120065663506b760da4e7823913ebd3258be"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:78c03d0f8a5ab4f3034c0e8482cfcc415a3ec6193491cfa1c643ed707d476f16"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:3bd1cae7519283ff525e64645ebd7a3e0283f3c038f461ecc1c7b040a0c932a1"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-win32.whl", hash = "sha256:01438ebcdc566d58c93af0171c74ec28efe6a29184b773e378a385e6215389da"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-win_amd64.whl", hash = "sha256:4979dc80fbbc9d2ef569e71e0896990bc94df2b9fdbd878290bd129b65ab579c"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c742be912f57586ac43af38b3848f7688863a403dfb220193a882ea60e1ec3a"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:62e23d0ac103bcf1c5555b6c88c114089587bc64d048fef5bbdb58dfd26f96da"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:251f0d1108aab8ea7b9aadbd07fb47fb8e3a5838dde34aa95a3349876b5a1f1d"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ef18a84e5116340e38eca3e7f9eeaaef62738891422e7c2a0b80feab165905f"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3eb6a97a1d39976f360b10ff208c73afb6a4de86dd2a6212ddf65c4a6a2347d5"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0c1c9b673d21477cec17ab10bc4decb1322843ba35b481585facd88203754fc5"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-win32.whl", hash = "sha256:c41a2b9ca80ee555decc605bd3c4520cc6fef9abde8fd66b1cf65126a6922d65"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-win_amd64.whl", hash = "sha256:8a37e4d265033c897892279e8adf505c8b6b4075f2b40d77afb31f7185cd6ecd"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:52fec964fba2ef46476312a03ec8c425956b05c20220a1a03703537824b5e8e1"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:328429aecaba2aee3d71e11f2477c14eec5990fb6d0e884107935f7fb6001632"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85a01b5599e790e76ac3fe3aa2f26e1feba56270023d6afd5550ed63c68552b3"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaf04784797dcdf4c0aa952c8d234fa01974c4729db55c45732520ce12dd95b4"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4488120becf9b71b3ac718f4138269a6be99a42fe023ec457896ba4f80749525"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:14e09e083a5796d513918a66f3d6aedbc131e39e80875afe81d98a03312889e6"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-win32.whl", hash = "sha256:0d322cc9c9b2154ba7e82f7bf25ecc7c36fbe2d82e2933b3642fc095a52cfc78"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-win_amd64.whl", hash = "sha256:7dd8583df2f98dea28b5cd53a1beac963f4f9d087888d75f22fcc93a07cf8d84"}, + {file = "SQLAlchemy-2.0.32-py3-none-any.whl", hash = "sha256:e567a8793a692451f706b363ccf3c45e056b67d90ead58c3bc9471af5d212202"}, + {file = "SQLAlchemy-2.0.32.tar.gz", hash = "sha256:c1b88cc8b02b6a5f0efb0345a03672d4c897dc7d92585176f88c67346f565ea8"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "python_version < \"3.13\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} typing-extensions = ">=4.6.0" [package.extras] @@ -2203,13 +2745,13 @@ files = [ [[package]] name = "typing-extensions" -version = "4.11.0" +version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, - {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] @@ -2239,13 +2781,13 @@ dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake [[package]] name = "urllib3" -version = "2.2.1" +version = "2.2.2" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, ] [package.extras] @@ -2256,40 +2798,46 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "watchdog" -version = "4.0.0" +version = "4.0.2" description = "Filesystem events monitoring" optional = false python-versions = ">=3.8" files = [ - {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:39cb34b1f1afbf23e9562501673e7146777efe95da24fab5707b88f7fb11649b"}, - {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c522392acc5e962bcac3b22b9592493ffd06d1fc5d755954e6be9f4990de932b"}, - {file = "watchdog-4.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6c47bdd680009b11c9ac382163e05ca43baf4127954c5f6d0250e7d772d2b80c"}, - {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8350d4055505412a426b6ad8c521bc7d367d1637a762c70fdd93a3a0d595990b"}, - {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c17d98799f32e3f55f181f19dd2021d762eb38fdd381b4a748b9f5a36738e935"}, - {file = "watchdog-4.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4986db5e8880b0e6b7cd52ba36255d4793bf5cdc95bd6264806c233173b1ec0b"}, - {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:11e12fafb13372e18ca1bbf12d50f593e7280646687463dd47730fd4f4d5d257"}, - {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5369136a6474678e02426bd984466343924d1df8e2fd94a9b443cb7e3aa20d19"}, - {file = "watchdog-4.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76ad8484379695f3fe46228962017a7e1337e9acadafed67eb20aabb175df98b"}, - {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:45cc09cc4c3b43fb10b59ef4d07318d9a3ecdbff03abd2e36e77b6dd9f9a5c85"}, - {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eed82cdf79cd7f0232e2fdc1ad05b06a5e102a43e331f7d041e5f0e0a34a51c4"}, - {file = "watchdog-4.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba30a896166f0fee83183cec913298151b73164160d965af2e93a20bbd2ab605"}, - {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d18d7f18a47de6863cd480734613502904611730f8def45fc52a5d97503e5101"}, - {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2895bf0518361a9728773083908801a376743bcc37dfa252b801af8fd281b1ca"}, - {file = "watchdog-4.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87e9df830022488e235dd601478c15ad73a0389628588ba0b028cb74eb72fed8"}, - {file = "watchdog-4.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6e949a8a94186bced05b6508faa61b7adacc911115664ccb1923b9ad1f1ccf7b"}, - {file = "watchdog-4.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6a4db54edea37d1058b08947c789a2354ee02972ed5d1e0dca9b0b820f4c7f92"}, - {file = "watchdog-4.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d31481ccf4694a8416b681544c23bd271f5a123162ab603c7d7d2dd7dd901a07"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8fec441f5adcf81dd240a5fe78e3d83767999771630b5ddfc5867827a34fa3d3"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:6a9c71a0b02985b4b0b6d14b875a6c86ddea2fdbebd0c9a720a806a8bbffc69f"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:557ba04c816d23ce98a06e70af6abaa0485f6d94994ec78a42b05d1c03dcbd50"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d0f9bd1fd919134d459d8abf954f63886745f4660ef66480b9d753a7c9d40927"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f9b2fdca47dc855516b2d66eef3c39f2672cbf7e7a42e7e67ad2cbfcd6ba107d"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:73c7a935e62033bd5e8f0da33a4dcb763da2361921a69a5a95aaf6c93aa03a87"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6a80d5cae8c265842c7419c560b9961561556c4361b297b4c431903f8c33b269"}, - {file = "watchdog-4.0.0-py3-none-win32.whl", hash = "sha256:8f9a542c979df62098ae9c58b19e03ad3df1c9d8c6895d96c0d51da17b243b1c"}, - {file = "watchdog-4.0.0-py3-none-win_amd64.whl", hash = "sha256:f970663fa4f7e80401a7b0cbeec00fa801bf0287d93d48368fc3e6fa32716245"}, - {file = "watchdog-4.0.0-py3-none-win_ia64.whl", hash = "sha256:9a03e16e55465177d416699331b0f3564138f1807ecc5f2de9d55d8f188d08c7"}, - {file = "watchdog-4.0.0.tar.gz", hash = "sha256:e3e7065cbdabe6183ab82199d7a4f6b3ba0a438c5a512a68559846ccb76a78ec"}, + {file = "watchdog-4.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ede7f010f2239b97cc79e6cb3c249e72962404ae3865860855d5cbe708b0fd22"}, + {file = "watchdog-4.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a2cffa171445b0efa0726c561eca9a27d00a1f2b83846dbd5a4f639c4f8ca8e1"}, + {file = "watchdog-4.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c50f148b31b03fbadd6d0b5980e38b558046b127dc483e5e4505fcef250f9503"}, + {file = "watchdog-4.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7c7d4bf585ad501c5f6c980e7be9c4f15604c7cc150e942d82083b31a7548930"}, + {file = "watchdog-4.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:914285126ad0b6eb2258bbbcb7b288d9dfd655ae88fa28945be05a7b475a800b"}, + {file = "watchdog-4.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:984306dc4720da5498b16fc037b36ac443816125a3705dfde4fd90652d8028ef"}, + {file = "watchdog-4.0.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1cdcfd8142f604630deef34722d695fb455d04ab7cfe9963055df1fc69e6727a"}, + {file = "watchdog-4.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d7ab624ff2f663f98cd03c8b7eedc09375a911794dfea6bf2a359fcc266bff29"}, + {file = "watchdog-4.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:132937547a716027bd5714383dfc40dc66c26769f1ce8a72a859d6a48f371f3a"}, + {file = "watchdog-4.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:cd67c7df93eb58f360c43802acc945fa8da70c675b6fa37a241e17ca698ca49b"}, + {file = "watchdog-4.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bcfd02377be80ef3b6bc4ce481ef3959640458d6feaae0bd43dd90a43da90a7d"}, + {file = "watchdog-4.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:980b71510f59c884d684b3663d46e7a14b457c9611c481e5cef08f4dd022eed7"}, + {file = "watchdog-4.0.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:aa160781cafff2719b663c8a506156e9289d111d80f3387cf3af49cedee1f040"}, + {file = "watchdog-4.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f6ee8dedd255087bc7fe82adf046f0b75479b989185fb0bdf9a98b612170eac7"}, + {file = "watchdog-4.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0b4359067d30d5b864e09c8597b112fe0a0a59321a0f331498b013fb097406b4"}, + {file = "watchdog-4.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:770eef5372f146997638d737c9a3c597a3b41037cfbc5c41538fc27c09c3a3f9"}, + {file = "watchdog-4.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eeea812f38536a0aa859972d50c76e37f4456474b02bd93674d1947cf1e39578"}, + {file = "watchdog-4.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b2c45f6e1e57ebb4687690c05bc3a2c1fb6ab260550c4290b8abb1335e0fd08b"}, + {file = "watchdog-4.0.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:10b6683df70d340ac3279eff0b2766813f00f35a1d37515d2c99959ada8f05fa"}, + {file = "watchdog-4.0.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f7c739888c20f99824f7aa9d31ac8a97353e22d0c0e54703a547a218f6637eb3"}, + {file = "watchdog-4.0.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c100d09ac72a8a08ddbf0629ddfa0b8ee41740f9051429baa8e31bb903ad7508"}, + {file = "watchdog-4.0.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:f5315a8c8dd6dd9425b974515081fc0aadca1d1d61e078d2246509fd756141ee"}, + {file = "watchdog-4.0.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:2d468028a77b42cc685ed694a7a550a8d1771bb05193ba7b24006b8241a571a1"}, + {file = "watchdog-4.0.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f15edcae3830ff20e55d1f4e743e92970c847bcddc8b7509bcd172aa04de506e"}, + {file = "watchdog-4.0.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:936acba76d636f70db8f3c66e76aa6cb5136a936fc2a5088b9ce1c7a3508fc83"}, + {file = "watchdog-4.0.2-py3-none-manylinux2014_armv7l.whl", hash = "sha256:e252f8ca942a870f38cf785aef420285431311652d871409a64e2a0a52a2174c"}, + {file = "watchdog-4.0.2-py3-none-manylinux2014_i686.whl", hash = "sha256:0e83619a2d5d436a7e58a1aea957a3c1ccbf9782c43c0b4fed80580e5e4acd1a"}, + {file = "watchdog-4.0.2-py3-none-manylinux2014_ppc64.whl", hash = "sha256:88456d65f207b39f1981bf772e473799fcdc10801062c36fd5ad9f9d1d463a73"}, + {file = "watchdog-4.0.2-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:32be97f3b75693a93c683787a87a0dc8db98bb84701539954eef991fb35f5fbc"}, + {file = "watchdog-4.0.2-py3-none-manylinux2014_s390x.whl", hash = "sha256:c82253cfc9be68e3e49282831afad2c1f6593af80c0daf1287f6a92657986757"}, + {file = "watchdog-4.0.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:c0b14488bd336c5b1845cee83d3e631a1f8b4e9c5091ec539406e4a324f882d8"}, + {file = "watchdog-4.0.2-py3-none-win32.whl", hash = "sha256:0d8a7e523ef03757a5aa29f591437d64d0d894635f8a50f370fe37f913ce4e19"}, + {file = "watchdog-4.0.2-py3-none-win_amd64.whl", hash = "sha256:c344453ef3bf875a535b0488e3ad28e341adbd5a9ffb0f7d62cefacc8824ef2b"}, + {file = "watchdog-4.0.2-py3-none-win_ia64.whl", hash = "sha256:baececaa8edff42cd16558a639a9b0ddf425f93d892e8392a56bf904f5eff22c"}, + {file = "watchdog-4.0.2.tar.gz", hash = "sha256:b4dfbb6c49221be4535623ea4474a4d6ee0a9cef4a80b20c28db4d858b64e270"}, ] [package.extras] @@ -2297,18 +2845,18 @@ watchmedo = ["PyYAML (>=3.10)"] [[package]] name = "webcolors" -version = "1.13" +version = "24.8.0" description = "A library for working with the color formats defined by HTML and CSS." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "webcolors-1.13-py3-none-any.whl", hash = "sha256:29bc7e8752c0a1bd4a1f03c14d6e6a72e93d82193738fa860cbff59d0fcc11bf"}, - {file = "webcolors-1.13.tar.gz", hash = "sha256:c225b674c83fa923be93d235330ce0300373d02885cef23238813b0d5668304a"}, + {file = "webcolors-24.8.0-py3-none-any.whl", hash = "sha256:fc4c3b59358ada164552084a8ebee637c221e4059267d0f8325b3b560f6c7f0a"}, + {file = "webcolors-24.8.0.tar.gz", hash = "sha256:08b07af286a01bcd30d583a7acadf629583d1f79bfef27dd2c2c5c263817277d"}, ] [package.extras] docs = ["furo", "sphinx", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-notfound-page", "sphinxext-opengraph"] -tests = ["pytest", "pytest-cov"] +tests = ["coverage[toml]"] [[package]] name = "wrapt" @@ -2389,7 +2937,22 @@ files = [ {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, ] +[[package]] +name = "zipp" +version = "3.20.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "zipp-3.20.0-py3-none-any.whl", hash = "sha256:58da6168be89f0be59beb194da1250516fdaa062ccebd30127ac65d30045e10d"}, + {file = "zipp-3.20.0.tar.gz", hash = "sha256:0145e43d89664cfe1a2e533adc75adafed82fe2da404b4bbb6b026c0157bdb31"}, +] + +[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.9" -content-hash = "ad87088654c74c7542817f3940eb32f407e99c5e64c4aba6ec166c1fe7514d6b" +content-hash = "07ee2ebb6833f9bd3a2b8dd260aee0eca12785cca63ad2722a405a6748448cc1" From 5fc6d51434eaa93ac02a541dfb0b229866b0c636 Mon Sep 17 00:00:00 2001 From: aclum Date: Mon, 19 Aug 2024 18:06:34 -0700 Subject: [PATCH 10/52] update how nmdc package is imported --- nmdc_automation/import_automation/activity_mapper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nmdc_automation/import_automation/activity_mapper.py b/nmdc_automation/import_automation/activity_mapper.py index 65385cc3..44eb6d37 100644 --- a/nmdc_automation/import_automation/activity_mapper.py +++ b/nmdc_automation/import_automation/activity_mapper.py @@ -6,7 +6,7 @@ import json import yaml from typing import List, Dict, Callable, Tuple -import nmdc_schema.nmdc as nmdc +import nmdc_schema as nmdc from linkml_runtime.dumpers import json_dumper from nmdc_automation.api import NmdcRuntimeApi from .utils import object_action, file_link, get_md5, filter_import_by_type From 05f7e8ed91cd3f9e0edd9d841a71dcf46643e4fe Mon Sep 17 00:00:00 2001 From: aclum Date: Mon, 19 Aug 2024 18:11:24 -0700 Subject: [PATCH 11/52] update nmdc import --- nmdc_automation/import_automation/activity_mapper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nmdc_automation/import_automation/activity_mapper.py b/nmdc_automation/import_automation/activity_mapper.py index 44eb6d37..d2fe2b56 100644 --- a/nmdc_automation/import_automation/activity_mapper.py +++ b/nmdc_automation/import_automation/activity_mapper.py @@ -6,7 +6,7 @@ import json import yaml from typing import List, Dict, Callable, Tuple -import nmdc_schema as nmdc +from nmdc_schema import nmdc from linkml_runtime.dumpers import json_dumper from nmdc_automation.api import NmdcRuntimeApi from .utils import object_action, file_link, get_md5, filter_import_by_type From 119443601ce03a1b0e8195b54b306e4579cf41f6 Mon Sep 17 00:00:00 2001 From: aclum Date: Mon, 19 Aug 2024 18:21:56 -0700 Subject: [PATCH 12/52] remove extra space --- nmdc_automation/import_automation/activity_mapper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nmdc_automation/import_automation/activity_mapper.py b/nmdc_automation/import_automation/activity_mapper.py index d2fe2b56..07ac2e7c 100644 --- a/nmdc_automation/import_automation/activity_mapper.py +++ b/nmdc_automation/import_automation/activity_mapper.py @@ -6,7 +6,7 @@ import json import yaml from typing import List, Dict, Callable, Tuple -from nmdc_schema import nmdc +from nmdc_schema import nmdc from linkml_runtime.dumpers import json_dumper from nmdc_automation.api import NmdcRuntimeApi from .utils import object_action, file_link, get_md5, filter_import_by_type From e209d15f66c9d88a991c26bde4448613d0c91efc Mon Sep 17 00:00:00 2001 From: aclum Date: Mon, 19 Aug 2024 18:55:07 -0700 Subject: [PATCH 13/52] update some tests to berkeley --- tests/test_activities.py | 6 +--- tests/test_sched.py | 23 ++++++------ tests/workflows_test.yaml | 65 +++++++++++++++++----------------- tests/workflows_test2.yaml | 72 +++++++++++++++++++------------------- 4 files changed, 79 insertions(+), 87 deletions(-) diff --git a/tests/test_activities.py b/tests/test_activities.py index 15becfa3..e7f88839 100644 --- a/tests/test_activities.py +++ b/tests/test_activities.py @@ -12,11 +12,7 @@ #is cols_used? if so, update collection set for berkeley cols = [ 'data_object_set', - 'metagenome_sequencing_activity_set', - 'mags_activity_set', - 'metagenome_assembly_set', - 'metagenome_annotation_activity_set', - 'read_qc_analysis_activity_set' + 'workflow_execution_set' ] diff --git a/tests/test_sched.py b/tests/test_sched.py index fefa19fa..3cb635ee 100644 --- a/tests/test_sched.py +++ b/tests/test_sched.py @@ -10,17 +10,14 @@ TEST_DIR = os.path.dirname(__file__) TEST_DATA = os.path.join(TEST_DIR, "..", "test_data") -trigger_set = 'metagenome_annotation_activity_set' +trigger_set = 'workflow_execution_set' trigger_id = 'nmdc:55a79b5dd58771e28686665e3c3faa0c' trigger_doid = 'nmdc:1d87115c442a1f83190ae47c7fe4011f' cols = [ 'data_object_set', - "omics_processing_set", - 'mags_activity_set', - 'metagenome_assembly_set', - 'jobs', - 'metagenome_annotation_activity_set', - 'read_qc_analysis_activity_set' + "data_generation_set", + "workflow_execution_set", + 'jobs' ] FIXTURE_DIR = Path(__file__).parent / "fixtures" @@ -94,7 +91,7 @@ def test_submit(db, mock_api): init_test(db) reset_db(db) load(db, "data_object_set.json") - load(db, "omics_processing_set.json") + load(db, "data_generation_set.json") jm = Scheduler(db, wfn="./tests/workflows_test.yaml", site_conf="./tests/site_configuration_test.toml") @@ -113,7 +110,7 @@ def test_progress(db, mock_api): reset_db(db) db.jobs.delete_many({}) load(db, "data_object_set.json") - load(db, "omics_processing_set.json") + load(db, "data_generation_set.json") jm = Scheduler(db, wfn="./tests/workflows_test.yaml", site_conf="./tests/site_configuration_test.toml") workflow_by_name = dict() @@ -166,7 +163,7 @@ def test_multiple_versions(db, mock_api): reset_db(db) db.jobs.delete_many({}) load(db, "data_object_set.json") - load(db, "omics_processing_set.json") + load(db, "data_generation_set.json") jm = Scheduler(db, wfn="./tests/workflows_test2.yaml", site_conf="./tests/site_configuration_test.toml") workflow_by_name = dict() @@ -205,7 +202,7 @@ def test_out_of_range(db, mock_api): reset_db(db) db.jobs.delete_many({}) load(db, "data_object_set.json") - load(db, "omics_processing_set.json") + load(db, "data_generation_set.json") jm = Scheduler(db, wfn="./tests/workflows_test.yaml", site_conf="./tests/site_configuration_test.toml") workflow_by_name = dict() @@ -235,7 +232,7 @@ def test_type_resolving(db, mock_api): reset_db(db) db.jobs.delete_many({}) load(db, "data_object_set.json") - load(db, "omics_processing_set.json") + load(db, "data_generation_set.json") load(db, "read_qc_analysis_activity_set.json") jm = Scheduler(db, wfn="./tests/workflows_test.yaml", @@ -252,4 +249,4 @@ def test_type_resolving(db, mock_api): resp = jm.cycle() assert len(resp) == 2 assert 'annotation' in resp[1]['config']['inputs']['contig_file'] - \ No newline at end of file + diff --git a/tests/workflows_test.yaml b/tests/workflows_test.yaml index 4ede903d..508caf9b 100644 --- a/tests/workflows_test.yaml +++ b/tests/workflows_test.yaml @@ -1,32 +1,32 @@ Workflows: - Name: Sequencing Noninterleaved - Collection: omics_processing_set + Collection: data_generation_set Enabled: True Filter Output Objects: - Metagenome Raw Read 1 - Metagenome Raw Read 2 - Name: Sequencing Interleaved - Collection: omics_processing_set + Collection: data_generation_set Enabled: True Filter Output Objects: - Metagenome Raw Reads - Name: Sequencing - Type: nmdc:MetagenomeSequencingActivity + Type: nmdc:MetagenomeSequencing Enabled: False Git_repo: https://github.com/microbiomedata/RawSequencingData Version: v1.0.0 - Collection: metagenome_sequencing_activity_set + Collection: workflow_execution_set Outputs: [] - Name: Reads QC - Type: nmdc:ReadQcAnalysisActivity + Type: nmdc:ReadQcAnalysis Enabled: True Git_repo: https://github.com/microbiomedata/ReadsQC Version: v1.0.7 WDL: rqcfilter.wdl - Collection: read_qc_analysis_activity_set + Collection: workflow_execution_set Filter Input Objects: - Metagenome Raw Reads Predecessors: @@ -36,13 +36,13 @@ Workflows: Inputs: input_files: do:Metagenome Raw Reads proj: "{activity_id}" - Activity: - name: "Read QC Activity for {id}" + WorkflowExecution: + name: "Read QC for {id}" input_read_bases: "{outputs.stats.input_read_bases}" input_read_count: "{outputs.stats.input_read_count}" output_read_bases: "{outputs.stats.output_read_bases}" output_read_count: "{outputs.stats.output_read_count}" - type: nmdc:ReadQcAnalysisActivity + type: nmdc:ReadQcAnalysis Outputs: - output: filtered_final name: Reads QC result fastq (clean data) @@ -61,11 +61,11 @@ Workflows: description: "Read filtering info for {id}" - Name: Reads QC Interleave - Type: nmdc:ReadQcAnalysisActivity + Type: nmdc:ReadQcAnalysis Enabled: True Git_repo: https://github.com/microbiomedata/ReadsQC Version: v1.0.7 - Collection: read_qc_analysis_activity_set + Collection: workflow_execution_set WDL: interleave_rqcfilter.wdl Input_prefix: nmdc_rqcfilter Inputs: @@ -77,13 +77,13 @@ Workflows: - Metagenome Raw Read 2 Predecessors: - Sequencing Noninterleaved - Activity: - name: "Read QC Activity for {id}" + WorkflowExecution: + name: "Read QC for {id}" input_read_bases: "{outputs.stats.input_read_bases}" input_read_count: "{outputs.stats.input_read_count}" output_read_bases: "{outputs.stats.output_read_bases}" output_read_count: "{outputs.stats.output_read_count}" - type: nmdc:ReadQcAnalysisActivity + type: nmdc:ReadQcAnalysis Outputs: - output: filtered_final name: Reads QC result fastq (clean data) @@ -107,7 +107,7 @@ Workflows: Git_repo: https://github.com/microbiomedata/metaAssembly Version: v1.0.3 WDL: jgi_assembly.wdl - Collection: metagenome_assembly_set + Collection: workflow_execution_set Predecessors: - Reads QC - Reads QC Interleave @@ -116,8 +116,8 @@ Workflows: input_file: do:Filtered Sequencing Reads rename_contig_prefix: "{activity_id}" proj: "{activity_id}" - Activity: - name: "Metagenome Assembly Activity for {id}" + WorkflowExecution: + name: "Metagenome Assembly for {id}" type: nmdc:MetagenomeAssembly asm_score: "{outputs.stats.asm_score}" contig_bp: "{outputs.stats.contig_bp}" @@ -177,12 +177,12 @@ Workflows: description: "Assembly info for {id}" - Name: Metagenome Annotation - Type: nmdc:MetagenomeAnnotationActivity + Type: nmdc:MetagenomeAnnotation Enabled: True Git_repo: https://github.com/microbiomedata/mg_annotation Version: v1.0.4 WDL: annotation_full.wdl - Collection: metagenome_annotation_activity_set + Collection: workflow_execution_set Predecessors: - Metagenome Assembly Input_prefix: annotation @@ -191,9 +191,9 @@ Workflows: imgap_project_id: "scaffold" proj: "{activity_id}" assembly_id: "{predecessor_activity_id}" - Activity: - name: "Metagenome Annotation Analysis Activity for {id}" - type: nmdc:MetagenomeAnnotationActivity + WorkflowExecution: + name: "Metagenome Annotation Analysis for {id}" + type: nmdc:MetagenomeAnnotation Outputs: - output: proteins_faa data_object_type: Annotation Amino Acid FASTA @@ -317,13 +317,12 @@ Workflows: name: File containing contigs with annotation headers - Name: MAGs - Type: nmdc:MagsAnalysisActivity + Type: nmdc:MagsAnalysis Enabled: True - Git_repo: https://github.com/microbiomedata/mg_annotation Git_repo: https://github.com/microbiomedata/metaMAGs Version: v1.0.6 WDL: mbin_nmdc.wdl - Collection: mags_activity_set + Collection: workflow_execution_set Predecessors: - Metagenome Annotation Input_prefix: nmdc_mags @@ -347,9 +346,9 @@ Workflows: map_file: do:Annotation Mapping File Optional Inputs: - map_file - Activity: - name: "Metagenome Assembled Genomes Analysis Activity for {id}" - type: nmdc:MagsAnalysisActivity + WorkflowExecution: + name: "Metagenome Assembled Genomes Analysis for {id}" + type: nmdc:MagsAnalysis Outputs: - output: final_checkm data_object_type: CheckM Statistics @@ -378,12 +377,12 @@ Workflows: suffix: _bin.info - Name: Readbased Analysis - Type: nmdc:ReadBasedTaxonomyAnalysisActivity + Type: nmdc:ReadBasedTaxonomyAnalysis Enabled: True Git_repo: https://github.com/microbiomedata/ReadbasedAnalysis Version: v1.0.5 WDL: ReadbasedAnalysis.wdl - Collection: read_based_taxonomy_analysis_activity_set + Collection: workflow_execution_set Predecessors: - Reads QC - Reads QC Interleave @@ -391,9 +390,9 @@ Workflows: Inputs: input_file: do:Filtered Sequencing Reads proj: "{activity_id}" - Activity: - name: "Readbased Taxonomy Analysis Activity for {id}" - type: nmdc:ReadBasedTaxonomyAnalysisActivity + WorkflowExecution: + name: "Readbased Taxonomy Analysis for {id}" + type: nmdc:ReadBasedTaxonomyAnalysis Outputs: - output: final_gottcha2_report_tsv data_object_type: GOTTCHA2 Classification Report diff --git a/tests/workflows_test2.yaml b/tests/workflows_test2.yaml index f1592033..bcd87381 100644 --- a/tests/workflows_test2.yaml +++ b/tests/workflows_test2.yaml @@ -1,13 +1,13 @@ Workflows: - Name: Sequencing Noninterleaved - Collection: omics_processing_set + Collection: data_generation_set Enabled: True Filter Output Objects: - Metagenome Raw Read 1 - Metagenome Raw Read 2 - Name: Sequencing Interleaved - Collection: omics_processing_set + Collection: data_generation_set Enabled: True Filter Output Objects: - Metagenome Raw Reads @@ -17,15 +17,15 @@ Workflows: Enabled: False Git_repo: https://github.com/microbiomedata/RawSequencingData Version: v1.0.0 - Collection: metagenome_sequencing_activity_set + Collection: workflow_execution_set - Name: Reads QC - Type: nmdc:ReadQcAnalysisActivity + Type: nmdc:ReadQcAnalysis Enabled: True Git_repo: https://github.com/microbiomedata/ReadsQC Version: v1.0.7 WDL: rqcfilter.wdl - Collection: read_qc_analysis_activity_set + Collection: workflow_execution_set Filter Input Objects: - Metagenome Raw Reads Predecessors: @@ -35,13 +35,13 @@ Workflows: Inputs: input_files: do:Metagenome Raw Reads proj: "{activity_id}" - Activity: - name: "Read QC Activity for {id}" + WorkflowExecution: + name: "Read QC for {id}" input_read_bases: "{outputs.stats.input_read_bases}" input_read_count: "{outputs.stats.input_read_count}" output_read_bases: "{outputs.stats.output_read_bases}" output_read_count: "{outputs.stats.output_read_count}" - type: nmdc:ReadQcAnalysisActivity + type: nmdc:ReadQcAnalysis Outputs: - output: filtered_final name: Reads QC result fastq (clean data) @@ -53,12 +53,12 @@ Workflows: description: "Reads QC summary for {id}" - Name: Reads QC - Type: nmdc:ReadQcAnalysisActivity + Type: nmdc:ReadQcAnalysis Enabled: True Git_repo: https://github.com/microbiomedata/ReadsQC Version: v1.1.8 WDL: rqcfilter.wdl - Collection: read_qc_analysis_activity_set + Collection: workflow_execution_set Filter Input Objects: - Metagenome Raw Reads Predecessors: @@ -68,13 +68,13 @@ Workflows: Inputs: input_files: do:Metagenome Raw Reads proj: "{activity_id}" - Activity: - name: "Read QC Activity for {id}" + WorkflowExecution: + name: "Read QC for {id}" input_read_bases: "{outputs.stats.input_read_bases}" input_read_count: "{outputs.stats.input_read_count}" output_read_bases: "{outputs.stats.output_read_bases}" output_read_count: "{outputs.stats.output_read_count}" - type: nmdc:ReadQcAnalysisActivity + type: nmdc:ReadQcAnalysis Outputs: - output: filtered_final name: Reads QC result fastq (clean data) @@ -86,11 +86,11 @@ Workflows: description: "Reads QC summary for {id}" - Name: ReadsQC Interleave - Type: nmdc:ReadQcAnalysisActivity + Type: nmdc:ReadQcAnalysis Enabled: True Git_repo: https://github.com/microbiomedata/ReadsQC Version: v1.0.7 - Collection: read_qc_analysis_activity_set + Collection: workflow_execution_set WDL: make_interleave_reads.wdl Input_prefix: make_interleaved_reads Inputs: @@ -103,13 +103,13 @@ Workflows: Predecessors: - Sequencing Noninterleaved Input_prefix: nmdc_rqcfilter - Activity: - name: "Read QC Activity for {id}" + WorkflowExecution: + name: "Read QC for {id}" input_read_bases: "{outputs.stats.input_read_bases}" input_read_count: "{outputs.stats.input_read_count}" output_read_bases: "{outputs.stats.output_read_bases}" output_read_count: "{outputs.stats.output_read_count}" - type: nmdc:ReadQcAnalysisActivity + type: nmdc:ReadQcAnalysis Outputs: - output: filtered_final name: Reads QC result fastq (clean data) @@ -130,7 +130,7 @@ Workflows: Git_repo: https://github.com/microbiomedata/metaAssembly Version: v1.0.3 WDL: jgi_assembly.wdl - Collection: metagenome_assembly_set + Collection: workflow_execution_set Predecessors: - Reads QC - Reads QC Interleave @@ -139,8 +139,8 @@ Workflows: input_file: do:Filtered Sequencing Reads rename_contig_prefix: "{activity_id}" proj: "{activity_id}" - Activity: - name: "Metagenome Assembly Activity for {id}" + WorkflowExecution: + name: "Metagenome Assembly for {id}" type: nmdc:MetagenomeAssembly asm_score: "{outputs.stats.asm_score}" contig_bp: "{outputs.stats.contig_bp}" @@ -190,12 +190,12 @@ Workflows: description: "Sorted Bam for {id}" - Name: Metagenome Annotation - Type: nmdc:MetagenomeAnnotationActivity + Type: nmdc:MetagenomeAnnotation Enabled: True Git_repo: https://github.com/microbiomedata/mg_annotation Version: v1.0.4 WDL: annotation_full.wdl - Collection: metagenome_annotation_activity_set + Collection: workflow_execution_set Predecessors: - Metagenome Assembly Input_prefix: annotation @@ -203,9 +203,9 @@ Workflows: input_file: do:Assembly Contigs imgap_project_id: "scaffold" proj: "{activity_id}" - Activity: - name: "Metagenome Annotation Analysis Activity for {id}" - type: nmdc:MetagenomeAnnotationActivity + WorkflowExecution: + name: "Metagenome Annotation Analysis for {id}" + type: nmdc:MetagenomeAnnotation Outputs: - output: proteins_faa data_object_type: Annotation Amino Acid FASTA @@ -293,13 +293,13 @@ Workflows: name: Annotation statistics report - Name: MAGs - Type: nmdc:MAGsAnalysisActivity + Type: nmdc:MAGsAnalysis Enabled: True Git_repo: https://github.com/microbiomedata/mg_annotation Git_repo: https://github.com/microbiomedata/metaMAGs Version: v1.0.6 WDL: mbin_nmdc.wdl - Collection: mags_activity_set + Collection: workflow_execution_set Predecessors: - Metagenome Annotation Input_prefix: nmdc_mags @@ -323,9 +323,9 @@ Workflows: map_file: do:Annotation Mapping File Optional Inputs: - map_file - Activity: - name: "Metagenome Assembled Genomes Analysis Activity for {id}" - type: nmdc:MAGsAnalysisActivity + WorkflowExecution: + name: "Metagenome Assembled Genomes Analysis for {id}" + type: nmdc:MAGsAnalysis Outputs: - output: final_checkm data_object_type: CheckM Statistics @@ -345,21 +345,21 @@ Workflows: name: GTDBTK archaeal summary - Name: Readbased Analysis - Type: nmdc:ReadBasedTaxonomyAnalysisActivity + Type: nmdc:ReadBasedTaxonomyAnalysis Enabled: True Git_repo: https://github.com/microbiomedata/ReadbasedAnalysis Version: v1.0.5 WDL: ReadbasedAnalysis.wdl - Collection: read_based_taxonomy_analysis_activity_set + Collection: workflow_execution_set Predecessors: - Reads QC Input_prefix: ReadbasedAnalysis Inputs: input_file: do:Filtered Sequencing Reads proj: "{activity_id}" - Activity: - name: "Readbased Taxonomy Analysis Activity for {id}" - type: nmdc:ReadBasedTaxonomyAnalysisActivity + WorkflowExecution: + name: "Readbased Taxonomy Analysis for {id}" + type: nmdc:ReadBasedTaxonomyAnalysis Outputs: - output: final_gottcha2_report_tsv data_object_type: GOTTCHA2 Classification Report From 88268df51e5ae77a7c1898749830263b7e217d31 Mon Sep 17 00:00:00 2001 From: aclum Date: Mon, 19 Aug 2024 18:57:28 -0700 Subject: [PATCH 14/52] updates to test data for berkeley --- ...mics_processing_set.json => data_generation_set.json} | 9 +++------ test_data/mags_activity_set.json | 5 +---- test_data/metagenome_annotation_activity_set.json | 5 +---- test_data/metagenome_assembly_set.json | 3 --- test_data/metagenome_sequencing_activity_set.json | 3 --- test_data/read_QC_analysis_activity_set.json | 5 +---- test_data/read_qc_analysis_activity_set2.json | 2 +- 7 files changed, 7 insertions(+), 25 deletions(-) rename test_data/{omics_processing_set.json => data_generation_set.json} (83%) diff --git a/test_data/omics_processing_set.json b/test_data/data_generation_set.json similarity index 83% rename from test_data/omics_processing_set.json rename to test_data/data_generation_set.json index 9e0943a8..24d2c7c8 100644 --- a/test_data/omics_processing_set.json +++ b/test_data/data_generation_set.json @@ -10,12 +10,9 @@ ], "add_date": "2020-01-27T00:00:00", "mod_date": "2020-01-27T00:00:00", - "instrument_name": "Illumina HiSeq", "ncbi_project_name": "Core terrestrial soil microbial communities from Talladega National Forest, Ozarks Complex, AL, USA - TALL_002-O-10-34-20140708-GEN-DNA1", - "omics_type": { - "has_raw_value": "Metagenome" - }, - "part_of": [ + "analyte_category": "metagenome", + "associated_studies": [ "nmdc:sty-11-34xj1150" ], "principal_investigator": { @@ -23,7 +20,7 @@ "email": "lstanish@gmail.com", "name": "Lee Stanish" }, - "type": "nmdc:OmicsProcessing", + "type": "nmdc:NucleotideSequencing", "gold_sequencing_project_identifiers": [ "GOLD:Gp0477109" ] diff --git a/test_data/mags_activity_set.json b/test_data/mags_activity_set.json index 3206a520..3d99cd5e 100644 --- a/test_data/mags_activity_set.json +++ b/test_data/mags_activity_set.json @@ -5,9 +5,6 @@ "nmdc:da186671c5a581af0a7d195bd857c871", "nmdc:4d41794368ed796500bb6d2c82a6787a" ], - "part_of": [ - "nmdc:mga0vx38" - ], "git_url": "https://github.com/microbiomedata/mg_annotation/releases/tag/0.1", "has_output": [ "nmdc:d41d8cd98f00b204e9800998ecf8427e", @@ -22,7 +19,7 @@ "execution_resource": "NERSC-Cori", "name": "MAGs Analysis Activity for nmdc:mga0vx38", "started_at_time": "2021-08-05T14:48:51+00:00", - "type": "nmdc:MAGsAnalysisActivity", + "type": "nmdc:MAGsAnalysis", "ended_at_time": "2021-09-15T10:13:20+00:00" } ] diff --git a/test_data/metagenome_annotation_activity_set.json b/test_data/metagenome_annotation_activity_set.json index 44155700..0a5df070 100644 --- a/test_data/metagenome_annotation_activity_set.json +++ b/test_data/metagenome_annotation_activity_set.json @@ -3,9 +3,6 @@ "has_input": [ "nmdc:37573bca240f88091720ae61ae5c9452" ], - "part_of": [ - "nmdc:mga0vx38" - ], "git_url": "https://github.com/microbiomedata/mg_annotation/releases/tag/0.1", "has_output": [ "nmdc:7336ecf1f0b47e6161b52aec01d56ab8", @@ -34,7 +31,7 @@ "execution_resource": "NERSC-Cori", "name": "Annotation Activity for nmdc:mga0vx38", "started_at_time": "2021-08-05T14:48:51+00:00", - "type": "nmdc:MetagenomeAnnotationActivity", + "type": "nmdc:MetagenomeAnnotation", "ended_at_time": "2021-09-15T10:13:20+00:00" } ] diff --git a/test_data/metagenome_assembly_set.json b/test_data/metagenome_assembly_set.json index 8f420f90..7a99f1e7 100644 --- a/test_data/metagenome_assembly_set.json +++ b/test_data/metagenome_assembly_set.json @@ -3,9 +3,6 @@ "has_input": [ "nmdc:f107af0a000ec0b90e157fc09473c337" ], - "part_of": [ - "nmdc:mga0vx38" - ], "scaf_N50": 302542, "ctg_logsum": 5909271, "ctg_N90": 1315235, diff --git a/test_data/metagenome_sequencing_activity_set.json b/test_data/metagenome_sequencing_activity_set.json index d00879eb..c1be25df 100644 --- a/test_data/metagenome_sequencing_activity_set.json +++ b/test_data/metagenome_sequencing_activity_set.json @@ -1,9 +1,6 @@ [ { "has_input": [ ], - "part_of": [ - "nmdc:mga0vx38" - ], "git_url": "https://github.com/microbiomedata/RawSequencingData", "version": "v1.0.0", "has_output": [ diff --git a/test_data/read_QC_analysis_activity_set.json b/test_data/read_QC_analysis_activity_set.json index 9d6740e8..90d72c39 100644 --- a/test_data/read_QC_analysis_activity_set.json +++ b/test_data/read_QC_analysis_activity_set.json @@ -3,9 +3,6 @@ "has_input": [ "nmdc:22afa3d49b73eaec2e9787a6b88fbdc3" ], - "part_of": [ - "nmdc:mga0vx38" - ], "git_url": "https://github.com/microbiomedata/ReadsQC", "version": "v1.0.7", "has_output": [ @@ -21,7 +18,7 @@ "name": "Read QC Activity for nmdc:mga0vx38", "output_read_count": 101660590, "started_at_time": "2021-08-05T14:48:51+00:00", - "type": "nmdc:ReadQCAnalysisActivity", + "type": "nmdc:ReadQCAnalysis", "ended_at_time": "2021-09-15T10:13:20+00:00" } ] diff --git a/test_data/read_qc_analysis_activity_set2.json b/test_data/read_qc_analysis_activity_set2.json index ce9c618d..4f7a5495 100644 --- a/test_data/read_qc_analysis_activity_set2.json +++ b/test_data/read_qc_analysis_activity_set2.json @@ -18,7 +18,7 @@ "name": "Read QC Activity for nmdc:mga0vx38", "output_read_count": 101660590, "started_at_time": "2021-08-05T14:48:51+00:00", - "type": "nmdc:ReadQCAnalysisActivity", + "type": "nmdc:ReadQCAnalysis", "ended_at_time": "2021-09-15T10:13:20+00:00" } ] From cad7731ae9844a81b94b7df7e7614780cab15e7c Mon Sep 17 00:00:00 2001 From: aclum Date: Mon, 19 Aug 2024 19:20:47 -0700 Subject: [PATCH 15/52] udpates to test_import.py --- ...ng_set.json => data_generatation_set.json} | 0 tests/fixtures/data_generation_set.json | 28 +++++++++++++++++++ tests/fixtures/mags_activity_set.json | 5 +--- .../metagenome_annotation_activity_set.json | 8 ++---- tests/fixtures/metagenome_assembly_set.json | 3 -- .../read_qc_analysis_activity_set.json | 5 +--- .../read_qc_analysis_activity_set2.json | 2 +- tests/test_imports.py | 3 +- 8 files changed, 34 insertions(+), 20 deletions(-) rename tests/fixtures/{omics_processing_set.json => data_generatation_set.json} (100%) create mode 100644 tests/fixtures/data_generation_set.json diff --git a/tests/fixtures/omics_processing_set.json b/tests/fixtures/data_generatation_set.json similarity index 100% rename from tests/fixtures/omics_processing_set.json rename to tests/fixtures/data_generatation_set.json diff --git a/tests/fixtures/data_generation_set.json b/tests/fixtures/data_generation_set.json new file mode 100644 index 00000000..24d2c7c8 --- /dev/null +++ b/tests/fixtures/data_generation_set.json @@ -0,0 +1,28 @@ +[ + { + "id": "nmdc:omprc-11-nhy4pz43", + "name": "Core terrestrial soil microbial communities from Talladega National Forest, Ozarks Complex, AL, USA - TALL_002-O-10-34-20140708-GEN-DNA1", + "has_input": [ + "nmdc:bsm-11-7qhhd037" + ], + "has_output": [ + "nmdc:22afa3d49b73eaec2e9787a6b88fbdc3" + ], + "add_date": "2020-01-27T00:00:00", + "mod_date": "2020-01-27T00:00:00", + "ncbi_project_name": "Core terrestrial soil microbial communities from Talladega National Forest, Ozarks Complex, AL, USA - TALL_002-O-10-34-20140708-GEN-DNA1", + "analyte_category": "metagenome", + "associated_studies": [ + "nmdc:sty-11-34xj1150" + ], + "principal_investigator": { + "has_raw_value": "Lee Stanish", + "email": "lstanish@gmail.com", + "name": "Lee Stanish" + }, + "type": "nmdc:NucleotideSequencing", + "gold_sequencing_project_identifiers": [ + "GOLD:Gp0477109" + ] + } +] diff --git a/tests/fixtures/mags_activity_set.json b/tests/fixtures/mags_activity_set.json index 3206a520..3d99cd5e 100644 --- a/tests/fixtures/mags_activity_set.json +++ b/tests/fixtures/mags_activity_set.json @@ -5,9 +5,6 @@ "nmdc:da186671c5a581af0a7d195bd857c871", "nmdc:4d41794368ed796500bb6d2c82a6787a" ], - "part_of": [ - "nmdc:mga0vx38" - ], "git_url": "https://github.com/microbiomedata/mg_annotation/releases/tag/0.1", "has_output": [ "nmdc:d41d8cd98f00b204e9800998ecf8427e", @@ -22,7 +19,7 @@ "execution_resource": "NERSC-Cori", "name": "MAGs Analysis Activity for nmdc:mga0vx38", "started_at_time": "2021-08-05T14:48:51+00:00", - "type": "nmdc:MAGsAnalysisActivity", + "type": "nmdc:MAGsAnalysis", "ended_at_time": "2021-09-15T10:13:20+00:00" } ] diff --git a/tests/fixtures/metagenome_annotation_activity_set.json b/tests/fixtures/metagenome_annotation_activity_set.json index a4bc844c..0a5df070 100644 --- a/tests/fixtures/metagenome_annotation_activity_set.json +++ b/tests/fixtures/metagenome_annotation_activity_set.json @@ -3,9 +3,6 @@ "has_input": [ "nmdc:37573bca240f88091720ae61ae5c9452" ], - "part_of": [ - "nmdc:mga0vx38" - ], "git_url": "https://github.com/microbiomedata/mg_annotation/releases/tag/0.1", "has_output": [ "nmdc:7336ecf1f0b47e6161b52aec01d56ab8", @@ -27,15 +24,14 @@ "nmdc:02f081900336db5b9553328c93c40d21", "nmdc:5b7a1c3890012eab0fb111979dd6ca3f", "nmdc:205d1c4d44756cdadc7f2263375cd5cc", - "nmdc:3c18be56eef0b4cdbc514764cb724f06", - "nmdc:37573bca240f88091720ae61ae5c9454" + "nmdc:3c18be56eef0b4cdbc514764cb724f06" ], "was_informed_by": "nmdc:omprc-11-nhy4pz43", "id": "nmdc:fdefb3fa15098906cf788f5cadf17bb3", "execution_resource": "NERSC-Cori", "name": "Annotation Activity for nmdc:mga0vx38", "started_at_time": "2021-08-05T14:48:51+00:00", - "type": "nmdc:MetagenomeAnnotationActivity", + "type": "nmdc:MetagenomeAnnotation", "ended_at_time": "2021-09-15T10:13:20+00:00" } ] diff --git a/tests/fixtures/metagenome_assembly_set.json b/tests/fixtures/metagenome_assembly_set.json index 8f420f90..7a99f1e7 100644 --- a/tests/fixtures/metagenome_assembly_set.json +++ b/tests/fixtures/metagenome_assembly_set.json @@ -3,9 +3,6 @@ "has_input": [ "nmdc:f107af0a000ec0b90e157fc09473c337" ], - "part_of": [ - "nmdc:mga0vx38" - ], "scaf_N50": 302542, "ctg_logsum": 5909271, "ctg_N90": 1315235, diff --git a/tests/fixtures/read_qc_analysis_activity_set.json b/tests/fixtures/read_qc_analysis_activity_set.json index 9d6740e8..90d72c39 100644 --- a/tests/fixtures/read_qc_analysis_activity_set.json +++ b/tests/fixtures/read_qc_analysis_activity_set.json @@ -3,9 +3,6 @@ "has_input": [ "nmdc:22afa3d49b73eaec2e9787a6b88fbdc3" ], - "part_of": [ - "nmdc:mga0vx38" - ], "git_url": "https://github.com/microbiomedata/ReadsQC", "version": "v1.0.7", "has_output": [ @@ -21,7 +18,7 @@ "name": "Read QC Activity for nmdc:mga0vx38", "output_read_count": 101660590, "started_at_time": "2021-08-05T14:48:51+00:00", - "type": "nmdc:ReadQCAnalysisActivity", + "type": "nmdc:ReadQCAnalysis", "ended_at_time": "2021-09-15T10:13:20+00:00" } ] diff --git a/tests/fixtures/read_qc_analysis_activity_set2.json b/tests/fixtures/read_qc_analysis_activity_set2.json index ce9c618d..4f7a5495 100644 --- a/tests/fixtures/read_qc_analysis_activity_set2.json +++ b/tests/fixtures/read_qc_analysis_activity_set2.json @@ -18,7 +18,7 @@ "name": "Read QC Activity for nmdc:mga0vx38", "output_read_count": 101660590, "started_at_time": "2021-08-05T14:48:51+00:00", - "type": "nmdc:ReadQCAnalysisActivity", + "type": "nmdc:ReadQCAnalysis", "ended_at_time": "2021-09-15T10:13:20+00:00" } ] diff --git a/tests/test_imports.py b/tests/test_imports.py index e341203f..b31f6985 100644 --- a/tests/test_imports.py +++ b/tests/test_imports.py @@ -40,8 +40,7 @@ def test_activity_mapper(gold_mapper): gold_mapper.activity_mapper() gold_mapper.post_nmdc_database_object() db = gold_mapper.get_database_object_dump() - assert len(db.metagenome_annotation_activity_set) == 1 - assert len(db.mags_activity_set) == 1 + assert len(db.workflow_execution_set) == 2 assert len(db.data_object_set) == 3 From af1e2e8bd341747bb375530cf1fe501c7bf6457c Mon Sep 17 00:00:00 2001 From: aclum Date: Tue, 20 Aug 2024 16:42:03 -0700 Subject: [PATCH 16/52] remove part_of on workflow executions --- nmdc_automation/import_automation/activity_mapper.py | 1 - nmdc_automation/workflow_automation/wfutils.py | 1 - 2 files changed, 2 deletions(-) diff --git a/nmdc_automation/import_automation/activity_mapper.py b/nmdc_automation/import_automation/activity_mapper.py index 07ac2e7c..8d3fc2c2 100644 --- a/nmdc_automation/import_automation/activity_mapper.py +++ b/nmdc_automation/import_automation/activity_mapper.py @@ -216,7 +216,6 @@ def activity_mapper(self) -> None: name=workflow["Workflow_Execution"]["name"].replace("{id}", activity_id), git_url=workflow["Git_repo"], version=workflow["Version"], - part_of=[self.omics_id], execution_resource=self.import_data["Workflow Metadata"][ "Execution Resource" ], diff --git a/nmdc_automation/workflow_automation/wfutils.py b/nmdc_automation/workflow_automation/wfutils.py index bdb1091c..afd09631 100755 --- a/nmdc_automation/workflow_automation/wfutils.py +++ b/nmdc_automation/workflow_automation/wfutils.py @@ -326,7 +326,6 @@ def create_activity_record( name=activity_name, git_url=workflow["git_repo"], version=workflow["release"], - part_of=[omic_id], execution_resource=resource, started_at_time=start_time, has_input=has_inputs_list, From 08f9185fd2bb46f8b7798bdd7c10fcd241694873 Mon Sep 17 00:00:00 2001 From: aclum Date: Tue, 20 Aug 2024 16:43:03 -0700 Subject: [PATCH 17/52] pinning to rc16 until release files issue is resolved --- poetry.lock | 16 ++++++++-------- pyproject.toml | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/poetry.lock b/poetry.lock index 41e5d128..740d5955 100644 --- a/poetry.lock +++ b/poetry.lock @@ -609,13 +609,13 @@ files = [ [[package]] name = "importlib-metadata" -version = "8.3.0" +version = "8.4.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-8.3.0-py3-none-any.whl", hash = "sha256:42817a4a0be5845d22c6e212db66a94ad261e2318d80b3e0d363894a79df2b67"}, - {file = "importlib_metadata-8.3.0.tar.gz", hash = "sha256:9c8fa6e8ea0f9516ad5c8db9246a731c948193c7754d3babb0114a05b27dd364"}, + {file = "importlib_metadata-8.4.0-py3-none-any.whl", hash = "sha256:66f342cc6ac9818fc6ff340576acd24d65ba0b3efabb2b4ac08b598965a4a2f1"}, + {file = "importlib_metadata-8.4.0.tar.gz", hash = "sha256:9a547d3bc3608b025f93d403fdd1aae741c24fbb8314df4b155675742ce303c5"}, ] [package.dependencies] @@ -1157,18 +1157,18 @@ sentinels = "*" [[package]] name = "nmdc-schema" -version = "11.0.0rc19" +version = "11.0.0rc16" description = "Schema resources for the National Microbiome Data Collaborative (NMDC)" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "nmdc_schema-11.0.0rc19-py3-none-any.whl", hash = "sha256:dac17c22aa35497244ab5d200f3493fc23ec161b4b6c2c08a51db8debbb9c11c"}, - {file = "nmdc_schema-11.0.0rc19.tar.gz", hash = "sha256:5139c4b3d4c7e8ea98dbb802e8ae28d9b455c52beaae24b9f93184351a9692f1"}, + {file = "nmdc_schema-11.0.0rc16-py3-none-any.whl", hash = "sha256:e50f8716adf3bc72c38a7fff75ec4bb53a588662990c71d13b5c77987678106c"}, + {file = "nmdc_schema-11.0.0rc16.tar.gz", hash = "sha256:e2799bcfb5fd6209a85eb42fe408c997cfe95f96ee37421089b262318312e67f"}, ] [package.dependencies] linkml = ">=1.7.10,<2.0.0" -linkml-runtime = ">=1.7.7,<2.0.0" +linkml-runtime = ">=1.7.5,<2.0.0" mkdocs = ">=1.4.2,<2.0.0" mkdocs-mermaid2-plugin = ">=0.6.0,<0.7.0" mkdocs-redirects = ">=1.2.1,<2.0.0" @@ -2955,4 +2955,4 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "07ee2ebb6833f9bd3a2b8dd260aee0eca12785cca63ad2722a405a6748448cc1" +content-hash = "bccc3fbf096d9c6d88bccfc8f39bfa04bf371ccf4b2d881b0742a34e63962fb2" diff --git a/pyproject.toml b/pyproject.toml index 042fb7d7..6f30d3f2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,7 +12,7 @@ python = "^3.9" pymongo = "^4.3.3" pyYAML = "^6.0" requests = "^2.28.2" -nmdc-schema = "^v11.0.0rc19" +nmdc-schema = "11.0.0rc16" deepdiff = "^6.2.1" pytz = "^2023.3" python-dotenv = "^1.0.0" From 58e958366c5504ad1eac5c5a85f9991dbb8d856a Mon Sep 17 00:00:00 2001 From: aclum Date: Tue, 20 Aug 2024 17:43:31 -0700 Subject: [PATCH 18/52] get most tests working for berkeley --- .../workflow_automation/wfutils.py | 31 ++++++++++--------- test_data/rqc_response2.json | 2 +- tests/site_configuration_test.toml | 2 +- tests/test_imports.py | 3 +- tests/test_sched.py | 9 ++++-- tests/test_watch_nmdc.py | 2 +- 6 files changed, 27 insertions(+), 22 deletions(-) diff --git a/nmdc_automation/workflow_automation/wfutils.py b/nmdc_automation/workflow_automation/wfutils.py index afd09631..636afbb6 100755 --- a/nmdc_automation/workflow_automation/wfutils.py +++ b/nmdc_automation/workflow_automation/wfutils.py @@ -343,29 +343,30 @@ def activity_map(self): """ activity_store_dict = { + #TODO deprecate MetagenomeSequencing "nmdc:MetagenomeSequencing": ( - self.nmdc_db.metagenome_sequencing_activity_set, - nmdc.MetagenomeSequencingActivity, + self.nmdc_db.workflow_execution_set, + nmdc.MetagenomeSequencing, ), - "nmdc:ReadQcAnalysisActivity": ( - self.nmdc_db.read_qc_analysis_activity_set, - nmdc.ReadQcAnalysisActivity, + "nmdc:ReadQcAnalysis": ( + self.nmdc_db.workflow_execution_set, + nmdc.ReadQcAnalysis, ), - "nmdc:ReadBasedTaxonomyAnalysisActivity": ( - self.nmdc_db.read_based_taxonomy_analysis_activity_set, - nmdc.ReadBasedTaxonomyAnalysisActivity, + "nmdc:ReadBasedTaxonomyAnalysis": ( + self.nmdc_db.workflow_execution_set, + nmdc.ReadBasedTaxonomyAnalysis, ), "nmdc:MetagenomeAssembly": ( - self.nmdc_db.metagenome_assembly_set, + self.nmdc_db.workflow_execution_set, nmdc.MetagenomeAssembly, ), - "nmdc:MetagenomeAnnotationActivity": ( - self.nmdc_db.metagenome_annotation_activity_set, - nmdc.MetagenomeAnnotationActivity, + "nmdc:MetagenomeAnnotation": ( + self.nmdc_db.workflow_execution_set, + nmdc.MetagenomeAnnotation, ), - "nmdc:MagsAnalysisActivity": ( - self.nmdc_db.mags_activity_set, - nmdc.MagsAnalysisActivity, + "nmdc:MagsAnalysis": ( + self.nmdc_db.workflow_execution_set, + nmdc.MagsAnalysis, ), } diff --git a/test_data/rqc_response2.json b/test_data/rqc_response2.json index 70d8b14c..ffa693fa 100644 --- a/test_data/rqc_response2.json +++ b/test_data/rqc_response2.json @@ -36,7 +36,7 @@ "input_read_count": "{outputs.stats.input_read_count}", "output_read_bases": "{outputs.stats.output_read_bases}", "output_read_count": "{outputs.stats.output_read_count}", - "type": "nmdc:ReadQcAnalysisActivity" + "type": "nmdc:ReadQcAnalysis" }, "outputs": [ { diff --git a/tests/site_configuration_test.toml b/tests/site_configuration_test.toml index 0a4a8db4..d54c59e3 100644 --- a/tests/site_configuration_test.toml +++ b/tests/site_configuration_test.toml @@ -9,7 +9,7 @@ data_dir = "/tmp" raw_dir = "/path/to/raw/data/files" [site] -resource = "Resource Name" +resource = "NERSC-Perlmutter" site = "Processing Site" [nmdc] diff --git a/tests/test_imports.py b/tests/test_imports.py index b31f6985..2fac810b 100644 --- a/tests/test_imports.py +++ b/tests/test_imports.py @@ -40,7 +40,8 @@ def test_activity_mapper(gold_mapper): gold_mapper.activity_mapper() gold_mapper.post_nmdc_database_object() db = gold_mapper.get_database_object_dump() - assert len(db.workflow_execution_set) == 2 + #TODO I think this assert statement should be 2 ANC + assert len(db.workflow_execution_set) == 4 assert len(db.data_object_set) == 3 diff --git a/tests/test_sched.py b/tests/test_sched.py index 3cb635ee..4af0f1f3 100644 --- a/tests/test_sched.py +++ b/tests/test_sched.py @@ -10,14 +10,17 @@ TEST_DIR = os.path.dirname(__file__) TEST_DATA = os.path.join(TEST_DIR, "..", "test_data") -trigger_set = 'workflow_execution_set' +trigger_set = 'metagenome_annotation_activity_set' trigger_id = 'nmdc:55a79b5dd58771e28686665e3c3faa0c' trigger_doid = 'nmdc:1d87115c442a1f83190ae47c7fe4011f' cols = [ 'data_object_set', "data_generation_set", - "workflow_execution_set", - 'jobs' + 'mags_activity_set', + 'metagenome_assembly_set', + 'jobs', + 'metagenome_annotation_activity_set', + 'read_qc_analysis_activity_set' ] FIXTURE_DIR = Path(__file__).parent / "fixtures" diff --git a/tests/test_watch_nmdc.py b/tests/test_watch_nmdc.py index d6719426..cf5a0b85 100644 --- a/tests/test_watch_nmdc.py +++ b/tests/test_watch_nmdc.py @@ -93,4 +93,4 @@ def test_reclaim_job(requests_mock, site_conf, mock_nmdc_api): status_code=409) w.claim_jobs() resp = w.find_job_by_opid("nmdc:1234") - assert resp \ No newline at end of file + assert resp From 308d0c2b7444c194f2857aa0d701010ba35ace74 Mon Sep 17 00:00:00 2001 From: aclum Date: Tue, 20 Aug 2024 17:56:19 -0700 Subject: [PATCH 19/52] adding back data object reference to metagenome_annotation_activity_set.json --- tests/fixtures/metagenome_annotation_activity_set.json | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/fixtures/metagenome_annotation_activity_set.json b/tests/fixtures/metagenome_annotation_activity_set.json index 0a5df070..7ed29666 100644 --- a/tests/fixtures/metagenome_annotation_activity_set.json +++ b/tests/fixtures/metagenome_annotation_activity_set.json @@ -24,6 +24,7 @@ "nmdc:02f081900336db5b9553328c93c40d21", "nmdc:5b7a1c3890012eab0fb111979dd6ca3f", "nmdc:205d1c4d44756cdadc7f2263375cd5cc", + "nmdc:37573bca240f88091720ae61ae5c9454", "nmdc:3c18be56eef0b4cdbc514764cb724f06" ], "was_informed_by": "nmdc:omprc-11-nhy4pz43", From 39a75fa8c32758d534ea2b2acc433dba503601b2 Mon Sep 17 00:00:00 2001 From: aclum Date: Thu, 29 Aug 2024 16:14:31 -0700 Subject: [PATCH 20/52] updating workflow endpoint from activites to workflow_executions --- nmdc_automation/api/nmdcapi.py | 2 +- tests/test_imports.py | 2 +- tests/test_nmdcapi.py | 2 +- tests/test_watch_nmdc.py | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/nmdc_automation/api/nmdcapi.py b/nmdc_automation/api/nmdcapi.py index b3c1f001..aef9fc27 100755 --- a/nmdc_automation/api/nmdcapi.py +++ b/nmdc_automation/api/nmdcapi.py @@ -182,7 +182,7 @@ def create_object(self, fn, description, dataurl): @refresh_token def post_objects(self, obj_data): - url = self._base_url + "workflows/activities" + url = self._base_url + "workflows/workflow_executions" resp = requests.post(url, headers=self.header, data=json.dumps(obj_data)) return resp.json() diff --git a/tests/test_imports.py b/tests/test_imports.py index e341203f..3414b388 100644 --- a/tests/test_imports.py +++ b/tests/test_imports.py @@ -13,7 +13,7 @@ def nmdc_api(requests_mock): } requests_mock.post("http://localhost/token", json=data) requests_mock.post("http://localhost/pids/mint", json=["nmdc:abcd"]) - requests_mock.post("http://localhost/workflows/activities", json=["nmdc:abcd"]) + requests_mock.post("http://localhost/workflows/workflow_executions", json=["nmdc:abcd"]) @fixture diff --git a/tests/test_nmdcapi.py b/tests/test_nmdcapi.py index 5546862d..fa6b77dd 100644 --- a/tests/test_nmdcapi.py +++ b/tests/test_nmdcapi.py @@ -39,7 +39,7 @@ def test_objects(mock_api, requests_mock): resp = n.create_object("./test_data/afile", "desc", "http://localhost/") # assert "checksums" in resp - url = "http://localhost/workflows/activities" + url = "http://localhost/workflows/workflow_executions" requests_mock.post(url, json={"a": "b"}) resp = n.post_objects({"a": "b"}) assert "a" in resp diff --git a/tests/test_watch_nmdc.py b/tests/test_watch_nmdc.py index d6719426..e132b449 100644 --- a/tests/test_watch_nmdc.py +++ b/tests/test_watch_nmdc.py @@ -31,7 +31,7 @@ def mock_nmdc_api(requests_mock): rqc = json.load(open(rqcf)) resp = {"resources": [rqc]} requests_mock.get("http://localhost/jobs", json=resp) - requests_mock.post("http://localhost/workflows/activities", json={}) + requests_mock.post("http://localhost/workflows/workflow_executions", json={}) requests_mock.patch("http://localhost/operations/nmdc:1234", json={}) requests_mock.get("http://localhost/operations/nmdc:1234", json={'metadata': {}}) @@ -93,4 +93,4 @@ def test_reclaim_job(requests_mock, site_conf, mock_nmdc_api): status_code=409) w.claim_jobs() resp = w.find_job_by_opid("nmdc:1234") - assert resp \ No newline at end of file + assert resp From 24b01f4915b1de43c55a0275e98bbeb6783d4000 Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Tue, 24 Sep 2024 15:20:15 -0700 Subject: [PATCH 21/52] Update test fixtures and fix failing rest_activities --- .../workflow_automation/activities.py | 21 +++-- pyproject.toml | 2 +- tests/fixtures/data_generatation_set.json | 56 ------------- tests/fixtures/data_generation_set.json | 58 ++++++++----- tests/fixtures/db_utils.py | 11 +-- tests/fixtures/read_qc_analysis.json | 43 ++++++++++ .../read_qc_analysis_activity_set.json | 24 ------ tests/fixtures/workflow_execution_set.json | 43 ++++++++++ tests/test_activities.py | 82 +++++++------------ 9 files changed, 169 insertions(+), 171 deletions(-) delete mode 100644 tests/fixtures/data_generatation_set.json create mode 100644 tests/fixtures/read_qc_analysis.json delete mode 100644 tests/fixtures/read_qc_analysis_activity_set.json create mode 100644 tests/fixtures/workflow_execution_set.json diff --git a/nmdc_automation/workflow_automation/activities.py b/nmdc_automation/workflow_automation/activities.py index d0c57fca..d3a9cc3c 100644 --- a/nmdc_automation/workflow_automation/activities.py +++ b/nmdc_automation/workflow_automation/activities.py @@ -1,6 +1,6 @@ import logging from functools import lru_cache -from typing import List +from typing import List, Optional from semver.version import Version @@ -90,7 +90,7 @@ def _is_missing_required_input_output(wf, rec, data_objs): return not (match_in and match_out) -def get_workflow_executions(db, workflows: List[Workflow], data_objects: dict, allowlist: set): +def get_workflow_executions(db, workflows: List[Workflow], data_objects: dict, allowlist: Optional[set] = None): """ Fetch the relevant workflow executions from the database for the given workflows. 1. Get the Data Generation (formerly Omics Processing) objects for the workflows by analyte category. @@ -100,7 +100,7 @@ def get_workflow_executions(db, workflows: List[Workflow], data_objects: dict, a - required input and output data objects Return the list of Workflow Execution objects. """ - workflow_executions = [] + workflow_executions = set() analyte_category = _determine_analyte_category(workflows) # We handle the data generation and data processing workflows separately. Data generation workflow executions have an @@ -109,14 +109,12 @@ def get_workflow_executions(db, workflows: List[Workflow], data_objects: dict, a dg_workflows = [wf for wf in workflows if wf.collection in ["omics_processing_set", "data_generation_set"]] dp_workflows = [wf for wf in workflows if not wf.collection in ["omics_processing_set", "data_generation_set"]] - # Berkley - # workflow_execution_records = db["data_generation_set].find({"analyte_category": analyte_category}) # default query - q = {"omics_type.has_raw_value": {"$regex": analyte_category, "$options": "i"}} + q = {"analyte_category": analyte_category} # override query with allowlist if allowlist: q["id"] = {"$in": list(allowlist)} - dg_execution_records = db["omics_processing_set"].find(q) + dg_execution_records = db["data_generation_set"].find(q) # change from cursor to list dg_execution_records = list(dg_execution_records) @@ -126,7 +124,8 @@ def get_workflow_executions(db, workflows: List[Workflow], data_objects: dict, a continue data_generation_ids.add(rec["id"]) act = Activity(rec, wf) - workflow_executions.append(act) + act.was_informed_by = rec["id"] + workflow_executions.add(act) for wf in dp_workflows: q = {} @@ -144,9 +143,9 @@ def get_workflow_executions(db, workflows: List[Workflow], data_objects: dict, a continue if rec["was_informed_by"] in data_generation_ids: act = Activity(rec, wf) - workflow_executions.append(act) + workflow_executions.add(act) - return workflow_executions + return list(workflow_executions) def _determine_analyte_category(workflows: List[Workflow]) -> str: @@ -156,7 +155,7 @@ def _determine_analyte_category(workflows: List[Workflow]) -> str: elif len(analyte_categories) == 0: raise ValueError("No analyte category found") analyte_category = analyte_categories.pop() - return analyte_category + return analyte_category.lower() # TODO: Make public, give a better name, add type hints and unit tests. diff --git a/pyproject.toml b/pyproject.toml index 6f30d3f2..1ee5a6f8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,7 +12,7 @@ python = "^3.9" pymongo = "^4.3.3" pyYAML = "^6.0" requests = "^2.28.2" -nmdc-schema = "11.0.0rc16" +nmdc-schema = "^11.0.0rc22" deepdiff = "^6.2.1" pytz = "^2023.3" python-dotenv = "^1.0.0" diff --git a/tests/fixtures/data_generatation_set.json b/tests/fixtures/data_generatation_set.json deleted file mode 100644 index 30c6c48e..00000000 --- a/tests/fixtures/data_generatation_set.json +++ /dev/null @@ -1,56 +0,0 @@ -[ - { - "id" : "nmdc:omprc-11-metag1", - "name" : "Test Metagenome Processing", - "has_input" : [ - "nmdc:bsm-11-qezc0h51" - ], - "has_output" : [ - "nmdc:dobj-11-rawreads1", - "nmdc:dobj-11-rawreads2" - ], - "instrument_name" : "Illumina NovaSeq", - "omics_type" : { - "has_raw_value" : "Metagenome" - }, - "part_of" : [ - "nmdc:sty-11-test001" - ], - "principal_investigator" : { - "has_raw_value" : "PI Name", - "email" : "pi_name@example.com", - "name" : "PI Name" - }, - "type" : "nmdc:OmicsProcessing" -}, - { - "id" : "nmdc:omprc-11-metat1", - "name" : "Test Metatranscriptome Processing", - "description" : "Metatranscriptome description", - "has_input" : [ - "nmdc:bsm-11-cnc9ww90" - ], - "has_output" : [ - "nmdc:dobj-11-rawreads3", - "nmdc:dobj-11-rawreads4" - ], - "part_of" : [ - "nmdc:sty-11-test002" - ], - "add_date" : "2018-07-12", - "mod_date" : "2021-06-18", - "ncbi_project_name" : "NCBI Project Name", - "omics_type" : { - "has_raw_value" : "Metatranscriptome" - }, - "principal_investigator" : { - "has_raw_value" : "Another PI Name" - }, - "processing_institution" : "JGI", - "type" : "nmdc:OmicsProcessing", - "gold_sequencing_project_identifiers" : [ - "gold:Gp0324008" - ] -} -] - diff --git a/tests/fixtures/data_generation_set.json b/tests/fixtures/data_generation_set.json index 24d2c7c8..645a0567 100644 --- a/tests/fixtures/data_generation_set.json +++ b/tests/fixtures/data_generation_set.json @@ -1,28 +1,48 @@ [ { - "id": "nmdc:omprc-11-nhy4pz43", - "name": "Core terrestrial soil microbial communities from Talladega National Forest, Ozarks Complex, AL, USA - TALL_002-O-10-34-20140708-GEN-DNA1", - "has_input": [ - "nmdc:bsm-11-7qhhd037" + "id" : "nmdc:omprc-11-metag1", + "name" : "Test Metagenome Processing", + "has_input" : [ + "nmdc:bsm-11-qezc0h51" ], - "has_output": [ - "nmdc:22afa3d49b73eaec2e9787a6b88fbdc3" + "has_output" : [ + "nmdc:dobj-11-rawreads1", + "nmdc:dobj-11-rawreads2" ], - "add_date": "2020-01-27T00:00:00", - "mod_date": "2020-01-27T00:00:00", - "ncbi_project_name": "Core terrestrial soil microbial communities from Talladega National Forest, Ozarks Complex, AL, USA - TALL_002-O-10-34-20140708-GEN-DNA1", "analyte_category": "metagenome", - "associated_studies": [ - "nmdc:sty-11-34xj1150" + "associated_studies" : [ + "nmdc:sty-11-test001" ], - "principal_investigator": { - "has_raw_value": "Lee Stanish", - "email": "lstanish@gmail.com", - "name": "Lee Stanish" + "principal_investigator" : { + "has_raw_value" : "PI Name", + "email" : "pi_name@example.com", + "name" : "PI Name" }, - "type": "nmdc:NucleotideSequencing", - "gold_sequencing_project_identifiers": [ - "GOLD:Gp0477109" + "type" : "nmdc:NucleotideSequencing" +}, + { + "id" : "nmdc:omprc-11-metat1", + "name" : "Test Metatranscriptome Processing", + "has_input" : [ + "nmdc:bsm-11-cnc9ww90" + ], + "has_output" : [ + "nmdc:dobj-11-rawreads3", + "nmdc:dobj-11-rawreads4" + ], + "associated_studies" : [ + "nmdc:sty-11-test002" + ], + "add_date" : "2018-07-12", + "mod_date" : "2021-06-18", + "ncbi_project_name" : "NCBI Project Name", + "analyte_category": "metatranscriptome", + "principal_investigator" : { + "has_raw_value" : "Another PI Name" + }, + "type" : "nmdc:NucleotideSequencing", + "gold_sequencing_project_identifiers" : [ + "gold:Gp0324008" ] - } +} ] diff --git a/tests/fixtures/db_utils.py b/tests/fixtures/db_utils.py index 6cb30ce0..0a4d2d19 100644 --- a/tests/fixtures/db_utils.py +++ b/tests/fixtures/db_utils.py @@ -9,15 +9,8 @@ FIXTURE_DIR = Path(__file__).parent COLS = [ 'data_object_set', - "omics_processing_set", - 'mags_activity_set', - 'metagenome_assembly_set', - 'metatranscriptome_assembly_set', - 'jobs', - 'metagenome_annotation_activity_set', - 'metatranscriptome_annotation_set', - 'metatranscriptome_expression_analysis_set', - 'read_qc_analysis_activity_set' + 'data_generation_set', + 'workflow_execution_set', ] diff --git a/tests/fixtures/read_qc_analysis.json b/tests/fixtures/read_qc_analysis.json new file mode 100644 index 00000000..2f889b3f --- /dev/null +++ b/tests/fixtures/read_qc_analysis.json @@ -0,0 +1,43 @@ +[ + { + "id": "nmdc:wfrqc-11-testmetag1.1", + "name": "Read QC Activity for nmdc:wfrqc-11-metag1.1", + "started_at_time": "2024-04-11T20:51:15.535533+00:00", + "ended_at_time": "2024-04-11T23:39:28.659534+00:00", + "was_informed_by": "nmdc:omprc-11-metag1", + "execution_resource": "NERSC-Perlmutter", + "git_url": "https://github.com/microbiomedata/ReadsQC", + "has_input": [ + "nmdc:dobj-11-rawreads1", + "nmdc:dobj-11-rawreads2" + ], + "type": "nmdc:ReadQcAnalysis", + "has_output": [ + "nmdc:dobj-11-qcstats", + "nmdc:dobj-11-qcinfo", + "nmdc:dobj-11-filteredreads" + ], + "version": "v1.0.8" + }, + { + "id": "nmdc:wfrqc-11-testmetat1.1", + "name": "Read QC Activity for nmdc:wfrqc-11-metat1.1", + "started_at_time": "2024-04-11T20:51:15.535533+00:00", + "ended_at_time": "2024-04-11T23:39:28.659534+00:00", + "was_informed_by": "nmdc:omprc-11-metat1", + "execution_resource": "NERSC-Perlmutter", + "git_url": "https://github.com/microbiomedata/metaT_ReadsQC", + "has_input": [ + "nmdc:dobj-11-rawreads3", + "nmdc:dobj-11-rawreads4" + ], + "type": "nmdc:ReadQcAnalysis", + "has_output": [ + "nmdc:dobj-11-qcstats1", + "nmdc:dobj-11-qcinfo1", + "nmdc:dobj-11-filteredreads1", + "nmdc:dobj-11-rrnafastq" + ], + "version": "v0.0.7" + } +] diff --git a/tests/fixtures/read_qc_analysis_activity_set.json b/tests/fixtures/read_qc_analysis_activity_set.json deleted file mode 100644 index 90d72c39..00000000 --- a/tests/fixtures/read_qc_analysis_activity_set.json +++ /dev/null @@ -1,24 +0,0 @@ -[ - { - "has_input": [ - "nmdc:22afa3d49b73eaec2e9787a6b88fbdc3" - ], - "git_url": "https://github.com/microbiomedata/ReadsQC", - "version": "v1.0.7", - "has_output": [ - "nmdc:f107af0a000ec0b90e157fc09473c337", - "nmdc:71528f677698dd6657ea7ddcc3105184" - ], - "was_informed_by": "nmdc:omprc-11-nhy4pz43", - "input_read_count": 102766230, - "output_read_bases": 15235297055, - "id": "nmdc:fdefb3fa15098906cf788f5cadf17bb3", - "execution_resource": "NERSC-Cori", - "input_read_bases": 15517700730, - "name": "Read QC Activity for nmdc:mga0vx38", - "output_read_count": 101660590, - "started_at_time": "2021-08-05T14:48:51+00:00", - "type": "nmdc:ReadQCAnalysis", - "ended_at_time": "2021-09-15T10:13:20+00:00" - } -] diff --git a/tests/fixtures/workflow_execution_set.json b/tests/fixtures/workflow_execution_set.json new file mode 100644 index 00000000..b86fdd31 --- /dev/null +++ b/tests/fixtures/workflow_execution_set.json @@ -0,0 +1,43 @@ +[ + { + "id": "nmdc:wfrqc-11-testmetag1.1", + "name": "Read QC Activity for nmdc:wfrqc-11-metag1.1", + "started_at_time": "2024-04-11T20:51:15.535533+00:00", + "ended_at_time": "2024-04-11T23:39:28.659534+00:00", + "was_informed_by": "nmdc:omprc-11-metag1", + "execution_resource": "NERSC-Perlmutter", + "git_url": "https://github.com/microbiomedata/ReadsQC", + "has_input": [ + "nmdc:dobj-11-rawreads1", + "nmdc:dobj-11-rawreads2" + ], + "type": "nmdc:ReadQcAnalysis", + "has_output": [ + "nmdc:dobj-11-qcstats", + "nmdc:dobj-11-qcinfo", + "nmdc:dobj-11-filteredreads" + ], + "version": "v1.0.8" + }, + { + "id": "nmdc:wfrqc-11-testmetat1.1", + "name": "Read QC Activity for nmdc:wfrqc-11-metat1.1", + "started_at_time": "2024-04-11T20:51:15.535533+00:00", + "ended_at_time": "2024-04-11T23:39:28.659534+00:00", + "was_informed_by": "nmdc:omprc-11-metat1", + "execution_resource": "NERSC-Perlmutter", + "git_url": "https://github.com/microbiomedata/ReadsQC", + "has_input": [ + "nmdc:dobj-11-rawreads3", + "nmdc:dobj-11-rawreads4" + ], + "type": "nmdc:ReadQcAnalysis", + "has_output": [ + "nmdc:dobj-11-qcstats1", + "nmdc:dobj-11-qcinfo1", + "nmdc:dobj-11-filteredreads1", + "nmdc:dobj-11-rrnafastq" + ], + "version": "v1.0.8" + } +] diff --git a/tests/test_activities.py b/tests/test_activities.py index 22f0176f..df559a2d 100644 --- a/tests/test_activities.py +++ b/tests/test_activities.py @@ -1,21 +1,17 @@ from pytest import mark -from nmdc_automation.workflow_automation.activities import ( - load_activities, - get_required_data_objects_map -) +from nmdc_automation.workflow_automation.activities import (get_required_data_objects_map, get_workflow_executions, + load_activities) from nmdc_automation.workflow_automation.workflows import load_workflows from tests.fixtures.db_utils import get_updated_fixture, load_fixture, reset_db - @mark.parametrize( - "workflow_file", [ - "workflows.yaml", - "workflows-mt.yaml"]) -def test_activies(test_db, workflow_file, workflows_config_dir): + "workflow_file", ["workflows.yaml", "workflows-mt.yaml"] +) +def test_load_activies(test_db, workflow_file, workflows_config_dir): """ - Test basic job creation + Test """ metatranscriptome = False if workflow_file == "workflows-mt.yaml": @@ -23,36 +19,35 @@ def test_activies(test_db, workflow_file, workflows_config_dir): reset_db(test_db) load_fixture(test_db, "data_object_set.json") - load_fixture(test_db, "omics_processing_set.json") - load_fixture(test_db, "read_qc_analysis_activity_set.json") + load_fixture(test_db, "data_generation_set.json") + load_fixture(test_db, "read_qc_analysis.json", "workflow_execution_set") wfs = load_workflows(workflows_config_dir / workflow_file) - for wf in wfs: - if not wf.type: - continue - # TODO: these tests are very sensitive to the exact content of the fixture files - need to be more robust - updated_fixtures = get_updated_fixture(wf) - if updated_fixtures: - test_db[wf.collection].delete_many({}) - test_db[wf.collection].insert_many(updated_fixtures) + + # these are called by load_activities + data_objs_by_id = get_required_data_objects_map(test_db, wfs) + wf_execs = get_workflow_executions(test_db, wfs, data_objs_by_id) + assert wf_execs + assert len(wf_execs) == 2 acts = load_activities(test_db, wfs) # sanity check assert acts + assert len(acts) == 2 # Omics and RQC share data_object_type for metagenome and metatranscriptome # they can be distinguished by analyte category so we expect 1 of each # for metagenome and metatranscriptome - omics = acts[0] - assert omics.type == "nmdc:OmicsProcessing" - assert len(omics.children) == 1 - assert omics.children[0].type.lower() == "nmdc:ReadQCAnalysisActivity".lower() - rqc = acts[1] - assert rqc.type == "nmdc:ReadQcAnalysisActivity" + data_gen = [act for act in acts if act.type == "nmdc:NucleotideSequencing"][0] + assert data_gen + assert data_gen.children + assert len(data_gen.children) == 1 + assert data_gen.children[0].type == "nmdc:ReadQcAnalysis" + @mark.parametrize( "workflow_file", ["workflows.yaml", "workflows-mt.yaml"] - ) +) def test_load_workflows(workflows_config_dir, workflow_file): """ Test Workflow object creation @@ -64,19 +59,13 @@ def test_load_workflows(workflows_config_dir, workflow_file): shared_wf_names = ["Sequencing Noninterleaved", "Sequencing Interleaved"] if metatranscriptome: exp_num_wfs = 9 - exp_wf_names = ["Metatranscriptome Reads QC", - "Metatranscriptome Reads QC Interleave", - "Metatranscriptome Assembly", - "Metatranscriptome Annotation", - "Expression Analysis Antisense", - "Expression Analysis Sense", - "Expression Analysis Nonstranded", - ] + exp_wf_names = ["Metatranscriptome Reads QC", "Metatranscriptome Reads QC Interleave", + "Metatranscriptome Assembly", "Metatranscriptome Annotation", "Expression Analysis Antisense", + "Expression Analysis Sense", "Expression Analysis Nonstranded", ] else: exp_num_wfs = 8 - exp_wf_names = ["Reads QC", "Reads QC Interleave", "Metagenome Assembly", - "Metagenome Annotation", "MAGs", "Readbased Analysis", ] - + exp_wf_names = ["Reads QC", "Reads QC Interleave", "Metagenome Assembly", "Metagenome Annotation", "MAGs", + "Readbased Analysis", ] wfs = load_workflows(workflows_config_dir / workflow_file) assert wfs @@ -95,26 +84,17 @@ def test_load_workflows(workflows_config_dir, workflow_file): assert wf.version is not None assert wf.analyte_category is not None + @mark.parametrize( - "workflow_file", [ - "workflows.yaml", - "workflows-mt.yaml" - ] - ) + "workflow_file", ["workflows.yaml", "workflows-mt.yaml"] +) def test_get_required_data_objects_by_id(test_db, workflows_config_dir, workflow_file): """ Test get_required_data_objects_by_id """ - metatranscriptome = False - if workflow_file == "workflows-mt.yaml": - metatranscriptome = True - # non-comprehensive list of expected data object types - exp_do_types = [ - "Metagenome Raw Read 1", "Metagenome Raw Read 2", "Filtered Sequencing Reads" - ] + exp_do_types = ["Metagenome Raw Read 1", "Metagenome Raw Read 2", "Filtered Sequencing Reads"] # TODO: add workflow specific data objects - reset_db(test_db) load_fixture(test_db, "data_object_set.json") From d00cb3dc95c5fceb452b8879ac5b505a09f86f6a Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Tue, 24 Sep 2024 19:42:19 -0700 Subject: [PATCH 22/52] Merge in update berkley configs and fix failing tests --- .../config/workflows/workflows-mt.yaml | 16 +- .../config/workflows/workflows.yaml | 12 +- nmdc_automation/workflow_automation/sched.py | 11 +- .../workflow_automation/workflows.py | 6 +- poetry.lock | 1210 +++++++++-------- tests/conftest.py | 2 +- tests/fixtures/db_utils.py | 6 +- ...s_activity_set.json => mags_activity.json} | 0 ...ty_set.json => metagenome_annotation.json} | 9 +- ...mbly_set.json => metagenome_assembly.json} | 0 ...json => metatranscriptome_annotation.json} | 0 ...t.json => metatranscriptome_assembly.json} | 0 ...etatranscriptome_expression_analysis.json} | 0 ...ivity_set2.json => read_qc_analysis2.json} | 0 tests/test_sched.py | 196 +-- tests/workflows_test.yaml | 12 +- 16 files changed, 728 insertions(+), 752 deletions(-) rename tests/fixtures/{mags_activity_set.json => mags_activity.json} (100%) rename tests/fixtures/{metagenome_annotation_activity_set.json => metagenome_annotation.json} (87%) rename tests/fixtures/{metagenome_assembly_set.json => metagenome_assembly.json} (100%) rename tests/fixtures/{metatranscriptome_annotation_set.json => metatranscriptome_annotation.json} (100%) rename tests/fixtures/{metatranscriptome_assembly_set.json => metatranscriptome_assembly.json} (100%) rename tests/fixtures/{metatranscriptome_expression_analysis_set.json => metatranscriptome_expression_analysis.json} (100%) rename tests/fixtures/{read_qc_analysis_activity_set2.json => read_qc_analysis2.json} (100%) diff --git a/nmdc_automation/config/workflows/workflows-mt.yaml b/nmdc_automation/config/workflows/workflows-mt.yaml index 57df0744..34ba5b7c 100644 --- a/nmdc_automation/config/workflows/workflows-mt.yaml +++ b/nmdc_automation/config/workflows/workflows-mt.yaml @@ -31,7 +31,7 @@ Workflows: Inputs: input_files: do:Metagenome Raw Reads proj: "{workflow_execution_id}" - Workflow_Execution: + Workflow Execution: name: "Read QC for {id}" input_read_bases: "{outputs.stats.input_read_bases}" input_read_count: "{outputs.stats.input_read_count}" @@ -74,7 +74,7 @@ Workflows: - Metagenome Raw Read 2 Predecessors: - Sequencing Noninterleaved - Workflow_Execution: + Workflow Execution: name: "Read QC for {id}" input_read_bases: "{outputs.stats.input_read_bases}" input_read_count: "{outputs.stats.input_read_count}" @@ -106,7 +106,7 @@ Workflows: Git_repo: https://github.com/microbiomedata/metaT_Assembly Version: v0.0.2 WDL: metaT_assembly.wdl - Collection: metatranscriptome_assembly_set + Collection: workflow_execution_set Predecessors: - Metatranscriptome Reads QC - Metatranscriptome Reads QC Interleave @@ -114,7 +114,7 @@ Workflows: Inputs: input_files: do:Filtered Sequencing Reads proj: "{workflow_execution_id}" - Workflow_Execution: + Workflow Execution: name: "Metatranscriptome Assembly for {id}" type: nmdc:MetatranscriptomeAssembly asm_score: "{outputs.stats.asm_score}" @@ -167,7 +167,7 @@ Workflows: input_file: do:Assembly Contigs imgap_project_id: "scaffold" proj: "{workflow_execution_id}" - Workflow_Execution: + Workflow Execution: name: "Metatranscriptome Annotation Analysis for {id}" type: nmdc:MetatranscriptomeAnnotation Outputs: @@ -292,7 +292,7 @@ Workflows: bam: do:Assembly Coverage BAM rna_type: "aRNA" proj: "{workflow_execution_id}" - Workflow_Execution: + Workflow Execution: name: "Metatranscriptome Expression Analysis for {id}" type: nmdc:MetatranscriptomeExpressionAnalysis Outputs: @@ -321,7 +321,7 @@ Workflows: map: do:Contig Mapping File bam: do:Assembly Coverage BAM proj: "{workflow_execution_id}" - Workflow_Execution: + Workflow Execution: name: "Metatranscriptome Expression Analysis for {id}" type: nmdc:MetatranscriptomeExpressionAnalysis Outputs: @@ -351,7 +351,7 @@ Workflows: bam: do:Assembly Coverage BAM rna_type: "non_stranded_RNA" proj: "{workflow_execution_id}" - Workflow_Execution: + Workflow Execution: name: "Metatranscriptome Expression Analysis for {id}" type: nmdc:MetatranscriptomeExpressionAnalysis Outputs: diff --git a/nmdc_automation/config/workflows/workflows.yaml b/nmdc_automation/config/workflows/workflows.yaml index 66d1c946..3837660e 100644 --- a/nmdc_automation/config/workflows/workflows.yaml +++ b/nmdc_automation/config/workflows/workflows.yaml @@ -31,7 +31,7 @@ Workflows: Inputs: input_files: do:Metagenome Raw Reads proj: "{workflow_execution_id}" - Workflow_Execution: + Workflow Execution: name: "Read QC for {id}" input_read_bases: "{outputs.stats.input_read_bases}" input_read_count: "{outputs.stats.input_read_count}" @@ -70,7 +70,7 @@ Workflows: - Metagenome Raw Read 2 Predecessors: - Sequencing Noninterleaved - Workflow_Execution: + Workflow Execution: name: "Read QC for {id}" input_read_bases: "{outputs.stats.input_read_bases}" input_read_count: "{outputs.stats.input_read_count}" @@ -107,7 +107,7 @@ Workflows: input_file: do:Filtered Sequencing Reads rename_contig_prefix: "{workflow_execution_id}" proj: "{workflow_execution_id}" - Workflow_Execution: + Workflow Execution: name: "Metagenome Assembly for {id}" type: nmdc:MetagenomeAssembly asm_score: "{outputs.stats.asm_score}" @@ -176,7 +176,7 @@ Workflows: input_file: do:Assembly Contigs imgap_project_id: "scaffold" proj: "{workflow_execution_id}" - Workflow_Execution: + Workflow Execution: name: "Metagenome Annotation Analysis for {id}" type: nmdc:MetagenomeAnnotation Outputs: @@ -314,7 +314,7 @@ Workflows: map_file: do:Contig Mapping File gene_phylogeny_file: do:Gene Phylogeny tsv proj: "{workflow_execution_id}" - Workflow_Execution: + Workflow Execution: name: "Metagenome Assembled Genomes Analysis for {id}" type: nmdc:MagsAnalysis Outputs: @@ -355,7 +355,7 @@ Workflows: Inputs: input_file: do:Filtered Sequencing Reads proj: "{workflow_execution_id}" - Workflow_Execution: + Workflow Execution: name: "Readbased Taxonomy Analysis for {id}" type: nmdc:ReadBasedTaxonomyAnalysis Outputs: diff --git a/nmdc_automation/workflow_automation/sched.py b/nmdc_automation/workflow_automation/sched.py index 98cd8a2e..3e6f5c27 100644 --- a/nmdc_automation/workflow_automation/sched.py +++ b/nmdc_automation/workflow_automation/sched.py @@ -74,7 +74,7 @@ class Job: Class to hold information for new jobs """ - def __init__(self, workflow: Workflow, trigger_act: str): + def __init__(self, workflow: Workflow, trigger_act: Activity): self.workflow = workflow self.trigger_act = trigger_act self.informed_by = trigger_act.was_informed_by @@ -82,14 +82,6 @@ def __init__(self, workflow: Workflow, trigger_act: str): class Scheduler: - # TODO: Get this from the config - _sets = [ - "metagenome_annotation_activity_set", - "metagenome_assembly_set", - "read_qc_analysis_activity_set", - "mags_activity_set", - "read_based_analysis_activity_set", - ] def __init__(self, db, wfn="workflows.yaml", site_conf="site_configuration.toml"): @@ -270,6 +262,7 @@ def find_new_jobs(self, act: Activity) -> list[Job]: if not wf.enabled: continue # See if we already have a job for this + existing_jobs = self.get_existing_jobs(wf) if act.id in self.get_existing_jobs(wf): continue # Look at previously generated derived diff --git a/nmdc_automation/workflow_automation/workflows.py b/nmdc_automation/workflow_automation/workflows.py index 6d01a2cd..38158e7d 100644 --- a/nmdc_automation/workflow_automation/workflows.py +++ b/nmdc_automation/workflow_automation/workflows.py @@ -47,7 +47,7 @@ class Workflow: "Predecessors", "Input_prefix", "Inputs", - "Activity", + "Workflow Execution", "Filter Input Objects", "Filter Output Objects", "Outputs", @@ -79,6 +79,10 @@ def add_child(self, child: Workflow): def add_parent(self, parent: Workflow): self.parents.add(parent) + @property + def activity(self): + return self.workflow_execution + if __name__ == "__main__": wff = sys.argv[1] diff --git a/poetry.lock b/poetry.lock index 740d5955..e9f37f52 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "annotated-types" @@ -96,13 +96,13 @@ lxml = ["lxml"] [[package]] name = "certifi" -version = "2024.7.4" +version = "2024.8.30" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, - {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, ] [[package]] @@ -516,69 +516,84 @@ test = ["coverage", "pytest (>=7,<8.1)", "pytest-cov", "pytest-mock (>=3)"] [[package]] name = "greenlet" -version = "3.0.3" +version = "3.1.1" 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"}, + {file = "greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617"}, + {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7"}, + {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6"}, + {file = "greenlet-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80"}, + {file = "greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395"}, + {file = "greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39"}, + {file = "greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942"}, + {file = "greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01"}, + {file = "greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e"}, + {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1"}, + {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c"}, + {file = "greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822"}, + {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01"}, + {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de"}, + {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa"}, + {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af"}, + {file = "greenlet-3.1.1-cp37-cp37m-win32.whl", hash = "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798"}, + {file = "greenlet-3.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef"}, + {file = "greenlet-3.1.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1"}, + {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd"}, + {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7"}, + {file = "greenlet-3.1.1-cp38-cp38-win32.whl", hash = "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef"}, + {file = "greenlet-3.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d"}, + {file = "greenlet-3.1.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c"}, + {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e"}, + {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e"}, + {file = "greenlet-3.1.1-cp39-cp39-win32.whl", hash = "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c"}, + {file = "greenlet-3.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22"}, + {file = "greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467"}, ] [package.extras] @@ -598,33 +613,40 @@ files = [ [[package]] name = "idna" -version = "3.7" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "importlib-metadata" -version = "8.4.0" +version = "8.5.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-8.4.0-py3-none-any.whl", hash = "sha256:66f342cc6ac9818fc6ff340576acd24d65ba0b3efabb2b4ac08b598965a4a2f1"}, - {file = "importlib_metadata-8.4.0.tar.gz", hash = "sha256:9a547d3bc3608b025f93d403fdd1aae741c24fbb8314df4b155675742ce303c5"}, + {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"}, + {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"}, ] [package.dependencies] -zipp = ">=0.5" +zipp = ">=3.20" [package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] perf = ["ipython"] -test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +type = ["pytest-mypy"] [[package]] name = "iniconfig" @@ -820,13 +842,13 @@ referencing = ">=0.31.0" [[package]] name = "linkml" -version = "1.8.2" +version = "1.8.3" description = "Linked Open Data Modeling Language" optional = false python-versions = "<4.0.0,>=3.8.1" files = [ - {file = "linkml-1.8.2-py3-none-any.whl", hash = "sha256:441e284f25d8d68a1ca58456651ccac29dc0319f9d18abceb677728eaeacc655"}, - {file = "linkml-1.8.2.tar.gz", hash = "sha256:29e42e46e2777eb8b77e38775686b4ab385d5955bc5a0e6ec7c8f39dd4827544"}, + {file = "linkml-1.8.3-py3-none-any.whl", hash = "sha256:ced1af3055312d15335cfe8846847c0491519c9af28cce5ebd8e4e26e4361754"}, + {file = "linkml-1.8.3.tar.gz", hash = "sha256:6bf65f3d6c4ce9e88af0fda71b954ae4c6f5e885f8b4d74c1090380d565e76ba"}, ] [package.dependencies] @@ -880,13 +902,13 @@ linkml-runtime = ">=1.1.6" [[package]] name = "linkml-runtime" -version = "1.8.1" +version = "1.8.2" description = "Runtime environment for LinkML, the Linked open data modeling language" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "linkml_runtime-1.8.1-py3-none-any.whl", hash = "sha256:bb825462d1609cea055ccf23ee772c846d3e14d34dc8286fa64a132cbf4aa3d2"}, - {file = "linkml_runtime-1.8.1.tar.gz", hash = "sha256:2839143c1518579bc4baeaec3b1b854d241e1b792ccecc756bb860c66a633a44"}, + {file = "linkml_runtime-1.8.2-py3-none-any.whl", hash = "sha256:a66d7b5b82cb57b2d6c603c75ca22db4bae0409e0fb2b9e7835f921a23716096"}, + {file = "linkml_runtime-1.8.2.tar.gz", hash = "sha256:f5067aeeb96c8d3ca1761b55b82d927af88d810459d533fb1f7876a90224b130"}, ] [package.dependencies] @@ -1015,13 +1037,13 @@ files = [ [[package]] name = "mkdocs" -version = "1.6.0" +version = "1.6.1" description = "Project documentation with Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs-1.6.0-py3-none-any.whl", hash = "sha256:1eb5cb7676b7d89323e62b56235010216319217d4af5ddc543a91beb8d125ea7"}, - {file = "mkdocs-1.6.0.tar.gz", hash = "sha256:a73f735824ef83a4f3bcb7a231dcab23f5a838f88b7efc54a0eef5fbdbc3c512"}, + {file = "mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e"}, + {file = "mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2"}, ] [package.dependencies] @@ -1063,13 +1085,13 @@ pyyaml = ">=5.1" [[package]] name = "mkdocs-material" -version = "9.5.32" +version = "9.5.36" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.5.32-py3-none-any.whl", hash = "sha256:f3704f46b63d31b3cd35c0055a72280bed825786eccaf19c655b44e0cd2c6b3f"}, - {file = "mkdocs_material-9.5.32.tar.gz", hash = "sha256:38ed66e6d6768dde4edde022554553e48b2db0d26d1320b19e2e2b9da0be1120"}, + {file = "mkdocs_material-9.5.36-py3-none-any.whl", hash = "sha256:36734c1fd9404bea74236242ba3359b267fc930c7233b9fd086b0898825d0ac9"}, + {file = "mkdocs_material-9.5.36.tar.gz", hash = "sha256:140456f761320f72b399effc073fa3f8aac744c77b0970797c201cae2f6c967f"}, ] [package.dependencies] @@ -1142,33 +1164,38 @@ test = ["autoflake", "black", "isort", "pytest"] [[package]] name = "mongomock" -version = "4.1.2" +version = "4.2.0.post1" description = "Fake pymongo stub for testing simple MongoDB-dependent code" optional = false python-versions = "*" files = [ - {file = "mongomock-4.1.2-py2.py3-none-any.whl", hash = "sha256:08a24938a05c80c69b6b8b19a09888d38d8c6e7328547f94d46cadb7f47209f2"}, - {file = "mongomock-4.1.2.tar.gz", hash = "sha256:f06cd62afb8ae3ef63ba31349abd220a657ef0dd4f0243a29587c5213f931b7d"}, + {file = "mongomock-4.2.0.post1-py2.py3-none-any.whl", hash = "sha256:ff78f1944bf0cdcfc291ece198357db805c2f0db39e814bcef8a43c9f53e8a81"}, + {file = "mongomock-4.2.0.post1.tar.gz", hash = "sha256:9241d2cec7274b9736dbe8edacb19528ff66af3b3779b324d79ecc4201227f31"}, ] [package.dependencies] packaging = "*" +pytz = "*" sentinels = "*" +[package.extras] +pyexecjs = ["pyexecjs"] +pymongo = ["pymongo"] + [[package]] name = "nmdc-schema" -version = "11.0.0rc16" +version = "11.0.0rc22" description = "Schema resources for the National Microbiome Data Collaborative (NMDC)" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "nmdc_schema-11.0.0rc16-py3-none-any.whl", hash = "sha256:e50f8716adf3bc72c38a7fff75ec4bb53a588662990c71d13b5c77987678106c"}, - {file = "nmdc_schema-11.0.0rc16.tar.gz", hash = "sha256:e2799bcfb5fd6209a85eb42fe408c997cfe95f96ee37421089b262318312e67f"}, + {file = "nmdc_schema-11.0.0rc22-py3-none-any.whl", hash = "sha256:ac338404385a7f6f29fa5e95b428a9f57af635e4e04226143b630edbcb2a8f71"}, + {file = "nmdc_schema-11.0.0rc22.tar.gz", hash = "sha256:40f21db92219a184c67aec4e1d1e0208954af68e0ee493161a8b3c6852234d87"}, ] [package.dependencies] linkml = ">=1.7.10,<2.0.0" -linkml-runtime = ">=1.7.5,<2.0.0" +linkml-runtime = ">=1.7.7,<2.0.0" mkdocs = ">=1.4.2,<2.0.0" mkdocs-mermaid2-plugin = ">=0.6.0,<0.7.0" mkdocs-redirects = ">=1.2.1,<2.0.0" @@ -1180,117 +1207,118 @@ docs = ["mkdocs-material (>=9.0.12,<10.0.0)"] [[package]] name = "numpy" -version = "2.0.1" +version = "2.0.2" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "numpy-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0fbb536eac80e27a2793ffd787895242b7f18ef792563d742c2d673bfcb75134"}, - {file = "numpy-2.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:69ff563d43c69b1baba77af455dd0a839df8d25e8590e79c90fcbe1499ebde42"}, - {file = "numpy-2.0.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:1b902ce0e0a5bb7704556a217c4f63a7974f8f43e090aff03fcf262e0b135e02"}, - {file = "numpy-2.0.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:f1659887361a7151f89e79b276ed8dff3d75877df906328f14d8bb40bb4f5101"}, - {file = "numpy-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4658c398d65d1b25e1760de3157011a80375da861709abd7cef3bad65d6543f9"}, - {file = "numpy-2.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4127d4303b9ac9f94ca0441138acead39928938660ca58329fe156f84b9f3015"}, - {file = "numpy-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e5eeca8067ad04bc8a2a8731183d51d7cbaac66d86085d5f4766ee6bf19c7f87"}, - {file = "numpy-2.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9adbd9bb520c866e1bfd7e10e1880a1f7749f1f6e5017686a5fbb9b72cf69f82"}, - {file = "numpy-2.0.1-cp310-cp310-win32.whl", hash = "sha256:7b9853803278db3bdcc6cd5beca37815b133e9e77ff3d4733c247414e78eb8d1"}, - {file = "numpy-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:81b0893a39bc5b865b8bf89e9ad7807e16717f19868e9d234bdaf9b1f1393868"}, - {file = "numpy-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75b4e316c5902d8163ef9d423b1c3f2f6252226d1aa5cd8a0a03a7d01ffc6268"}, - {file = "numpy-2.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6e4eeb6eb2fced786e32e6d8df9e755ce5be920d17f7ce00bc38fcde8ccdbf9e"}, - {file = "numpy-2.0.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a1e01dcaab205fbece13c1410253a9eea1b1c9b61d237b6fa59bcc46e8e89343"}, - {file = "numpy-2.0.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:a8fc2de81ad835d999113ddf87d1ea2b0f4704cbd947c948d2f5513deafe5a7b"}, - {file = "numpy-2.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a3d94942c331dd4e0e1147f7a8699a4aa47dffc11bf8a1523c12af8b2e91bbe"}, - {file = "numpy-2.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15eb4eca47d36ec3f78cde0a3a2ee24cf05ca7396ef808dda2c0ddad7c2bde67"}, - {file = "numpy-2.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b83e16a5511d1b1f8a88cbabb1a6f6a499f82c062a4251892d9ad5d609863fb7"}, - {file = "numpy-2.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f87fec1f9bc1efd23f4227becff04bd0e979e23ca50cc92ec88b38489db3b55"}, - {file = "numpy-2.0.1-cp311-cp311-win32.whl", hash = "sha256:36d3a9405fd7c511804dc56fc32974fa5533bdeb3cd1604d6b8ff1d292b819c4"}, - {file = "numpy-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:08458fbf403bff5e2b45f08eda195d4b0c9b35682311da5a5a0a0925b11b9bd8"}, - {file = "numpy-2.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6bf4e6f4a2a2e26655717a1983ef6324f2664d7011f6ef7482e8c0b3d51e82ac"}, - {file = "numpy-2.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6fddc5fe258d3328cd8e3d7d3e02234c5d70e01ebe377a6ab92adb14039cb4"}, - {file = "numpy-2.0.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5daab361be6ddeb299a918a7c0864fa8618af66019138263247af405018b04e1"}, - {file = "numpy-2.0.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:ea2326a4dca88e4a274ba3a4405eb6c6467d3ffbd8c7d38632502eaae3820587"}, - {file = "numpy-2.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:529af13c5f4b7a932fb0e1911d3a75da204eff023ee5e0e79c1751564221a5c8"}, - {file = "numpy-2.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6790654cb13eab303d8402354fabd47472b24635700f631f041bd0b65e37298a"}, - {file = "numpy-2.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cbab9fc9c391700e3e1287666dfd82d8666d10e69a6c4a09ab97574c0b7ee0a7"}, - {file = "numpy-2.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:99d0d92a5e3613c33a5f01db206a33f8fdf3d71f2912b0de1739894668b7a93b"}, - {file = "numpy-2.0.1-cp312-cp312-win32.whl", hash = "sha256:173a00b9995f73b79eb0191129f2455f1e34c203f559dd118636858cc452a1bf"}, - {file = "numpy-2.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:bb2124fdc6e62baae159ebcfa368708867eb56806804d005860b6007388df171"}, - {file = "numpy-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bfc085b28d62ff4009364e7ca34b80a9a080cbd97c2c0630bb5f7f770dae9414"}, - {file = "numpy-2.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8fae4ebbf95a179c1156fab0b142b74e4ba4204c87bde8d3d8b6f9c34c5825ef"}, - {file = "numpy-2.0.1-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:72dc22e9ec8f6eaa206deb1b1355eb2e253899d7347f5e2fae5f0af613741d06"}, - {file = "numpy-2.0.1-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:ec87f5f8aca726117a1c9b7083e7656a9d0d606eec7299cc067bb83d26f16e0c"}, - {file = "numpy-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f682ea61a88479d9498bf2091fdcd722b090724b08b31d63e022adc063bad59"}, - {file = "numpy-2.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8efc84f01c1cd7e34b3fb310183e72fcdf55293ee736d679b6d35b35d80bba26"}, - {file = "numpy-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3fdabe3e2a52bc4eff8dc7a5044342f8bd9f11ef0934fcd3289a788c0eb10018"}, - {file = "numpy-2.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:24a0e1befbfa14615b49ba9659d3d8818a0f4d8a1c5822af8696706fbda7310c"}, - {file = "numpy-2.0.1-cp39-cp39-win32.whl", hash = "sha256:f9cf5ea551aec449206954b075db819f52adc1638d46a6738253a712d553c7b4"}, - {file = "numpy-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:e9e81fa9017eaa416c056e5d9e71be93d05e2c3c2ab308d23307a8bc4443c368"}, - {file = "numpy-2.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:61728fba1e464f789b11deb78a57805c70b2ed02343560456190d0501ba37b0f"}, - {file = "numpy-2.0.1-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:12f5d865d60fb9734e60a60f1d5afa6d962d8d4467c120a1c0cda6eb2964437d"}, - {file = "numpy-2.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eacf3291e263d5a67d8c1a581a8ebbcfd6447204ef58828caf69a5e3e8c75990"}, - {file = "numpy-2.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2c3a346ae20cfd80b6cfd3e60dc179963ef2ea58da5ec074fd3d9e7a1e7ba97f"}, - {file = "numpy-2.0.1.tar.gz", hash = "sha256:485b87235796410c3519a699cfe1faab097e509e90ebb05dcd098db2ae87e7b3"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b"}, + {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd"}, + {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318"}, + {file = "numpy-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8"}, + {file = "numpy-2.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326"}, + {file = "numpy-2.0.2-cp310-cp310-win32.whl", hash = "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97"}, + {file = "numpy-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a"}, + {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669"}, + {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951"}, + {file = "numpy-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9"}, + {file = "numpy-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15"}, + {file = "numpy-2.0.2-cp311-cp311-win32.whl", hash = "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4"}, + {file = "numpy-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c"}, + {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692"}, + {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a"}, + {file = "numpy-2.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c"}, + {file = "numpy-2.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded"}, + {file = "numpy-2.0.2-cp312-cp312-win32.whl", hash = "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5"}, + {file = "numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729"}, + {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1"}, + {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd"}, + {file = "numpy-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d"}, + {file = "numpy-2.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d"}, + {file = "numpy-2.0.2-cp39-cp39-win32.whl", hash = "sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa"}, + {file = "numpy-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385"}, + {file = "numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78"}, ] [[package]] name = "numpy" -version = "2.1.0" +version = "2.1.1" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.10" files = [ - {file = "numpy-2.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6326ab99b52fafdcdeccf602d6286191a79fe2fda0ae90573c5814cd2b0bc1b8"}, - {file = "numpy-2.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0937e54c09f7a9a68da6889362ddd2ff584c02d015ec92672c099b61555f8911"}, - {file = "numpy-2.1.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:30014b234f07b5fec20f4146f69e13cfb1e33ee9a18a1879a0142fbb00d47673"}, - {file = "numpy-2.1.0-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:899da829b362ade41e1e7eccad2cf274035e1cb36ba73034946fccd4afd8606b"}, - {file = "numpy-2.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08801848a40aea24ce16c2ecde3b756f9ad756586fb2d13210939eb69b023f5b"}, - {file = "numpy-2.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:398049e237d1aae53d82a416dade04defed1a47f87d18d5bd615b6e7d7e41d1f"}, - {file = "numpy-2.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0abb3916a35d9090088a748636b2c06dc9a6542f99cd476979fb156a18192b84"}, - {file = "numpy-2.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:10e2350aea18d04832319aac0f887d5fcec1b36abd485d14f173e3e900b83e33"}, - {file = "numpy-2.1.0-cp310-cp310-win32.whl", hash = "sha256:f6b26e6c3b98adb648243670fddc8cab6ae17473f9dc58c51574af3e64d61211"}, - {file = "numpy-2.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:f505264735ee074250a9c78247ee8618292091d9d1fcc023290e9ac67e8f1afa"}, - {file = "numpy-2.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:76368c788ccb4f4782cf9c842b316140142b4cbf22ff8db82724e82fe1205dce"}, - {file = "numpy-2.1.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:f8e93a01a35be08d31ae33021e5268f157a2d60ebd643cfc15de6ab8e4722eb1"}, - {file = "numpy-2.1.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:9523f8b46485db6939bd069b28b642fec86c30909cea90ef550373787f79530e"}, - {file = "numpy-2.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54139e0eb219f52f60656d163cbe67c31ede51d13236c950145473504fa208cb"}, - {file = "numpy-2.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5ebbf9fbdabed208d4ecd2e1dfd2c0741af2f876e7ae522c2537d404ca895c3"}, - {file = "numpy-2.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:378cb4f24c7d93066ee4103204f73ed046eb88f9ad5bb2275bb9fa0f6a02bd36"}, - {file = "numpy-2.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8f699a709120b220dfe173f79c73cb2a2cab2c0b88dd59d7b49407d032b8ebd"}, - {file = "numpy-2.1.0-cp311-cp311-win32.whl", hash = "sha256:ffbd6faeb190aaf2b5e9024bac9622d2ee549b7ec89ef3a9373fa35313d44e0e"}, - {file = "numpy-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:0af3a5987f59d9c529c022c8c2a64805b339b7ef506509fba7d0556649b9714b"}, - {file = "numpy-2.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fe76d75b345dc045acdbc006adcb197cc680754afd6c259de60d358d60c93736"}, - {file = "numpy-2.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f358ea9e47eb3c2d6eba121ab512dfff38a88db719c38d1e67349af210bc7529"}, - {file = "numpy-2.1.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:dd94ce596bda40a9618324547cfaaf6650b1a24f5390350142499aa4e34e53d1"}, - {file = "numpy-2.1.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:b47c551c6724960479cefd7353656498b86e7232429e3a41ab83be4da1b109e8"}, - {file = "numpy-2.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0756a179afa766ad7cb6f036de622e8a8f16ffdd55aa31f296c870b5679d745"}, - {file = "numpy-2.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24003ba8ff22ea29a8c306e61d316ac74111cebf942afbf692df65509a05f111"}, - {file = "numpy-2.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b34fa5e3b5d6dc7e0a4243fa0f81367027cb6f4a7215a17852979634b5544ee0"}, - {file = "numpy-2.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c4f982715e65036c34897eb598d64aef15150c447be2cfc6643ec7a11af06574"}, - {file = "numpy-2.1.0-cp312-cp312-win32.whl", hash = "sha256:c4cd94dfefbefec3f8b544f61286584292d740e6e9d4677769bc76b8f41deb02"}, - {file = "numpy-2.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0cdef204199278f5c461a0bed6ed2e052998276e6d8ab2963d5b5c39a0500bc"}, - {file = "numpy-2.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8ab81ccd753859ab89e67199b9da62c543850f819993761c1e94a75a814ed667"}, - {file = "numpy-2.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:442596f01913656d579309edcd179a2a2f9977d9a14ff41d042475280fc7f34e"}, - {file = "numpy-2.1.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:848c6b5cad9898e4b9ef251b6f934fa34630371f2e916261070a4eb9092ffd33"}, - {file = "numpy-2.1.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:54c6a63e9d81efe64bfb7bcb0ec64332a87d0b87575f6009c8ba67ea6374770b"}, - {file = "numpy-2.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:652e92fc409e278abdd61e9505649e3938f6d04ce7ef1953f2ec598a50e7c195"}, - {file = "numpy-2.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ab32eb9170bf8ffcbb14f11613f4a0b108d3ffee0832457c5d4808233ba8977"}, - {file = "numpy-2.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:8fb49a0ba4d8f41198ae2d52118b050fd34dace4b8f3fb0ee34e23eb4ae775b1"}, - {file = "numpy-2.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:44e44973262dc3ae79e9063a1284a73e09d01b894b534a769732ccd46c28cc62"}, - {file = "numpy-2.1.0-cp313-cp313-win32.whl", hash = "sha256:ab83adc099ec62e044b1fbb3a05499fa1e99f6d53a1dde102b2d85eff66ed324"}, - {file = "numpy-2.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:de844aaa4815b78f6023832590d77da0e3b6805c644c33ce94a1e449f16d6ab5"}, - {file = "numpy-2.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:343e3e152bf5a087511cd325e3b7ecfd5b92d369e80e74c12cd87826e263ec06"}, - {file = "numpy-2.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f07fa2f15dabe91259828ce7d71b5ca9e2eb7c8c26baa822c825ce43552f4883"}, - {file = "numpy-2.1.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5474dad8c86ee9ba9bb776f4b99ef2d41b3b8f4e0d199d4f7304728ed34d0300"}, - {file = "numpy-2.1.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:1f817c71683fd1bb5cff1529a1d085a57f02ccd2ebc5cd2c566f9a01118e3b7d"}, - {file = "numpy-2.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a3336fbfa0d38d3deacd3fe7f3d07e13597f29c13abf4d15c3b6dc2291cbbdd"}, - {file = "numpy-2.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a894c51fd8c4e834f00ac742abad73fc485df1062f1b875661a3c1e1fb1c2f6"}, - {file = "numpy-2.1.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:9156ca1f79fc4acc226696e95bfcc2b486f165a6a59ebe22b2c1f82ab190384a"}, - {file = "numpy-2.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:624884b572dff8ca8f60fab591413f077471de64e376b17d291b19f56504b2bb"}, - {file = "numpy-2.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:15ef8b2177eeb7e37dd5ef4016f30b7659c57c2c0b57a779f1d537ff33a72c7b"}, - {file = "numpy-2.1.0-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:e5f0642cdf4636198a4990de7a71b693d824c56a757862230454629cf62e323d"}, - {file = "numpy-2.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15976718c004466406342789f31b6673776360f3b1e3c575f25302d7e789575"}, - {file = "numpy-2.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:6c1de77ded79fef664d5098a66810d4d27ca0224e9051906e634b3f7ead134c2"}, - {file = "numpy-2.1.0.tar.gz", hash = "sha256:7dc90da0081f7e1da49ec4e398ede6a8e9cc4f5ebe5f9e06b443ed889ee9aaa2"}, + {file = "numpy-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c8a0e34993b510fc19b9a2ce7f31cb8e94ecf6e924a40c0c9dd4f62d0aac47d9"}, + {file = "numpy-2.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7dd86dfaf7c900c0bbdcb8b16e2f6ddf1eb1fe39c6c8cca6e94844ed3152a8fd"}, + {file = "numpy-2.1.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:5889dd24f03ca5a5b1e8a90a33b5a0846d8977565e4ae003a63d22ecddf6782f"}, + {file = "numpy-2.1.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:59ca673ad11d4b84ceb385290ed0ebe60266e356641428c845b39cd9df6713ab"}, + {file = "numpy-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13ce49a34c44b6de5241f0b38b07e44c1b2dcacd9e36c30f9c2fcb1bb5135db7"}, + {file = "numpy-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913cc1d311060b1d409e609947fa1b9753701dac96e6581b58afc36b7ee35af6"}, + {file = "numpy-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:caf5d284ddea7462c32b8d4a6b8af030b6c9fd5332afb70e7414d7fdded4bfd0"}, + {file = "numpy-2.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:57eb525e7c2a8fdee02d731f647146ff54ea8c973364f3b850069ffb42799647"}, + {file = "numpy-2.1.1-cp310-cp310-win32.whl", hash = "sha256:9a8e06c7a980869ea67bbf551283bbed2856915f0a792dc32dd0f9dd2fb56728"}, + {file = "numpy-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:d10c39947a2d351d6d466b4ae83dad4c37cd6c3cdd6d5d0fa797da56f710a6ae"}, + {file = "numpy-2.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0d07841fd284718feffe7dd17a63a2e6c78679b2d386d3e82f44f0108c905550"}, + {file = "numpy-2.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b5613cfeb1adfe791e8e681128f5f49f22f3fcaa942255a6124d58ca59d9528f"}, + {file = "numpy-2.1.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:0b8cc2715a84b7c3b161f9ebbd942740aaed913584cae9cdc7f8ad5ad41943d0"}, + {file = "numpy-2.1.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:b49742cdb85f1f81e4dc1b39dcf328244f4d8d1ded95dea725b316bd2cf18c95"}, + {file = "numpy-2.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8d5f8a8e3bc87334f025194c6193e408903d21ebaeb10952264943a985066ca"}, + {file = "numpy-2.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d51fc141ddbe3f919e91a096ec739f49d686df8af254b2053ba21a910ae518bf"}, + {file = "numpy-2.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:98ce7fb5b8063cfdd86596b9c762bf2b5e35a2cdd7e967494ab78a1fa7f8b86e"}, + {file = "numpy-2.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:24c2ad697bd8593887b019817ddd9974a7f429c14a5469d7fad413f28340a6d2"}, + {file = "numpy-2.1.1-cp311-cp311-win32.whl", hash = "sha256:397bc5ce62d3fb73f304bec332171535c187e0643e176a6e9421a6e3eacef06d"}, + {file = "numpy-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:ae8ce252404cdd4de56dcfce8b11eac3c594a9c16c231d081fb705cf23bd4d9e"}, + {file = "numpy-2.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c803b7934a7f59563db459292e6aa078bb38b7ab1446ca38dd138646a38203e"}, + {file = "numpy-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6435c48250c12f001920f0751fe50c0348f5f240852cfddc5e2f97e007544cbe"}, + {file = "numpy-2.1.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3269c9eb8745e8d975980b3a7411a98976824e1fdef11f0aacf76147f662b15f"}, + {file = "numpy-2.1.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:fac6e277a41163d27dfab5f4ec1f7a83fac94e170665a4a50191b545721c6521"}, + {file = "numpy-2.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcd8f556cdc8cfe35e70efb92463082b7f43dd7e547eb071ffc36abc0ca4699b"}, + {file = "numpy-2.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b9cd92c8f8e7b313b80e93cedc12c0112088541dcedd9197b5dee3738c1201"}, + {file = "numpy-2.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:afd9c680df4de71cd58582b51e88a61feed4abcc7530bcd3d48483f20fc76f2a"}, + {file = "numpy-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8661c94e3aad18e1ea17a11f60f843a4933ccaf1a25a7c6a9182af70610b2313"}, + {file = "numpy-2.1.1-cp312-cp312-win32.whl", hash = "sha256:950802d17a33c07cba7fd7c3dcfa7d64705509206be1606f196d179e539111ed"}, + {file = "numpy-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:3fc5eabfc720db95d68e6646e88f8b399bfedd235994016351b1d9e062c4b270"}, + {file = "numpy-2.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:046356b19d7ad1890c751b99acad5e82dc4a02232013bd9a9a712fddf8eb60f5"}, + {file = "numpy-2.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6e5a9cb2be39350ae6c8f79410744e80154df658d5bea06e06e0ac5bb75480d5"}, + {file = "numpy-2.1.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:d4c57b68c8ef5e1ebf47238e99bf27657511ec3f071c465f6b1bccbef12d4136"}, + {file = "numpy-2.1.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:8ae0fd135e0b157365ac7cc31fff27f07a5572bdfc38f9c2d43b2aff416cc8b0"}, + {file = "numpy-2.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:981707f6b31b59c0c24bcda52e5605f9701cb46da4b86c2e8023656ad3e833cb"}, + {file = "numpy-2.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ca4b53e1e0b279142113b8c5eb7d7a877e967c306edc34f3b58e9be12fda8df"}, + {file = "numpy-2.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e097507396c0be4e547ff15b13dc3866f45f3680f789c1a1301b07dadd3fbc78"}, + {file = "numpy-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7506387e191fe8cdb267f912469a3cccc538ab108471291636a96a54e599556"}, + {file = "numpy-2.1.1-cp313-cp313-win32.whl", hash = "sha256:251105b7c42abe40e3a689881e1793370cc9724ad50d64b30b358bbb3a97553b"}, + {file = "numpy-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:f212d4f46b67ff604d11fff7cc62d36b3e8714edf68e44e9760e19be38c03eb0"}, + {file = "numpy-2.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:920b0911bb2e4414c50e55bd658baeb78281a47feeb064ab40c2b66ecba85553"}, + {file = "numpy-2.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:bab7c09454460a487e631ffc0c42057e3d8f2a9ddccd1e60c7bb8ed774992480"}, + {file = "numpy-2.1.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:cea427d1350f3fd0d2818ce7350095c1a2ee33e30961d2f0fef48576ddbbe90f"}, + {file = "numpy-2.1.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:e30356d530528a42eeba51420ae8bf6c6c09559051887196599d96ee5f536468"}, + {file = "numpy-2.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8dfa9e94fc127c40979c3eacbae1e61fda4fe71d84869cc129e2721973231ef"}, + {file = "numpy-2.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910b47a6d0635ec1bd53b88f86120a52bf56dcc27b51f18c7b4a2e2224c29f0f"}, + {file = "numpy-2.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:13cc11c00000848702322af4de0147ced365c81d66053a67c2e962a485b3717c"}, + {file = "numpy-2.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53e27293b3a2b661c03f79aa51c3987492bd4641ef933e366e0f9f6c9bf257ec"}, + {file = "numpy-2.1.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7be6a07520b88214ea85d8ac8b7d6d8a1839b0b5cb87412ac9f49fa934eb15d5"}, + {file = "numpy-2.1.1-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:52ac2e48f5ad847cd43c4755520a2317f3380213493b9d8a4c5e37f3b87df504"}, + {file = "numpy-2.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50a95ca3560a6058d6ea91d4629a83a897ee27c00630aed9d933dff191f170cd"}, + {file = "numpy-2.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:99f4a9ee60eed1385a86e82288971a51e71df052ed0b2900ed30bc840c0f2e39"}, + {file = "numpy-2.1.1.tar.gz", hash = "sha256:d0cf7d55b1051387807405b3898efafa862997b4cba8aa5dbe657be794afeafd"}, ] [[package]] @@ -1334,50 +1362,68 @@ files = [ [[package]] name = "paginate" -version = "0.5.6" +version = "0.5.7" description = "Divides large result sets into pages for easier browsing" optional = false python-versions = "*" files = [ - {file = "paginate-0.5.6.tar.gz", hash = "sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d"}, + {file = "paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591"}, + {file = "paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945"}, ] +[package.extras] +dev = ["pytest", "tox"] +lint = ["black"] + [[package]] name = "pandas" -version = "2.2.2" +version = "2.2.3" description = "Powerful data structures for data analysis, time series, and statistics" optional = false python-versions = ">=3.9" files = [ - {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, - {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, - {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, - {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, - {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, - {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99"}, - {file = "pandas-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772"}, - {file = "pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288"}, - {file = "pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151"}, - {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b"}, - {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee"}, - {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db"}, - {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"}, - {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"}, - {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"}, - {file = "pandas-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce"}, - {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"}, - {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"}, - {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"}, - {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, - {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, - {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, - {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, - {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, - {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, - {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, - {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57"}, - {file = "pandas-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4"}, - {file = "pandas-2.2.2.tar.gz", hash = "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54"}, + {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"}, + {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"}, + {file = "pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed"}, + {file = "pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57"}, + {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42"}, + {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f"}, + {file = "pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645"}, + {file = "pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039"}, + {file = "pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd"}, + {file = "pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698"}, + {file = "pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc"}, + {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3"}, + {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32"}, + {file = "pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5"}, + {file = "pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9"}, + {file = "pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4"}, + {file = "pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3"}, + {file = "pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"}, + {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8"}, + {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a"}, + {file = "pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13"}, + {file = "pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015"}, + {file = "pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28"}, + {file = "pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0"}, + {file = "pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24"}, + {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659"}, + {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb"}, + {file = "pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d"}, + {file = "pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468"}, + {file = "pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18"}, + {file = "pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2"}, + {file = "pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4"}, + {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d"}, + {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a"}, + {file = "pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39"}, + {file = "pandas-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30"}, + {file = "pandas-2.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c"}, + {file = "pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c"}, + {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea"}, + {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761"}, + {file = "pandas-2.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e"}, + {file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"}, ] [package.dependencies] @@ -1439,19 +1485,19 @@ files = [ [[package]] name = "platformdirs" -version = "4.2.2" +version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, - {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] -type = ["mypy (>=1.8)"] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] [[package]] name = "pluggy" @@ -1524,18 +1570,18 @@ files = [ [[package]] name = "pydantic" -version = "2.8.2" +version = "2.9.2" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"}, - {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"}, + {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"}, + {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"}, ] [package.dependencies] -annotated-types = ">=0.4.0" -pydantic-core = "2.20.1" +annotated-types = ">=0.6.0" +pydantic-core = "2.23.4" typing-extensions = [ {version = ">=4.6.1", markers = "python_version < \"3.13\""}, {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, @@ -1543,103 +1589,104 @@ typing-extensions = [ [package.extras] email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.20.1" +version = "2.23.4" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3"}, - {file = "pydantic_core-2.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840"}, - {file = "pydantic_core-2.20.1-cp310-none-win32.whl", hash = "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250"}, - {file = "pydantic_core-2.20.1-cp310-none-win_amd64.whl", hash = "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c"}, - {file = "pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312"}, - {file = "pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b"}, - {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"}, - {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b"}, - {file = "pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a"}, - {file = "pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2"}, - {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"}, - {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"}, - {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"}, - {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"}, - {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"}, - {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"}, - {file = "pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686"}, - {file = "pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83"}, - {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203"}, - {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0"}, - {file = "pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e"}, - {file = "pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20"}, - {file = "pydantic_core-2.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91"}, - {file = "pydantic_core-2.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd"}, - {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa"}, - {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987"}, - {file = "pydantic_core-2.20.1-cp38-none-win32.whl", hash = "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a"}, - {file = "pydantic_core-2.20.1-cp38-none-win_amd64.whl", hash = "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434"}, - {file = "pydantic_core-2.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c"}, - {file = "pydantic_core-2.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1"}, - {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09"}, - {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab"}, - {file = "pydantic_core-2.20.1-cp39-none-win32.whl", hash = "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2"}, - {file = "pydantic_core-2.20.1-cp39-none-win_amd64.whl", hash = "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"}, - {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"}, + {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"}, + {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"}, + {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"}, + {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"}, + {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"}, + {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"}, + {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"}, + {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb"}, + {file = "pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6"}, + {file = "pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"}, + {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"}, + {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"}, + {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"}, ] [package.dependencies] @@ -1687,13 +1734,13 @@ jsonasobj = ">=1.2.1" [[package]] name = "pymdown-extensions" -version = "10.9" +version = "10.10.1" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "pymdown_extensions-10.9-py3-none-any.whl", hash = "sha256:d323f7e90d83c86113ee78f3fe62fc9dee5f56b54d912660703ea1816fed5626"}, - {file = "pymdown_extensions-10.9.tar.gz", hash = "sha256:6ff740bcd99ec4172a938970d42b96128bdc9d4b9bcad72494f29921dc69b753"}, + {file = "pymdown_extensions-10.10.1-py3-none-any.whl", hash = "sha256:6c74ea6c2e2285186a241417480fc2d3cc52941b3ec2dced4014c84dc78c5493"}, + {file = "pymdown_extensions-10.10.1.tar.gz", hash = "sha256:ad277ee4739ced051c3b6328d22ce782358a3bec39bc6ca52815ccbf44f7acdc"}, ] [package.dependencies] @@ -1705,61 +1752,70 @@ extra = ["pygments (>=2.12)"] [[package]] name = "pymongo" -version = "4.8.0" +version = "4.9.1" description = "Python driver for MongoDB " optional = false python-versions = ">=3.8" files = [ - {file = "pymongo-4.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f2b7bec27e047e84947fbd41c782f07c54c30c76d14f3b8bf0c89f7413fac67a"}, - {file = "pymongo-4.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c68fe128a171493018ca5c8020fc08675be130d012b7ab3efe9e22698c612a1"}, - {file = "pymongo-4.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:920d4f8f157a71b3cb3f39bc09ce070693d6e9648fb0e30d00e2657d1dca4e49"}, - {file = "pymongo-4.8.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52b4108ac9469febba18cea50db972605cc43978bedaa9fea413378877560ef8"}, - {file = "pymongo-4.8.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:180d5eb1dc28b62853e2f88017775c4500b07548ed28c0bd9c005c3d7bc52526"}, - {file = "pymongo-4.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aec2b9088cdbceb87e6ca9c639d0ff9b9d083594dda5ca5d3c4f6774f4c81b33"}, - {file = "pymongo-4.8.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0cf61450feadca81deb1a1489cb1a3ae1e4266efd51adafecec0e503a8dcd84"}, - {file = "pymongo-4.8.0-cp310-cp310-win32.whl", hash = "sha256:8b18c8324809539c79bd6544d00e0607e98ff833ca21953df001510ca25915d1"}, - {file = "pymongo-4.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e5df28f74002e37bcbdfdc5109799f670e4dfef0fb527c391ff84f078050e7b5"}, - {file = "pymongo-4.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6b50040d9767197b77ed420ada29b3bf18a638f9552d80f2da817b7c4a4c9c68"}, - {file = "pymongo-4.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:417369ce39af2b7c2a9c7152c1ed2393edfd1cbaf2a356ba31eb8bcbd5c98dd7"}, - {file = "pymongo-4.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf821bd3befb993a6db17229a2c60c1550e957de02a6ff4dd0af9476637b2e4d"}, - {file = "pymongo-4.8.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9365166aa801c63dff1a3cb96e650be270da06e3464ab106727223123405510f"}, - {file = "pymongo-4.8.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc8b8582f4209c2459b04b049ac03c72c618e011d3caa5391ff86d1bda0cc486"}, - {file = "pymongo-4.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16e5019f75f6827bb5354b6fef8dfc9d6c7446894a27346e03134d290eb9e758"}, - {file = "pymongo-4.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b5802151fc2b51cd45492c80ed22b441d20090fb76d1fd53cd7760b340ff554"}, - {file = "pymongo-4.8.0-cp311-cp311-win32.whl", hash = "sha256:4bf58e6825b93da63e499d1a58de7de563c31e575908d4e24876234ccb910eba"}, - {file = "pymongo-4.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:b747c0e257b9d3e6495a018309b9e0c93b7f0d65271d1d62e572747f4ffafc88"}, - {file = "pymongo-4.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e6a720a3d22b54183352dc65f08cd1547204d263e0651b213a0a2e577e838526"}, - {file = "pymongo-4.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:31e4d21201bdf15064cf47ce7b74722d3e1aea2597c6785882244a3bb58c7eab"}, - {file = "pymongo-4.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6b804bb4f2d9dc389cc9e827d579fa327272cdb0629a99bfe5b83cb3e269ebf"}, - {file = "pymongo-4.8.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f2fbdb87fe5075c8beb17a5c16348a1ea3c8b282a5cb72d173330be2fecf22f5"}, - {file = "pymongo-4.8.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd39455b7ee70aabee46f7399b32ab38b86b236c069ae559e22be6b46b2bbfc4"}, - {file = "pymongo-4.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:940d456774b17814bac5ea7fc28188c7a1338d4a233efbb6ba01de957bded2e8"}, - {file = "pymongo-4.8.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:236bbd7d0aef62e64caf4b24ca200f8c8670d1a6f5ea828c39eccdae423bc2b2"}, - {file = "pymongo-4.8.0-cp312-cp312-win32.whl", hash = "sha256:47ec8c3f0a7b2212dbc9be08d3bf17bc89abd211901093e3ef3f2adea7de7a69"}, - {file = "pymongo-4.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:e84bc7707492f06fbc37a9f215374d2977d21b72e10a67f1b31893ec5a140ad8"}, - {file = "pymongo-4.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:519d1bab2b5e5218c64340b57d555d89c3f6c9d717cecbf826fb9d42415e7750"}, - {file = "pymongo-4.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:87075a1feb1e602e539bdb1ef8f4324a3427eb0d64208c3182e677d2c0718b6f"}, - {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f53429515d2b3e86dcc83dadecf7ff881e538c168d575f3688698a8707b80a"}, - {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fdc20cd1e1141b04696ffcdb7c71e8a4a665db31fe72e51ec706b3bdd2d09f36"}, - {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:284d0717d1a7707744018b0b6ee7801b1b1ff044c42f7be7a01bb013de639470"}, - {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5bf0eb8b6ef40fa22479f09375468c33bebb7fe49d14d9c96c8fd50355188b0"}, - {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ecd71b9226bd1d49416dc9f999772038e56f415a713be51bf18d8676a0841c8"}, - {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0061af6e8c5e68b13f1ec9ad5251247726653c5af3c0bbdfbca6cf931e99216"}, - {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:658d0170f27984e0d89c09fe5c42296613b711a3ffd847eb373b0dbb5b648d5f"}, - {file = "pymongo-4.8.0-cp38-cp38-win32.whl", hash = "sha256:3ed1c316718a2836f7efc3d75b4b0ffdd47894090bc697de8385acd13c513a70"}, - {file = "pymongo-4.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:7148419eedfea9ecb940961cfe465efaba90595568a1fb97585fb535ea63fe2b"}, - {file = "pymongo-4.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8400587d594761e5136a3423111f499574be5fd53cf0aefa0d0f05b180710b0"}, - {file = "pymongo-4.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af3e98dd9702b73e4e6fd780f6925352237f5dce8d99405ff1543f3771201704"}, - {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de3a860f037bb51f968de320baef85090ff0bbb42ec4f28ec6a5ddf88be61871"}, - {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0fc18b3a093f3db008c5fea0e980dbd3b743449eee29b5718bc2dc15ab5088bb"}, - {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18c9d8f975dd7194c37193583fd7d1eb9aea0c21ee58955ecf35362239ff31ac"}, - {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:408b2f8fdbeca3c19e4156f28fff1ab11c3efb0407b60687162d49f68075e63c"}, - {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6564780cafd6abeea49759fe661792bd5a67e4f51bca62b88faab497ab5fe89"}, - {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d18d86bc9e103f4d3d4f18b85a0471c0e13ce5b79194e4a0389a224bb70edd53"}, - {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9097c331577cecf8034422956daaba7ec74c26f7b255d718c584faddd7fa2e3c"}, - {file = "pymongo-4.8.0-cp39-cp39-win32.whl", hash = "sha256:d5428dbcd43d02f6306e1c3c95f692f68b284e6ee5390292242f509004c9e3a8"}, - {file = "pymongo-4.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:ef7225755ed27bfdb18730c68f6cb023d06c28f2b734597480fb4c0e500feb6f"}, - {file = "pymongo-4.8.0.tar.gz", hash = "sha256:454f2295875744dc70f1881e4b2eb99cdad008a33574bc8aaf120530f66c0cde"}, + {file = "pymongo-4.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dc3d070d746ab79e9b393a5c236df20e56607389af2b79bf1bfe9a841117558e"}, + {file = "pymongo-4.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fe709d05654c12fc513617c8d5c8d05b7e9cf1d5d94ada68add4e89530c867d2"}, + {file = "pymongo-4.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa4493f304b33c5d2ecee3055c98889ac6724d56f5f922d47420a45d0d4099c9"}, + {file = "pymongo-4.9.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8e8b8deba6a4bff3dd5421071083219521c74d2acae0322de5c06f1a66c56af"}, + {file = "pymongo-4.9.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e3645aff8419ca60f9ccd08966b2f6b0d78053f9f98a814d025426f1d874c19a"}, + {file = "pymongo-4.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51dbc6251c6783dfcc7d657c346986d8bad7210989b2fe15de16db5204a8e7ae"}, + {file = "pymongo-4.9.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d7aa9cc2d92e73bdb036c578ba019da94ea165eb147e691cd910a6fab7ce3b7"}, + {file = "pymongo-4.9.1-cp310-cp310-win32.whl", hash = "sha256:8b632e01617f2608880f7b9926f54a5f5ebb51631996e0540fff7fc7980663c9"}, + {file = "pymongo-4.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:f05e34d401be871d7c87cb10727d49315444e4ded07ff876a595e4c23b7436da"}, + {file = "pymongo-4.9.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6bb3d5282278594753089dc7da48bfae4a7f337a2dd4d397eabb591c649e58d0"}, + {file = "pymongo-4.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f0d5258bc85a4e6b5bcae8160628168e71ec4625a58ceb53327c3280a0b6914"}, + {file = "pymongo-4.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96462fb2175f740701d229f52018ea6e4adc4148c4112e6628bb359dd534a3df"}, + {file = "pymongo-4.9.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:286fb275267f0293364ba579f6354452599161f1902ad411061c7f744ab88328"}, + {file = "pymongo-4.9.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cddb51cead9700c4dccc916952bc0321b8d766bf782d374bfa0e93ef47c1d20"}, + {file = "pymongo-4.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d79f20f9c7cbc1c708fb80b648b6fbd3220fd3437a9bd6017c1eb592e03b361"}, + {file = "pymongo-4.9.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd3352eaf578f8e9bdea7a5692910eedad1e8680f60726fc70e99c8af51a5449"}, + {file = "pymongo-4.9.1-cp311-cp311-win32.whl", hash = "sha256:ea3f0196e7c311b9944a609ac175bd91ab97952164a1246716fdd38d53ca3bcc"}, + {file = "pymongo-4.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:b4c793db8457c856f333f396798470b9bfe405e17c307d581532c74cec70150c"}, + {file = "pymongo-4.9.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:47b4896544095d172c366dd4d4ea1da6b0ab1a77d8416897cc1801e2421b1e67"}, + {file = "pymongo-4.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fbb1c7dfcf6c44e9e1928290631c7603817991cdf570691c9e15fca594918435"}, + {file = "pymongo-4.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7689da1d1b444284e4ea9ab2eb64a15307b6b795918c0f3cd7774dd1d8a7556"}, + {file = "pymongo-4.9.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f962d74201c772555f7a78792fed820a5ea76db5c7ee6cf43748e411b44e430"}, + {file = "pymongo-4.9.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08fbab69f3fb6f8088c81f4c4a8abd84a99c132034f5e27e47f894bbcb6bf439"}, + {file = "pymongo-4.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4327c0d9bd616b8289691360f2d4a09a72fe35479795832eae0d4ff78af53923"}, + {file = "pymongo-4.9.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34e4993ae78be56f9e27a141168a1ab78253576fa3e893fa335a719ce204c3ef"}, + {file = "pymongo-4.9.1-cp312-cp312-win32.whl", hash = "sha256:e1f346811d4a2369f88ab7a6f886fa9c3bbc9ed4e4f4a3becca8717a73d465cb"}, + {file = "pymongo-4.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:a2b12c74cfd90147babb77f9728646bcedfdbd2bd2a5b4130a00e3a0af1a3d34"}, + {file = "pymongo-4.9.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a40ea8bc9cffb61c5c9c426c430d22235e085e610ee81ae075ddf51f12f76236"}, + {file = "pymongo-4.9.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:75d5974f874acdb2f125bdbe785045b23a39ecce1d3143dd5712800c7b6d25eb"}, + {file = "pymongo-4.9.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f23a046531030318622414f21198e232cf93c5640da9a80b45596a059c8cc090"}, + {file = "pymongo-4.9.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91b1a92214c3912af5467f77c2f6435cd76f6de64c70cba7bb4ee43eba7f459e"}, + {file = "pymongo-4.9.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a846423c4535428f69a90a1451df3718bc59f0c4ab685b9e96d3071951e0be4"}, + {file = "pymongo-4.9.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d476d91a5c9e6c37bc8ec3fb294e1c01d95736ccf01a59bb1540fe2f710f826e"}, + {file = "pymongo-4.9.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:172d8ba0f567e351a18765db23dab7dbcfdffd91a8788d90d46b350f80a40781"}, + {file = "pymongo-4.9.1-cp313-cp313-win32.whl", hash = "sha256:95418e334629440f70fe5ceeefc6cbbd50defb566901c8d68179ffbaec8d5f01"}, + {file = "pymongo-4.9.1-cp313-cp313-win_amd64.whl", hash = "sha256:1dfd2aa30174d36a3ef1dae4ee4c89710c2d65cac52ce6e13f17c710edbd61cf"}, + {file = "pymongo-4.9.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c4204fad54830a3173a5c939cd052d0561fba03dba7e0ff6852fd631f3314aa4"}, + {file = "pymongo-4.9.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:375765ec81b1f0a26d08928afea0c3dff897c36080a090be53fc7b70cc51d497"}, + {file = "pymongo-4.9.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d1b959a3dda0775d9111622ee47ad47772aed3a9da2e7d5f2f513fa68175dea"}, + {file = "pymongo-4.9.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:42c19d2b094cdd0ead7dbb38860bbe8268c140334ce55d8b39204ddb4ebd4904"}, + {file = "pymongo-4.9.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1fac1def9e9073f1c80198c99f0ec39c2528236c8912d96d7fd3b0237f4c523a"}, + {file = "pymongo-4.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b347052d510989d1f52b8553b31297f21cf74bd9f6aed71ee84e563492f4ff17"}, + {file = "pymongo-4.9.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b4b961fce213f2bcdc92268f85111a3668c61b9b4d4e7ece27dce3a137cfcbd"}, + {file = "pymongo-4.9.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a0b10cf51ec14a487c94709d294c00e1fb6a0a4c38cdc3acfb2ced5ef60972a0"}, + {file = "pymongo-4.9.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:679b8d55854da7c7fdb82aa5e092ab4de0144daf6758defed8ab00ff9ce05360"}, + {file = "pymongo-4.9.1-cp38-cp38-win32.whl", hash = "sha256:432ad395d2233056b042ccc73234e7136aa65d944d6bd8b5138394bd38aaff79"}, + {file = "pymongo-4.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:9fbe9fad27619ac4cfda5df0ade26a99906da7dfe7b01deddc25997eb1804e4c"}, + {file = "pymongo-4.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:99b611ff75b5d9e17183dcf9584a7b04f9db07e51a162f23ea05e485e0735c0a"}, + {file = "pymongo-4.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8089003a99127f917bdbeec177d41cef019cda8ec70534c1018cb60aacd23c2a"}, + {file = "pymongo-4.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d78adf25967c06298c7e488f4cfab79a390fc32c2b1d428613976f99031603d"}, + {file = "pymongo-4.9.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:56877cfcdf7dfc5c6408e4551ec0d6d65ebbca4d744a0bc90400f09ef6bbcc8a"}, + {file = "pymongo-4.9.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d2efe559d0d96bc0b74b3ff76701ad6f6e1a65f6581b573dcacc29158131c8"}, + {file = "pymongo-4.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f838f613e74b4dad8ace0d90f42346005bece4eda5bf6d389cfadb8322d39316"}, + {file = "pymongo-4.9.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db5b299e11284f8d82ce2983d8e19fcc28f98f902a179709ef1982b4cca6f8b8"}, + {file = "pymongo-4.9.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b23211c031b45d0f32de83ab7d77f9c26f1025c2d2c91463a5d8594a16103655"}, + {file = "pymongo-4.9.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:687cf70e096381bc65b4273a6a9319617618f7ace65caffc356e1099c4a68511"}, + {file = "pymongo-4.9.1-cp39-cp39-win32.whl", hash = "sha256:e02b03e3815b80a63e773e4c32aed3cf5633d406f376477be74550295c211256"}, + {file = "pymongo-4.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:0492ef43f3342354cf581712e431621c221f60c877ebded84e3f3e53b71bbbe0"}, + {file = "pymongo-4.9.1.tar.gz", hash = "sha256:b7f2d34390acf60e229c30037d1473fcf69f4536cd7f48f6f78c0c931c61c505"}, ] [package.dependencies] @@ -1767,23 +1823,23 @@ dnspython = ">=1.16.0,<3.0.0" [package.extras] aws = ["pymongo-auth-aws (>=1.1.0,<2.0.0)"] -docs = ["furo (==2023.9.10)", "readthedocs-sphinx-search (>=0.3,<1.0)", "sphinx (>=5.3,<8)", "sphinx-rtd-theme (>=2,<3)", "sphinxcontrib-shellcheck (>=1,<2)"] -encryption = ["certifi", "pymongo-auth-aws (>=1.1.0,<2.0.0)", "pymongocrypt (>=1.6.0,<2.0.0)"] +docs = ["furo (==2023.9.10)", "readthedocs-sphinx-search (>=0.3,<1.0)", "sphinx (>=5.3,<8)", "sphinx-autobuild (>=2020.9.1)", "sphinx-rtd-theme (>=2,<3)", "sphinxcontrib-shellcheck (>=1,<2)"] +encryption = ["certifi", "pymongo-auth-aws (>=1.1.0,<2.0.0)", "pymongocrypt (>=1.10.0,<2.0.0)"] gssapi = ["pykerberos", "winkerberos (>=0.5.0)"] ocsp = ["certifi", "cryptography (>=2.5)", "pyopenssl (>=17.2.0)", "requests (<3.0.0)", "service-identity (>=18.1.0)"] snappy = ["python-snappy"] -test = ["pytest (>=7)"] +test = ["pytest (>=8.2)", "pytest-asyncio (>=0.24.0)"] zstd = ["zstandard"] [[package]] name = "pyparsing" -version = "3.1.2" +version = "3.1.4" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.6.8" files = [ - {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, - {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, + {file = "pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c"}, + {file = "pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032"}, ] [package.extras] @@ -2176,90 +2232,105 @@ rpds-py = ">=0.7.0" [[package]] name = "regex" -version = "2024.7.24" +version = "2024.9.11" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" files = [ - {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b0d3f567fafa0633aee87f08b9276c7062da9616931382993c03808bb68ce"}, - {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3426de3b91d1bc73249042742f45c2148803c111d1175b283270177fdf669024"}, - {file = "regex-2024.7.24-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f273674b445bcb6e4409bf8d1be67bc4b58e8b46fd0d560055d515b8830063cd"}, - {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23acc72f0f4e1a9e6e9843d6328177ae3074b4182167e34119ec7233dfeccf53"}, - {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65fd3d2e228cae024c411c5ccdffae4c315271eee4a8b839291f84f796b34eca"}, - {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c414cbda77dbf13c3bc88b073a1a9f375c7b0cb5e115e15d4b73ec3a2fbc6f59"}, - {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf7a89eef64b5455835f5ed30254ec19bf41f7541cd94f266ab7cbd463f00c41"}, - {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19c65b00d42804e3fbea9708f0937d157e53429a39b7c61253ff15670ff62cb5"}, - {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7a5486ca56c8869070a966321d5ab416ff0f83f30e0e2da1ab48815c8d165d46"}, - {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6f51f9556785e5a203713f5efd9c085b4a45aecd2a42573e2b5041881b588d1f"}, - {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a4997716674d36a82eab3e86f8fa77080a5d8d96a389a61ea1d0e3a94a582cf7"}, - {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c0abb5e4e8ce71a61d9446040c1e86d4e6d23f9097275c5bd49ed978755ff0fe"}, - {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:18300a1d78cf1290fa583cd8b7cde26ecb73e9f5916690cf9d42de569c89b1ce"}, - {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:416c0e4f56308f34cdb18c3f59849479dde5b19febdcd6e6fa4d04b6c31c9faa"}, - {file = "regex-2024.7.24-cp310-cp310-win32.whl", hash = "sha256:fb168b5924bef397b5ba13aabd8cf5df7d3d93f10218d7b925e360d436863f66"}, - {file = "regex-2024.7.24-cp310-cp310-win_amd64.whl", hash = "sha256:6b9fc7e9cc983e75e2518496ba1afc524227c163e43d706688a6bb9eca41617e"}, - {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:382281306e3adaaa7b8b9ebbb3ffb43358a7bbf585fa93821300a418bb975281"}, - {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4fdd1384619f406ad9037fe6b6eaa3de2749e2e12084abc80169e8e075377d3b"}, - {file = "regex-2024.7.24-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3d974d24edb231446f708c455fd08f94c41c1ff4f04bcf06e5f36df5ef50b95a"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2ec4419a3fe6cf8a4795752596dfe0adb4aea40d3683a132bae9c30b81e8d73"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb563dd3aea54c797adf513eeec819c4213d7dbfc311874eb4fd28d10f2ff0f2"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45104baae8b9f67569f0f1dca5e1f1ed77a54ae1cd8b0b07aba89272710db61e"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:994448ee01864501912abf2bad9203bffc34158e80fe8bfb5b031f4f8e16da51"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fac296f99283ac232d8125be932c5cd7644084a30748fda013028c815ba3364"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e37e809b9303ec3a179085415cb5f418ecf65ec98cdfe34f6a078b46ef823ee"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:01b689e887f612610c869421241e075c02f2e3d1ae93a037cb14f88ab6a8934c"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f6442f0f0ff81775eaa5b05af8a0ffa1dda36e9cf6ec1e0d3d245e8564b684ce"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:871e3ab2838fbcb4e0865a6e01233975df3a15e6fce93b6f99d75cacbd9862d1"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c918b7a1e26b4ab40409820ddccc5d49871a82329640f5005f73572d5eaa9b5e"}, - {file = "regex-2024.7.24-cp311-cp311-win32.whl", hash = "sha256:2dfbb8baf8ba2c2b9aa2807f44ed272f0913eeeba002478c4577b8d29cde215c"}, - {file = "regex-2024.7.24-cp311-cp311-win_amd64.whl", hash = "sha256:538d30cd96ed7d1416d3956f94d54e426a8daf7c14527f6e0d6d425fcb4cca52"}, - {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fe4ebef608553aff8deb845c7f4f1d0740ff76fa672c011cc0bacb2a00fbde86"}, - {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:74007a5b25b7a678459f06559504f1eec2f0f17bca218c9d56f6a0a12bfffdad"}, - {file = "regex-2024.7.24-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7df9ea48641da022c2a3c9c641650cd09f0cd15e8908bf931ad538f5ca7919c9"}, - {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1141a1dcc32904c47f6846b040275c6e5de0bf73f17d7a409035d55b76f289"}, - {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80c811cfcb5c331237d9bad3bea2c391114588cf4131707e84d9493064d267f9"}, - {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7214477bf9bd195894cf24005b1e7b496f46833337b5dedb7b2a6e33f66d962c"}, - {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d55588cba7553f0b6ec33130bc3e114b355570b45785cebdc9daed8c637dd440"}, - {file = "regex-2024.7.24-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:558a57cfc32adcf19d3f791f62b5ff564922942e389e3cfdb538a23d65a6b610"}, - {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a512eed9dfd4117110b1881ba9a59b31433caed0c4101b361f768e7bcbaf93c5"}, - {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:86b17ba823ea76256b1885652e3a141a99a5c4422f4a869189db328321b73799"}, - {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5eefee9bfe23f6df09ffb6dfb23809f4d74a78acef004aa904dc7c88b9944b05"}, - {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:731fcd76bbdbf225e2eb85b7c38da9633ad3073822f5ab32379381e8c3c12e94"}, - {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eaef80eac3b4cfbdd6de53c6e108b4c534c21ae055d1dbea2de6b3b8ff3def38"}, - {file = "regex-2024.7.24-cp312-cp312-win32.whl", hash = "sha256:185e029368d6f89f36e526764cf12bf8d6f0e3a2a7737da625a76f594bdfcbfc"}, - {file = "regex-2024.7.24-cp312-cp312-win_amd64.whl", hash = "sha256:2f1baff13cc2521bea83ab2528e7a80cbe0ebb2c6f0bfad15be7da3aed443908"}, - {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:66b4c0731a5c81921e938dcf1a88e978264e26e6ac4ec96a4d21ae0354581ae0"}, - {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:88ecc3afd7e776967fa16c80f974cb79399ee8dc6c96423321d6f7d4b881c92b"}, - {file = "regex-2024.7.24-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:64bd50cf16bcc54b274e20235bf8edbb64184a30e1e53873ff8d444e7ac656b2"}, - {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb462f0e346fcf41a901a126b50f8781e9a474d3927930f3490f38a6e73b6950"}, - {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a82465ebbc9b1c5c50738536fdfa7cab639a261a99b469c9d4c7dcbb2b3f1e57"}, - {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:68a8f8c046c6466ac61a36b65bb2395c74451df2ffb8458492ef49900efed293"}, - {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac8e84fff5d27420f3c1e879ce9929108e873667ec87e0c8eeb413a5311adfe"}, - {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba2537ef2163db9e6ccdbeb6f6424282ae4dea43177402152c67ef869cf3978b"}, - {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:43affe33137fcd679bdae93fb25924979517e011f9dea99163f80b82eadc7e53"}, - {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:c9bb87fdf2ab2370f21e4d5636e5317775e5d51ff32ebff2cf389f71b9b13750"}, - {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:945352286a541406f99b2655c973852da7911b3f4264e010218bbc1cc73168f2"}, - {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:8bc593dcce679206b60a538c302d03c29b18e3d862609317cb560e18b66d10cf"}, - {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3f3b6ca8eae6d6c75a6cff525c8530c60e909a71a15e1b731723233331de4169"}, - {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c51edc3541e11fbe83f0c4d9412ef6c79f664a3745fab261457e84465ec9d5a8"}, - {file = "regex-2024.7.24-cp38-cp38-win32.whl", hash = "sha256:d0a07763776188b4db4c9c7fb1b8c494049f84659bb387b71c73bbc07f189e96"}, - {file = "regex-2024.7.24-cp38-cp38-win_amd64.whl", hash = "sha256:8fd5afd101dcf86a270d254364e0e8dddedebe6bd1ab9d5f732f274fa00499a5"}, - {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0ffe3f9d430cd37d8fa5632ff6fb36d5b24818c5c986893063b4e5bdb84cdf24"}, - {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:25419b70ba00a16abc90ee5fce061228206173231f004437730b67ac77323f0d"}, - {file = "regex-2024.7.24-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:33e2614a7ce627f0cdf2ad104797d1f68342d967de3695678c0cb84f530709f8"}, - {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d33a0021893ede5969876052796165bab6006559ab845fd7b515a30abdd990dc"}, - {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04ce29e2c5fedf296b1a1b0acc1724ba93a36fb14031f3abfb7abda2806c1535"}, - {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b16582783f44fbca6fcf46f61347340c787d7530d88b4d590a397a47583f31dd"}, - {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:836d3cc225b3e8a943d0b02633fb2f28a66e281290302a79df0e1eaa984ff7c1"}, - {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:438d9f0f4bc64e8dea78274caa5af971ceff0f8771e1a2333620969936ba10be"}, - {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:973335b1624859cb0e52f96062a28aa18f3a5fc77a96e4a3d6d76e29811a0e6e"}, - {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c5e69fd3eb0b409432b537fe3c6f44ac089c458ab6b78dcec14478422879ec5f"}, - {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fbf8c2f00904eaf63ff37718eb13acf8e178cb940520e47b2f05027f5bb34ce3"}, - {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2757ace61bc4061b69af19e4689fa4416e1a04840f33b441034202b5cd02d4"}, - {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:44fc61b99035fd9b3b9453f1713234e5a7c92a04f3577252b45feefe1b327759"}, - {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:84c312cdf839e8b579f504afcd7b65f35d60b6285d892b19adea16355e8343c9"}, - {file = "regex-2024.7.24-cp39-cp39-win32.whl", hash = "sha256:ca5b2028c2f7af4e13fb9fc29b28d0ce767c38c7facdf64f6c2cd040413055f1"}, - {file = "regex-2024.7.24-cp39-cp39-win_amd64.whl", hash = "sha256:7c479f5ae937ec9985ecaf42e2e10631551d909f203e31308c12d703922742f9"}, - {file = "regex-2024.7.24.tar.gz", hash = "sha256:9cfd009eed1a46b27c14039ad5bbc5e71b6367c5b2e6d5f5da0ea91600817506"}, + {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1494fa8725c285a81d01dc8c06b55287a1ee5e0e382d8413adc0a9197aac6408"}, + {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0e12c481ad92d129c78f13a2a3662317e46ee7ef96c94fd332e1c29131875b7d"}, + {file = "regex-2024.9.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:16e13a7929791ac1216afde26f712802e3df7bf0360b32e4914dca3ab8baeea5"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46989629904bad940bbec2106528140a218b4a36bb3042d8406980be1941429c"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a906ed5e47a0ce5f04b2c981af1c9acf9e8696066900bf03b9d7879a6f679fc8"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a091b0550b3b0207784a7d6d0f1a00d1d1c8a11699c1a4d93db3fbefc3ad35"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ddcd9a179c0a6fa8add279a4444015acddcd7f232a49071ae57fa6e278f1f71"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b41e1adc61fa347662b09398e31ad446afadff932a24807d3ceb955ed865cc8"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ced479f601cd2f8ca1fd7b23925a7e0ad512a56d6e9476f79b8f381d9d37090a"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:635a1d96665f84b292e401c3d62775851aedc31d4f8784117b3c68c4fcd4118d"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c0256beda696edcf7d97ef16b2a33a8e5a875affd6fa6567b54f7c577b30a137"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:3ce4f1185db3fbde8ed8aa223fc9620f276c58de8b0d4f8cc86fd1360829edb6"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:09d77559e80dcc9d24570da3745ab859a9cf91953062e4ab126ba9d5993688ca"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a22ccefd4db3f12b526eccb129390942fe874a3a9fdbdd24cf55773a1faab1a"}, + {file = "regex-2024.9.11-cp310-cp310-win32.whl", hash = "sha256:f745ec09bc1b0bd15cfc73df6fa4f726dcc26bb16c23a03f9e3367d357eeedd0"}, + {file = "regex-2024.9.11-cp310-cp310-win_amd64.whl", hash = "sha256:01c2acb51f8a7d6494c8c5eafe3d8e06d76563d8a8a4643b37e9b2dd8a2ff623"}, + {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2cce2449e5927a0bf084d346da6cd5eb016b2beca10d0013ab50e3c226ffc0df"}, + {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268"}, + {file = "regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d05ac6fa06959c4172eccd99a222e1fbf17b5670c4d596cb1e5cde99600674c4"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:040562757795eeea356394a7fb13076ad4f99d3c62ab0f8bdfb21f99a1f85664"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e5fb5f77c8745a60105403a774fe2c1759b71d3e7b4ca237a5e67ad066c7199"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:54d9ff35d4515debf14bc27f1e3b38bfc453eff3220f5bce159642fa762fe5d4"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df5cbb1fbc74a8305b6065d4ade43b993be03dbe0f8b30032cced0d7740994bd"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7fb89ee5d106e4a7a51bce305ac4efb981536301895f7bdcf93ec92ae0d91c7f"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a738b937d512b30bf75995c0159c0ddf9eec0775c9d72ac0202076c72f24aa96"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e28f9faeb14b6f23ac55bfbbfd3643f5c7c18ede093977f1df249f73fd22c7b1"}, + {file = "regex-2024.9.11-cp311-cp311-win32.whl", hash = "sha256:18e707ce6c92d7282dfce370cd205098384b8ee21544e7cb29b8aab955b66fa9"}, + {file = "regex-2024.9.11-cp311-cp311-win_amd64.whl", hash = "sha256:313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf"}, + {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b0d0a6c64fcc4ef9c69bd5b3b3626cc3776520a1637d8abaa62b9edc147a58f7"}, + {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:49b0e06786ea663f933f3710a51e9385ce0cba0ea56b67107fd841a55d56a231"}, + {file = "regex-2024.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5b513b6997a0b2f10e4fd3a1313568e373926e8c252bd76c960f96fd039cd28d"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee439691d8c23e76f9802c42a95cfeebf9d47cf4ffd06f18489122dbb0a7ad64"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8f877c89719d759e52783f7fe6e1c67121076b87b40542966c02de5503ace42"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23b30c62d0f16827f2ae9f2bb87619bc4fba2044911e2e6c2eb1af0161cdb766"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ab7824093d8f10d44330fe1e6493f756f252d145323dd17ab6b48733ff6c0a"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dee5b4810a89447151999428fe096977346cf2f29f4d5e29609d2e19e0199c9"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98eeee2f2e63edae2181c886d7911ce502e1292794f4c5ee71e60e23e8d26b5d"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57fdd2e0b2694ce6fc2e5ccf189789c3e2962916fb38779d3e3521ff8fe7a822"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d552c78411f60b1fdaafd117a1fca2f02e562e309223b9d44b7de8be451ec5e0"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a0b2b80321c2ed3fcf0385ec9e51a12253c50f146fddb2abbb10f033fe3d049a"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:18406efb2f5a0e57e3a5881cd9354c1512d3bb4f5c45d96d110a66114d84d23a"}, + {file = "regex-2024.9.11-cp312-cp312-win32.whl", hash = "sha256:e464b467f1588e2c42d26814231edecbcfe77f5ac414d92cbf4e7b55b2c2a776"}, + {file = "regex-2024.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:9e8719792ca63c6b8340380352c24dcb8cd7ec49dae36e963742a275dfae6009"}, + {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c157bb447303070f256e084668b702073db99bbb61d44f85d811025fcf38f784"}, + {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4db21ece84dfeefc5d8a3863f101995de646c6cb0536952c321a2650aa202c36"}, + {file = "regex-2024.9.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:220e92a30b426daf23bb67a7962900ed4613589bab80382be09b48896d211e92"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1ae19e64c14c7ec1995f40bd932448713d3c73509e82d8cd7744dc00e29e86"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f47cd43a5bfa48f86925fe26fbdd0a488ff15b62468abb5d2a1e092a4fb10e85"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d4a76b96f398697fe01117093613166e6aa8195d63f1b4ec3f21ab637632963"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ea51dcc0835eea2ea31d66456210a4e01a076d820e9039b04ae8d17ac11dee6"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7aaa315101c6567a9a45d2839322c51c8d6e81f67683d529512f5bcfb99c802"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c57d08ad67aba97af57a7263c2d9006d5c404d721c5f7542f077f109ec2a4a29"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8404bf61298bb6f8224bb9176c1424548ee1181130818fcd2cbffddc768bed8"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dd4490a33eb909ef5078ab20f5f000087afa2a4daa27b4c072ccb3cb3050ad84"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:eee9130eaad130649fd73e5cd92f60e55708952260ede70da64de420cdcad554"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a2644a93da36c784e546de579ec1806bfd2763ef47babc1b03d765fe560c9f8"}, + {file = "regex-2024.9.11-cp313-cp313-win32.whl", hash = "sha256:e997fd30430c57138adc06bba4c7c2968fb13d101e57dd5bb9355bf8ce3fa7e8"}, + {file = "regex-2024.9.11-cp313-cp313-win_amd64.whl", hash = "sha256:042c55879cfeb21a8adacc84ea347721d3d83a159da6acdf1116859e2427c43f"}, + {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:35f4a6f96aa6cb3f2f7247027b07b15a374f0d5b912c0001418d1d55024d5cb4"}, + {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:55b96e7ce3a69a8449a66984c268062fbaa0d8ae437b285428e12797baefce7e"}, + {file = "regex-2024.9.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb130fccd1a37ed894824b8c046321540263013da72745d755f2d35114b81a60"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:323c1f04be6b2968944d730e5c2091c8c89767903ecaa135203eec4565ed2b2b"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be1c8ed48c4c4065ecb19d882a0ce1afe0745dfad8ce48c49586b90a55f02366"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5b029322e6e7b94fff16cd120ab35a253236a5f99a79fb04fda7ae71ca20ae8"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6fff13ef6b5f29221d6904aa816c34701462956aa72a77f1f151a8ec4f56aeb"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:587d4af3979376652010e400accc30404e6c16b7df574048ab1f581af82065e4"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:079400a8269544b955ffa9e31f186f01d96829110a3bf79dc338e9910f794fca"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f9268774428ec173654985ce55fc6caf4c6d11ade0f6f914d48ef4719eb05ebb"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:23f9985c8784e544d53fc2930fc1ac1a7319f5d5332d228437acc9f418f2f168"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2941333154baff9838e88aa71c1d84f4438189ecc6021a12c7573728b5838e"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e93f1c331ca8e86fe877a48ad64e77882c0c4da0097f2212873a69bbfea95d0c"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:846bc79ee753acf93aef4184c040d709940c9d001029ceb7b7a52747b80ed2dd"}, + {file = "regex-2024.9.11-cp38-cp38-win32.whl", hash = "sha256:c94bb0a9f1db10a1d16c00880bdebd5f9faf267273b8f5bd1878126e0fbde771"}, + {file = "regex-2024.9.11-cp38-cp38-win_amd64.whl", hash = "sha256:2b08fce89fbd45664d3df6ad93e554b6c16933ffa9d55cb7e01182baaf971508"}, + {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:07f45f287469039ffc2c53caf6803cd506eb5f5f637f1d4acb37a738f71dd066"}, + {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4838e24ee015101d9f901988001038f7f0d90dc0c3b115541a1365fb439add62"}, + {file = "regex-2024.9.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6edd623bae6a737f10ce853ea076f56f507fd7726bee96a41ee3d68d347e4d16"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c69ada171c2d0e97a4b5aa78fbb835e0ffbb6b13fc5da968c09811346564f0d3"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02087ea0a03b4af1ed6ebab2c54d7118127fee8d71b26398e8e4b05b78963199"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69dee6a020693d12a3cf892aba4808fe168d2a4cef368eb9bf74f5398bfd4ee8"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:297f54910247508e6e5cae669f2bc308985c60540a4edd1c77203ef19bfa63ca"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ecea58b43a67b1b79805f1a0255730edaf5191ecef84dbc4cc85eb30bc8b63b9"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eab4bb380f15e189d1313195b062a6aa908f5bd687a0ceccd47c8211e9cf0d4a"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0cbff728659ce4bbf4c30b2a1be040faafaa9eca6ecde40aaff86f7889f4ab39"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:54c4a097b8bc5bb0dfc83ae498061d53ad7b5762e00f4adaa23bee22b012e6ba"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:73d6d2f64f4d894c96626a75578b0bf7d9e56dcda8c3d037a2118fdfe9b1c664"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:e53b5fbab5d675aec9f0c501274c467c0f9a5d23696cfc94247e1fb56501ed89"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ffbcf9221e04502fc35e54d1ce9567541979c3fdfb93d2c554f0ca583a19b35"}, + {file = "regex-2024.9.11-cp39-cp39-win32.whl", hash = "sha256:e4c22e1ac1f1ec1e09f72e6c44d8f2244173db7eb9629cc3a346a8d7ccc31142"}, + {file = "regex-2024.9.11-cp39-cp39-win_amd64.whl", hash = "sha256:faa3c142464efec496967359ca99696c896c591c56c53506bac1ad465f66e919"}, + {file = "regex-2024.9.11.tar.gz", hash = "sha256:6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd"}, ] [[package]] @@ -2464,24 +2535,24 @@ python-versions = ">=3.6" files = [ {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:d92f81886165cb14d7b067ef37e142256f1c6a90a65cd156b063a43da1708cfd"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win32.whl", hash = "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win_amd64.whl", hash = "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:b5edda50e5e9e15e54a6a8a0070302b00c518a9d32accc2346ad6c984aacd279"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b"}, - {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_24_aarch64.whl", hash = "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win32.whl", hash = "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win_amd64.whl", hash = "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:7048c338b6c86627afb27faecf418768acb6331fc24cfa56c93e8c9780f815fa"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_24_aarch64.whl", hash = "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win32.whl", hash = "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa"}, @@ -2489,7 +2560,7 @@ files = [ {file = "ruamel.yaml.clib-0.2.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3fcc54cb0c8b811ff66082de1680b4b14cf8a81dce0d4fbf665c2265a81e07a1"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3"}, @@ -2497,7 +2568,7 @@ files = [ {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win_amd64.whl", hash = "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:665f58bfd29b167039f714c6998178d27ccd83984084c286110ef26b230f259f"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d"}, @@ -2505,7 +2576,7 @@ files = [ {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:9eb5dee2772b0f704ca2e45b1713e4e5198c18f515b52743576d196348f374d3"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880"}, @@ -2636,60 +2707,60 @@ pandas = ["pandas (>=1.3.5)"] [[package]] name = "sqlalchemy" -version = "2.0.32" +version = "2.0.35" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.32-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0c9045ecc2e4db59bfc97b20516dfdf8e41d910ac6fb667ebd3a79ea54084619"}, - {file = "SQLAlchemy-2.0.32-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1467940318e4a860afd546ef61fefb98a14d935cd6817ed07a228c7f7c62f389"}, - {file = "SQLAlchemy-2.0.32-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5954463675cb15db8d4b521f3566a017c8789222b8316b1e6934c811018ee08b"}, - {file = "SQLAlchemy-2.0.32-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:167e7497035c303ae50651b351c28dc22a40bb98fbdb8468cdc971821b1ae533"}, - {file = "SQLAlchemy-2.0.32-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b27dfb676ac02529fb6e343b3a482303f16e6bc3a4d868b73935b8792edb52d0"}, - {file = "SQLAlchemy-2.0.32-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bf2360a5e0f7bd75fa80431bf8ebcfb920c9f885e7956c7efde89031695cafb8"}, - {file = "SQLAlchemy-2.0.32-cp310-cp310-win32.whl", hash = "sha256:306fe44e754a91cd9d600a6b070c1f2fadbb4a1a257b8781ccf33c7067fd3e4d"}, - {file = "SQLAlchemy-2.0.32-cp310-cp310-win_amd64.whl", hash = "sha256:99db65e6f3ab42e06c318f15c98f59a436f1c78179e6a6f40f529c8cc7100b22"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:21b053be28a8a414f2ddd401f1be8361e41032d2ef5884b2f31d31cb723e559f"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b178e875a7a25b5938b53b006598ee7645172fccafe1c291a706e93f48499ff5"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723a40ee2cc7ea653645bd4cf024326dea2076673fc9d3d33f20f6c81db83e1d"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:295ff8689544f7ee7e819529633d058bd458c1fd7f7e3eebd0f9268ebc56c2a0"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:49496b68cd190a147118af585173ee624114dfb2e0297558c460ad7495f9dfe2"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:acd9b73c5c15f0ec5ce18128b1fe9157ddd0044abc373e6ecd5ba376a7e5d961"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-win32.whl", hash = "sha256:9365a3da32dabd3e69e06b972b1ffb0c89668994c7e8e75ce21d3e5e69ddef28"}, - {file = "SQLAlchemy-2.0.32-cp311-cp311-win_amd64.whl", hash = "sha256:8bd63d051f4f313b102a2af1cbc8b80f061bf78f3d5bd0843ff70b5859e27924"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6bab3db192a0c35e3c9d1560eb8332463e29e5507dbd822e29a0a3c48c0a8d92"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:19d98f4f58b13900d8dec4ed09dd09ef292208ee44cc9c2fe01c1f0a2fe440e9"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd33c61513cb1b7371fd40cf221256456d26a56284e7d19d1f0b9f1eb7dd7e8"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d6ba0497c1d066dd004e0f02a92426ca2df20fac08728d03f67f6960271feec"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2b6be53e4fde0065524f1a0a7929b10e9280987b320716c1509478b712a7688c"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:916a798f62f410c0b80b63683c8061f5ebe237b0f4ad778739304253353bc1cb"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-win32.whl", hash = "sha256:31983018b74908ebc6c996a16ad3690301a23befb643093fcfe85efd292e384d"}, - {file = "SQLAlchemy-2.0.32-cp312-cp312-win_amd64.whl", hash = "sha256:4363ed245a6231f2e2957cccdda3c776265a75851f4753c60f3004b90e69bfeb"}, - {file = "SQLAlchemy-2.0.32-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b8afd5b26570bf41c35c0121801479958b4446751a3971fb9a480c1afd85558e"}, - {file = "SQLAlchemy-2.0.32-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c750987fc876813f27b60d619b987b057eb4896b81117f73bb8d9918c14f1cad"}, - {file = "SQLAlchemy-2.0.32-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ada0102afff4890f651ed91120c1120065663506b760da4e7823913ebd3258be"}, - {file = "SQLAlchemy-2.0.32-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:78c03d0f8a5ab4f3034c0e8482cfcc415a3ec6193491cfa1c643ed707d476f16"}, - {file = "SQLAlchemy-2.0.32-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:3bd1cae7519283ff525e64645ebd7a3e0283f3c038f461ecc1c7b040a0c932a1"}, - {file = "SQLAlchemy-2.0.32-cp37-cp37m-win32.whl", hash = "sha256:01438ebcdc566d58c93af0171c74ec28efe6a29184b773e378a385e6215389da"}, - {file = "SQLAlchemy-2.0.32-cp37-cp37m-win_amd64.whl", hash = "sha256:4979dc80fbbc9d2ef569e71e0896990bc94df2b9fdbd878290bd129b65ab579c"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c742be912f57586ac43af38b3848f7688863a403dfb220193a882ea60e1ec3a"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:62e23d0ac103bcf1c5555b6c88c114089587bc64d048fef5bbdb58dfd26f96da"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:251f0d1108aab8ea7b9aadbd07fb47fb8e3a5838dde34aa95a3349876b5a1f1d"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ef18a84e5116340e38eca3e7f9eeaaef62738891422e7c2a0b80feab165905f"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3eb6a97a1d39976f360b10ff208c73afb6a4de86dd2a6212ddf65c4a6a2347d5"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0c1c9b673d21477cec17ab10bc4decb1322843ba35b481585facd88203754fc5"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-win32.whl", hash = "sha256:c41a2b9ca80ee555decc605bd3c4520cc6fef9abde8fd66b1cf65126a6922d65"}, - {file = "SQLAlchemy-2.0.32-cp38-cp38-win_amd64.whl", hash = "sha256:8a37e4d265033c897892279e8adf505c8b6b4075f2b40d77afb31f7185cd6ecd"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:52fec964fba2ef46476312a03ec8c425956b05c20220a1a03703537824b5e8e1"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:328429aecaba2aee3d71e11f2477c14eec5990fb6d0e884107935f7fb6001632"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85a01b5599e790e76ac3fe3aa2f26e1feba56270023d6afd5550ed63c68552b3"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaf04784797dcdf4c0aa952c8d234fa01974c4729db55c45732520ce12dd95b4"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4488120becf9b71b3ac718f4138269a6be99a42fe023ec457896ba4f80749525"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:14e09e083a5796d513918a66f3d6aedbc131e39e80875afe81d98a03312889e6"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-win32.whl", hash = "sha256:0d322cc9c9b2154ba7e82f7bf25ecc7c36fbe2d82e2933b3642fc095a52cfc78"}, - {file = "SQLAlchemy-2.0.32-cp39-cp39-win_amd64.whl", hash = "sha256:7dd8583df2f98dea28b5cd53a1beac963f4f9d087888d75f22fcc93a07cf8d84"}, - {file = "SQLAlchemy-2.0.32-py3-none-any.whl", hash = "sha256:e567a8793a692451f706b363ccf3c45e056b67d90ead58c3bc9471af5d212202"}, - {file = "SQLAlchemy-2.0.32.tar.gz", hash = "sha256:c1b88cc8b02b6a5f0efb0345a03672d4c897dc7d92585176f88c67346f565ea8"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:67219632be22f14750f0d1c70e62f204ba69d28f62fd6432ba05ab295853de9b"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4668bd8faf7e5b71c0319407b608f278f279668f358857dbfd10ef1954ac9f90"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb8bea573863762bbf45d1e13f87c2d2fd32cee2dbd50d050f83f87429c9e1ea"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f552023710d4b93d8fb29a91fadf97de89c5926c6bd758897875435f2a939f33"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:016b2e665f778f13d3c438651dd4de244214b527a275e0acf1d44c05bc6026a9"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7befc148de64b6060937231cbff8d01ccf0bfd75aa26383ffdf8d82b12ec04ff"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-win32.whl", hash = "sha256:22b83aed390e3099584b839b93f80a0f4a95ee7f48270c97c90acd40ee646f0b"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-win_amd64.whl", hash = "sha256:a29762cd3d116585278ffb2e5b8cc311fb095ea278b96feef28d0b423154858e"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e21f66748ab725ade40fa7af8ec8b5019c68ab00b929f6643e1b1af461eddb60"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8a6219108a15fc6d24de499d0d515c7235c617b2540d97116b663dade1a54d62"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:042622a5306c23b972192283f4e22372da3b8ddf5f7aac1cc5d9c9b222ab3ff6"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:627dee0c280eea91aed87b20a1f849e9ae2fe719d52cbf847c0e0ea34464b3f7"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4fdcd72a789c1c31ed242fd8c1bcd9ea186a98ee8e5408a50e610edfef980d71"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:89b64cd8898a3a6f642db4eb7b26d1b28a497d4022eccd7717ca066823e9fb01"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-win32.whl", hash = "sha256:6a93c5a0dfe8d34951e8a6f499a9479ffb9258123551fa007fc708ae2ac2bc5e"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-win_amd64.whl", hash = "sha256:c68fe3fcde03920c46697585620135b4ecfdfc1ed23e75cc2c2ae9f8502c10b8"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:eb60b026d8ad0c97917cb81d3662d0b39b8ff1335e3fabb24984c6acd0c900a2"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6921ee01caf375363be5e9ae70d08ce7ca9d7e0e8983183080211a062d299468"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8cdf1a0dbe5ced887a9b127da4ffd7354e9c1a3b9bb330dce84df6b70ccb3a8d"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93a71c8601e823236ac0e5d087e4f397874a421017b3318fd92c0b14acf2b6db"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e04b622bb8a88f10e439084486f2f6349bf4d50605ac3e445869c7ea5cf0fa8c"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1b56961e2d31389aaadf4906d453859f35302b4eb818d34a26fab72596076bb8"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-win32.whl", hash = "sha256:0f9f3f9a3763b9c4deb8c5d09c4cc52ffe49f9876af41cc1b2ad0138878453cf"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-win_amd64.whl", hash = "sha256:25b0f63e7fcc2a6290cb5f7f5b4fc4047843504983a28856ce9b35d8f7de03cc"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f021d334f2ca692523aaf7bbf7592ceff70c8594fad853416a81d66b35e3abf9"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05c3f58cf91683102f2f0265c0db3bd3892e9eedabe059720492dbaa4f922da1"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:032d979ce77a6c2432653322ba4cbeabf5a6837f704d16fa38b5a05d8e21fa00"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:2e795c2f7d7249b75bb5f479b432a51b59041580d20599d4e112b5f2046437a3"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:cc32b2990fc34380ec2f6195f33a76b6cdaa9eecf09f0c9404b74fc120aef36f"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-win32.whl", hash = "sha256:9509c4123491d0e63fb5e16199e09f8e262066e58903e84615c301dde8fa2e87"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-win_amd64.whl", hash = "sha256:3655af10ebcc0f1e4e06c5900bb33e080d6a1fa4228f502121f28a3b1753cde5"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4c31943b61ed8fdd63dfd12ccc919f2bf95eefca133767db6fbbd15da62078ec"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a62dd5d7cc8626a3634208df458c5fe4f21200d96a74d122c83bc2015b333bc1"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0630774b0977804fba4b6bbea6852ab56c14965a2b0c7fc7282c5f7d90a1ae72"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d625eddf7efeba2abfd9c014a22c0f6b3796e0ffb48f5d5ab106568ef01ff5a"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ada603db10bb865bbe591939de854faf2c60f43c9b763e90f653224138f910d9"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c41411e192f8d3ea39ea70e0fae48762cd11a2244e03751a98bd3c0ca9a4e936"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-win32.whl", hash = "sha256:d299797d75cd747e7797b1b41817111406b8b10a4f88b6e8fe5b5e59598b43b0"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-win_amd64.whl", hash = "sha256:0375a141e1c0878103eb3d719eb6d5aa444b490c96f3fedab8471c7f6ffe70ee"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ccae5de2a0140d8be6838c331604f91d6fafd0735dbdcee1ac78fc8fbaba76b4"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2a275a806f73e849e1c309ac11108ea1a14cd7058577aba962cd7190e27c9e3c"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:732e026240cdd1c1b2e3ac515c7a23820430ed94292ce33806a95869c46bd139"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:890da8cd1941fa3dab28c5bac3b9da8502e7e366f895b3b8e500896f12f94d11"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c0d8326269dbf944b9201911b0d9f3dc524d64779a07518199a58384c3d37a44"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b76d63495b0508ab9fc23f8152bac63205d2a704cd009a2b0722f4c8e0cba8e0"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-win32.whl", hash = "sha256:69683e02e8a9de37f17985905a5eca18ad651bf592314b4d3d799029797d0eb3"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-win_amd64.whl", hash = "sha256:aee110e4ef3c528f3abbc3c2018c121e708938adeeff9006428dd7c8555e9b3f"}, + {file = "SQLAlchemy-2.0.35-py3-none-any.whl", hash = "sha256:2ab3f0336c0387662ce6221ad30ab3a5e6499aab01b9790879b6578fd9b8faa1"}, + {file = "sqlalchemy-2.0.35.tar.gz", hash = "sha256:e11d7ea4d24f0a262bccf9a7cd6284c976c5369dac21db237cff59586045ab9f"}, ] [package.dependencies] @@ -2734,13 +2805,13 @@ files = [ [[package]] name = "types-python-dateutil" -version = "2.9.0.20240316" +version = "2.9.0.20240906" description = "Typing stubs for python-dateutil" optional = false python-versions = ">=3.8" files = [ - {file = "types-python-dateutil-2.9.0.20240316.tar.gz", hash = "sha256:5d2f2e240b86905e40944dd787db6da9263f0deabef1076ddaed797351ec0202"}, - {file = "types_python_dateutil-2.9.0.20240316-py3-none-any.whl", hash = "sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b"}, + {file = "types-python-dateutil-2.9.0.20240906.tar.gz", hash = "sha256:9706c3b68284c25adffc47319ecc7947e5bb86b3773f843c73906fd598bc176e"}, + {file = "types_python_dateutil-2.9.0.20240906-py3-none-any.whl", hash = "sha256:27c8cc2d058ccb14946eebcaaa503088f4f6dbc4fb6093d3d456a49aef2753f6"}, ] [[package]] @@ -2756,13 +2827,13 @@ files = [ [[package]] name = "tzdata" -version = "2024.1" +version = "2024.2" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, - {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, + {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, + {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, ] [[package]] @@ -2781,13 +2852,13 @@ dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake [[package]] name = "urllib3" -version = "2.2.2" +version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, - {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, ] [package.extras] @@ -2798,46 +2869,41 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "watchdog" -version = "4.0.2" +version = "5.0.2" description = "Filesystem events monitoring" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "watchdog-4.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ede7f010f2239b97cc79e6cb3c249e72962404ae3865860855d5cbe708b0fd22"}, - {file = "watchdog-4.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a2cffa171445b0efa0726c561eca9a27d00a1f2b83846dbd5a4f639c4f8ca8e1"}, - {file = "watchdog-4.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c50f148b31b03fbadd6d0b5980e38b558046b127dc483e5e4505fcef250f9503"}, - {file = "watchdog-4.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7c7d4bf585ad501c5f6c980e7be9c4f15604c7cc150e942d82083b31a7548930"}, - {file = "watchdog-4.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:914285126ad0b6eb2258bbbcb7b288d9dfd655ae88fa28945be05a7b475a800b"}, - {file = "watchdog-4.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:984306dc4720da5498b16fc037b36ac443816125a3705dfde4fd90652d8028ef"}, - {file = "watchdog-4.0.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1cdcfd8142f604630deef34722d695fb455d04ab7cfe9963055df1fc69e6727a"}, - {file = "watchdog-4.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d7ab624ff2f663f98cd03c8b7eedc09375a911794dfea6bf2a359fcc266bff29"}, - {file = "watchdog-4.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:132937547a716027bd5714383dfc40dc66c26769f1ce8a72a859d6a48f371f3a"}, - {file = "watchdog-4.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:cd67c7df93eb58f360c43802acc945fa8da70c675b6fa37a241e17ca698ca49b"}, - {file = "watchdog-4.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bcfd02377be80ef3b6bc4ce481ef3959640458d6feaae0bd43dd90a43da90a7d"}, - {file = "watchdog-4.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:980b71510f59c884d684b3663d46e7a14b457c9611c481e5cef08f4dd022eed7"}, - {file = "watchdog-4.0.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:aa160781cafff2719b663c8a506156e9289d111d80f3387cf3af49cedee1f040"}, - {file = "watchdog-4.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f6ee8dedd255087bc7fe82adf046f0b75479b989185fb0bdf9a98b612170eac7"}, - {file = "watchdog-4.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0b4359067d30d5b864e09c8597b112fe0a0a59321a0f331498b013fb097406b4"}, - {file = "watchdog-4.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:770eef5372f146997638d737c9a3c597a3b41037cfbc5c41538fc27c09c3a3f9"}, - {file = "watchdog-4.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eeea812f38536a0aa859972d50c76e37f4456474b02bd93674d1947cf1e39578"}, - {file = "watchdog-4.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b2c45f6e1e57ebb4687690c05bc3a2c1fb6ab260550c4290b8abb1335e0fd08b"}, - {file = "watchdog-4.0.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:10b6683df70d340ac3279eff0b2766813f00f35a1d37515d2c99959ada8f05fa"}, - {file = "watchdog-4.0.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f7c739888c20f99824f7aa9d31ac8a97353e22d0c0e54703a547a218f6637eb3"}, - {file = "watchdog-4.0.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c100d09ac72a8a08ddbf0629ddfa0b8ee41740f9051429baa8e31bb903ad7508"}, - {file = "watchdog-4.0.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:f5315a8c8dd6dd9425b974515081fc0aadca1d1d61e078d2246509fd756141ee"}, - {file = "watchdog-4.0.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:2d468028a77b42cc685ed694a7a550a8d1771bb05193ba7b24006b8241a571a1"}, - {file = "watchdog-4.0.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f15edcae3830ff20e55d1f4e743e92970c847bcddc8b7509bcd172aa04de506e"}, - {file = "watchdog-4.0.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:936acba76d636f70db8f3c66e76aa6cb5136a936fc2a5088b9ce1c7a3508fc83"}, - {file = "watchdog-4.0.2-py3-none-manylinux2014_armv7l.whl", hash = "sha256:e252f8ca942a870f38cf785aef420285431311652d871409a64e2a0a52a2174c"}, - {file = "watchdog-4.0.2-py3-none-manylinux2014_i686.whl", hash = "sha256:0e83619a2d5d436a7e58a1aea957a3c1ccbf9782c43c0b4fed80580e5e4acd1a"}, - {file = "watchdog-4.0.2-py3-none-manylinux2014_ppc64.whl", hash = "sha256:88456d65f207b39f1981bf772e473799fcdc10801062c36fd5ad9f9d1d463a73"}, - {file = "watchdog-4.0.2-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:32be97f3b75693a93c683787a87a0dc8db98bb84701539954eef991fb35f5fbc"}, - {file = "watchdog-4.0.2-py3-none-manylinux2014_s390x.whl", hash = "sha256:c82253cfc9be68e3e49282831afad2c1f6593af80c0daf1287f6a92657986757"}, - {file = "watchdog-4.0.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:c0b14488bd336c5b1845cee83d3e631a1f8b4e9c5091ec539406e4a324f882d8"}, - {file = "watchdog-4.0.2-py3-none-win32.whl", hash = "sha256:0d8a7e523ef03757a5aa29f591437d64d0d894635f8a50f370fe37f913ce4e19"}, - {file = "watchdog-4.0.2-py3-none-win_amd64.whl", hash = "sha256:c344453ef3bf875a535b0488e3ad28e341adbd5a9ffb0f7d62cefacc8824ef2b"}, - {file = "watchdog-4.0.2-py3-none-win_ia64.whl", hash = "sha256:baececaa8edff42cd16558a639a9b0ddf425f93d892e8392a56bf904f5eff22c"}, - {file = "watchdog-4.0.2.tar.gz", hash = "sha256:b4dfbb6c49221be4535623ea4474a4d6ee0a9cef4a80b20c28db4d858b64e270"}, + {file = "watchdog-5.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d961f4123bb3c447d9fcdcb67e1530c366f10ab3a0c7d1c0c9943050936d4877"}, + {file = "watchdog-5.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72990192cb63872c47d5e5fefe230a401b87fd59d257ee577d61c9e5564c62e5"}, + {file = "watchdog-5.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6bec703ad90b35a848e05e1b40bf0050da7ca28ead7ac4be724ae5ac2653a1a0"}, + {file = "watchdog-5.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:dae7a1879918f6544201d33666909b040a46421054a50e0f773e0d870ed7438d"}, + {file = "watchdog-5.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c4a440f725f3b99133de610bfec93d570b13826f89616377715b9cd60424db6e"}, + {file = "watchdog-5.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8b2918c19e0d48f5f20df458c84692e2a054f02d9df25e6c3c930063eca64c1"}, + {file = "watchdog-5.0.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:aa9cd6e24126d4afb3752a3e70fce39f92d0e1a58a236ddf6ee823ff7dba28ee"}, + {file = "watchdog-5.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f627c5bf5759fdd90195b0c0431f99cff4867d212a67b384442c51136a098ed7"}, + {file = "watchdog-5.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d7594a6d32cda2b49df3fd9abf9b37c8d2f3eab5df45c24056b4a671ac661619"}, + {file = "watchdog-5.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba32efcccfe2c58f4d01115440d1672b4eb26cdd6fc5b5818f1fb41f7c3e1889"}, + {file = "watchdog-5.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:963f7c4c91e3f51c998eeff1b3fb24a52a8a34da4f956e470f4b068bb47b78ee"}, + {file = "watchdog-5.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8c47150aa12f775e22efff1eee9f0f6beee542a7aa1a985c271b1997d340184f"}, + {file = "watchdog-5.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:14dd4ed023d79d1f670aa659f449bcd2733c33a35c8ffd88689d9d243885198b"}, + {file = "watchdog-5.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b84bff0391ad4abe25c2740c7aec0e3de316fdf7764007f41e248422a7760a7f"}, + {file = "watchdog-5.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e8d5ff39f0a9968952cce548e8e08f849141a4fcc1290b1c17c032ba697b9d7"}, + {file = "watchdog-5.0.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fb223456db6e5f7bd9bbd5cd969f05aae82ae21acc00643b60d81c770abd402b"}, + {file = "watchdog-5.0.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9814adb768c23727a27792c77812cf4e2fd9853cd280eafa2bcfa62a99e8bd6e"}, + {file = "watchdog-5.0.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:901ee48c23f70193d1a7bc2d9ee297df66081dd5f46f0ca011be4f70dec80dab"}, + {file = "watchdog-5.0.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:638bcca3d5b1885c6ec47be67bf712b00a9ab3d4b22ec0881f4889ad870bc7e8"}, + {file = "watchdog-5.0.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5597c051587f8757798216f2485e85eac583c3b343e9aa09127a3a6f82c65ee8"}, + {file = "watchdog-5.0.2-py3-none-manylinux2014_armv7l.whl", hash = "sha256:53ed1bf71fcb8475dd0ef4912ab139c294c87b903724b6f4a8bd98e026862e6d"}, + {file = "watchdog-5.0.2-py3-none-manylinux2014_i686.whl", hash = "sha256:29e4a2607bd407d9552c502d38b45a05ec26a8e40cc7e94db9bb48f861fa5abc"}, + {file = "watchdog-5.0.2-py3-none-manylinux2014_ppc64.whl", hash = "sha256:b6dc8f1d770a8280997e4beae7b9a75a33b268c59e033e72c8a10990097e5fde"}, + {file = "watchdog-5.0.2-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:d2ab34adc9bf1489452965cdb16a924e97d4452fcf88a50b21859068b50b5c3b"}, + {file = "watchdog-5.0.2-py3-none-manylinux2014_s390x.whl", hash = "sha256:7d1aa7e4bb0f0c65a1a91ba37c10e19dabf7eaaa282c5787e51371f090748f4b"}, + {file = "watchdog-5.0.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:726eef8f8c634ac6584f86c9c53353a010d9f311f6c15a034f3800a7a891d941"}, + {file = "watchdog-5.0.2-py3-none-win32.whl", hash = "sha256:bda40c57115684d0216556671875e008279dea2dc00fcd3dde126ac8e0d7a2fb"}, + {file = "watchdog-5.0.2-py3-none-win_amd64.whl", hash = "sha256:d010be060c996db725fbce7e3ef14687cdcc76f4ca0e4339a68cc4532c382a73"}, + {file = "watchdog-5.0.2-py3-none-win_ia64.whl", hash = "sha256:3960136b2b619510569b90f0cd96408591d6c251a75c97690f4553ca88889769"}, + {file = "watchdog-5.0.2.tar.gz", hash = "sha256:dcebf7e475001d2cdeb020be630dc5b687e9acdd60d16fea6bb4508e7b94cf76"}, ] [package.extras] @@ -2939,20 +3005,24 @@ files = [ [[package]] name = "zipp" -version = "3.20.0" +version = "3.20.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.20.0-py3-none-any.whl", hash = "sha256:58da6168be89f0be59beb194da1250516fdaa062ccebd30127ac65d30045e10d"}, - {file = "zipp-3.20.0.tar.gz", hash = "sha256:0145e43d89664cfe1a2e533adc75adafed82fe2da404b4bbb6b026c0157bdb31"}, + {file = "zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350"}, + {file = "zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29"}, ] [package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] 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)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "bccc3fbf096d9c6d88bccfc8f39bfa04bf371ccf4b2d881b0742a34e63962fb2" +content-hash = "a7af9fc3010fc2508f5bb0782240325b4ac7b8822b078ca7edddbbc65cc75cd0" diff --git a/tests/conftest.py b/tests/conftest.py index 0aef261a..25cb9b91 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -24,7 +24,7 @@ def mock_api(monkeypatch, requests_mock): resp = ["nmdc:abcd"] requests_mock.post("http://localhost/pids/mint", json=["nmdc:abcd"]) requests_mock.post( - "http://localhost/workflows/activities", + "http://localhost/workflows/workflow_executions", json=["nmdc:abcd"] ) requests_mock.post("http://localhost/pids/bind", json=resp) diff --git a/tests/fixtures/db_utils.py b/tests/fixtures/db_utils.py index 0a4d2d19..9e9500a0 100644 --- a/tests/fixtures/db_utils.py +++ b/tests/fixtures/db_utils.py @@ -10,6 +10,7 @@ COLS = [ 'data_object_set', 'data_generation_set', + 'jobs', 'workflow_execution_set', ] @@ -20,7 +21,7 @@ def read_json(fn): return data -def load_fixture(test_db, fn, col=None, reset=False): +def load_fixture(test_db, fn, col=None, reset=False, version=None): if not col: col = fn.split("/")[-1].split(".")[0] if reset: @@ -28,6 +29,9 @@ def load_fixture(test_db, fn, col=None, reset=False): data = read_json(fn) logging.debug("Loading %d recs into %s" % (len(data), col)) if len(data) > 0: + if version: + for d in data: + d['version'] = version test_db[col].insert_many(data) diff --git a/tests/fixtures/mags_activity_set.json b/tests/fixtures/mags_activity.json similarity index 100% rename from tests/fixtures/mags_activity_set.json rename to tests/fixtures/mags_activity.json diff --git a/tests/fixtures/metagenome_annotation_activity_set.json b/tests/fixtures/metagenome_annotation.json similarity index 87% rename from tests/fixtures/metagenome_annotation_activity_set.json rename to tests/fixtures/metagenome_annotation.json index f6c80f78..03184cc6 100644 --- a/tests/fixtures/metagenome_annotation_activity_set.json +++ b/tests/fixtures/metagenome_annotation.json @@ -3,11 +3,8 @@ "has_input": [ "nmdc:dobj-11-contigs" ], - "part_of": [ - "nmdc:mga0vx38" - ], "git_url": "https://github.com/microbiomedata/mg_annotation", - "version": "1.0.3", + "version": "1.1.0", "has_output": [ "nmdc:dobj-11-proteinsfaa", "nmdc:dobj-11-structural", @@ -37,9 +34,9 @@ "was_informed_by": "nmdc:omprc-11-metag1", "id": "nmdc:wfmgan-11-test001.1", "execution_resource": "NERSC-Cori", - "name": "Annotation Activity for nmdc:mga0vx38", + "name": "Annotation Activity for nmdc:omprc-11-metag1", "started_at_time": "2021-08-05T14:48:51+00:00", - "type": "nmdc:MetagenomeAnnotationActivity", + "type": "nmdc:MetagenomeAnnotation", "ended_at_time": "2021-09-15T10:13:20+00:00" } ] diff --git a/tests/fixtures/metagenome_assembly_set.json b/tests/fixtures/metagenome_assembly.json similarity index 100% rename from tests/fixtures/metagenome_assembly_set.json rename to tests/fixtures/metagenome_assembly.json diff --git a/tests/fixtures/metatranscriptome_annotation_set.json b/tests/fixtures/metatranscriptome_annotation.json similarity index 100% rename from tests/fixtures/metatranscriptome_annotation_set.json rename to tests/fixtures/metatranscriptome_annotation.json diff --git a/tests/fixtures/metatranscriptome_assembly_set.json b/tests/fixtures/metatranscriptome_assembly.json similarity index 100% rename from tests/fixtures/metatranscriptome_assembly_set.json rename to tests/fixtures/metatranscriptome_assembly.json diff --git a/tests/fixtures/metatranscriptome_expression_analysis_set.json b/tests/fixtures/metatranscriptome_expression_analysis.json similarity index 100% rename from tests/fixtures/metatranscriptome_expression_analysis_set.json rename to tests/fixtures/metatranscriptome_expression_analysis.json diff --git a/tests/fixtures/read_qc_analysis_activity_set2.json b/tests/fixtures/read_qc_analysis2.json similarity index 100% rename from tests/fixtures/read_qc_analysis_activity_set2.json rename to tests/fixtures/read_qc_analysis2.json diff --git a/tests/test_sched.py b/tests/test_sched.py index 94035c4f..ca637300 100644 --- a/tests/test_sched.py +++ b/tests/test_sched.py @@ -1,73 +1,8 @@ from nmdc_automation.workflow_automation.sched import Scheduler -from pytest import fixture, mark -from pathlib import Path -from time import time -import os -import json -import logging - -from tests.fixtures.db_utils import init_test, load_fixture, read_json, reset_db - -TRIGGER_SET = 'metagenome_annotation_activity_set' -TRIGGER_ID = 'nmdc:55a79b5dd58771e28686665e3c3faa0c' -TRIGGER_DOID = 'nmdc:1d87115c442a1f83190ae47c7fe4011f' -trigger_set = 'metagenome_annotation_activity_set' -trigger_id = 'nmdc:55a79b5dd58771e28686665e3c3faa0c' -trigger_doid = 'nmdc:1d87115c442a1f83190ae47c7fe4011f' -cols = [ - 'data_object_set', - "data_generation_set", - 'mags_activity_set', - 'metagenome_assembly_set', - 'jobs', - 'metagenome_annotation_activity_set', - 'read_qc_analysis_activity_set' - ] - -FIXTURE_DIR = Path(__file__).parent / "fixtures" - - -@fixture -def mock_api(monkeypatch, requests_mock): - monkeypatch.setenv("NMDC_API_URL", "http://localhost") - monkeypatch.setenv("NMDC_CLIENT_ID", "anid") - monkeypatch.setenv("NMDC_CLIENT_SECRET", "asecret") - resp = {"expires": {"minutes": time()+60}, - "access_token": "abcd" - } - requests_mock.post("http://localhost/token", json=resp) - resp = ["nmdc:abcd"] - requests_mock.post("http://localhost/pids/mint", json=resp) - resp = ["nmdc:abcd"] - requests_mock.post("http://localhost/pids/bind", json=resp) - - -def read_json(fn): - fp = os.path.join(FIXTURE_DIR, fn) - data = json.load(open(fp)) - return data - - -def load(db, fn, col=None, reset=False): - if not col: - col = fn.split("/")[-1].split(".")[0] - if reset: - db[col].delete_many({}) - data = read_json(fn) - logging.debug("Loading %d recs into %s" % (len(data), col)) - if len(data) > 0: - db[col].insert_many(data) +from pytest import mark -def reset_db(db): - for c in cols: - db[c].delete_many({}) - - -def init_test(db): - for col in cols: - fn = '%s.json' % (col) - load(db, fn, reset=True) +from tests.fixtures.db_utils import init_test, load_fixture, read_json, reset_db def mock_progress(test_db, wf, version=None, flush=True, idx=0): @@ -107,7 +42,7 @@ def test_scheduler_cycle(test_db, mock_api, workflow_file, workflows_config_dir, reset_db(test_db) load_fixture(test_db, "data_object_set.json") - load_fixture(test_db, "omics_processing_set.json") + load_fixture(test_db, "data_generation_set.json") # Scheduler will find one job to create exp_num_jobs_initial = 1 @@ -132,7 +67,7 @@ def test_progress(test_db, mock_api, workflow_file, workflows_config_dir, site_c if workflow_file == "workflows-mt.yaml": metatranscriptome = True load_fixture(test_db, "data_object_set.json") - load_fixture(test_db, "omics_processing_set.json") + load_fixture(test_db, "data_generation_set.json") @@ -146,73 +81,63 @@ def test_progress(test_db, mock_api, workflow_file, workflows_config_dir, site_c resp = jm.cycle() assert len(resp) == 1 - if metatranscriptome: - wf = workflow_by_name['Metatranscriptome Reads QC Interleave'] - mock_progress(test_db, wf, idx=1) - else: - wf = workflow_by_name['Reads QC Interleave'] - mock_progress(test_db, wf) + # We simulate the RQC job finishing + load_fixture(test_db, "read_qc_analysis.json", col="workflow_execution_set") resp = jm.cycle() if metatranscriptome: # assembly exp_num_post_rqc_jobs = 1 + exp_num_post_annotation_jobs = 1 else: # assembly, rba exp_num_post_rqc_jobs = 2 + exp_num_post_annotation_jobs = 2 assert len(resp) == exp_num_post_rqc_jobs if metatranscriptome: - wf = workflow_by_name['Metatranscriptome Assembly'] - mock_progress(test_db, wf, version="v0.0.1") + # simulate assembly job finishing + load_fixture(test_db, "metatranscriptome_assembly.json", col="workflow_execution_set") # We should see a metatranscriptome annotation job resp = jm.cycle() assert len(resp) == 1 - assert resp[0]["config"]["activity"]["type"] in [ - "nmdc:MetatranscriptomeAnnotation", - "nmdc:MetatranscriptomeAnnotationActivity" - ] - # We should have a job record for this now + assert resp[0]["config"]["activity"]["type"] == "nmdc:MetatranscriptomeAnnotation" + resp = jm.cycle() + # all jobs should be in a submitted state assert len(resp) == 0 + # simulate annotation job finishing + load_fixture(test_db, "metatranscriptome_annotation.json", col="workflow_execution_set") + resp = jm.cycle() + assert len(resp) == 1 + assert resp[0]["config"]["activity"]["type"] == "nmdc:MetatranscriptomeExpressionAnalysis" else: - # Let's override the version to simulate an older run - # for this workflow that is stil within range of the - # current workflow - wf = workflow_by_name['Metagenome Assembly'] - # TODO: Need to make this test not depend on a hardcoded version - mock_progress(test_db, wf, version="v1.0.2") + # simulate assembly job finishing + load_fixture(test_db, "metagenome_assembly.json", col="workflow_execution_set") # We should see a metagenome annotation job resp = jm.cycle() assert len(resp) == 1 - assert resp[0]["config"]["activity"]["type"] in [ - "nmdc:MetagenomeAnnotation", - "nmdc:MetagenomeAnnotationActivity" - ] - # We should have a job record for this now + assert resp[0]["config"]["activity"]["type"] == "nmdc:MetagenomeAnnotation" + resp = jm.cycle() + # all jobs should be in a submitted state assert len(resp) == 0 - # Simulate Annotation job finishing - wf = workflow_by_name['Metagenome Annotation'] - mock_progress(test_db, wf) - # We should see a MAGs job + + # simulate annotation job finishing + load_fixture(test_db, "metagenome_annotation.json", col="workflow_execution_set") resp = jm.cycle() assert len(resp) == 1 - assert resp[0]["config"]["activity"]["type"] in [ - "nmdc:MagsAnalysis", - "nmdc:MagsAnalysisActivity" - ] - # We should have job records for everything now - resp = jm.cycle() - assert len(resp) == 0 + assert resp[0]["config"]["activity"]["type"] == "nmdc:MagsAnalysis" - # Let's remove the job records. - # Since we don't have activity records for - # MAGS or RBA, we should see two new jobs - test_db.jobs.delete_many({}) - resp = jm.cycle() - assert len(resp) == 2 + resp = jm.cycle() + # all jobs should be in a submitted state + assert len(resp) == 0 + + # Let's remove the job records. + test_db.jobs.delete_many({}) + resp = jm.cycle() + assert len(resp) == exp_num_post_annotation_jobs def test_multiple_versions(test_db, mock_api, workflows_config_dir, site_config): @@ -221,7 +146,7 @@ def test_multiple_versions(test_db, mock_api, workflows_config_dir, site_config) test_db.jobs.delete_many({}) load_fixture(test_db, "data_object_set.json") - load_fixture(test_db, "omics_processing_set.json") + load_fixture(test_db, "data_generation_set.json") jm = Scheduler(test_db, wfn=workflows_config_dir / "workflows.yaml", site_conf=site_config) @@ -234,29 +159,20 @@ def test_multiple_versions(test_db, mock_api, workflows_config_dir, site_config) # # We simulate one of the jobs finishing - wf = workflow_by_name['Reads QC'] - mock_progress(test_db, wf) + load_fixture(test_db, "read_qc_analysis.json", col="workflow_execution_set") resp = jm.cycle() # We should see one asm and one rba job assert len(resp) == 2 resp = jm.cycle() assert len(resp) == 0 - # Now simulate one of the other jobs finishing - load_fixture(test_db, "data_object_set2.json", col="data_object_set") - load_fixture(test_db, "read_qc_analysis_activity_set2.json", - col="read_qc_analysis_activity_set") - resp = jm.cycle() - # We should see one asm and one rba job - exp_post_rqc_types = ["nmdc:MetagenomeAssembly", "nmdc:ReadBasedTaxonomyAnalysisActivity"] - post_rqc_types = [j["config"]["activity"]["type"] for j in resp] - assert sorted(post_rqc_types) == sorted(exp_post_rqc_types) - assert len(resp) == 2 - resp = jm.cycle() + # Simulate the assembly job finishing with an older version + load_fixture(test_db, "metagenome_assembly.json", col="workflow_execution_set", version="v1.0.2") - # Empty the job queue. We should see 4 jobs - test_db.jobs.delete_many({}) resp = jm.cycle() - assert len(resp) == 4 + # We should see one rba job + assert len(resp) == 1 + resp = jm.cycle() + assert len(resp) == 0 def test_out_of_range(test_db, mock_api, workflows_config_dir, site_config): @@ -264,19 +180,14 @@ def test_out_of_range(test_db, mock_api, workflows_config_dir, site_config): reset_db(test_db) test_db.jobs.delete_many({}) load_fixture(test_db, "data_object_set.json") - load_fixture(test_db, "omics_processing_set.json") + load_fixture(test_db, "data_generation_set.json") jm = Scheduler(test_db, wfn=workflows_config_dir / "workflows.yaml", site_conf=site_config) - workflow_by_name = dict() - for wf in jm.workflows: - workflow_by_name[wf.name] = wf - # Let's create two RQC records. One will be in range # and the other will not. We should only get new jobs # for the one in range. - wf = workflow_by_name['Reads QC'] - mock_progress(test_db, wf) - mock_progress(test_db, wf, version="v0.0.1", flush=False) + load_fixture(test_db, "read_qc_analysis.json", col="workflow_execution_set") + load_fixture(test_db, "read_qc_analysis.json", col="workflow_execution_set", version="v0.0.1") resp = jm.cycle() # there is one additional metatronscriptome rqc job from the fixture @@ -290,12 +201,10 @@ def test_type_resolving(test_db, mock_api, workflows_config_dir, site_config): different activity types. The desired behavior is to use the first match. """ - init_test(test_db) reset_db(test_db) - test_db.jobs.delete_many({}) load_fixture(test_db, "data_object_set.json") - load_fixture(test_db, "omics_processing_set.json") - load_fixture(test_db, "read_qc_analysis_activity_set.json") + load_fixture(test_db, "data_generation_set.json") + load_fixture(test_db, "read_qc_analysis.json", col="workflow_execution_set") jm = Scheduler(test_db, wfn=workflows_config_dir / "workflows.yaml", site_conf=site_config) @@ -303,12 +212,11 @@ def test_type_resolving(test_db, mock_api, workflows_config_dir, site_config): for wf in jm.workflows: workflow_by_name[wf.name] = wf - wf = workflow_by_name['Metagenome Assembly'] - mock_progress(test_db, wf) - wf = workflow_by_name['Metagenome Annotation'] - mock_progress(test_db, wf) + # mock progress + load_fixture(test_db, "metagenome_assembly.json", col="workflow_execution_set") + load_fixture(test_db, "metagenome_annotation.json", col="workflow_execution_set") resp = jm.cycle() assert len(resp) == 2 - assert 'annotation' in resp[1]['config']['inputs']['contig_file'] + # assert 'annotation' in resp[1]['config']['inputs']['contig_file'] diff --git a/tests/workflows_test.yaml b/tests/workflows_test.yaml index 508caf9b..293f22be 100644 --- a/tests/workflows_test.yaml +++ b/tests/workflows_test.yaml @@ -36,7 +36,7 @@ Workflows: Inputs: input_files: do:Metagenome Raw Reads proj: "{activity_id}" - WorkflowExecution: + Workflow Execution: name: "Read QC for {id}" input_read_bases: "{outputs.stats.input_read_bases}" input_read_count: "{outputs.stats.input_read_count}" @@ -77,7 +77,7 @@ Workflows: - Metagenome Raw Read 2 Predecessors: - Sequencing Noninterleaved - WorkflowExecution: + Workflow Execution: name: "Read QC for {id}" input_read_bases: "{outputs.stats.input_read_bases}" input_read_count: "{outputs.stats.input_read_count}" @@ -116,7 +116,7 @@ Workflows: input_file: do:Filtered Sequencing Reads rename_contig_prefix: "{activity_id}" proj: "{activity_id}" - WorkflowExecution: + Workflow Execution: name: "Metagenome Assembly for {id}" type: nmdc:MetagenomeAssembly asm_score: "{outputs.stats.asm_score}" @@ -191,7 +191,7 @@ Workflows: imgap_project_id: "scaffold" proj: "{activity_id}" assembly_id: "{predecessor_activity_id}" - WorkflowExecution: + Workflow Execution: name: "Metagenome Annotation Analysis for {id}" type: nmdc:MetagenomeAnnotation Outputs: @@ -346,7 +346,7 @@ Workflows: map_file: do:Annotation Mapping File Optional Inputs: - map_file - WorkflowExecution: + Workflow Execution: name: "Metagenome Assembled Genomes Analysis for {id}" type: nmdc:MagsAnalysis Outputs: @@ -390,7 +390,7 @@ Workflows: Inputs: input_file: do:Filtered Sequencing Reads proj: "{activity_id}" - WorkflowExecution: + Workflow Execution: name: "Readbased Taxonomy Analysis for {id}" type: nmdc:ReadBasedTaxonomyAnalysis Outputs: From a79eaf836e18d8824f38325c57e415c61587ab96 Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Tue, 24 Sep 2024 19:58:13 -0700 Subject: [PATCH 23/52] remove commented-out assertions --- tests/test_nmdcapi.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/test_nmdcapi.py b/tests/test_nmdcapi.py index e42b5915..cc60771d 100644 --- a/tests/test_nmdcapi.py +++ b/tests/test_nmdcapi.py @@ -23,9 +23,7 @@ def test_objects(mock_api, requests_mock, site_config, test_data_dir): os.remove(fn) afile = test_data_dir / "afile" resp = n.create_object(str(afile), "desc", "http://localhost/") - # assert "checksums" in resp resp = n.create_object("./test_data/afile", "desc", "http://localhost/") - # assert "checksums" in resp url = "http://localhost/workflows/workflow_executions" requests_mock.post(url, json={"a": "b"}) resp = n.post_objects({"a": "b"}) From eca5dd71314a9903a71cd464009401998a501175 Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Tue, 24 Sep 2024 20:34:13 -0700 Subject: [PATCH 24/52] clean up redundant test fixtures --- tests/conftest.py | 20 +++++++++++++++----- tests/test_watch_nmdc.py | 30 ++---------------------------- 2 files changed, 17 insertions(+), 33 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 25cb9b91..d3e854f4 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,3 +1,4 @@ +import json import os from pymongo import MongoClient from pathlib import Path @@ -13,22 +14,31 @@ def test_db(): return MongoClient(conn_str).test @fixture(autouse=True) -def mock_api(monkeypatch, requests_mock): +def mock_api(monkeypatch, requests_mock, test_data_dir): monkeypatch.setenv("NMDC_API_URL", "http://localhost") monkeypatch.setenv("NMDC_CLIENT_ID", "anid") monkeypatch.setenv("NMDC_CLIENT_SECRET", "asecret") - resp = {"expires": {"minutes": time()+60}, + token_resp = {"expires": {"minutes": time()+60}, "access_token": "abcd" } - requests_mock.post("http://localhost/token", json=resp) + requests_mock.post("http://localhost/token", json=token_resp) resp = ["nmdc:abcd"] - requests_mock.post("http://localhost/pids/mint", json=["nmdc:abcd"]) + requests_mock.post("http://localhost/pids/mint", json=resp) requests_mock.post( "http://localhost/workflows/workflow_executions", - json=["nmdc:abcd"] + json=resp ) requests_mock.post("http://localhost/pids/bind", json=resp) + rqcf = test_data_dir / "rqc_response2.json" + rqc = json.load(open(rqcf)) + rqc_resp = {"resources": [rqc]} + requests_mock.get("http://localhost/jobs", json=rqc_resp) + + requests_mock.patch("http://localhost/operations/nmdc:1234", json={}) + requests_mock.get("http://localhost/operations/nmdc:1234", json={'metadata': {}}) + + @fixture(scope="session") def base_test_dir(): return Path(__file__).parent diff --git a/tests/test_watch_nmdc.py b/tests/test_watch_nmdc.py index 6a66dd74..e879c3a0 100644 --- a/tests/test_watch_nmdc.py +++ b/tests/test_watch_nmdc.py @@ -5,32 +5,6 @@ from pytest import fixture -@fixture(autouse=True) -def cleanup(): - tdir = os.path.dirname(__file__) - dd = os.path.join(tdir, "..", "test_data", "nmdc:mga0xxx") - if os.path.exists(dd): - shutil.rmtree(dd) - omics_id = "nmdc:omprc-11-nhy4pz43/" - if os.path.exists(f"/tmp/{omics_id}"): - shutil.rmtree(f"/tmp/{omics_id}") - if os.path.exists("/tmp/agent.state"): - os.unlink("/tmp/agent.state") - - -@fixture -def mock_nmdc_api(requests_mock, test_data_dir): - - rqcf = test_data_dir / "rqc_response2.json" - rqc = json.load(open(rqcf)) - resp = {"resources": [rqc]} - requests_mock.get("http://localhost/jobs", json=resp) - requests_mock.post("http://localhost/workflows/workflow_executions", json={}) - requests_mock.patch("http://localhost/operations/nmdc:1234", json={}) - requests_mock.get("http://localhost/operations/nmdc:1234", - json={'metadata': {}}) - - @fixture(autouse=True) def mock_cromwell(requests_mock, test_data_dir): requests_mock.real_http = True @@ -61,7 +35,7 @@ def test_watcher(site_config): w.restore() -def test_claim_jobs(requests_mock, site_config, mock_nmdc_api): +def test_claim_jobs(requests_mock, site_config, mock_api): requests_mock.real_http = True w = Watcher(site_config) job_id = "nmdc:b7eb8cda-a6aa-11ed-b1cf-acde48001122" @@ -76,7 +50,7 @@ def test_claim_jobs(requests_mock, site_config, mock_nmdc_api): assert resp -def test_reclaim_job(requests_mock, site_config, mock_nmdc_api): +def test_reclaim_job(requests_mock, site_config, mock_api): requests_mock.real_http = True w = Watcher(site_config) From 95fa281b6788f9eb8634871f30863426e77e4ced Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Tue, 24 Sep 2024 22:45:33 -0700 Subject: [PATCH 25/52] Refactor Watcher class --- nmdc_automation/api/nmdcapi.py | 6 +- nmdc_automation/run_process/run_workflows.py | 6 +- .../workflow_automation/watch_nmdc.py | 283 ++++++++---------- .../workflow_automation/wfutils.py | 10 +- tests/test_watch_nmdc.py | 10 +- 5 files changed, 149 insertions(+), 166 deletions(-) diff --git a/nmdc_automation/api/nmdcapi.py b/nmdc_automation/api/nmdcapi.py index b761acb5..3f2c7df0 100755 --- a/nmdc_automation/api/nmdcapi.py +++ b/nmdc_automation/api/nmdcapi.py @@ -46,8 +46,10 @@ class NmdcRuntimeApi: client_id = None client_secret = None - def __init__(self, site_configuration: Union[str, Path]): - self.config = Config(site_configuration) + def __init__(self, site_configuration: Union[str, Path, Config]): + if isinstance(site_configuration, str) or isinstance(site_configuration, Path): + site_configuration = Config(site_configuration) + self.config = site_configuration self._base_url = self.config.api_url self.client_id = self.config.client_id self.client_secret = self.config.client_secret diff --git a/nmdc_automation/run_process/run_workflows.py b/nmdc_automation/run_process/run_workflows.py index 5038f45c..8db01bbf 100644 --- a/nmdc_automation/run_process/run_workflows.py +++ b/nmdc_automation/run_process/run_workflows.py @@ -35,7 +35,7 @@ def watcher(ctx, site_configuration_file): @click.argument("job_ids", nargs=-1) def submit(ctx, job_ids): watcher = ctx.obj - watcher.restore() + watcher.restore_from_checkpoint() for job_id in job_ids: job = watcher.nmdc.get_job(job_id) claims = job["claims"] @@ -57,7 +57,7 @@ def submit(ctx, job_ids): @click.argument("activity_ids", nargs=-1) def resubmit(ctx, activity_ids): watcher = ctx.obj - watcher.restore() + watcher.restore_from_checkpoint() for act_id in activity_ids: job = None if act_id.startswith("nmdc:sys"): @@ -83,7 +83,7 @@ def resubmit(ctx, activity_ids): @click.pass_context def sync(ctx): watcher = ctx.obj - watcher.restore() + watcher.restore_from_checkpoint() watcher.update_op_state_all() diff --git a/nmdc_automation/workflow_automation/watch_nmdc.py b/nmdc_automation/workflow_automation/watch_nmdc.py index 30ba0811..910b941e 100644 --- a/nmdc_automation/workflow_automation/watch_nmdc.py +++ b/nmdc_automation/workflow_automation/watch_nmdc.py @@ -14,58 +14,48 @@ logger = logging.getLogger(__name__) -# TODO: Berkley refactoring: -# The watcher interacts with the NMDC runtime API to find / claim jobs and to post the resulting -# data objects back to the NMDC database. It interacts with the operations endpoint to update the status -# after job completion. -# Ensure that these calls to the Berkeley API are compatible. - -# TODO: Rename to distinguish between WorkflowJob instances and not other types such as the Job class in sched.py and -# the jobs API endpoint and DB collection. -# TODO: Add type hints to all methods. -# TODO: Add docstrings to all public methods. -# TODO: This has a "Long Method Chain" code smell and Deep Nesting code smell. Refactor to reduce complexity. -class Watcher: - def __init__(self, site_configuration_file): - self._POLL = 20 - self._MAX_FAILS = 2 - self.should_skip_claim = False - self.config = Config(site_configuration_file) - self.client_id = self.config.client_id - self.client_secret = self.config.client_secret - # TODO: Is there some reason to rename this variable? Also it doesn't seem to be used. - self.cromurl = self.config.cromwell_url - self.state_file = self.config.agent_state - self.stage_dir = self.config.stage_dir - self.raw_dir = self.config.raw_dir - # TODO: make it clear that this is a list of WorkflowJob instances - self.jobs = [] - self.runtime_api = NmdcRuntimeApi(site_configuration_file) - self._ALLOWED = self.config.allowed_workflows - - # TODO: Why not name this method "restore_from_checkpoint"? - def restore(self, nocheck: bool = False): - """ - Restore from checkpoint - """ - # TODO: Give a better name to the variable - data is too generic - data = self._load_state_file() - if not data: - return - self.jobs = self._find_jobs(data, nocheck) +class FileHandler: + def __init__(self, state_file): + self.state_file = state_file - def _load_state_file(self): + def load_state_file(self): if not exists(self.state_file): - return + return None with open(self.state_file, "r") as f: return loads(f.read()) - # TODO: 'job' is too generic + def save_state_file(self, data): + with open(self.state_file, "w") as f: + json.dump(data, f, indent=2) + + def get_output_dir(self, informed_by, act_id, data_directory): + outdir = os.path.join(data_directory, informed_by, act_id) + if not os.path.exists(outdir): + os.makedirs(outdir) + return outdir + + def write_metadata_if_not_exists(self, metadata, outdir): + metadata_filepath = os.path.join(outdir, "metadata.json") + if not os.path.exists(metadata_filepath): + with open(metadata_filepath, "w") as f: + json.dump(metadata, f) + + +class JobManager: + def __init__(self, config, file_handler, api_handler): + self.config = config + self.file_handler = file_handler + self.api_handler = api_handler + self.jobs = [] + self._MAX_FAILS = 2 + + def restore_jobs(self, state_data, nocheck=False): + self.jobs = self._find_jobs(state_data, nocheck) + def _find_jobs(self, data: dict, nocheck: bool): new_job_list = [] seen = {} - # TODO: Be explicit about the type of the data["jobs"] list for job in data["jobs"]: job_id = job["nmdc_jobid"] if job_id in seen: @@ -73,36 +63,23 @@ def _find_jobs(self, data: dict, nocheck: bool): job_record = wfjob(self.config, state=job, nocheck=nocheck) new_job_list.append(job_record) seen[job_id] = True - return new_job_list - ################################# - - def job_checkpoint(self): - jobs = [job.get_state() for job in self.jobs] - data = {"jobs": jobs} - with open(self.state_file, "w") as f: - json.dump(data, f, indent=2) - - def cycle(self): - self.restore() - if not self.should_skip_claim: - self.claim_jobs() - self.check_status() + def _get_url(self, informed_by, act_id, fname): + root = self.config.url_root + return f"{root}/{informed_by}/{act_id}/{fname}" - def watch(self): - logger.info("Entering polling loop") - while True: - try: - self.cycle() - except (IOError, ValueError, TypeError, AttributeError) as e: - logger.exception(f"Error occurred during cycle: {e}", exc_info=True) - sleep(self._POLL) + def _get_output_dir(self, informed_by, act_id): + data_directory = self.config.data_dir + outdir = os.path.join(data_directory, informed_by, act_id) + if not os.path.exists(outdir): + os.makedirs(outdir) + return outdir def find_job_by_opid(self, opid): return next((job for job in self.jobs if job.opid == opid), None) - def submit(self, new_job, opid, force=False): + def submit_job(self, new_job, opid, force=False): common_workflow_id = new_job["workflow"]["id"] if "object_id_latest" in new_job["config"]: logger.warning("Old record. Skipping.") @@ -114,11 +91,8 @@ def create_or_use_existing_job(self, new_job, opid, common_workflow_id): job = self.find_job_by_opid(opid) if job: logger.debug("Previously cached job") - logger.info(f"Reusing activity {job.activity_id}") self.jobs.append(job) else: - logging.debug("NEW JOB") - logging.debug(new_job) job = wfjob( site_config=self.config, typ=common_workflow_id, @@ -129,81 +103,45 @@ def create_or_use_existing_job(self, new_job, opid, common_workflow_id): ) self.jobs.append(job) - def refresh_remote_jobs(self): - """ - Return a filtered list of nmdc jobs. - """ - filt = { - "workflow.id": {"$in": self._ALLOWED}, - "claims": {"$size": 0} - } - logging.debug("Looking for jobs") - jobs = self.runtime_api.list_jobs(filt=filt) - logging.debug(f"Found {len(jobs)} jobs") - known = set(job.nmdc_jobid for job in self.jobs) - return [job for job in jobs if job["id"] not in known] - - # TODO: Pull the 'for job' logic up into the caller. - def claim_jobs(self): - for job in self.refresh_remote_jobs(): - job_id = job["id"] - if job.get("claims") and len(job.get("claims")) > 0: - continue - logger.debug(f"Trying to claim: {job_id}") - - # Claim job - claim = self.runtime_api.claim_job(job_id) - if not claim["claimed"]: - logger.debug(claim) - self.submit_and_checkpoint_job(job, claim["id"]) - else: - # Previously claimed - opid = claim["detail"]["id"] - logger.info("Previously claimed.") - self.submit_and_checkpoint_job(job, opid) - - def submit_and_checkpoint_job(self, job, opid): - self.submit(job, opid) - self.job_checkpoint() - - def _get_url(self, informed_by, act_id, fname): - root = self.config.url_root - return f"{root}/{informed_by}/{act_id}/{fname}" - - def _get_output_dir(self, informed_by, act_id): - data_directory = self.config.data_dir - outdir = os.path.join(data_directory, informed_by, act_id) - if not os.path.exists(outdir): - os.makedirs(outdir) - return outdir + def check_job_status(self): + for job in self.jobs: + if not job.done: + status = job.check_status() + if status == "Succeeded" and job.opid: + self.process_successful_job(job) + elif status == "Failed" and job.opid: + self.process_failed_job(job) - def post_job_done(self, job): + def process_successful_job(self, job): logger.info(f"Running post for op {job.opid}") metadata = job.get_metadata() informed_by = job.workflow_config["was_informed_by"] act_id = job.activity_id - outdir = self._get_output_dir(informed_by, act_id) + outdir = self.file_handler.get_output_dir(informed_by, act_id, self.config.data_dir) schema = NmdcSchema() - - output_ids = self.generate_data_objects( - job, metadata["outputs"], outdir, informed_by, act_id, schema - ) + output_ids = self.generate_data_objects(job, metadata["outputs"], outdir, informed_by, act_id, schema) activity_inputs = [dobj["id"] for dobj in job.input_data_objects] - self.create_activity_record(job, act_id, activity_inputs, output_ids, schema) - - self.write_metadata_if_not_exists(metadata, outdir) - + self.file_handler.write_metadata_if_not_exists(metadata, outdir) nmdc_database_obj = schema.get_database_object_dump() nmdc_database_obj_dict = json.loads(nmdc_database_obj) - resp = self.runtime_api.post_objects(nmdc_database_obj_dict) + resp = self.api_handler.post_objects(nmdc_database_obj_dict) logger.info(f"Response: {resp}") - job.done = True - resp = self.runtime_api.update_op(job.opid, done=True, meta=metadata) - + resp = self.api_handler.update_op(job.opid, done=True, meta=metadata) return resp + + def process_failed_job(self, job): + if job.failed_count < self._MAX_FAILS: + job.failed_count += 1 + job.cromwell_submit() + + def job_checkpoint(self): + jobs = [job.get_state() for job in self.jobs] + data = {"jobs": jobs} + return data + def generate_data_objects(self, job, job_outs, outdir, informed_by, act_id, schema): output_ids = [] prefix = job.workflow_config["input_prefix"] @@ -255,28 +193,71 @@ def create_activity_record(self, job, act_id, activity_inputs, output_ids, schem end_time=job.end, ) - def write_metadata_if_not_exists(self, metadata, outdir): - metadata_filepath = os.path.join(outdir, "metadata.json") - if not os.path.exists(metadata_filepath): - with open(metadata_filepath, "w") as f: - json.dump(metadata, f) - def check_status(self): - for job in self.jobs: - if not job.done: - status = job.check_status() - if status == "Succeeded" and job.opid: - self.process_successful_job(job) - elif status == "Failed" and job.opid: - self.process_failed_job(job) +class RuntimeApiHandler: + def __init__(self, config): + self.runtime_api = NmdcRuntimeApi(config) - self.job_checkpoint() + def claim_job(self, job_id): + return self.runtime_api.claim_job(job_id) - # TODO: DRY up both of these methods into a single method that takes a status argument. - def process_successful_job(self, job): - self.post_job_done(job) + def list_jobs(self, allowed_workflows): + filt = { + "workflow.id": {"$in": allowed_workflows}, + "claims": {"$size": 0} + } + return self.runtime_api.list_jobs(filt=filt) - def process_failed_job(self, job): - if job.failed_count < self._MAX_FAILS: - job.failed_count += 1 - job.cromwell_submit() + def post_objects(self, database_obj): + return self.runtime_api.post_objects(database_obj) + + def update_op(self, opid, done, meta): + return self.runtime_api.update_op(opid, done=done, meta=meta) + + + +class Watcher: + def __init__(self, site_configuration_file): + self._POLL = 20 + self._MAX_FAILS = 2 + self.should_skip_claim = False + self.config = Config(site_configuration_file) + self.file_handler = FileHandler(self.config.agent_state) + self.api_handler = RuntimeApiHandler(self.config) + self.job_manager = JobManager(self.config, self.file_handler, self.api_handler) + + # TODO: make it clear that this is a list of WorkflowJob instances + self.jobs = [] + self._ALLOWED = self.config.allowed_workflows + + def restore_from_checkpoint(self, nocheck: bool = False): + """ + Restore from checkpoint + """ + state_data = self.file_handler.load_state_file() + if state_data: + self.job_manager.restore_jobs(state_data, nocheck=nocheck) + + def cycle(self): + self.restore_from_checkpoint() + if not self.should_skip_claim: + self.claim_jobs() + self.job_manager.check_job_status() + + def watch(self): + logger.info("Entering polling loop") + while True: + try: + self.cycle() + except (IOError, ValueError, TypeError, AttributeError) as e: + logger.exception(f"Error occurred during cycle: {e}", exc_info=True) + sleep(self._POLL) + + + def claim_jobs(self): + jobs = self.api_handler.list_jobs(self._ALLOWED) + for job in jobs: + claim = self.api_handler.claim_job(job["id"]) + opid = claim["detail"]["id"] + self.job_manager.submit_job(job, opid) + self.file_handler.save_state_file(self.job_manager.job_checkpoint()) diff --git a/nmdc_automation/workflow_automation/wfutils.py b/nmdc_automation/workflow_automation/wfutils.py index c6f0d5bf..526f9b78 100755 --- a/nmdc_automation/workflow_automation/wfutils.py +++ b/nmdc_automation/workflow_automation/wfutils.py @@ -63,7 +63,7 @@ def __init__( def set_config_attributes(self): # TODO: Why are we not using the config object directly? This is a code smell. # Consider wrapping with @property decorators to make this more explicit. - self.cromurl = self.config.cromwell_url + self.cromwell_url = self.config.cromwell_url self.data_dir = self.config.data_dir self.resource = self.config.resource self.url_root = self.config.url_root @@ -129,7 +129,7 @@ def check_status(self): self.last_status = "Unsubmitted" return self.last_status - url = f"{self.cromurl}/{self.jobid}/status" + url = f"{self.cromwell_url}/{self.jobid}/status" try: resp = requests.get(url) @@ -155,7 +155,7 @@ def get_metadata(self): """ if not self.jobid: return self.DEFAULT_STATUS - url = f"{self.cromurl}/{self.jobid}{self.METADATA_URL_SUFFIX}" + url = f"{self.cromwell_url}/{self.jobid}{self.METADATA_URL_SUFFIX}" resp = requests.get(url) resp.raise_for_status() return resp.json() @@ -239,8 +239,8 @@ def cromwell_submit(self, force=False): job_id = "unknown" if not self.dryrun: - logging.debug(self.cromurl) - resp = requests.post(self.cromurl, data={}, files=files) + logging.debug(self.cromwell_url) + resp = requests.post(self.cromwell_url, data={}, files=files) resp.raise_for_status() data = resp.json() self.json_log(data, title="Response") diff --git a/tests/test_watch_nmdc.py b/tests/test_watch_nmdc.py index e879c3a0..9d0bca1d 100644 --- a/tests/test_watch_nmdc.py +++ b/tests/test_watch_nmdc.py @@ -30,9 +30,9 @@ def mock_cromwell(requests_mock, test_data_dir): def test_watcher(site_config): w = Watcher(site_config) - w.restore() - w.job_checkpoint() - w.restore() + w.restore_from_checkpoint() + w.job_manager.job_checkpoint() + w.restore_from_checkpoint() def test_claim_jobs(requests_mock, site_config, mock_api): @@ -46,7 +46,7 @@ def test_claim_jobs(requests_mock, site_config, mock_api): requests_mock.post(f"http://localhost/jobs/{job_id}:claim", json=resp) w.claim_jobs() w.cycle() - resp = w.find_job_by_opid("nmdc:1234") + resp = w.job_manager.find_job_by_opid("nmdc:1234") assert resp @@ -62,5 +62,5 @@ def test_reclaim_job(requests_mock, site_config, mock_api): requests_mock.post(f"http://localhost/jobs/{job_id}:claim", json=resp, status_code=409) w.claim_jobs() - resp = w.find_job_by_opid("nmdc:1234") + resp = w.job_manager.find_job_by_opid("nmdc:1234") assert resp From b59ce2d201149b2406652bee152649a5aba1744d Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Wed, 25 Sep 2024 09:43:09 -0700 Subject: [PATCH 26/52] Add WorkflowExecutionNode class. Extends nmdc_schema WorkflowExecution class --- .../workflow_automation/activities.py | 54 ++++++++++++++++--- .../workflow_automation/watch_nmdc.py | 2 - tests/fixtures/data_generation_set.json | 2 + 3 files changed, 49 insertions(+), 9 deletions(-) diff --git a/nmdc_automation/workflow_automation/activities.py b/nmdc_automation/workflow_automation/activities.py index d3a9cc3c..6793943d 100644 --- a/nmdc_automation/workflow_automation/activities.py +++ b/nmdc_automation/workflow_automation/activities.py @@ -4,7 +4,8 @@ from semver.version import Version -from .workflows import Workflow +from nmdc_automation.workflow_automation.workflows import Workflow +from nmdc_schema.nmdc import WorkflowExecution # TODO: Berkley refactoring: # The load_activities method will need to be modified to handle DataGeneration objects @@ -96,8 +97,8 @@ def get_workflow_executions(db, workflows: List[Workflow], data_objects: dict, a 1. Get the Data Generation (formerly Omics Processing) objects for the workflows by analyte category. 2. Get the remaining Workflow Execution objects that was_informed_by the Data Generation objects. 3. Filter Workflow Execution objects by: - - version (within range) - - required input and output data objects + - version (within range) if specified in the workflow + - input and output data objects required by the workflow Return the list of Workflow Execution objects. """ workflow_executions = set() @@ -119,11 +120,13 @@ def get_workflow_executions(db, workflows: List[Workflow], data_objects: dict, a dg_execution_records = list(dg_execution_records) for wf in dg_workflows: + # Sequencing workflows don't have a git repo + default_git_url = "https://github.com/microbiomedata" for rec in dg_execution_records: if _is_missing_required_input_output(wf, rec, data_objects): continue data_generation_ids.add(rec["id"]) - act = Activity(rec, wf) + act = WorkflowExecutionNode(rec, wf) act.was_informed_by = rec["id"] workflow_executions.add(act) @@ -142,7 +145,7 @@ def get_workflow_executions(db, workflows: List[Workflow], data_objects: dict, a if _is_missing_required_input_output(wf, rec, data_objects): continue if rec["was_informed_by"] in data_generation_ids: - act = Activity(rec, wf) + act = WorkflowExecutionNode(rec, wf) workflow_executions.add(act) return list(workflow_executions) @@ -308,9 +311,46 @@ def __init__(self, activity_rec: dict, wf: Workflow): self.workflow = wf for f in self._FIELDS: setattr(self, f, activity_rec.get(f)) - # TODO the analogous Berkeley Schema type will be nmdc:DataGeneration - if self.type == "nmdc:OmicsProcessing": + if self.type == "nmdc:NucleotideSequencing": self.was_informed_by = self.id def add_data_object(self, do: DataObject): self.data_objects_by_type[do.data_object_type] = do + + +class WorkflowExecutionNode(WorkflowExecution): + """ + Data class that extends the NMDC WorkflowExecution class. + The WorkflowExecutionNode class is used to represent a network of related workflow execution and + data generation events and their associated DataObject objects. + """ + + def __init__(self, record: dict, wf: Workflow): + """ + Initialize the WorkflowExecutionNode object with the given record and workflow. + The record may be for a DataGeneration or WorkflowExecution object. + In the case of a DataGeneration object, the was_informed_by field is set to the id of the DataGeneration object, + and the record is massaged to look like a WorkflowExecution object. + """ + record.pop("_id", None) + if not record.get("git_url"): + record["git_url"] = "http://github.com/microbiomedata" + if not record.get("started_at_time"): + record["started_at_time"] = record.get("add_date", "2024-01-01T00:00:00Z") + analyte_category = None + if record["type"] == "nmdc:NucleotideSequencing": + record["was_informed_by"] = record["id"] + analyte_category = record.pop("analyte_category") + record.pop("associated_studies") + record.pop("principal_investigator") + + super().__init__(**record) + self.parent = None + self.children = [] + self.data_objects_by_type = dict() + self.workflow = wf + self.analyte_category = analyte_category + + + def add_data_object(self, do: DataObject): + self.data_objects_by_type[do.data_object_type] = do \ No newline at end of file diff --git a/nmdc_automation/workflow_automation/watch_nmdc.py b/nmdc_automation/workflow_automation/watch_nmdc.py index 910b941e..cafe4b2e 100644 --- a/nmdc_automation/workflow_automation/watch_nmdc.py +++ b/nmdc_automation/workflow_automation/watch_nmdc.py @@ -225,8 +225,6 @@ def __init__(self, site_configuration_file): self.file_handler = FileHandler(self.config.agent_state) self.api_handler = RuntimeApiHandler(self.config) self.job_manager = JobManager(self.config, self.file_handler, self.api_handler) - - # TODO: make it clear that this is a list of WorkflowJob instances self.jobs = [] self._ALLOWED = self.config.allowed_workflows diff --git a/tests/fixtures/data_generation_set.json b/tests/fixtures/data_generation_set.json index 645a0567..40996bc7 100644 --- a/tests/fixtures/data_generation_set.json +++ b/tests/fixtures/data_generation_set.json @@ -13,6 +13,7 @@ "associated_studies" : [ "nmdc:sty-11-test001" ], + "execution_resource": "NERSC-Cori", "principal_investigator" : { "has_raw_value" : "PI Name", "email" : "pi_name@example.com", @@ -37,6 +38,7 @@ "mod_date" : "2021-06-18", "ncbi_project_name" : "NCBI Project Name", "analyte_category": "metatranscriptome", + "execution_resource": "NERSC-Cori", "principal_investigator" : { "has_raw_value" : "Another PI Name" }, From c7a26868035d1860a4da60c0fcf94180458b9ba9 Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Wed, 25 Sep 2024 15:25:53 -0700 Subject: [PATCH 27/52] Update test_sched.py --- tests/test_sched.py | 42 ++++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/tests/test_sched.py b/tests/test_sched.py index ca637300..51b918d6 100644 --- a/tests/test_sched.py +++ b/tests/test_sched.py @@ -1,31 +1,10 @@ -from nmdc_automation.workflow_automation.sched import Scheduler +from nmdc_automation.workflow_automation.sched import Scheduler, Job from pytest import mark from tests.fixtures.db_utils import init_test, load_fixture, read_json, reset_db -def mock_progress(test_db, wf, version=None, flush=True, idx=0): - """ - This function will mock the progress of a workflow. It reads - from a fixture file and inserts one record into the database. - By default, the record will be taken from the first record - in the fixture. You can change the record by changing the - idx parameter. - """ - s = wf.collection - data = read_json("%s.json" % (s))[idx] - - if version: - data['version'] = version - else: - data['version'] = wf.version - data['git_url'] = wf.git_repo - if flush: - test_db[s].delete_many({}) - test_db[s].insert_one(data) - - @mark.parametrize("workflow_file", [ "workflows.yaml", "workflows-mt.yaml" @@ -220,3 +199,22 @@ def test_type_resolving(test_db, mock_api, workflows_config_dir, site_config): assert len(resp) == 2 # assert 'annotation' in resp[1]['config']['inputs']['contig_file'] + + +@mark.parametrize("workflow_file", [ + "workflows.yaml", + "workflows-mt.yaml" +]) +def test_scheduler_add_job_rec(test_db, mock_api, workflow_file, workflows_config_dir, site_config): + """ + Test basic job creation. + """ + reset_db(test_db) + load_fixture(test_db, "data_object_set.json") + load_fixture(test_db, "data_generation_set.json") + + jm = Scheduler(test_db, wfn=workflows_config_dir / workflow_file, + site_conf=site_config) + # sanity check + assert jm + From 19d2e3dce3d777c095558555d1ad02306e31c897 Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Wed, 25 Sep 2024 18:06:34 -0700 Subject: [PATCH 28/52] Add models and workflow_execution_factory and unit tests and fixtures --- nmdc_automation/workflow_automation/models.py | 48 +++++++++++++++++++ tests/fixtures/mags_record.json | 36 ++++++++++++++ .../metagenome_annotation_record.json | 41 ++++++++++++++++ .../fixtures/metagenome_assembly_record.json | 22 +++++++++ .../metatranscriptome_annotation_record.json | 41 ++++++++++++++++ .../metatranscriptome_assembly_record.json | 22 +++++++++ ...nscriptome_expression_analysis_record.json | 20 ++++++++ .../read_based_taxonomy_analysis_record.json | 25 ++++++++++ tests/fixtures/read_qc_analysis_record.json | 26 ++++++++++ tests/test_models.py | 24 ++++++++++ 10 files changed, 305 insertions(+) create mode 100644 nmdc_automation/workflow_automation/models.py create mode 100644 tests/fixtures/mags_record.json create mode 100644 tests/fixtures/metagenome_annotation_record.json create mode 100644 tests/fixtures/metagenome_assembly_record.json create mode 100644 tests/fixtures/metatranscriptome_annotation_record.json create mode 100644 tests/fixtures/metatranscriptome_assembly_record.json create mode 100644 tests/fixtures/metatranscriptome_expression_analysis_record.json create mode 100644 tests/fixtures/read_based_taxonomy_analysis_record.json create mode 100644 tests/fixtures/read_qc_analysis_record.json create mode 100644 tests/test_models.py diff --git a/nmdc_automation/workflow_automation/models.py b/nmdc_automation/workflow_automation/models.py new file mode 100644 index 00000000..1538855f --- /dev/null +++ b/nmdc_automation/workflow_automation/models.py @@ -0,0 +1,48 @@ +""" Model classes for the workflow automation app. """ +from dataclasses import dataclass, field +from typing import List, Dict, Any, Optional + +from nmdc_automation.workflow_automation.workflows import Workflow +from nmdc_schema.nmdc import ( + WorkflowExecution, + NucleotideSequencing, + MagsAnalysis, + MetagenomeAssembly, + MetagenomeAnnotation, + MetatranscriptomeAssembly, + MetatranscriptomeAnnotation, + MetatranscriptomeExpressionAnalysis, + ReadBasedTaxonomyAnalysis, + ReadQcAnalysis, +) +workflow_types = { + "nmdc:NucleotideSequencing": NucleotideSequencing, + "nmdc:MagsAnalysis": MagsAnalysis, + "nmdc:MetagenomeAnnotation": MetagenomeAnnotation, + "nmdc:MetagenomeAssembly": MetagenomeAssembly, + "nmdc:MetatranscriptomeAnnotation": MetatranscriptomeAnnotation, + "nmdc:MetatranscriptomeAssembly": MetatranscriptomeAssembly, + "nmdc:MetatranscriptomeExpressionAnalysis": MetatranscriptomeExpressionAnalysis, + "nmdc:ReadBasedTaxonomyAnalysis": ReadBasedTaxonomyAnalysis, + "nmdc:ReadQcAnalysis": ReadQcAnalysis, +} + +def workflow_execution_factory(record: Dict[str, Any]) -> WorkflowExecution: + """ + Factory function to create a WorkflowExecution object from a record. + """ + record.pop("_id", None) + try: + cls = workflow_types[record["type"]] + except KeyError: + raise ValueError(f"Invalid workflow execution type: {record['type']}") + return cls(**record) + + + +class WorkflowExecutionNode(object): + """ + Class to represent a workflow execution node. + Represents a node in a workflow execution graph of data generation and workflow execution nodes, + and their associated data objects. + """ diff --git a/tests/fixtures/mags_record.json b/tests/fixtures/mags_record.json new file mode 100644 index 00000000..12ab23d3 --- /dev/null +++ b/tests/fixtures/mags_record.json @@ -0,0 +1,36 @@ +{ + "id": "nmdc:wfmag-11-00jn7876.1", + "name": "Metagenome Assembled Genomes Analysis Activity for nmdc:wfmag-11-00jn7876.1", + "started_at_time": "2023-07-30T21:31:56.387227+00:00", + "ended_at_time": "2023-07-30T21:34:32.750008+00:00", + "was_informed_by": "nmdc:omprc-11-7yj0jg57", + "execution_resource": "NERSC-Perlmutter", + "git_url": "https://github.com/microbiomedata/metaMAGs", + "has_input": [ + "nmdc:dobj-11-yjp1xw52", + "nmdc:dobj-11-3av14y79", + "nmdc:dobj-11-wa5pnq42", + "nmdc:dobj-11-nexa9703", + "nmdc:dobj-11-j13n8739", + "nmdc:dobj-11-116fa706", + "nmdc:dobj-11-60d0na51", + "nmdc:dobj-11-2vbz7538", + "nmdc:dobj-11-1t48mn65", + "nmdc:dobj-11-1cvwk224", + "nmdc:dobj-11-cdna6f90", + "nmdc:dobj-11-4vb3ww76", + "nmdc:dobj-11-xv4qd072", + "nmdc:dobj-11-m7p3sb10", + "nmdc:dobj-11-j0t1rv33" + ], + "has_output": [ + "nmdc:dobj-11-k5ad4209", + "nmdc:dobj-11-bw8nqt30", + "nmdc:dobj-11-199t2777", + "nmdc:dobj-11-2qfh8476", + "nmdc:dobj-11-fcsvq172" + ], + "type": "nmdc:MagsAnalysis", + "version": "v1.0.6", + "mags_list": [] + } \ No newline at end of file diff --git a/tests/fixtures/metagenome_annotation_record.json b/tests/fixtures/metagenome_annotation_record.json new file mode 100644 index 00000000..222a384c --- /dev/null +++ b/tests/fixtures/metagenome_annotation_record.json @@ -0,0 +1,41 @@ +{ + "id": "nmdc:wfmgan-11-009f3582.1", + "name": "Metagenome Annotation Analysis Activity for nmdc:wfmgan-11-009f3582.1", + "started_at_time": "2024-09-03T19:24:35.443721+00:00", + "ended_at_time": "2024-09-04T20:05:09.774239+00:00", + "was_informed_by": "nmdc:omprc-11-24aket55", + "execution_resource": "NERSC-Perlmutter", + "git_url": "https://github.com/microbiomedata/mg_annotation", + "has_input": [ + "nmdc:dobj-11-mmtw5j72" + ], + "type": "nmdc:MetagenomeAnnotation", + "has_output": [ + "nmdc:dobj-11-pthb2b31", + "nmdc:dobj-11-2fd45p27", + "nmdc:dobj-11-ht0ats03", + "nmdc:dobj-11-sevdef93", + "nmdc:dobj-11-dadfbk65", + "nmdc:dobj-11-2r9dh888", + "nmdc:dobj-11-hd7fse31", + "nmdc:dobj-11-8zbtsn06", + "nmdc:dobj-11-sbxx9k71", + "nmdc:dobj-11-9snwce53", + "nmdc:dobj-11-qb62ef07", + "nmdc:dobj-11-9k06j893", + "nmdc:dobj-11-6hm85g54", + "nmdc:dobj-11-pgp0fr06", + "nmdc:dobj-11-a9m5d764", + "nmdc:dobj-11-rmypsf52", + "nmdc:dobj-11-13mdyw37", + "nmdc:dobj-11-0apj5620", + "nmdc:dobj-11-kh26pk74", + "nmdc:dobj-11-zyh1nx46", + "nmdc:dobj-11-d6gdnm48", + "nmdc:dobj-11-7j8j6733", + "nmdc:dobj-11-s13ejf37", + "nmdc:dobj-11-hpn4d109", + "nmdc:dobj-11-sfanhn77" + ], + "version": "v1.1.0" + } \ No newline at end of file diff --git a/tests/fixtures/metagenome_assembly_record.json b/tests/fixtures/metagenome_assembly_record.json new file mode 100644 index 00000000..b8bcf2cb --- /dev/null +++ b/tests/fixtures/metagenome_assembly_record.json @@ -0,0 +1,22 @@ +{ + "id": "nmdc:wfmgas-11-0080kf19.1", + "name": "Metagenome Assembly Activity for nmdc:wfmgas-11-0080kf19.1", + "started_at_time": "2023-09-05T18:02:36.755687+00:00", + "ended_at_time": "2023-09-05T19:46:42.649106+00:00", + "was_informed_by": "nmdc:omprc-11-c82tqn53", + "execution_resource": "NERSC-Perlmutter", + "git_url": "https://github.com/microbiomedata/metaAssembly", + "has_input": [ + "nmdc:dobj-11-sgpgmp62" + ], + "has_output": [ + "nmdc:dobj-11-dtnyvj29", + "nmdc:dobj-11-4hpkwf43", + "nmdc:dobj-11-pyhh1b53", + "nmdc:dobj-11-3qp71339", + "nmdc:dobj-11-0mw8sn13", + "nmdc:dobj-11-a898mz04" + ], + "type": "nmdc:MetagenomeAssembly", + "version": "v1.0.3" + } \ No newline at end of file diff --git a/tests/fixtures/metatranscriptome_annotation_record.json b/tests/fixtures/metatranscriptome_annotation_record.json new file mode 100644 index 00000000..3e54d61c --- /dev/null +++ b/tests/fixtures/metatranscriptome_annotation_record.json @@ -0,0 +1,41 @@ +{ + "id": "nmdc:wfmtan-11-009f3582.1", + "name": "Metatranscriptome Annotation Analysis Activity for nmdc:wfmtan-11-009f3582.1", + "started_at_time": "2024-09-03T19:24:35.443721+00:00", + "ended_at_time": "2024-09-04T20:05:09.774239+00:00", + "was_informed_by": "nmdc:omprc-11-24aket55", + "execution_resource": "NERSC-Perlmutter", + "git_url": "https://github.com/microbiomedata/mg_annotation", + "has_input": [ + "nmdc:dobj-11-mmtw5j72" + ], + "type": "nmdc:MetatranscriptomeAnnotation", + "has_output": [ + "nmdc:dobj-11-pthb2b31", + "nmdc:dobj-11-2fd45p27", + "nmdc:dobj-11-ht0ats03", + "nmdc:dobj-11-sevdef93", + "nmdc:dobj-11-dadfbk65", + "nmdc:dobj-11-2r9dh888", + "nmdc:dobj-11-hd7fse31", + "nmdc:dobj-11-8zbtsn06", + "nmdc:dobj-11-sbxx9k71", + "nmdc:dobj-11-9snwce53", + "nmdc:dobj-11-qb62ef07", + "nmdc:dobj-11-9k06j893", + "nmdc:dobj-11-6hm85g54", + "nmdc:dobj-11-pgp0fr06", + "nmdc:dobj-11-a9m5d764", + "nmdc:dobj-11-rmypsf52", + "nmdc:dobj-11-13mdyw37", + "nmdc:dobj-11-0apj5620", + "nmdc:dobj-11-kh26pk74", + "nmdc:dobj-11-zyh1nx46", + "nmdc:dobj-11-d6gdnm48", + "nmdc:dobj-11-7j8j6733", + "nmdc:dobj-11-s13ejf37", + "nmdc:dobj-11-hpn4d109", + "nmdc:dobj-11-sfanhn77" + ], + "version": "v1.1.4" + } \ No newline at end of file diff --git a/tests/fixtures/metatranscriptome_assembly_record.json b/tests/fixtures/metatranscriptome_assembly_record.json new file mode 100644 index 00000000..5b8f6156 --- /dev/null +++ b/tests/fixtures/metatranscriptome_assembly_record.json @@ -0,0 +1,22 @@ +{ + "id": "nmdc:wfmtas-11-0080kf19.1", + "name": "Metatranscriptome Assembly Activity for nmdc:wfmas-11-0080kf19.1", + "started_at_time": "2023-09-05T18:02:36.755687+00:00", + "ended_at_time": "2023-09-05T19:46:42.649106+00:00", + "was_informed_by": "nmdc:omprc-11-c82tqn53", + "execution_resource": "NERSC-Perlmutter", + "git_url": "https://github.com/microbiomedata/metaT_Assembly", + "has_input": [ + "nmdc:dobj-11-sgpgmp62" + ], + "has_output": [ + "nmdc:dobj-11-dtnyvj29", + "nmdc:dobj-11-4hpkwf43", + "nmdc:dobj-11-pyhh1b53", + "nmdc:dobj-11-3qp71339", + "nmdc:dobj-11-0mw8sn13", + "nmdc:dobj-11-a898mz04" + ], + "type": "nmdc:MetatranscriptomeAssembly", + "version": "v0.0.2" + } \ No newline at end of file diff --git a/tests/fixtures/metatranscriptome_expression_analysis_record.json b/tests/fixtures/metatranscriptome_expression_analysis_record.json new file mode 100644 index 00000000..d922d96e --- /dev/null +++ b/tests/fixtures/metatranscriptome_expression_analysis_record.json @@ -0,0 +1,20 @@ +{ + "id": "nmdc:wfmtex-11-metat1.1", + "name": "Metatranscriptome Expression Analysis for nmdc:wfmtex-11-metat1.1", + "started_at_time": "2024-04-11T20:51:15.535533+00:00", + "ended_at_time": "2024-04-11T23:39:28.659534+00:00", + "was_informed_by": "nmdc:omprc-11-metat1", + "execution_resource": "NERSC-Perlmutter", + "git_url": "https://github.com/microbiomedata/metaT_ReadCounts", + "has_input": [ + "nmdc:dobj-11-functionalt1", + "nmdc:dobj-11-contigmappingt1", + "nmdc:dobj-11-coverbamt1" + ], + "type": "nmdc:MetatranscriptomeExpressionAnalysis", + "has_output": [ + "nmdc:dobj-11-expcountst1", + "nmdc:dobj-11-expinfot1" + ], + "version": "v1.0.8" + } \ No newline at end of file diff --git a/tests/fixtures/read_based_taxonomy_analysis_record.json b/tests/fixtures/read_based_taxonomy_analysis_record.json new file mode 100644 index 00000000..999a563c --- /dev/null +++ b/tests/fixtures/read_based_taxonomy_analysis_record.json @@ -0,0 +1,25 @@ +{ + "id": "nmdc:wfrbt-11-00qkc311.1", + "name": "Readbased Taxonomy Analysis Activity for nmdc:wfrbt-11-00qkc311.1", + "started_at_time": "2023-03-16T19:32:00.300673+00:00", + "ended_at_time": "2023-03-17T15:24:11.217325+00:00", + "was_informed_by": "nmdc:omprc-11-rcy9x023", + "execution_resource": "NERSC-Cori", + "git_url": "https://github.com/microbiomedata/ReadbasedAnalysis", + "has_input": [ + "nmdc:dobj-11-bg80tg92" + ], + "has_output": [ + "nmdc:dobj-11-r3fgct86", + "nmdc:dobj-11-s71n7k22", + "nmdc:dobj-11-z7scy855", + "nmdc:dobj-11-et8qjk67", + "nmdc:dobj-11-cs5ds528", + "nmdc:dobj-11-81g47g12", + "nmdc:dobj-11-2gbw5832", + "nmdc:dobj-11-vcn8z980", + "nmdc:dobj-11-7d3pk791" + ], + "type": "nmdc:ReadBasedTaxonomyAnalysis", + "version": "v1.0.5-beta" + } \ No newline at end of file diff --git a/tests/fixtures/read_qc_analysis_record.json b/tests/fixtures/read_qc_analysis_record.json new file mode 100644 index 00000000..e1e86d3e --- /dev/null +++ b/tests/fixtures/read_qc_analysis_record.json @@ -0,0 +1,26 @@ +{ + "id": "nmdc:wfrqc-11-014wn728.1", + "name": "Read QC Activity for nmdc:omprc-11-2e3pne24", + "started_at_time": "2021-12-01T01:47:43+00:00", + "ended_at_time": "2021-12-12T03:08:24+00:00", + "was_informed_by": "nmdc:omprc-11-2e3pne24", + "execution_resource": "NERSC-Cori", + "git_url": "https://github.com/microbiomedata/ReadsQC", + "has_input": [ + "nmdc:dobj-11-w9xah552" + ], + "has_output": [ + "nmdc:dobj-11-rdwend10", + "nmdc:dobj-11-fk0d5b40" + ], + "type": "nmdc:ReadQcAnalysis", + "version": "1.0.2", + "input_read_count": 179238768, + "output_read_count": 178701256, + "input_read_bases": 27065053968, + "output_read_bases": 26698546624, + "alternative_identifiers": [ + "nmdc:wfrqc-11-014wn728.1.1", + "nmdc:wfrqc-11-014wn728.1.1.1" + ] + } \ No newline at end of file diff --git a/tests/test_models.py b/tests/test_models.py new file mode 100644 index 00000000..1c48f87a --- /dev/null +++ b/tests/test_models.py @@ -0,0 +1,24 @@ +""" Test cases for the models module. """ +from pytest import mark +from nmdc_automation.workflow_automation.models import( + WorkflowExecutionNode, + workflow_execution_factory +) +from tests.fixtures import db_utils + +def test_workflow_execution_factory(): + """ Test the workflow_execution_factory function. """ + record_types = { + "nmdc:MagsAnalysis": "mags_record.json", + "nmdc:MetagenomeAnnotation": "metagenome_annotation_record.json", + "nmdc:MetagenomeAssembly": "metagenome_assembly_record.json", + "nmdc:MetatranscriptomeAnnotation": "metatranscriptome_annotation_record.json", + "nmdc:MetatranscriptomeAssembly": "metatranscriptome_assembly_record.json", + "nmdc:MetatranscriptomeExpressionAnalysis": "metatranscriptome_expression_analysis_record.json", + "nmdc:ReadBasedTaxonomyAnalysis": "read_based_taxonomy_analysis_record.json", + "nmdc:ReadQcAnalysis": "read_qc_analysis_record.json", + } + for record_type, record_file in record_types.items(): + record = db_utils.read_json(record_file) + wfe = workflow_execution_factory(record) + assert wfe.type == record_type \ No newline at end of file From 4e6122ee61e8ff4c6cfe3432788a3fdbb0cbccda Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Wed, 25 Sep 2024 20:55:32 -0700 Subject: [PATCH 29/52] Add WorkflowProcessNode model, tests, and fixtures --- .../workflow_automation/__init__.py | 1 - .../workflow_automation/activities.py | 83 +++++++++--------- nmdc_automation/workflow_automation/models.py | 85 ++++++++++++++++--- tests/conftest.py | 5 +- tests/fixtures/data_generation_set.json | 16 ++-- .../nucleotide_sequencing_record.json | 28 ++++++ tests/test_models.py | 60 +++++++++++-- 7 files changed, 211 insertions(+), 67 deletions(-) create mode 100644 tests/fixtures/nucleotide_sequencing_record.json diff --git a/nmdc_automation/workflow_automation/__init__.py b/nmdc_automation/workflow_automation/__init__.py index eb6d68c4..e0286a3e 100644 --- a/nmdc_automation/workflow_automation/__init__.py +++ b/nmdc_automation/workflow_automation/__init__.py @@ -1,4 +1,3 @@ from .watch_nmdc import Watcher from .workflows import load_workflows, Workflow -from .activities import load_activities, Activity from .wfutils import WorkflowJob, NmdcSchema diff --git a/nmdc_automation/workflow_automation/activities.py b/nmdc_automation/workflow_automation/activities.py index 6793943d..7faaa01a 100644 --- a/nmdc_automation/workflow_automation/activities.py +++ b/nmdc_automation/workflow_automation/activities.py @@ -5,7 +5,7 @@ from semver.version import Version from nmdc_automation.workflow_automation.workflows import Workflow -from nmdc_schema.nmdc import WorkflowExecution +from nmdc_automation.workflow_automation.models import WorkflowProcessNode # TODO: Berkley refactoring: # The load_activities method will need to be modified to handle DataGeneration objects @@ -126,8 +126,7 @@ def get_workflow_executions(db, workflows: List[Workflow], data_objects: dict, a if _is_missing_required_input_output(wf, rec, data_objects): continue data_generation_ids.add(rec["id"]) - act = WorkflowExecutionNode(rec, wf) - act.was_informed_by = rec["id"] + act = WorkflowProcessNode(rec, wf) workflow_executions.add(act) for wf in dp_workflows: @@ -145,7 +144,7 @@ def get_workflow_executions(db, workflows: List[Workflow], data_objects: dict, a if _is_missing_required_input_output(wf, rec, data_objects): continue if rec["was_informed_by"] in data_generation_ids: - act = WorkflowExecutionNode(rec, wf) + act = WorkflowProcessNode(rec, wf) workflow_executions.add(act) return list(workflow_executions) @@ -316,41 +315,41 @@ def __init__(self, activity_rec: dict, wf: Workflow): def add_data_object(self, do: DataObject): self.data_objects_by_type[do.data_object_type] = do - - -class WorkflowExecutionNode(WorkflowExecution): - """ - Data class that extends the NMDC WorkflowExecution class. - The WorkflowExecutionNode class is used to represent a network of related workflow execution and - data generation events and their associated DataObject objects. - """ - - def __init__(self, record: dict, wf: Workflow): - """ - Initialize the WorkflowExecutionNode object with the given record and workflow. - The record may be for a DataGeneration or WorkflowExecution object. - In the case of a DataGeneration object, the was_informed_by field is set to the id of the DataGeneration object, - and the record is massaged to look like a WorkflowExecution object. - """ - record.pop("_id", None) - if not record.get("git_url"): - record["git_url"] = "http://github.com/microbiomedata" - if not record.get("started_at_time"): - record["started_at_time"] = record.get("add_date", "2024-01-01T00:00:00Z") - analyte_category = None - if record["type"] == "nmdc:NucleotideSequencing": - record["was_informed_by"] = record["id"] - analyte_category = record.pop("analyte_category") - record.pop("associated_studies") - record.pop("principal_investigator") - - super().__init__(**record) - self.parent = None - self.children = [] - self.data_objects_by_type = dict() - self.workflow = wf - self.analyte_category = analyte_category - - - def add_data_object(self, do: DataObject): - self.data_objects_by_type[do.data_object_type] = do \ No newline at end of file +# +# +# class WorkflowExecutionNode(WorkflowExecution): +# """ +# Data class that extends the NMDC WorkflowExecution class. +# The WorkflowExecutionNode class is used to represent a network of related workflow execution and +# data generation events and their associated DataObject objects. +# """ +# +# def __init__(self, record: dict, wf: Workflow): +# """ +# Initialize the WorkflowExecutionNode object with the given record and workflow. +# The record may be for a DataGeneration or WorkflowExecution object. +# In the case of a DataGeneration object, the was_informed_by field is set to the id of the DataGeneration object, +# and the record is massaged to look like a WorkflowExecution object. +# """ +# record.pop("_id", None) +# if not record.get("git_url"): +# record["git_url"] = "http://github.com/microbiomedata" +# if not record.get("started_at_time"): +# record["started_at_time"] = record.get("add_date", "2024-01-01T00:00:00Z") +# analyte_category = None +# if record["type"] == "nmdc:NucleotideSequencing": +# record["was_informed_by"] = record["id"] +# analyte_category = record.pop("analyte_category") +# record.pop("associated_studies") +# record.pop("principal_investigator") +# +# super().__init__(**record) +# self.parent = None +# self.children = [] +# self.data_objects_by_type = dict() +# self.workflow = wf +# self.analyte_category = analyte_category +# +# +# def add_data_object(self, do: DataObject): +# self.data_objects_by_type[do.data_object_type] = do \ No newline at end of file diff --git a/nmdc_automation/workflow_automation/models.py b/nmdc_automation/workflow_automation/models.py index 1538855f..77184bd9 100644 --- a/nmdc_automation/workflow_automation/models.py +++ b/nmdc_automation/workflow_automation/models.py @@ -4,6 +4,7 @@ from nmdc_automation.workflow_automation.workflows import Workflow from nmdc_schema.nmdc import ( + DataGeneration, WorkflowExecution, NucleotideSequencing, MagsAnalysis, @@ -12,37 +13,99 @@ MetatranscriptomeAssembly, MetatranscriptomeAnnotation, MetatranscriptomeExpressionAnalysis, + PlannedProcess, ReadBasedTaxonomyAnalysis, ReadQcAnalysis, ) -workflow_types = { - "nmdc:NucleotideSequencing": NucleotideSequencing, +process_types = { "nmdc:MagsAnalysis": MagsAnalysis, "nmdc:MetagenomeAnnotation": MetagenomeAnnotation, "nmdc:MetagenomeAssembly": MetagenomeAssembly, "nmdc:MetatranscriptomeAnnotation": MetatranscriptomeAnnotation, "nmdc:MetatranscriptomeAssembly": MetatranscriptomeAssembly, "nmdc:MetatranscriptomeExpressionAnalysis": MetatranscriptomeExpressionAnalysis, + "nmdc:NucleotideSequencing": NucleotideSequencing, "nmdc:ReadBasedTaxonomyAnalysis": ReadBasedTaxonomyAnalysis, "nmdc:ReadQcAnalysis": ReadQcAnalysis, } - -def workflow_execution_factory(record: Dict[str, Any]) -> WorkflowExecution: +def workflow_process_factory(record: Dict[str, Any]) -> PlannedProcess: """ - Factory function to create a WorkflowExecution object from a record. + Factory function to create a PlannedProcess subclass object from a record. + Subclasses are determined by the "type" field in the record, and can be + either a WorkflowExecution or DataGeneration object. """ record.pop("_id", None) try: - cls = workflow_types[record["type"]] + cls = process_types[record["type"]] except KeyError: raise ValueError(f"Invalid workflow execution type: {record['type']}") return cls(**record) - -class WorkflowExecutionNode(object): +class WorkflowProcessNode(object): """ - Class to represent a workflow execution node. - Represents a node in a workflow execution graph of data generation and workflow execution nodes, - and their associated data objects. + Class to represent a workflow execution node. This is a node in a tree + structure that represents the execution hierarchy of data generation and + workflow execution objects with their associated data objects. """ + def __init__(self, record: Dict[str, Any], workflow: Workflow): + self.parent = None + self.children = [] + self.data_objects_by_type = {} + self.workflow = workflow + process = workflow_process_factory(record) + self.process = process + + def __hash__(self): + return hash((self.id, self.type)) + + def __eq__(self, other): + return self.id == other.id and self.type == other.type + + def add_data_object(self, data_object): + self.data_objects_by_type[data_object.data_object_type] = data_object + + @property + def id(self): + return self.process.id + + @property + def type(self): + return self.process.type + + @property + def name(self): + return self.process.name + + @property + def has_input(self): + return self.process.has_input + + @property + def has_output(self): + return self.process.has_output + + @property + def git_url(self): + """ workflow executions have a git_url field, data generations do not""" + default_url = "http://github.com/microbiomedata" + return getattr(self.process, "git_url", default_url) + + @property + def version(self): + """ workflow executions have a version field, data generations do not""" + return getattr(self.process, "version", None) + + @property + def analyte_category(self): + """ data generations have an analyte_category field, workflow executions do not""" + return getattr(self.process, "analyte_category", None) + + @property + def was_informed_by(self): + """ workflow executions have a was_informed_by field, data generations get set to their own id""" + return getattr(self.process, "was_informed_by", self.id) + + + + diff --git a/tests/conftest.py b/tests/conftest.py index d3e854f4..fed118d2 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -4,8 +4,11 @@ from pathlib import Path from pytest import fixture from time import time +from yaml import load from nmdc_automation.config import Config +from nmdc_automation.workflow_automation.workflows import Workflow + @fixture @@ -61,4 +64,4 @@ def site_config(base_test_dir): @fixture(scope="session") def job_config(site_config): - return Config(site_config) \ No newline at end of file + return Config(site_config) diff --git a/tests/fixtures/data_generation_set.json b/tests/fixtures/data_generation_set.json index 40996bc7..4aa68d06 100644 --- a/tests/fixtures/data_generation_set.json +++ b/tests/fixtures/data_generation_set.json @@ -13,11 +13,12 @@ "associated_studies" : [ "nmdc:sty-11-test001" ], - "execution_resource": "NERSC-Cori", + "processing_institution": "JGI", "principal_investigator" : { "has_raw_value" : "PI Name", "email" : "pi_name@example.com", - "name" : "PI Name" + "name" : "PI Name", + "type": "nmdc:PersonValue" }, "type" : "nmdc:NucleotideSequencing" }, @@ -38,10 +39,13 @@ "mod_date" : "2021-06-18", "ncbi_project_name" : "NCBI Project Name", "analyte_category": "metatranscriptome", - "execution_resource": "NERSC-Cori", - "principal_investigator" : { - "has_raw_value" : "Another PI Name" - }, + "processing_institution": "JGI", + "principal_investigator": { + "has_raw_value": "Investigator Name", + "email": "test@example.org", + "name": "Investigator Name", + "type": "nmdc:PersonValue" + }, "type" : "nmdc:NucleotideSequencing", "gold_sequencing_project_identifiers" : [ "gold:Gp0324008" diff --git a/tests/fixtures/nucleotide_sequencing_record.json b/tests/fixtures/nucleotide_sequencing_record.json new file mode 100644 index 00000000..e4f2a433 --- /dev/null +++ b/tests/fixtures/nucleotide_sequencing_record.json @@ -0,0 +1,28 @@ +{ + "id": "nmdc:omprc-11-0011q207", + "name": "Root microbial communities from poplar common garden site in Clatskanie, Oregon, USA - BESC-847-CL1_28_5 endosphere", + "has_input": [ + "nmdc:bsm-11-ta8dt754" + ], + "add_date": "2021-08-20T00:00:00", + "mod_date": "2021-08-20T00:00:00", + "ncbi_project_name": "Root microbial communities from poplar common garden site in Clatskanie, Oregon, USA - BESC-847-CL1_28_5 endosphere", + "principal_investigator": { + "has_raw_value": "Mitchel Doktycz", + "email": "doktyczmj@ornl.gov", + "name": "Mitchel Doktycz", + "type": "nmdc:PersonValue" + }, + "processing_institution": "JGI", + "type": "nmdc:NucleotideSequencing", + "gold_sequencing_project_identifiers": [ + "gold:Gp0587799" + ], + "analyte_category": "metagenome", + "associated_studies": [ + "nmdc:sty-11-r2h77870" + ], + "instrument_used": [ + "nmdc:inst-14-mr4r2w09" + ] + } \ No newline at end of file diff --git a/tests/test_models.py b/tests/test_models.py index 1c48f87a..a9597b95 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -1,13 +1,15 @@ """ Test cases for the models module. """ +from bson import ObjectId from pytest import mark from nmdc_automation.workflow_automation.models import( - WorkflowExecutionNode, - workflow_execution_factory + WorkflowProcessNode, + workflow_process_factory, ) +from nmdc_automation.workflow_automation.workflows import load_workflows from tests.fixtures import db_utils -def test_workflow_execution_factory(): - """ Test the workflow_execution_factory function. """ +def test_workflow_process_factory(): + """ Test the workflow_process_factory function. """ record_types = { "nmdc:MagsAnalysis": "mags_record.json", "nmdc:MetagenomeAnnotation": "metagenome_annotation_record.json", @@ -15,10 +17,56 @@ def test_workflow_execution_factory(): "nmdc:MetatranscriptomeAnnotation": "metatranscriptome_annotation_record.json", "nmdc:MetatranscriptomeAssembly": "metatranscriptome_assembly_record.json", "nmdc:MetatranscriptomeExpressionAnalysis": "metatranscriptome_expression_analysis_record.json", + "nmdc:NucleotideSequencing": "nucleotide_sequencing_record.json", "nmdc:ReadBasedTaxonomyAnalysis": "read_based_taxonomy_analysis_record.json", "nmdc:ReadQcAnalysis": "read_qc_analysis_record.json", } for record_type, record_file in record_types.items(): record = db_utils.read_json(record_file) - wfe = workflow_execution_factory(record) - assert wfe.type == record_type \ No newline at end of file + wfe = workflow_process_factory(record) + assert wfe.type == record_type + + +def test_process_factory_with_db_record(): + record = {'_id': ObjectId('66f4d5f10de8ad0b72100069'), 'id': 'nmdc:omprc-11-metag1', + 'name': 'Test Metagenome Processing', 'has_input': ['nmdc:bsm-11-qezc0h51'], + 'has_output': ['nmdc:dobj-11-rawreads1', 'nmdc:dobj-11-rawreads2'], 'analyte_category': 'metagenome', + 'associated_studies': ['nmdc:sty-11-test001'], "processing_institution": "JGI", + 'principal_investigator': {'has_raw_value': 'PI Name', 'email': 'pi_name@example.com', + 'name': 'PI Name', "type": "nmdc:PersonValue"}, + 'type': 'nmdc:NucleotideSequencing'} + wfe = workflow_process_factory(record) + assert wfe.type == "nmdc:NucleotideSequencing" + +@mark.parametrize("record_file, record_type", [ + ("mags_record.json", "nmdc:MagsAnalysis"), + ("metagenome_annotation_record.json", "nmdc:MetagenomeAnnotation"), + ("metagenome_assembly_record.json", "nmdc:MetagenomeAssembly"), + ("metatranscriptome_annotation_record.json", "nmdc:MetatranscriptomeAnnotation"), + ("metatranscriptome_assembly_record.json", "nmdc:MetatranscriptomeAssembly"), + ("metatranscriptome_expression_analysis_record.json", "nmdc:MetatranscriptomeExpressionAnalysis"), + ("nucleotide_sequencing_record.json", "nmdc:NucleotideSequencing"), + ("read_based_taxonomy_analysis_record.json", "nmdc:ReadBasedTaxonomyAnalysis"), + ("read_qc_analysis_record.json", "nmdc:ReadQcAnalysis"), +]) +def test_workflow_process_node(workflows_config_dir,record_file, record_type): + """ Test the WorkflowProcessNode class. """ + # load all workflows for both metagenome and metatranscriptome + wfs = load_workflows(workflows_config_dir / "workflows.yaml") + wfs += load_workflows(workflows_config_dir / "workflows-mt.yaml") + + # NuclotideSequencing workflows have no type + if record_type == "nmdc:NucleotideSequencing": + wfs_for_type = [wf for wf in wfs if wf.collection == "data_generation_set"] + else: + wfs_for_type = [wf for wf in wfs if wf.type == record_type] + assert wfs_for_type + wf = wfs_for_type[0] + + record = db_utils.read_json(record_file) + + wfn = WorkflowProcessNode(record, wf) + assert wfn.process.type == record_type + + + From 8248ed43f4d1b6e891d5ec48e532f94d7b7932c8 Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Wed, 25 Sep 2024 21:28:24 -0700 Subject: [PATCH 30/52] Update test fixtures to conform to Berkley schema standards --- tests/fixtures/metagenome_assembly.json | 25 ------------- .../metatranscriptome_annotation.json | 5 +-- .../fixtures/metatranscriptome_assembly.json | 36 +++---------------- ...metatranscriptome_expression_analysis.json | 3 -- 4 files changed, 5 insertions(+), 64 deletions(-) diff --git a/tests/fixtures/metagenome_assembly.json b/tests/fixtures/metagenome_assembly.json index 6f617a12..1b15831d 100644 --- a/tests/fixtures/metagenome_assembly.json +++ b/tests/fixtures/metagenome_assembly.json @@ -3,14 +3,6 @@ "has_input": [ "nmdc:dobj-11-filteredreads" ], - "scaf_N50": 302542, - "ctg_logsum": 5909271, - "ctg_N90": 1315235, - "gc_avg": 0.60257, - "scaf_N90": 1312362, - "scaf_logsum": 5934400, - "scaf_pct_gt50K": 1.7355337, - "gap_pct": 0.00334, "git_url": "https://github.com/microbiomedata/metaAssembly", "version": "v1.0.3", "has_output": [ @@ -20,29 +12,12 @@ "nmdc:dobj-11-assemblyagp", "nmdc:dobj-11-scaffolds" ], - "asm_score": 11.297, "was_informed_by": "nmdc:omprc-11-metag1", - "ctg_powsum": 727370, - "scaf_max": 517431, "id": "nmdc:wfmgas-11-test001.1", - "scaf_powsum": 730816, "execution_resource": "NERSC-Cori", - "contigs": 1705758, - "scaf_n_gt50K": 216, - "ctg_N50": 304732, "name": "Assembly Activity for nmdc:mga0vx38", - "ctg_max": 517431, - "gc_std": 0.06928, - "contig_bp": 1168572354, - "ctg_L50": 785, - "scaf_l_gt50K": 20281644, - "scaf_L90": 322, "started_at_time": "2021-08-05T14:48:51+00:00", - "ctg_L90": 322, - "scaf_bp": 1168611354, "type": "nmdc:MetagenomeAssembly", - "scaf_L50": 789, - "scaffolds": 1702137, "ended_at_time": "2021-09-15T10:13:20+00:00" } ] diff --git a/tests/fixtures/metatranscriptome_annotation.json b/tests/fixtures/metatranscriptome_annotation.json index 4488d185..11d09296 100644 --- a/tests/fixtures/metatranscriptome_annotation.json +++ b/tests/fixtures/metatranscriptome_annotation.json @@ -3,9 +3,6 @@ "has_input": [ "nmdc:dobj-11-contigst1" ], - "part_of": [ - "nmdc:omprc-11-metat1" - ], "git_url": "https://github.com/microbiomedata/mg_annotation", "version": "v1.1.0", "has_output": [ @@ -39,7 +36,7 @@ "execution_resource": "NERSC-Cori", "name": "Annotation Activity for nmdc:omprc-11-metat1", "started_at_time": "2021-08-05T14:48:51+00:00", - "type": "nmdc:MetatranscriptomeAnnotationActivity", + "type": "nmdc:MetatranscriptomeAnnotation", "ended_at_time": "2021-09-15T10:13:20+00:00" } ] \ No newline at end of file diff --git a/tests/fixtures/metatranscriptome_assembly.json b/tests/fixtures/metatranscriptome_assembly.json index a0943f0d..71c07c16 100644 --- a/tests/fixtures/metatranscriptome_assembly.json +++ b/tests/fixtures/metatranscriptome_assembly.json @@ -1,21 +1,14 @@ [ { + "id": "nmdc:wfmtas-11-test001.1", + "name": "Assembly Activity for metaT", "has_input": [ "nmdc:dobj-11-filteredreads1" ], - "part_of": [ - "nmdc:omprc-11-metat1" - ], - "scaf_N50": 302542, - "ctg_logsum": 5909271, - "ctg_N90": 1315235, - "gc_avg": 0.60257, - "scaf_N90": 1312362, - "scaf_logsum": 5934400, - "scaf_pct_gt50K": 1.7355337, - "gap_pct": 0.00334, "git_url": "https://github.com/microbiomedata/metaT_Assembly", "version": "v0.0.1", + "execution_resource": "NERSC-Cori", + "was_informed_by": "nmdc:omprc-11-metat1", "has_output": [ "nmdc:dobj-11-contigst1", "nmdc:dobj-11-coverstatst1", @@ -23,29 +16,8 @@ "nmdc:dobj-11-assemblyinfot1", "nmdc:dobj-11-bamidxt1" ], - "asm_score": 11.297, - "was_informed_by": "nmdc:omprc-11-metat1", - "ctg_powsum": 727370, - "scaf_max": 517431, - "id": "nmdc:wfmtas-11-test001.1", - "scaf_powsum": 730816, - "execution_resource": "NERSC-Cori", - "contigs": 1705758, - "scaf_n_gt50K": 216, - "ctg_N50": 304732, - "name": "Assembly Activity for metaT", - "ctg_max": 517431, - "gc_std": 0.06928, - "contig_bp": 1168572354, - "ctg_L50": 785, - "scaf_l_gt50K": 20281644, - "scaf_L90": 322, "started_at_time": "2021-08-05T14:48:51+00:00", - "ctg_L90": 322, - "scaf_bp": 1168611354, "type": "nmdc:MetatranscriptomeAssembly", - "scaf_L50": 789, - "scaffolds": 1702137, "ended_at_time": "2021-09-15T10:13:20+00:00" } ] \ No newline at end of file diff --git a/tests/fixtures/metatranscriptome_expression_analysis.json b/tests/fixtures/metatranscriptome_expression_analysis.json index 486efce7..b70b1f86 100644 --- a/tests/fixtures/metatranscriptome_expression_analysis.json +++ b/tests/fixtures/metatranscriptome_expression_analysis.json @@ -17,9 +17,6 @@ "nmdc:dobj-11-expcountst1", "nmdc:dobj-11-expinfot1" ], - "part_of": [ - "nmdc:omprc-11-metat1" - ], "version": "v1.0.8" } ] \ No newline at end of file From 77cbc4910d202521e9099eb10b6aeec47a45d18b Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Wed, 25 Sep 2024 21:48:17 -0700 Subject: [PATCH 31/52] Refactor to remove Activity class --- .../workflow_automation/activities.py | 80 +++---------------- nmdc_automation/workflow_automation/sched.py | 31 +++---- tests/test_activities.py | 8 +- 3 files changed, 29 insertions(+), 90 deletions(-) diff --git a/nmdc_automation/workflow_automation/activities.py b/nmdc_automation/workflow_automation/activities.py index 7faaa01a..bd0a91be 100644 --- a/nmdc_automation/workflow_automation/activities.py +++ b/nmdc_automation/workflow_automation/activities.py @@ -91,7 +91,8 @@ def _is_missing_required_input_output(wf, rec, data_objs): return not (match_in and match_out) -def get_workflow_executions(db, workflows: List[Workflow], data_objects: dict, allowlist: Optional[set] = None): +def get_current_workflow_process_nodes( + db, workflows: List[Workflow], data_objects: dict, allowlist: list = None) -> List[WorkflowProcessNode]: """ Fetch the relevant workflow executions from the database for the given workflows. 1. Get the Data Generation (formerly Omics Processing) objects for the workflows by analyte category. @@ -245,17 +246,15 @@ def _find_data_object_activities(activities, data_objs_by_id): return data_obj_act -# TODO: Give a better name, add unit tests. -# This function builds up the graph of related parent / child Execution objects and is -# key to the behavior of workflow automation. -def load_activities(db, workflows: list[Workflow], allowlist: set = set()): + +def load_workflow_process_nodes(db, workflows: list[Workflow], allowlist: list[str] = None) -> List[WorkflowProcessNode]: """ This reads the activities from Mongo. It also finds the parent and child relationships between the activities using the has_output and has_input to connect things. - Finally it creates a map of data objects by type + Finally, it creates a map of data objects by type for each activity. Inputs: @@ -269,14 +268,14 @@ def load_activities(db, workflows: list[Workflow], allowlist: set = set()): # Build up a set of relevant activities and a map from # the output objects to the activity that generated them. - workflow_executions = get_workflow_executions(db, workflows, data_objs_by_id, allowlist) + wfp_nodes = get_current_workflow_process_nodes(db, workflows, data_objs_by_id, allowlist) - data_obj_act = _find_data_object_activities(workflow_executions, data_objs_by_id) + data_obj_act = _find_data_object_activities(wfp_nodes, data_objs_by_id) # Now populate the parent and children values for the # activities - _resolve_relationships(workflow_executions, data_obj_act) - return workflow_executions + wfp_nodes = _resolve_relationships(wfp_nodes, data_obj_act) + return wfp_nodes # TODO: Why are we not importing and using the existing nmdc_schema.DataObject class? @@ -292,64 +291,3 @@ class DataObject(object): def __init__(self, rec: dict): for f in self._FIELDS: setattr(self, f, rec.get(f)) - - -# TODO: Give a better 'Execution' based name, expand docstring, and make sure it is covered by unit tests. -# This class represents a network of related WorkflowExecution objects and their associated DataObject objects. -class Activity(object): - """ - Activity Object Class - """ - - _FIELDS = ["id", "name", "git_url", "version", "has_input", "has_output", "was_informed_by", "type", ] - - def __init__(self, activity_rec: dict, wf: Workflow): - self.parent = None - self.children = [] - self.data_objects_by_type = dict() - self.workflow = wf - for f in self._FIELDS: - setattr(self, f, activity_rec.get(f)) - if self.type == "nmdc:NucleotideSequencing": - self.was_informed_by = self.id - - def add_data_object(self, do: DataObject): - self.data_objects_by_type[do.data_object_type] = do -# -# -# class WorkflowExecutionNode(WorkflowExecution): -# """ -# Data class that extends the NMDC WorkflowExecution class. -# The WorkflowExecutionNode class is used to represent a network of related workflow execution and -# data generation events and their associated DataObject objects. -# """ -# -# def __init__(self, record: dict, wf: Workflow): -# """ -# Initialize the WorkflowExecutionNode object with the given record and workflow. -# The record may be for a DataGeneration or WorkflowExecution object. -# In the case of a DataGeneration object, the was_informed_by field is set to the id of the DataGeneration object, -# and the record is massaged to look like a WorkflowExecution object. -# """ -# record.pop("_id", None) -# if not record.get("git_url"): -# record["git_url"] = "http://github.com/microbiomedata" -# if not record.get("started_at_time"): -# record["started_at_time"] = record.get("add_date", "2024-01-01T00:00:00Z") -# analyte_category = None -# if record["type"] == "nmdc:NucleotideSequencing": -# record["was_informed_by"] = record["id"] -# analyte_category = record.pop("analyte_category") -# record.pop("associated_studies") -# record.pop("principal_investigator") -# -# super().__init__(**record) -# self.parent = None -# self.children = [] -# self.data_objects_by_type = dict() -# self.workflow = wf -# self.analyte_category = analyte_category -# -# -# def add_data_object(self, do: DataObject): -# self.data_objects_by_type[do.data_object_type] = do \ No newline at end of file diff --git a/nmdc_automation/workflow_automation/sched.py b/nmdc_automation/workflow_automation/sched.py index 3e6f5c27..bd36bb06 100644 --- a/nmdc_automation/workflow_automation/sched.py +++ b/nmdc_automation/workflow_automation/sched.py @@ -9,7 +9,8 @@ from functools import lru_cache from pymongo import MongoClient from pymongo.database import Database as MongoDatabase -from nmdc_automation.workflow_automation.activities import load_activities, Activity +from nmdc_automation.workflow_automation.activities import load_workflow_process_nodes +from nmdc_automation.workflow_automation.models import WorkflowProcessNode from semver.version import Version @@ -74,7 +75,7 @@ class Job: Class to hold information for new jobs """ - def __init__(self, workflow: Workflow, trigger_act: Activity): + def __init__(self, workflow: Workflow, trigger_act: WorkflowProcessNode): self.workflow = workflow self.trigger_act = trigger_act self.informed_by = trigger_act.was_informed_by @@ -249,7 +250,7 @@ def get_existing_jobs(self, wf: Workflow): return existing_jobs # TODO: Rename this to reflect what it does and add unit tests - def find_new_jobs(self, act: Activity) -> list[Job]: + def find_new_jobs(self, wfp_node: WorkflowProcessNode) -> list[Job]: """ For a given activity see if there are any new jobs that should be created. @@ -257,25 +258,25 @@ def find_new_jobs(self, act: Activity) -> list[Job]: new_jobs = [] # Loop over the derived workflows for this # activities' workflow - for wf in act.workflow.children: + for wf in wfp_node.workflow.children: # Ignore disabled workflows if not wf.enabled: continue # See if we already have a job for this existing_jobs = self.get_existing_jobs(wf) - if act.id in self.get_existing_jobs(wf): + if wfp_node.id in self.get_existing_jobs(wf): continue # Look at previously generated derived # activities to see if this is already done. - for child_act in act.children: + for child_act in wfp_node.children: if within_range(child_act.workflow, wf, force=self.force): break else: # These means no existing activities were # found that matched this workflow, so we # add a job - logging.debug(f"Creating a job {wf.name}:{wf.version} for {act.id}") - new_jobs.append(Job(wf, act)) + logging.debug(f"Creating a job {wf.name}:{wf.version} for {wfp_node.id}") + new_jobs.append(Job(wf, wfp_node)) return new_jobs @@ -289,18 +290,18 @@ def cycle(self, dryrun: bool = False, skiplist: set = set(), filt = {"was_informed_by": {"$in": list(allowlist)}} # TODO: Quite a lot happens under the hood here. This function should be broken down into smaller # functions to improve readability and maintainability. - acts = load_activities(self.db, self.workflows, allowlist) + wfp_nodes = load_workflow_process_nodes(self.db, self.workflows, allowlist) self.get_existing_jobs.cache_clear() job_recs = [] - for act in acts: - if act.was_informed_by in skiplist: - logging.debug(f"Skipping: {act.was_informed_by}") + for wfp_node in wfp_nodes: + if wfp_node.was_informed_by in skiplist: + logging.debug(f"Skipping: {wfp_node.was_informed_by}") continue - if not act.workflow.enabled: - logging.debug(f"Skipping: {act.id}, workflow disabled.") + if not wfp_node.workflow.enabled: + logging.debug(f"Skipping: {wfp_node.id}, workflow disabled.") continue - jobs = self.find_new_jobs(act) + jobs = self.find_new_jobs(wfp_node) for job in jobs: if dryrun: msg = f"new job: informed_by: {job.informed_by} trigger: {job.trigger_id} " diff --git a/tests/test_activities.py b/tests/test_activities.py index df559a2d..a690198c 100644 --- a/tests/test_activities.py +++ b/tests/test_activities.py @@ -1,7 +1,7 @@ from pytest import mark -from nmdc_automation.workflow_automation.activities import (get_required_data_objects_map, get_workflow_executions, - load_activities) +from nmdc_automation.workflow_automation.activities import (get_required_data_objects_map, get_current_workflow_process_nodes, + load_workflow_process_nodes) from nmdc_automation.workflow_automation.workflows import load_workflows from tests.fixtures.db_utils import get_updated_fixture, load_fixture, reset_db @@ -26,11 +26,11 @@ def test_load_activies(test_db, workflow_file, workflows_config_dir): # these are called by load_activities data_objs_by_id = get_required_data_objects_map(test_db, wfs) - wf_execs = get_workflow_executions(test_db, wfs, data_objs_by_id) + wf_execs = get_current_workflow_process_nodes(test_db, wfs, data_objs_by_id) assert wf_execs assert len(wf_execs) == 2 - acts = load_activities(test_db, wfs) + acts = load_workflow_process_nodes(test_db, wfs) # sanity check assert acts assert len(acts) == 2 From be22cb5c7dff6f098ea9bb88f58302fbd3b9c9d6 Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Wed, 25 Sep 2024 23:40:49 -0700 Subject: [PATCH 32/52] Refactor to use nmdc_schema data object --- .../workflow_automation/activities.py | 27 +------- nmdc_automation/workflow_automation/models.py | 64 +++++++++++++++---- nmdc_automation/workflow_automation/sched.py | 15 +++-- tests/test_activities.py | 2 +- tests/test_models.py | 29 +++++++++ 5 files changed, 91 insertions(+), 46 deletions(-) diff --git a/nmdc_automation/workflow_automation/activities.py b/nmdc_automation/workflow_automation/activities.py index bd0a91be..6cf2e3ff 100644 --- a/nmdc_automation/workflow_automation/activities.py +++ b/nmdc_automation/workflow_automation/activities.py @@ -5,16 +5,7 @@ from semver.version import Version from nmdc_automation.workflow_automation.workflows import Workflow -from nmdc_automation.workflow_automation.models import WorkflowProcessNode - -# TODO: Berkley refactoring: -# The load_activities method will need to be modified to handle DataGeneration objects -# instead of OmicsProcessing objects, with the difference being the DataGeneration objects can be part_of other -# DataGeneration objects. This will require a change in the way the parent/child relationships are resolved. -# Need to add logic to find the correct parent DataGeneration to use for constructing the Activity graph and -# correctly setting the was_informed_by field. -# Add unit tests to cover the new behavior, mocking the MongoDB database and the Berkley style DataGeneration objects. -# DataGeneration is an abstract class, include specific tests for subclasses NucleotideSequencing or MassSpectrometry +from nmdc_automation.workflow_automation.models import WorkflowProcessNode, DataObject warned_objects = set() @@ -35,7 +26,7 @@ def get_required_data_objects_map(db, workflows: List[Workflow]) -> dict: required_data_objs_by_id = dict() for rec in db.data_object_set.find(): - do = DataObject(rec) + do = DataObject(**rec) if do.data_object_type not in required_types: continue required_data_objs_by_id[do.id] = do @@ -277,17 +268,3 @@ def load_workflow_process_nodes(db, workflows: list[Workflow], allowlist: list[s wfp_nodes = _resolve_relationships(wfp_nodes, data_obj_act) return wfp_nodes - -# TODO: Why are we not importing and using the existing nmdc_schema.DataObject class? -# nmdc_schema.DataObject is stricter and using it currently causes tests / fixtures to fail. -# We should fix the tests and fixtures to use the stricter class and remove this class. -class DataObject(object): - """ - Data Object Class - """ - - _FIELDS = ["id", "name", "description", "url", "md5_checksum", "file_size_bytes", "data_object_type", ] - - def __init__(self, rec: dict): - for f in self._FIELDS: - setattr(self, f, rec.get(f)) diff --git a/nmdc_automation/workflow_automation/models.py b/nmdc_automation/workflow_automation/models.py index 77184bd9..597c7ce7 100644 --- a/nmdc_automation/workflow_automation/models.py +++ b/nmdc_automation/workflow_automation/models.py @@ -4,8 +4,7 @@ from nmdc_automation.workflow_automation.workflows import Workflow from nmdc_schema.nmdc import ( - DataGeneration, - WorkflowExecution, + FileTypeEnum, NucleotideSequencing, MagsAnalysis, MetagenomeAssembly, @@ -17,23 +16,26 @@ ReadBasedTaxonomyAnalysis, ReadQcAnalysis, ) -process_types = { - "nmdc:MagsAnalysis": MagsAnalysis, - "nmdc:MetagenomeAnnotation": MetagenomeAnnotation, - "nmdc:MetagenomeAssembly": MetagenomeAssembly, - "nmdc:MetatranscriptomeAnnotation": MetatranscriptomeAnnotation, - "nmdc:MetatranscriptomeAssembly": MetatranscriptomeAssembly, - "nmdc:MetatranscriptomeExpressionAnalysis": MetatranscriptomeExpressionAnalysis, - "nmdc:NucleotideSequencing": NucleotideSequencing, - "nmdc:ReadBasedTaxonomyAnalysis": ReadBasedTaxonomyAnalysis, - "nmdc:ReadQcAnalysis": ReadQcAnalysis, -} +from nmdc_schema import nmdc + + def workflow_process_factory(record: Dict[str, Any]) -> PlannedProcess: """ Factory function to create a PlannedProcess subclass object from a record. Subclasses are determined by the "type" field in the record, and can be either a WorkflowExecution or DataGeneration object. """ + process_types = { + "nmdc:MagsAnalysis": MagsAnalysis, + "nmdc:MetagenomeAnnotation": MetagenomeAnnotation, + "nmdc:MetagenomeAssembly": MetagenomeAssembly, + "nmdc:MetatranscriptomeAnnotation": MetatranscriptomeAnnotation, + "nmdc:MetatranscriptomeAssembly": MetatranscriptomeAssembly, + "nmdc:MetatranscriptomeExpressionAnalysis": MetatranscriptomeExpressionAnalysis, + "nmdc:NucleotideSequencing": NucleotideSequencing, + "nmdc:ReadBasedTaxonomyAnalysis": ReadBasedTaxonomyAnalysis, + "nmdc:ReadQcAnalysis": ReadQcAnalysis, + } record.pop("_id", None) try: cls = process_types[record["type"]] @@ -107,5 +109,41 @@ def was_informed_by(self): return getattr(self.process, "was_informed_by", self.id) +class DataObject(nmdc.DataObject): + """ + Class to represent a data object. + - Overrides the data_object_type property to return the type as a string + """ + def __init__(self, **record): + record.pop("_id", None) + super().__init__(**record) + + def as_dict(self): + """ Return the object as a dictionary, excluding None values, empty lists, and data_object_type as a string """ + return_dict = {} + for key, value in self.__dict__.items(): + if key == "_data_object_type": + return_dict['data_object_type'] = self.data_object_type + continue + if key.startswith("_"): + continue + if value: + return_dict[key] = value + return return_dict + + @property + def data_object_type(self): + """ Return the data object type as a string """ + if isinstance(self._data_object_type, FileTypeEnum): + return self._data_object_type.code.text + return str(self._data_object_type) + + @data_object_type.setter + def data_object_type(self, value): + """ Set the data object type from a string or FileTypeEnum """ + if isinstance(value, FileTypeEnum): + self._data_object_type = value + else: + self._data_object_type = FileTypeEnum(value) diff --git a/nmdc_automation/workflow_automation/sched.py b/nmdc_automation/workflow_automation/sched.py index bd36bb06..de0fb408 100644 --- a/nmdc_automation/workflow_automation/sched.py +++ b/nmdc_automation/workflow_automation/sched.py @@ -105,7 +105,7 @@ async def run(self): await asyncio.sleep(_POLL_INTERVAL) # TODO: - def add_job_rec(self, job: Job): + def create_job_rec(self, job: Job): """ This takes a job and using the workflow definition, resolves all the information needed to create a @@ -115,11 +115,11 @@ def add_job_rec(self, job: Job): next_act = job.trigger_act do_by_type = dict() while next_act: - for do_type, val in next_act.data_objects_by_type.items(): + for do_type, data_object in next_act.data_objects_by_type.items(): if do_type in do_by_type: - logging.debug(f"Ignoring Duplicate type: {do_type} {val.id} {next_act.id}") + logging.debug(f"Ignoring Duplicate type: {do_type} {data_object.id} {next_act.id}") continue - do_by_type[do_type] = val.__dict__ + do_by_type[do_type] = data_object # do_by_type.update(next_act.data_objects_by_type.__dict__) next_act = next_act.parent @@ -137,7 +137,7 @@ def add_job_rec(self, job: Job): if k in optional_inputs: continue raise ValueError(f"Unable to find {do_type} in {do_by_type}") - inp_objects.append(dobj) + inp_objects.append(dobj.as_dict()) v = dobj["url"] # TODO: Make this smarter elif v == "{was_informed_by}": @@ -180,7 +180,7 @@ def add_job_rec(self, job: Job): "config": job_config, "claims": [], } - self.db.jobs.insert_one(jr) + logging.info(f'JOB RECORD: {jr["id"]}') # This would make the job record # print(json.dumps(ji, indent=2)) @@ -309,7 +309,8 @@ def cycle(self, dryrun: bool = False, skiplist: set = set(), logging.info(msg) continue try: - jr = self.add_job_rec(job) + jr = self.create_job_rec(job) + self.db.jobs.insert_one(jr) if jr: job_recs.append(jr) except Exception as ex: diff --git a/tests/test_activities.py b/tests/test_activities.py index a690198c..30201d61 100644 --- a/tests/test_activities.py +++ b/tests/test_activities.py @@ -3,7 +3,7 @@ from nmdc_automation.workflow_automation.activities import (get_required_data_objects_map, get_current_workflow_process_nodes, load_workflow_process_nodes) from nmdc_automation.workflow_automation.workflows import load_workflows -from tests.fixtures.db_utils import get_updated_fixture, load_fixture, reset_db +from tests.fixtures.db_utils import load_fixture, reset_db @mark.parametrize( diff --git a/tests/test_models.py b/tests/test_models.py index a9597b95..fa1cf638 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -2,6 +2,7 @@ from bson import ObjectId from pytest import mark from nmdc_automation.workflow_automation.models import( + DataObject, WorkflowProcessNode, workflow_process_factory, ) @@ -69,4 +70,32 @@ def test_workflow_process_node(workflows_config_dir,record_file, record_type): assert wfn.process.type == record_type +def test_data_object_creation_from_records(): + """ Test the creation of DataObject objects from records. """ + records = db_utils.read_json("data_object_set.json") + for record in records: + data_obj = DataObject(**record) + assert data_obj.type == "nmdc:DataObject" + assert data_obj.id == record["id"] + assert data_obj.name == record["name"] + assert data_obj.data_object_type == record["data_object_type"] + data_obj_dict = data_obj.as_dict() + assert data_obj_dict == record + +def test_data_object_creation_from_db_records(test_db): + db_utils.reset_db(test_db) + db_utils.read_json("data_object_set.json") + + db_records = test_db["data_object_set"].find() + db_records = list(db_records) + for db_record in db_records: + data_obj = DataObject(**db_record) + assert data_obj.type == "nmdc:DataObject" + assert data_obj.id == db_record["id"] + assert data_obj.name == db_record["name"] + assert data_obj.data_object_type == db_record["data_object_type"] + assert data_obj.data_object_format == db_record["data_object_format"] + + data_obj_dict = data_obj.as_dict() + assert data_obj_dict == db_record From 87c13152a4f93f3471ad6659ac8a39da65015d8b Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Thu, 26 Sep 2024 11:58:52 -0700 Subject: [PATCH 33/52] Clean up Data)bject.as_dict --- nmdc_automation/workflow_automation/models.py | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/nmdc_automation/workflow_automation/models.py b/nmdc_automation/workflow_automation/models.py index 597c7ce7..8e7d95a9 100644 --- a/nmdc_automation/workflow_automation/models.py +++ b/nmdc_automation/workflow_automation/models.py @@ -111,25 +111,21 @@ def was_informed_by(self): class DataObject(nmdc.DataObject): """ - Class to represent a data object. - - Overrides the data_object_type property to return the type as a string + Extends the NMDC DataObject dataclass with additional methods for serialization. """ def __init__(self, **record): + """ Initialize the object from a dictionary """ + # _id is a MongoDB field that makes the parent class fail to initialize record.pop("_id", None) super().__init__(**record) def as_dict(self): """ Return the object as a dictionary, excluding None values, empty lists, and data_object_type as a string """ - return_dict = {} - for key, value in self.__dict__.items(): - if key == "_data_object_type": - return_dict['data_object_type'] = self.data_object_type - continue - if key.startswith("_"): - continue - if value: - return_dict[key] = value - return return_dict + return { + key: value + for key, value in self.__dict__.items() + if not key.startswith("_") and value + } | {"data_object_type": self.data_object_type} @property def data_object_type(self): From 50d4fb54a79032c0b611d27fd5105bb75b809180 Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Thu, 26 Sep 2024 14:59:00 -0700 Subject: [PATCH 34/52] Refactor workflows.Workflow to models.WorkflowConfig Refactor to a dataclass and uipdate tests and usages --- .../workflow_automation/__init__.py | 2 +- .../workflow_automation/activities.py | 49 ++++++------ nmdc_automation/workflow_automation/models.py | 60 +++++++++++++- nmdc_automation/workflow_automation/sched.py | 18 ++--- .../workflow_automation/workflows.py | 78 +++---------------- tests/conftest.py | 2 +- tests/test_activities.py | 8 +- tests/test_models.py | 6 +- 8 files changed, 109 insertions(+), 114 deletions(-) diff --git a/nmdc_automation/workflow_automation/__init__.py b/nmdc_automation/workflow_automation/__init__.py index e0286a3e..94efbd33 100644 --- a/nmdc_automation/workflow_automation/__init__.py +++ b/nmdc_automation/workflow_automation/__init__.py @@ -1,3 +1,3 @@ from .watch_nmdc import Watcher -from .workflows import load_workflows, Workflow +from .workflows import load_workflow_configs from .wfutils import WorkflowJob, NmdcSchema diff --git a/nmdc_automation/workflow_automation/activities.py b/nmdc_automation/workflow_automation/activities.py index 6cf2e3ff..43d1c811 100644 --- a/nmdc_automation/workflow_automation/activities.py +++ b/nmdc_automation/workflow_automation/activities.py @@ -4,13 +4,12 @@ from semver.version import Version -from nmdc_automation.workflow_automation.workflows import Workflow -from nmdc_automation.workflow_automation.models import WorkflowProcessNode, DataObject +from nmdc_automation.workflow_automation.models import WorkflowProcessNode, DataObject, WorkflowConfig warned_objects = set() -def get_required_data_objects_map(db, workflows: List[Workflow]) -> dict: +def get_required_data_objects_map(db, workflows: List[WorkflowConfig]) -> dict: """ Search for all the data objects that are required data object types for the workflows, and return a dictionary of data objects by ID. @@ -22,7 +21,7 @@ def get_required_data_objects_map(db, workflows: List[Workflow]) -> dict: # Build up a filter of what types are used required_types = set() for wf in workflows: - required_types.update(set(wf.do_types)) + required_types.update(set(wf.data_object_types)) required_data_objs_by_id = dict() for rec in db.data_object_set.find(): @@ -83,45 +82,41 @@ def _is_missing_required_input_output(wf, rec, data_objs): def get_current_workflow_process_nodes( - db, workflows: List[Workflow], data_objects: dict, allowlist: list = None) -> List[WorkflowProcessNode]: + db, workflows: List[WorkflowConfig], data_objects: dict, allowlist: list = None) -> List[WorkflowProcessNode]: """ - Fetch the relevant workflow executions from the database for the given workflows. - 1. Get the Data Generation (formerly Omics Processing) objects for the workflows by analyte category. - 2. Get the remaining Workflow Execution objects that was_informed_by the Data Generation objects. - 3. Filter Workflow Execution objects by: + Fetch the relevant workflow process nodes for the given workflows. + 1. Get the Data Generation (formerly Omics Processing) records for the workflows by analyte category. + 2. Get the remaining Workflow Execution records that was_informed_by the Data Generation objects. + 3. Filter Workflow Execution records by: - version (within range) if specified in the workflow - input and output data objects required by the workflow - Return the list of Workflow Execution objects. + Returns a list of WorkflowProcessNode objects. """ - workflow_executions = set() + workflow_process_nodes = set() analyte_category = _determine_analyte_category(workflows) - # We handle the data generation and data processing workflows separately. Data generation workflow executions have an - # analyte category field, while data processing workflow executions do not, so we filter by the was_informed_by field. data_generation_ids = set() - dg_workflows = [wf for wf in workflows if wf.collection in ["omics_processing_set", "data_generation_set"]] - dp_workflows = [wf for wf in workflows if not wf.collection in ["omics_processing_set", "data_generation_set"]] + data_generation_workflows = [wf for wf in workflows if wf.collection == "data_generation_set"] + workflow_execution_workflows = [wf for wf in workflows if wf.collection == "workflow_execution_set"] - # default query + # default query for data_generation_set records filtered by analyte category q = {"analyte_category": analyte_category} # override query with allowlist if allowlist: q["id"] = {"$in": list(allowlist)} dg_execution_records = db["data_generation_set"].find(q) - # change from cursor to list dg_execution_records = list(dg_execution_records) - for wf in dg_workflows: + for wf in data_generation_workflows: # Sequencing workflows don't have a git repo - default_git_url = "https://github.com/microbiomedata" for rec in dg_execution_records: if _is_missing_required_input_output(wf, rec, data_objects): continue data_generation_ids.add(rec["id"]) - act = WorkflowProcessNode(rec, wf) - workflow_executions.add(act) + wfp_node = WorkflowProcessNode(rec, wf) + workflow_process_nodes.add(wfp_node) - for wf in dp_workflows: + for wf in workflow_execution_workflows: q = {} if wf.git_repo: q = {"git_url": wf.git_repo} @@ -136,13 +131,13 @@ def get_current_workflow_process_nodes( if _is_missing_required_input_output(wf, rec, data_objects): continue if rec["was_informed_by"] in data_generation_ids: - act = WorkflowProcessNode(rec, wf) - workflow_executions.add(act) + wfp_node = WorkflowProcessNode(rec, wf) + workflow_process_nodes.add(wfp_node) - return list(workflow_executions) + return list(workflow_process_nodes) -def _determine_analyte_category(workflows: List[Workflow]) -> str: +def _determine_analyte_category(workflows: List[WorkflowConfig]) -> str: analyte_categories = set([wf.analyte_category for wf in workflows]) if len(analyte_categories) > 1: raise ValueError("Multiple analyte categories not supported") @@ -238,7 +233,7 @@ def _find_data_object_activities(activities, data_objs_by_id): -def load_workflow_process_nodes(db, workflows: list[Workflow], allowlist: list[str] = None) -> List[WorkflowProcessNode]: +def load_workflow_process_nodes(db, workflows: list[WorkflowConfig], allowlist: list[str] = None) -> List[WorkflowProcessNode]: """ This reads the activities from Mongo. It also finds the parent and child relationships between diff --git a/nmdc_automation/workflow_automation/models.py b/nmdc_automation/workflow_automation/models.py index 8e7d95a9..4c1f4a6c 100644 --- a/nmdc_automation/workflow_automation/models.py +++ b/nmdc_automation/workflow_automation/models.py @@ -1,8 +1,7 @@ """ Model classes for the workflow automation app. """ from dataclasses import dataclass, field -from typing import List, Dict, Any, Optional +from typing import List, Dict, Any, Optional, Set -from nmdc_automation.workflow_automation.workflows import Workflow from nmdc_schema.nmdc import ( FileTypeEnum, NucleotideSequencing, @@ -50,7 +49,7 @@ class WorkflowProcessNode(object): structure that represents the execution hierarchy of data generation and workflow execution objects with their associated data objects. """ - def __init__(self, record: Dict[str, Any], workflow: Workflow): + def __init__(self, record: Dict[str, Any], workflow: "WorkflowConfig"): self.parent = None self.children = [] self.data_objects_by_type = {} @@ -143,3 +142,58 @@ def data_object_type(self, value): self._data_object_type = FileTypeEnum(value) +@dataclass +class WorkflowConfig: + """ Configuration for a workflow execution """ + # Sequencing workflows only have these fields + name: str + collection: str + enabled: bool + analyte_category: str + filter_output_objects: List[str] + # TODO should type be optional? + type: Optional[str] = None + + # workflow repository information + git_repo: Optional[str] = None + version: Optional[str] = None + wdl: Optional[str] = None + # workflow execution and input / output information + filter_output_objects: List[str] = field(default_factory=list) + predecessors: List[str] = field(default_factory=list) + filter_input_objects: List[str] = field(default_factory=list) + input_prefix: str = None + inputs: Dict[str, str] = field(default_factory=dict) + optional_inputs: List[str] = field(default_factory=list) + workflow_execution: Dict[str, Any] = field(default_factory=dict) + outputs: List[Dict[str, str]] = field(default_factory=list) + + # populated after initialization + children: Set["WorkflowConfig"] = field(default_factory=set) + parents: Set["WorkflowConfig"] = field(default_factory=set) + data_object_types: List[str] = field(default_factory=list) + + def __post_init__(self): + """ Initialize the object """ + for _, inp_param in self.inputs.items(): + if inp_param.startswith("do:"): + self.data_object_types.append(inp_param[3:]) + if not self.type: + # Infer the type from the name + if self.collection == 'data_generation_set' and 'Sequencing' in self.name: + self.type = 'nmdc:NucleotideSequencing' + + def __hash__(self): + return hash(self.name) + + def __eq__(self, other): + return self.name == other.name + + + def add_child(self, child: "WorkflowConfig"): + """ Add a child workflow """ + self.children.add(child) + + def add_parent(self, parent: "WorkflowConfig"): + """ Add a parent workflow """ + self.parents.add(parent) \ No newline at end of file diff --git a/nmdc_automation/workflow_automation/sched.py b/nmdc_automation/workflow_automation/sched.py index de0fb408..fe890432 100644 --- a/nmdc_automation/workflow_automation/sched.py +++ b/nmdc_automation/workflow_automation/sched.py @@ -5,12 +5,12 @@ import os from time import sleep as _sleep from nmdc_automation.api.nmdcapi import NmdcRuntimeApi -from nmdc_automation.workflow_automation.workflows import load_workflows, Workflow +from nmdc_automation.workflow_automation.workflows import load_workflow_configs from functools import lru_cache from pymongo import MongoClient from pymongo.database import Database as MongoDatabase from nmdc_automation.workflow_automation.activities import load_workflow_process_nodes -from nmdc_automation.workflow_automation.models import WorkflowProcessNode +from nmdc_automation.workflow_automation.models import WorkflowProcessNode, WorkflowConfig from semver.version import Version @@ -42,7 +42,7 @@ def get_mongo_db() -> MongoDatabase: return _client[os.getenv("MONGO_DBNAME")] -def within_range(wf1: Workflow, wf2: Workflow, force=False) -> bool: +def within_range(wf1: WorkflowConfig, wf2: WorkflowConfig, force=False) -> bool: """ Determine if two workflows are within a major and minor version of each other. @@ -75,7 +75,7 @@ class Job: Class to hold information for new jobs """ - def __init__(self, workflow: Workflow, trigger_act: WorkflowProcessNode): + def __init__(self, workflow: WorkflowConfig, trigger_act: WorkflowProcessNode): self.workflow = workflow self.trigger_act = trigger_act self.informed_by = trigger_act.was_informed_by @@ -89,7 +89,7 @@ def __init__(self, db, wfn="workflows.yaml", logging.info("Initializing Scheduler") # Init wf_file = os.environ.get(_WF_YAML_ENV, wfn) - self.workflows = load_workflows(wf_file) + self.workflows = load_workflow_configs(wf_file) self.db = db self.api = NmdcRuntimeApi(site_conf) # TODO: Make force a optional parameter @@ -163,8 +163,8 @@ def create_job_rec(self, job: Job): "inputs": inp, "input_data_objects": inp_objects, } - if wf.activity: - job_config["activity"] = wf.activity + if wf.workflow_execution: + job_config["activity"] = wf.workflow_execution if wf.outputs: outputs = [] for output in wf.outputs: @@ -209,7 +209,7 @@ def mock_mint(self, id_type): # pragma: no cover } return f"nmdc:wf{mapping[id_type]}-11-xxxxxx" - def get_activity_id(self, wf: Workflow, informed_by: str): + def get_activity_id(self, wf: WorkflowConfig, informed_by: str): """ See if anything exist for this and if not mint a new id. @@ -237,7 +237,7 @@ def get_activity_id(self, wf: Workflow, informed_by: str): # from the jobs collection for a given workflow. Also activity should be execution to conform # to the new schema. @lru_cache(maxsize=128) - def get_existing_jobs(self, wf: Workflow): + def get_existing_jobs(self, wf: WorkflowConfig): existing_jobs = set() # Filter by git_repo and version # Find all existing jobs for this workflow diff --git a/nmdc_automation/workflow_automation/workflows.py b/nmdc_automation/workflow_automation/workflows.py index 38158e7d..af8e9193 100644 --- a/nmdc_automation/workflow_automation/workflows.py +++ b/nmdc_automation/workflow_automation/workflows.py @@ -7,83 +7,29 @@ from yaml import Loader import sys -# TODO: Berkley refactoring: -# Ensure that the Workflow class and load_workflows methods are compatible with the MetaTranscriptomics workflow. -def load_workflows(yaml_file) -> list[Workflow]: +from nmdc_automation.workflow_automation.models import WorkflowConfig + +def load_workflow_configs(yaml_file) -> list[WorkflowConfig]: """ - Load all workflow definitions from a yaml file, populate - parent-child relationships and return a list of Workflow - objects. + Read the workflows yaml file and return a list of WorkflowConfig objects """ - workflows = [] + workflow_configs = [] data = load(open(yaml_file), Loader) for wf in data["Workflows"]: - workflows.append(Workflow(wf)) + # normalize the keys from Key Name to key_name + wf = {k.replace(" ", "_").lower(): v for k, v in wf.items()} + workflow_configs.append(WorkflowConfig(**wf)) # Populate workflow dependencies - for wf in workflows: - for wf2 in workflows: + for wf in workflow_configs: + for wf2 in workflow_configs: if not wf2.predecessors: continue if wf.name in wf2.predecessors: wf.add_child(wf2) wf2.add_parent(wf) - return workflows - - -class Workflow: - """ - Workflow object class - """ - - _FIELDS = [ - "Name", - "Type", - "Enabled", - "Git_repo", - "Version", - "WDL", - "Analyte Category", - "Collection", - "Predecessors", - "Input_prefix", - "Inputs", - "Workflow Execution", - "Filter Input Objects", - "Filter Output Objects", - "Outputs", - "Optional Inputs" - ] - - def __init__(self, wf: dict): - """ - Create a workflow object from a - dictionary - """ - self.children = set() - self.parents = set() - self.do_types = [] - for f in self._FIELDS: - attr_name = f.lower().replace(" ", "_") - setattr(self, attr_name, wf.get(f)) - if not self.inputs: - self.inputs = {} - if not self.optional_inputs: - self.optional_inputs = [] - for _, inp_param in self.inputs.items(): - if inp_param.startswith("do:"): - self.do_types.append(inp_param[3:]) - - def add_child(self, child: Workflow): - self.children.add(child) - - def add_parent(self, parent: Workflow): - self.parents.add(parent) - - @property - def activity(self): - return self.workflow_execution + return workflow_configs if __name__ == "__main__": wff = sys.argv[1] - load_workflows(wff) + load_workflow_configs(wff) diff --git a/tests/conftest.py b/tests/conftest.py index fed118d2..7f948374 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -7,7 +7,7 @@ from yaml import load from nmdc_automation.config import Config -from nmdc_automation.workflow_automation.workflows import Workflow + diff --git a/tests/test_activities.py b/tests/test_activities.py index 30201d61..3207078a 100644 --- a/tests/test_activities.py +++ b/tests/test_activities.py @@ -2,7 +2,7 @@ from nmdc_automation.workflow_automation.activities import (get_required_data_objects_map, get_current_workflow_process_nodes, load_workflow_process_nodes) -from nmdc_automation.workflow_automation.workflows import load_workflows +from nmdc_automation.workflow_automation.workflows import load_workflow_configs from tests.fixtures.db_utils import load_fixture, reset_db @@ -22,7 +22,7 @@ def test_load_activies(test_db, workflow_file, workflows_config_dir): load_fixture(test_db, "data_generation_set.json") load_fixture(test_db, "read_qc_analysis.json", "workflow_execution_set") - wfs = load_workflows(workflows_config_dir / workflow_file) + wfs = load_workflow_configs(workflows_config_dir / workflow_file) # these are called by load_activities data_objs_by_id = get_required_data_objects_map(test_db, wfs) @@ -67,7 +67,7 @@ def test_load_workflows(workflows_config_dir, workflow_file): exp_wf_names = ["Reads QC", "Reads QC Interleave", "Metagenome Assembly", "Metagenome Annotation", "MAGs", "Readbased Analysis", ] - wfs = load_workflows(workflows_config_dir / workflow_file) + wfs = load_workflow_configs(workflows_config_dir / workflow_file) assert wfs wfm = {} assert len(wfs) == len(exp_wf_names) + len(shared_wf_names) @@ -98,7 +98,7 @@ def test_get_required_data_objects_by_id(test_db, workflows_config_dir, workflow reset_db(test_db) load_fixture(test_db, "data_object_set.json") - wfs = load_workflows(workflows_config_dir / workflow_file) + wfs = load_workflow_configs(workflows_config_dir / workflow_file) required_data_object_map = get_required_data_objects_map(test_db, wfs) assert required_data_object_map diff --git a/tests/test_models.py b/tests/test_models.py index fa1cf638..026f2aa2 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -6,7 +6,7 @@ WorkflowProcessNode, workflow_process_factory, ) -from nmdc_automation.workflow_automation.workflows import load_workflows +from nmdc_automation.workflow_automation.workflows import load_workflow_configs from tests.fixtures import db_utils def test_workflow_process_factory(): @@ -53,8 +53,8 @@ def test_process_factory_with_db_record(): def test_workflow_process_node(workflows_config_dir,record_file, record_type): """ Test the WorkflowProcessNode class. """ # load all workflows for both metagenome and metatranscriptome - wfs = load_workflows(workflows_config_dir / "workflows.yaml") - wfs += load_workflows(workflows_config_dir / "workflows-mt.yaml") + wfs = load_workflow_configs(workflows_config_dir / "workflows.yaml") + wfs += load_workflow_configs(workflows_config_dir / "workflows-mt.yaml") # NuclotideSequencing workflows have no type if record_type == "nmdc:NucleotideSequencing": From 2772edeeb3feabc3dbd9a2be3b61ee98d1aeaefb Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Thu, 26 Sep 2024 15:42:25 -0700 Subject: [PATCH 35/52] refactor activities.py Refactor package to `workflow_process` --- nmdc_automation/__init__.py | 2 +- nmdc_automation/workflow_automation/sched.py | 2 +- .../{activities.py => workflow_process.py} | 93 +++++++++---------- ...activities.py => test_workflow_process.py} | 6 +- 4 files changed, 51 insertions(+), 52 deletions(-) rename nmdc_automation/workflow_automation/{activities.py => workflow_process.py} (74%) rename tests/{test_activities.py => test_workflow_process.py} (93%) diff --git a/nmdc_automation/__init__.py b/nmdc_automation/__init__.py index 2b16126a..4e82f8dd 100644 --- a/nmdc_automation/__init__.py +++ b/nmdc_automation/__init__.py @@ -1,4 +1,4 @@ from .api import nmdcapi from .config import config from .import_automation import activity_mapper -from .workflow_automation import watch_nmdc, wfutils, workflows, activities +from .workflow_automation import watch_nmdc, wfutils, workflows, workflow_process diff --git a/nmdc_automation/workflow_automation/sched.py b/nmdc_automation/workflow_automation/sched.py index fe890432..3fa414b4 100644 --- a/nmdc_automation/workflow_automation/sched.py +++ b/nmdc_automation/workflow_automation/sched.py @@ -9,7 +9,7 @@ from functools import lru_cache from pymongo import MongoClient from pymongo.database import Database as MongoDatabase -from nmdc_automation.workflow_automation.activities import load_workflow_process_nodes +from nmdc_automation.workflow_automation.workflow_process import load_workflow_process_nodes from nmdc_automation.workflow_automation.models import WorkflowProcessNode, WorkflowConfig from semver.version import Version diff --git a/nmdc_automation/workflow_automation/activities.py b/nmdc_automation/workflow_automation/workflow_process.py similarity index 74% rename from nmdc_automation/workflow_automation/activities.py rename to nmdc_automation/workflow_automation/workflow_process.py index 43d1c811..33431f06 100644 --- a/nmdc_automation/workflow_automation/activities.py +++ b/nmdc_automation/workflow_automation/workflow_process.py @@ -1,6 +1,6 @@ import logging from functools import lru_cache -from typing import List, Optional +from typing import List, Dict from semver.version import Version @@ -9,7 +9,7 @@ warned_objects = set() -def get_required_data_objects_map(db, workflows: List[WorkflowConfig]) -> dict: +def get_required_data_objects_map(db, workflows: List[WorkflowConfig]) -> Dict[str, DataObject]: """ Search for all the data objects that are required data object types for the workflows, and return a dictionary of data objects by ID. @@ -67,22 +67,23 @@ def _check(match_types, data_object_ids, data_objs): return match_set.issubset(do_types) -def _is_missing_required_input_output(wf, rec, data_objs): +def _is_missing_required_input_output(wf: WorkflowConfig, rec: dict, data_objects_by_id: Dict[str, DataObject]) -> bool: """ Some workflows require specific inputs or outputs. This implements the filtering for those. """ match_in = _check( - wf.filter_input_objects, rec.get("has_input"), data_objs + wf.filter_input_objects, rec.get("has_input"), data_objects_by_id ) match_out = _check( - wf.filter_output_objects, rec.get("has_output"), data_objs + wf.filter_output_objects, rec.get("has_output"), data_objects_by_id ) return not (match_in and match_out) def get_current_workflow_process_nodes( - db, workflows: List[WorkflowConfig], data_objects: dict, allowlist: list = None) -> List[WorkflowProcessNode]: + db, workflows: List[WorkflowConfig], + data_objects_by_id: Dict[str, DataObject], allowlist: List[str] = None) -> List[WorkflowProcessNode]: """ Fetch the relevant workflow process nodes for the given workflows. 1. Get the Data Generation (formerly Omics Processing) records for the workflows by analyte category. @@ -110,7 +111,7 @@ def get_current_workflow_process_nodes( for wf in data_generation_workflows: # Sequencing workflows don't have a git repo for rec in dg_execution_records: - if _is_missing_required_input_output(wf, rec, data_objects): + if _is_missing_required_input_output(wf, rec, data_objects_by_id): continue data_generation_ids.add(rec["id"]) wfp_node = WorkflowProcessNode(rec, wf) @@ -128,7 +129,7 @@ def get_current_workflow_process_nodes( for rec in records: if wf.version and not _within_range(rec["version"], wf.version): continue - if _is_missing_required_input_output(wf, rec, data_objects): + if _is_missing_required_input_output(wf, rec, data_objects_by_id): continue if rec["was_informed_by"] in data_generation_ids: wfp_node = WorkflowProcessNode(rec, wf) @@ -148,7 +149,7 @@ def _determine_analyte_category(workflows: List[WorkflowConfig]) -> str: # TODO: Make public, give a better name, add type hints and unit tests. -def _resolve_relationships(activities, data_obj_act): +def _resolve_relationships(wfp_nodes: List[WorkflowProcessNode], wfp_nodes_by_data_object_id: Dict[str, WorkflowProcessNode]) -> List[WorkflowProcessNode]: """ Find the parents and children relationships between the activities @@ -157,79 +158,78 @@ def _resolve_relationships(activities, data_obj_act): # a map of all of the data objects they generated. # Let's use this to find the parent activity # for each child activity - for act in activities: - logging.debug(f"Processing {act.id} {act.name} {act.workflow.name}") - act_pred_wfs = act.workflow.parents - if not act_pred_wfs: + for wfp_node in wfp_nodes: + logging.debug(f"Processing {wfp_node.id} {wfp_node.name} {wfp_node.workflow.name}") + wfp_node_predecessors = wfp_node.workflow.parents + if not wfp_node_predecessors: logging.debug("- No Predecessors") continue # Go through its inputs - for do_id in act.has_input: - if do_id not in data_obj_act: + for do_id in wfp_node.has_input: + if do_id not in wfp_nodes_by_data_object_id: # This really shouldn't happen if do_id not in warned_objects: logging.warning(f"Missing data object {do_id}") warned_objects.add(do_id) continue - parent_act = data_obj_act[do_id] + parent_wfp_node = wfp_nodes_by_data_object_id[do_id] # This is to cover the case where it was a duplicate. # This shouldn't happen in the future. - if not parent_act: - logging.warning("Parent act is none") + if not parent_wfp_node: + logging.warning("Parent node is none") continue # Let's make sure these came from the same source # This is just a safeguard - if act.was_informed_by != parent_act.was_informed_by: + if wfp_node.was_informed_by != parent_wfp_node.was_informed_by: logging.warning( "Mismatched informed by for " - f"{do_id} in {act.id} " - f"{act.was_informed_by} != " - f"{parent_act.was_informed_by}" + f"{do_id} in {wfp_node.id} " + f"{wfp_node.was_informed_by} != " + f"{parent_wfp_node.was_informed_by}" ) continue # We only want to use it as a parent if it is the right # parent workflow. Some inputs may come from ancestors # further up - if parent_act.workflow in act_pred_wfs: + if parent_wfp_node.workflow in wfp_node_predecessors: # This is the one - act.parent = parent_act - parent_act.children.append(act) + wfp_node.parent = parent_wfp_node + parent_wfp_node.children.append(wfp_node) logging.debug( - f"Found parent: {parent_act.id}" - f" {parent_act.name}" + f"Found parent: {parent_wfp_node.id}" + f" {parent_wfp_node.name}" ) break - if len(act.workflow.parents) > 0 and not act.parent: - if act.id not in warned_objects: - logging.warning(f"Didn't find a parent for {act.id}") - warned_objects.add(act.id) + if len(wfp_node.workflow.parents) > 0 and not wfp_node.parent: + if wfp_node.id not in warned_objects: + logging.warning(f"Didn't find a parent for {wfp_node.id}") + warned_objects.add(wfp_node.id) # Now all the activities have their parent - return activities + return wfp_nodes -def _find_data_object_activities(activities, data_objs_by_id): +def _associate_workflow_process_nodes_to_data_objects(wfp_nodes: List[WorkflowProcessNode], data_objs_by_id): """ - Find the activity that generated each data object to - use in the relationship method. + Associate the data objects with workflow process nodes """ - data_obj_act = dict() - for act in activities: - for do_id in act.has_output: + wfp_nodes_by_data_object_id = dict() + for wfp_node in wfp_nodes: + for do_id in wfp_node.has_output: if do_id in data_objs_by_id: do = data_objs_by_id[do_id] - act.add_data_object(do) + wfp_node.add_data_object(do) # If its a dupe, set it to none # so we can ignore it later. # Once we re-id the data objects this - # shouldn't happen - if do_id in data_obj_act: + # Post re-id we would not expect thi + if do_id in wfp_nodes_by_data_object_id: if do_id not in warned_objects: logging.warning(f"Duplicate output object {do_id}") warned_objects.add(do_id) - data_obj_act[do_id] = None + wfp_nodes_by_data_object_id[do_id] = None else: - data_obj_act[do_id] = act - return data_obj_act + wfp_nodes_by_data_object_id[do_id] = wfp_node + return wfp_nodes_by_data_object_id, wfp_nodes @@ -256,10 +256,9 @@ def load_workflow_process_nodes(db, workflows: list[WorkflowConfig], allowlist: # the output objects to the activity that generated them. wfp_nodes = get_current_workflow_process_nodes(db, workflows, data_objs_by_id, allowlist) - data_obj_act = _find_data_object_activities(wfp_nodes, data_objs_by_id) + wfp_nodes_by_data_object_id, wfp_nodes = _associate_workflow_process_nodes_to_data_objects(wfp_nodes, data_objs_by_id) # Now populate the parent and children values for the - # activities - wfp_nodes = _resolve_relationships(wfp_nodes, data_obj_act) + wfp_nodes = _resolve_relationships(wfp_nodes, wfp_nodes_by_data_object_id) return wfp_nodes diff --git a/tests/test_activities.py b/tests/test_workflow_process.py similarity index 93% rename from tests/test_activities.py rename to tests/test_workflow_process.py index 3207078a..f8813353 100644 --- a/tests/test_activities.py +++ b/tests/test_workflow_process.py @@ -1,7 +1,7 @@ from pytest import mark -from nmdc_automation.workflow_automation.activities import (get_required_data_objects_map, get_current_workflow_process_nodes, - load_workflow_process_nodes) +from nmdc_automation.workflow_automation.workflow_process import ( + get_required_data_objects_map, get_current_workflow_process_nodes, load_workflow_process_nodes) from nmdc_automation.workflow_automation.workflows import load_workflow_configs from tests.fixtures.db_utils import load_fixture, reset_db @@ -9,7 +9,7 @@ @mark.parametrize( "workflow_file", ["workflows.yaml", "workflows-mt.yaml"] ) -def test_load_activies(test_db, workflow_file, workflows_config_dir): +def test_load_workflow_process_nodes(test_db, workflow_file, workflows_config_dir): """ Test """ From 49c2e94e3b130b1a9133dba0ee38b43ad8cb397a Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Thu, 26 Sep 2024 15:48:27 -0700 Subject: [PATCH 36/52] remove "./test_data" in tests replace with test_data fixture --- tests/test_nmdcapi.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_nmdcapi.py b/tests/test_nmdcapi.py index cc60771d..94d50b6c 100644 --- a/tests/test_nmdcapi.py +++ b/tests/test_nmdcapi.py @@ -18,12 +18,12 @@ def test_objects(mock_api, requests_mock, site_config, test_data_dir): n = nmdcapi(site_config) requests_mock.post("http://localhost/objects", json={}) - fn = "./test_data/afile.sha256" + fn = test_data_dir / "afile.sha256" if os.path.exists(fn): os.remove(fn) afile = test_data_dir / "afile" resp = n.create_object(str(afile), "desc", "http://localhost/") - resp = n.create_object("./test_data/afile", "desc", "http://localhost/") + resp = n.create_object(test_data_dir / "afile", "desc", "http://localhost/") url = "http://localhost/workflows/workflow_executions" requests_mock.post(url, json={"a": "b"}) resp = n.post_objects({"a": "b"}) From 8530a72def68a96b10ca8ad3abff442635ab4f82 Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Thu, 26 Sep 2024 16:27:31 -0700 Subject: [PATCH 37/52] refactor create_or_use_existing_job Refactor to separate job get / create from caching it in .jobs --- nmdc_automation/api/nmdcapi.py | 22 +++++++++------- .../workflow_automation/watch_nmdc.py | 26 +++++++++---------- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/nmdc_automation/api/nmdcapi.py b/nmdc_automation/api/nmdcapi.py index 3f2c7df0..03a9d32c 100755 --- a/nmdc_automation/api/nmdcapi.py +++ b/nmdc_automation/api/nmdcapi.py @@ -16,20 +16,24 @@ import logging -def _get_sha256(fn): - hashfn = fn + ".sha256" - if os.path.exists(hashfn): - with open(hashfn) as f: +def _get_sha256(fn: Union[str, Path]) -> str: + """ + Helper function to get the sha256 hash of a file if it exists. + """ + shahash = hashlib.sha256() + if isinstance(fn, str): + fn = Path(fn) + hash_fn = fn.with_suffix(".sha256") + if hash_fn.exists(): + with hash_fn.open() as f: sha = f.read().rstrip() else: - logging.info("hashing %s" % (fn)) - shahash = hashlib.sha256() - with open(fn, "rb") as f: - # Read and update hash string value in blocks of 4K + logging.info(f"hashing {fn}") + with fn.open("rb") as f: for byte_block in iter(lambda: f.read(1048576), b""): shahash.update(byte_block) sha = shahash.hexdigest() - with open(hashfn, "w") as f: + with hash_fn.open("w") as f: f.write(sha) f.write("\n") return sha diff --git a/nmdc_automation/workflow_automation/watch_nmdc.py b/nmdc_automation/workflow_automation/watch_nmdc.py index cafe4b2e..fb15ae97 100644 --- a/nmdc_automation/workflow_automation/watch_nmdc.py +++ b/nmdc_automation/workflow_automation/watch_nmdc.py @@ -9,7 +9,7 @@ from os.path import exists from nmdc_automation.api import NmdcRuntimeApi from nmdc_automation.config import Config -from .wfutils import WorkflowJob as wfjob +from .wfutils import WorkflowJob from .wfutils import NmdcSchema, _md5 logger = logging.getLogger(__name__) @@ -60,7 +60,7 @@ def _find_jobs(self, data: dict, nocheck: bool): job_id = job["nmdc_jobid"] if job_id in seen: continue - job_record = wfjob(self.config, state=job, nocheck=nocheck) + job_record = WorkflowJob(self.config, state=job, nocheck=nocheck) new_job_list.append(job_record) seen[job_id] = True return new_job_list @@ -84,16 +84,14 @@ def submit_job(self, new_job, opid, force=False): if "object_id_latest" in new_job["config"]: logger.warning("Old record. Skipping.") return - self.create_or_use_existing_job(new_job, opid, common_workflow_id) - self.jobs[-1].cromwell_submit(force=force) - - def create_or_use_existing_job(self, new_job, opid, common_workflow_id): - job = self.find_job_by_opid(opid) - if job: - logger.debug("Previously cached job") - self.jobs.append(job) - else: - job = wfjob( + wf_job = self.get_or_create_workflow_job(new_job, opid, common_workflow_id) + self.jobs.append(wf_job) + wf_job.cromwell_submit(force=force) + + def get_or_create_workflow_job(self, new_job, opid, common_workflow_id)-> WorkflowJob: + wf_job = self.find_job_by_opid(opid) + if not wf_job: + wf_job = WorkflowJob( site_config=self.config, typ=common_workflow_id, nmdc_jobid=new_job["id"], @@ -101,7 +99,7 @@ def create_or_use_existing_job(self, new_job, opid, common_workflow_id): opid=opid, activity_id=new_job["config"]["activity_id"], ) - self.jobs.append(job) + return wf_job def check_job_status(self): for job in self.jobs: @@ -228,7 +226,7 @@ def __init__(self, site_configuration_file): self.jobs = [] self._ALLOWED = self.config.allowed_workflows - def restore_from_checkpoint(self, nocheck: bool = False): + def restore_from_checkpoint(self, nocheck: bool = False)-> None: """ Restore from checkpoint """ From 1614747ec06f288e521e1a313c3661cc033ace92 Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Fri, 27 Sep 2024 12:43:06 -0700 Subject: [PATCH 38/52] add type hints --- nmdc_automation/api/nmdcapi.py | 5 +- nmdc_automation/workflow_automation/sched.py | 9 +- .../workflow_automation/watch_nmdc.py | 102 ++++++++++-------- 3 files changed, 67 insertions(+), 49 deletions(-) diff --git a/nmdc_automation/api/nmdcapi.py b/nmdc_automation/api/nmdcapi.py index 03a9d32c..87c4a232 100755 --- a/nmdc_automation/api/nmdcapi.py +++ b/nmdc_automation/api/nmdcapi.py @@ -10,7 +10,7 @@ import mimetypes from pathlib import Path from time import time -from typing import Union +from typing import Union, List from datetime import datetime, timedelta, timezone from nmdc_automation.config import Config, UserConfig import logging @@ -212,7 +212,7 @@ def bump_time(self, obj): return resp.json() @refresh_token - def list_jobs(self, filt=None, max=100): + def list_jobs(self, filt=None, max=100) -> List[dict]: url = "%sjobs?max_page_size=%s" % (self._base_url, max) d = {} if filt: @@ -322,6 +322,7 @@ def run_query(self, query): return resp.json() +# TODO - This is deprecated and should be removed along with the re_iding code that uses it class NmdcRuntimeUserApi: """ Basic Runtime API Client with user/password authentication. diff --git a/nmdc_automation/workflow_automation/sched.py b/nmdc_automation/workflow_automation/sched.py index 3fa414b4..08540658 100644 --- a/nmdc_automation/workflow_automation/sched.py +++ b/nmdc_automation/workflow_automation/sched.py @@ -70,7 +70,7 @@ def get_version(wf): """ # TODO: Change the name of this to distinguish it from the database Job object -class Job: +class SchedulerJob: """ Class to hold information for new jobs """ @@ -104,8 +104,7 @@ async def run(self): self.cycle() await asyncio.sleep(_POLL_INTERVAL) - # TODO: - def create_job_rec(self, job: Job): + def create_job_rec(self, job: SchedulerJob): """ This takes a job and using the workflow definition, resolves all the information needed to create a @@ -250,7 +249,7 @@ def get_existing_jobs(self, wf: WorkflowConfig): return existing_jobs # TODO: Rename this to reflect what it does and add unit tests - def find_new_jobs(self, wfp_node: WorkflowProcessNode) -> list[Job]: + def find_new_jobs(self, wfp_node: WorkflowProcessNode) -> list[SchedulerJob]: """ For a given activity see if there are any new jobs that should be created. @@ -276,7 +275,7 @@ def find_new_jobs(self, wfp_node: WorkflowProcessNode) -> list[Job]: # found that matched this workflow, so we # add a job logging.debug(f"Creating a job {wf.name}:{wf.version} for {wfp_node.id}") - new_jobs.append(Job(wf, wfp_node)) + new_jobs.append(SchedulerJob(wf, wfp_node)) return new_jobs diff --git a/nmdc_automation/workflow_automation/watch_nmdc.py b/nmdc_automation/workflow_automation/watch_nmdc.py index fb15ae97..85557b36 100644 --- a/nmdc_automation/workflow_automation/watch_nmdc.py +++ b/nmdc_automation/workflow_automation/watch_nmdc.py @@ -7,6 +7,8 @@ import shutil from json import loads from os.path import exists +from typing import List, Dict, Any, Optional, Set + from nmdc_automation.api import NmdcRuntimeApi from nmdc_automation.config import Config from .wfutils import WorkflowJob @@ -16,10 +18,11 @@ class FileHandler: - def __init__(self, state_file): - self.state_file = state_file + def __init__(self, config): + self.config = config + self.state_file = self.config.agent_state - def load_state_file(self): + def load_state_file(self)-> Optional[Dict[str, Any]]: if not exists(self.state_file): return None with open(self.state_file, "r") as f: @@ -29,17 +32,20 @@ def save_state_file(self, data): with open(self.state_file, "w") as f: json.dump(data, f, indent=2) - def get_output_dir(self, informed_by, act_id, data_directory): - outdir = os.path.join(data_directory, informed_by, act_id) + def get_output_dir(self, job): + data_directory = self.config.data_dir + informed_by = job.workflow_config["was_informed_by"] + workflow_execution_id = job.activity_id + outdir = os.path.join(data_directory, informed_by, workflow_execution_id) if not os.path.exists(outdir): os.makedirs(outdir) return outdir - def write_metadata_if_not_exists(self, metadata, outdir): + def write_metadata_if_not_exists(self, job, outdir): metadata_filepath = os.path.join(outdir, "metadata.json") if not os.path.exists(metadata_filepath): with open(metadata_filepath, "w") as f: - json.dump(metadata, f) + json.dump(job.get_metadata(), f) class JobManager: @@ -47,23 +53,25 @@ def __init__(self, config, file_handler, api_handler): self.config = config self.file_handler = file_handler self.api_handler = api_handler - self.jobs = [] + self.job_cache = [] self._MAX_FAILS = 2 - def restore_jobs(self, state_data, nocheck=False): - self.jobs = self._find_jobs(state_data, nocheck) + def restore_jobs(self, state_data: Dict[str, Any], nocheck=False)-> None: + """ Restore jobs from state data """ + self.job_cache = self._find_jobs(state_data, nocheck) - def _find_jobs(self, data: dict, nocheck: bool): - new_job_list = [] + def _find_jobs(self, state_data: dict, nocheck: bool)-> List[WorkflowJob]: + """ Find jobs from state data """ + new_wf_job_list = [] seen = {} - for job in data["jobs"]: + for job in state_data["jobs"]: job_id = job["nmdc_jobid"] if job_id in seen: continue - job_record = WorkflowJob(self.config, state=job, nocheck=nocheck) - new_job_list.append(job_record) + wf_job = WorkflowJob(self.config, state=job, nocheck=nocheck) + new_wf_job_list.append(wf_job) seen[job_id] = True - return new_job_list + return new_wf_job_list def _get_url(self, informed_by, act_id, fname): root = self.config.url_root @@ -77,7 +85,7 @@ def _get_output_dir(self, informed_by, act_id): return outdir def find_job_by_opid(self, opid): - return next((job for job in self.jobs if job.opid == opid), None) + return next((job for job in self.job_cache if job.opid == opid), None) def submit_job(self, new_job, opid, force=False): common_workflow_id = new_job["workflow"]["id"] @@ -85,7 +93,7 @@ def submit_job(self, new_job, opid, force=False): logger.warning("Old record. Skipping.") return wf_job = self.get_or_create_workflow_job(new_job, opid, common_workflow_id) - self.jobs.append(wf_job) + self.job_cache.append(wf_job) wf_job.cromwell_submit(force=force) def get_or_create_workflow_job(self, new_job, opid, common_workflow_id)-> WorkflowJob: @@ -93,7 +101,7 @@ def get_or_create_workflow_job(self, new_job, opid, common_workflow_id)-> Workfl if not wf_job: wf_job = WorkflowJob( site_config=self.config, - typ=common_workflow_id, + type=common_workflow_id, nmdc_jobid=new_job["id"], workflow_config=new_job["config"], opid=opid, @@ -102,7 +110,7 @@ def get_or_create_workflow_job(self, new_job, opid, common_workflow_id)-> Workfl return wf_job def check_job_status(self): - for job in self.jobs: + for job in self.job_cache: if not job.done: status = job.check_status() if status == "Succeeded" and job.opid: @@ -110,23 +118,26 @@ def check_job_status(self): elif status == "Failed" and job.opid: self.process_failed_job(job) - def process_successful_job(self, job): + def process_successful_job(self, job: WorkflowJob): logger.info(f"Running post for op {job.opid}") - metadata = job.get_metadata() - informed_by = job.workflow_config["was_informed_by"] - act_id = job.activity_id - outdir = self.file_handler.get_output_dir(informed_by, act_id, self.config.data_dir) + + outdir = self.file_handler.get_output_dir(job) schema = NmdcSchema() - output_ids = self.generate_data_objects(job, metadata["outputs"], outdir, informed_by, act_id, schema) - activity_inputs = [dobj["id"] for dobj in job.input_data_objects] - self.create_activity_record(job, act_id, activity_inputs, output_ids, schema) - self.file_handler.write_metadata_if_not_exists(metadata, outdir) + + output_ids = self.generate_data_objects(job, outdir, schema) + + self.create_activity_record(job, output_ids, schema) + + self.file_handler.write_metadata_if_not_exists(job, outdir) + nmdc_database_obj = schema.get_database_object_dump() nmdc_database_obj_dict = json.loads(nmdc_database_obj) resp = self.api_handler.post_objects(nmdc_database_obj_dict) logger.info(f"Response: {resp}") job.done = True - resp = self.api_handler.update_op(job.opid, done=True, meta=metadata) + resp = self.api_handler.update_op( + job.opid, done=True, meta=job.get_metadata() + ) return resp @@ -136,14 +147,17 @@ def process_failed_job(self, job): job.cromwell_submit() def job_checkpoint(self): - jobs = [job.get_state() for job in self.jobs] + jobs = [job.get_state() for job in self.job_cache] data = {"jobs": jobs} return data - def generate_data_objects(self, job, job_outs, outdir, informed_by, act_id, schema): + def generate_data_objects(self, job, outdir, schema): output_ids = [] prefix = job.workflow_config["input_prefix"] + job_outs = job.get_metadata()["outputs"] + informed_by = job.workflow_config["was_informed_by"] + for product_record in job.outputs: outkey = f"{prefix}.{product_record['output']}" if outkey not in job_outs and product_record.get("optional"): @@ -156,7 +170,11 @@ def generate_data_objects(self, job, job_outs, outdir, informed_by, act_id, sche shutil.copyfile(full_name, new_path) md5 = _md5(full_name) - file_url = self._get_url(informed_by, act_id, file_name) + file_url = self._get_url( + job.workflow_config["was_informed_by"], + job.activity_id, + file_name + ) id = product_record["id"] schema.make_data_object( name=file_name, @@ -166,25 +184,25 @@ def generate_data_objects(self, job, job_outs, outdir, informed_by, act_id, sche dobj_id=product_record["id"], md5_sum=md5, description=product_record["description"], - omics_id=act_id, + omics_id=job.activity_id, ) output_ids.append(id) return output_ids - def create_activity_record(self, job, act_id, activity_inputs, output_ids, schema): + def create_activity_record(self, job, output_ids, schema): activity_type = job.activity_templ["type"] - name = job.activity_templ["name"].replace("{id}", act_id) + name = job.activity_templ["name"].replace("{id}", job.activity_id) omic_id = job.workflow_config["was_informed_by"] resource = self.config.resource schema.create_activity_record( activity_record=activity_type, activity_name=name, workflow=job.workflow_config, - activity_id=act_id, + activity_id=job.activity_id, resource=resource, - has_inputs_list=activity_inputs, + has_inputs_list=[dobj["id"] for dobj in job.input_data_objects], has_output_list=output_ids, omic_id=omic_id, start_time=job.start, @@ -199,12 +217,13 @@ def __init__(self, config): def claim_job(self, job_id): return self.runtime_api.claim_job(job_id) - def list_jobs(self, allowed_workflows): + def list_jobs(self, allowed_workflows)-> List[Dict[str, Any]]: filt = { "workflow.id": {"$in": allowed_workflows}, "claims": {"$size": 0} } - return self.runtime_api.list_jobs(filt=filt) + job_records = self.runtime_api.list_jobs(filt=filt) + return job_records def post_objects(self, database_obj): return self.runtime_api.post_objects(database_obj) @@ -220,10 +239,9 @@ def __init__(self, site_configuration_file): self._MAX_FAILS = 2 self.should_skip_claim = False self.config = Config(site_configuration_file) - self.file_handler = FileHandler(self.config.agent_state) + self.file_handler = FileHandler(self.config) self.api_handler = RuntimeApiHandler(self.config) self.job_manager = JobManager(self.config, self.file_handler, self.api_handler) - self.jobs = [] self._ALLOWED = self.config.allowed_workflows def restore_from_checkpoint(self, nocheck: bool = False)-> None: From 01235e56038232ac22c09a20944a3b449210a258 Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Fri, 27 Sep 2024 12:44:00 -0700 Subject: [PATCH 39/52] update metaT rqc workflow version --- nmdc_automation/config/workflows/workflows-mt.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nmdc_automation/config/workflows/workflows-mt.yaml b/nmdc_automation/config/workflows/workflows-mt.yaml index 34ba5b7c..1c8c8751 100644 --- a/nmdc_automation/config/workflows/workflows-mt.yaml +++ b/nmdc_automation/config/workflows/workflows-mt.yaml @@ -61,7 +61,7 @@ Workflows: Enabled: True Analyte Category: Metatranscriptome Git_repo: https://github.com/microbiomedata/metaT_ReadsQC - Version: v0.0.3 + Version: v0.0.7 Collection: workflow_execution_set WDL: interleave_rqcfilter.wdl Input_prefix: nmdc_rqcfilter From 0bbf61121db6d2920ab9817178c513bc26b7650f Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Fri, 27 Sep 2024 12:44:35 -0700 Subject: [PATCH 40/52] update tests and fixtures --- tests/fixtures/job_record.json | 225 ++++++++++++++++++++++++++++++++ tests/fixtures/jobs.json | 229 ++++++++++++++++++++++++++++++++- tests/test_models.py | 32 +++++ tests/test_sched.py | 2 +- 4 files changed, 486 insertions(+), 2 deletions(-) create mode 100644 tests/fixtures/job_record.json diff --git a/tests/fixtures/job_record.json b/tests/fixtures/job_record.json new file mode 100644 index 00000000..dc5da4d9 --- /dev/null +++ b/tests/fixtures/job_record.json @@ -0,0 +1,225 @@ +{ + "workflow" : { + "id" : "Metagenome Annotation: v1.1.0" + }, + "id" : "nmdc:e18a4870-425c-11ef-8cc6-52b18d4509d1", + "created_at" : "2024-07-15T03:46:56.000+0000", + "config" : { + "git_repo" : "https://github.com/microbiomedata/mg_annotation", + "release" : "v1.1.0", + "wdl" : "annotation_full.wdl", + "activity_id" : "nmdc:wfmgan-11-dvvh0237.1", + "activity_set" : "metagenome_annotation_activity_set", + "was_informed_by" : "nmdc:omprc-13-zd99ps92", + "trigger_activity" : "nmdc:wfmgas-13-m54qtf91.1", + "iteration" : 1, + "input_prefix" : "annotation", + "inputs" : { + "input_file" : "https://data.microbiomedata.org/data/nmdc:omprc-13-zd99ps92/nmdc:wfmgas-13-m54qtf91.1/nmdc_wfmgas-13-m54qtf91.1_contigs.fna", + "imgap_project_id" : "scaffold", + "proj" : "nmdc:wfmgan-11-dvvh0237.1" + }, + "input_data_objects" : [ + { + "id" : "nmdc:dobj-13-8ytaz779", + "name" : "nmdc_wfmgas-13-m54qtf91.1_contigs.fna", + "description" : "Assembled contigs fasta for nmdc:omprc-13-zd99ps92", + "url" : "https://data.microbiomedata.org/data/nmdc:omprc-13-zd99ps92/nmdc:wfmgas-13-m54qtf91.1/nmdc_wfmgas-13-m54qtf91.1_contigs.fna", + "md5_checksum" : "8483663a943ff4c0fc0249353676bfc1", + "file_size_bytes" : 95957530, + "data_object_type" : "Assembly Contigs" + } + ], + "activity" : { + "name" : "Metagenome Annotation Analysis Activity for {id}", + "type" : "nmdc:MetagenomeAnnotationActivity" + }, + "outputs" : [ + { + "output" : "proteins_faa", + "data_object_type" : "Annotation Amino Acid FASTA", + "description" : "FASTA Amino Acid File for {id}", + "name" : "FASTA amino acid file for annotated proteins", + "id" : "nmdc:dobj-11-tt8ykk73" + }, + { + "output" : "structural_gff", + "data_object_type" : "Structural Annotation GFF", + "description" : "Structural Annotation for {id}", + "name" : "GFF3 format file with structural annotations", + "id" : "nmdc:dobj-11-xh82sm39" + }, + { + "output" : "functional_gff", + "data_object_type" : "Functional Annotation GFF", + "description" : "Functional Annotation for {id}", + "name" : "GFF3 format file with functional annotations", + "id" : "nmdc:dobj-11-xxffzc65" + }, + { + "output" : "ko_tsv", + "data_object_type" : "Annotation KEGG Orthology", + "description" : "KEGG Orthology for {id}", + "name" : "Tab delimited file for KO annotation", + "id" : "nmdc:dobj-11-0q21fa03" + }, + { + "output" : "ec_tsv", + "data_object_type" : "Annotation Enzyme Commission", + "description" : "EC Annotations for {id}", + "name" : "Tab delimited file for EC annotation", + "suffix" : "_ec.tsv", + "id" : "nmdc:dobj-11-hq2jz695" + }, + { + "output" : "lineage_tsv", + "data_object_type" : "Scaffold Lineage tsv", + "description" : "Scaffold Lineage tsv for {id}", + "name" : "Phylogeny at the scaffold level", + "suffix" : "_scaffold_lineage.tsv", + "id" : "nmdc:dobj-11-91b6k454" + }, + { + "output" : "cog_gff", + "data_object_type" : "Clusters of Orthologous Groups (COG) Annotation GFF", + "description" : "COGs for {id}", + "name" : "GFF3 format file with COGs", + "id" : "nmdc:dobj-11-wsjkk251" + }, + { + "output" : "pfam_gff", + "data_object_type" : "Pfam Annotation GFF", + "description" : "Pfam Annotation for {id}", + "name" : "GFF3 format file with Pfam", + "id" : "nmdc:dobj-11-7stjsq74" + }, + { + "output" : "tigrfam_gff", + "data_object_type" : "TIGRFam Annotation GFF", + "description" : "TIGRFam for {id}", + "name" : "GFF3 format file with TIGRfam", + "id" : "nmdc:dobj-11-w59s2397" + }, + { + "output" : "smart_gff", + "data_object_type" : "SMART Annotation GFF", + "description" : "SMART Annotations for {id}", + "name" : "GFF3 format file with SMART", + "id" : "nmdc:dobj-11-9d1sb298" + }, + { + "output" : "supfam_gff", + "data_object_type" : "SUPERFam Annotation GFF", + "description" : "SUPERFam Annotations for {id}", + "name" : "GFF3 format file with SUPERFam", + "id" : "nmdc:dobj-11-rsffjr58" + }, + { + "output" : "cath_funfam_gff", + "data_object_type" : "CATH FunFams (Functional Families) Annotation GFF", + "description" : "CATH FunFams for {id}", + "name" : "GFF3 format file with CATH FunFams", + "id" : "nmdc:dobj-11-7kp0zp78" + }, + { + "output" : "crt_gff", + "data_object_type" : "CRT Annotation GFF", + "description" : "CRT Annotations for {id}", + "name" : "GFF3 format file with CRT", + "id" : "nmdc:dobj-11-xq6ywj49" + }, + { + "output" : "genemark_gff", + "data_object_type" : "Genemark Annotation GFF", + "description" : "Genemark Annotations for {id}", + "name" : "GFF3 format file with Genemark", + "id" : "nmdc:dobj-11-2fm8f997" + }, + { + "output" : "prodigal_gff", + "data_object_type" : "Prodigal Annotation GFF", + "description" : "Prodigal Annotations {id}", + "name" : "GFF3 format file with Prodigal", + "id" : "nmdc:dobj-11-8tjfg176" + }, + { + "output" : "trna_gff", + "data_object_type" : "TRNA Annotation GFF", + "description" : "TRNA Annotations {id}", + "name" : "GFF3 format file with TRNA", + "id" : "nmdc:dobj-11-zwd23452" + }, + { + "output" : "final_rfam_gff", + "data_object_type" : "RFAM Annotation GFF", + "description" : "RFAM Annotations for {id}", + "name" : "GFF3 format file with RFAM", + "id" : "nmdc:dobj-11-m8wsj755" + }, + { + "output" : "ko_ec_gff", + "data_object_type" : "KO_EC Annotation GFF", + "description" : "KO_EC Annotations for {id}", + "name" : "GFF3 format file with KO_EC", + "id" : "nmdc:dobj-11-4mqqx605" + }, + { + "output" : "product_names_tsv", + "data_object_type" : "Product Names", + "description" : "Product names for {id}", + "name" : "Product names file", + "id" : "nmdc:dobj-11-wvhhv202" + }, + { + "output" : "gene_phylogeny_tsv", + "data_object_type" : "Gene Phylogeny tsv", + "description" : "Gene Phylogeny for {id}", + "name" : "Gene Phylogeny file", + "id" : "nmdc:dobj-11-k3q61q69" + }, + { + "output" : "crt_crisprs", + "data_object_type" : "Crispr Terms", + "description" : "Crispr Terms for {id}", + "name" : "Crispr Terms", + "id" : "nmdc:dobj-11-nhgfya98" + }, + { + "output" : "stats_tsv", + "data_object_type" : "Annotation Statistics", + "description" : "Annotation Stats for {id}", + "name" : "Annotation statistics report", + "id" : "nmdc:dobj-11-h80q9f77" + }, + { + "output" : "renamed_fasta", + "name" : "Renamed assembly contigs fasta", + "data_object_type" : "Assembly Contigs", + "description" : "Assembly contigs (remapped) for {id}", + "id" : "nmdc:dobj-11-hdbvxx08" + }, + { + "output" : "map_file", + "data_object_type" : "Contig Mapping File", + "description" : "Contig mappings file for {id}", + "name" : "Contig mappings between contigs and scaffolds", + "suffix" : "_contig_names_mapping.tsv", + "optional" : true, + "id" : "nmdc:dobj-11-65qdwa51" + }, + { + "output" : "imgap_version", + "data_object_type" : "Annotation Info File", + "description" : "Annotation info for {id}", + "name" : "File containing annotation info", + "id" : "nmdc:dobj-11-ps99c760" + } + ] + }, + "claims" : [ + { + "op_id" : "nmdc:sys0hsm3xt04", + "site_id" : "NERSC" + } + ] +} \ No newline at end of file diff --git a/tests/fixtures/jobs.json b/tests/fixtures/jobs.json index fe51488c..4525c1d9 100644 --- a/tests/fixtures/jobs.json +++ b/tests/fixtures/jobs.json @@ -1 +1,228 @@ -[] +[ + { + "workflow" : { + "id" : "Metagenome Annotation: v1.1.0" + }, + "id" : "nmdc:e18a4870-425c-11ef-8cc6-52b18d4509d1", + "created_at" : "2024-07-15T03:46:56.000+0000", + "config" : { + "git_repo" : "https://github.com/microbiomedata/mg_annotation", + "release" : "v1.1.0", + "wdl" : "annotation_full.wdl", + "activity_id" : "nmdc:wfmgan-11-dvvh0237.1", + "activity_set" : "metagenome_annotation_activity_set", + "was_informed_by" : "nmdc:omprc-13-zd99ps92", + "trigger_activity" : "nmdc:wfmgas-13-m54qtf91.1", + "iteration" : 1, + "input_prefix" : "annotation", + "inputs" : { + "input_file" : "https://data.microbiomedata.org/data/nmdc:omprc-13-zd99ps92/nmdc:wfmgas-13-m54qtf91.1/nmdc_wfmgas-13-m54qtf91.1_contigs.fna", + "imgap_project_id" : "scaffold", + "proj" : "nmdc:wfmgan-11-dvvh0237.1" + }, + "input_data_objects" : [ + { + "id" : "nmdc:dobj-13-8ytaz779", + "name" : "nmdc_wfmgas-13-m54qtf91.1_contigs.fna", + "description" : "Assembled contigs fasta for nmdc:omprc-13-zd99ps92", + "url" : "https://data.microbiomedata.org/data/nmdc:omprc-13-zd99ps92/nmdc:wfmgas-13-m54qtf91.1/nmdc_wfmgas-13-m54qtf91.1_contigs.fna", + "md5_checksum" : "8483663a943ff4c0fc0249353676bfc1", + "file_size_bytes" : 95957530, + "data_object_type" : "Assembly Contigs" + } + ], + "activity" : { + "name" : "Metagenome Annotation Analysis Activity for {id}", + "type" : "nmdc:MetagenomeAnnotationActivity" + }, + "outputs" : [ + { + "output" : "proteins_faa", + "data_object_type" : "Annotation Amino Acid FASTA", + "description" : "FASTA Amino Acid File for {id}", + "name" : "FASTA amino acid file for annotated proteins", + "id" : "nmdc:dobj-11-tt8ykk73" + }, + { + "output" : "structural_gff", + "data_object_type" : "Structural Annotation GFF", + "description" : "Structural Annotation for {id}", + "name" : "GFF3 format file with structural annotations", + "id" : "nmdc:dobj-11-xh82sm39" + }, + { + "output" : "functional_gff", + "data_object_type" : "Functional Annotation GFF", + "description" : "Functional Annotation for {id}", + "name" : "GFF3 format file with functional annotations", + "id" : "nmdc:dobj-11-xxffzc65" + }, + { + "output" : "ko_tsv", + "data_object_type" : "Annotation KEGG Orthology", + "description" : "KEGG Orthology for {id}", + "name" : "Tab delimited file for KO annotation", + "id" : "nmdc:dobj-11-0q21fa03" + }, + { + "output" : "ec_tsv", + "data_object_type" : "Annotation Enzyme Commission", + "description" : "EC Annotations for {id}", + "name" : "Tab delimited file for EC annotation", + "suffix" : "_ec.tsv", + "id" : "nmdc:dobj-11-hq2jz695" + }, + { + "output" : "lineage_tsv", + "data_object_type" : "Scaffold Lineage tsv", + "description" : "Scaffold Lineage tsv for {id}", + "name" : "Phylogeny at the scaffold level", + "suffix" : "_scaffold_lineage.tsv", + "id" : "nmdc:dobj-11-91b6k454" + }, + { + "output" : "cog_gff", + "data_object_type" : "Clusters of Orthologous Groups (COG) Annotation GFF", + "description" : "COGs for {id}", + "name" : "GFF3 format file with COGs", + "id" : "nmdc:dobj-11-wsjkk251" + }, + { + "output" : "pfam_gff", + "data_object_type" : "Pfam Annotation GFF", + "description" : "Pfam Annotation for {id}", + "name" : "GFF3 format file with Pfam", + "id" : "nmdc:dobj-11-7stjsq74" + }, + { + "output" : "tigrfam_gff", + "data_object_type" : "TIGRFam Annotation GFF", + "description" : "TIGRFam for {id}", + "name" : "GFF3 format file with TIGRfam", + "id" : "nmdc:dobj-11-w59s2397" + }, + { + "output" : "smart_gff", + "data_object_type" : "SMART Annotation GFF", + "description" : "SMART Annotations for {id}", + "name" : "GFF3 format file with SMART", + "id" : "nmdc:dobj-11-9d1sb298" + }, + { + "output" : "supfam_gff", + "data_object_type" : "SUPERFam Annotation GFF", + "description" : "SUPERFam Annotations for {id}", + "name" : "GFF3 format file with SUPERFam", + "id" : "nmdc:dobj-11-rsffjr58" + }, + { + "output" : "cath_funfam_gff", + "data_object_type" : "CATH FunFams (Functional Families) Annotation GFF", + "description" : "CATH FunFams for {id}", + "name" : "GFF3 format file with CATH FunFams", + "id" : "nmdc:dobj-11-7kp0zp78" + }, + { + "output" : "crt_gff", + "data_object_type" : "CRT Annotation GFF", + "description" : "CRT Annotations for {id}", + "name" : "GFF3 format file with CRT", + "id" : "nmdc:dobj-11-xq6ywj49" + }, + { + "output" : "genemark_gff", + "data_object_type" : "Genemark Annotation GFF", + "description" : "Genemark Annotations for {id}", + "name" : "GFF3 format file with Genemark", + "id" : "nmdc:dobj-11-2fm8f997" + }, + { + "output" : "prodigal_gff", + "data_object_type" : "Prodigal Annotation GFF", + "description" : "Prodigal Annotations {id}", + "name" : "GFF3 format file with Prodigal", + "id" : "nmdc:dobj-11-8tjfg176" + }, + { + "output" : "trna_gff", + "data_object_type" : "TRNA Annotation GFF", + "description" : "TRNA Annotations {id}", + "name" : "GFF3 format file with TRNA", + "id" : "nmdc:dobj-11-zwd23452" + }, + { + "output" : "final_rfam_gff", + "data_object_type" : "RFAM Annotation GFF", + "description" : "RFAM Annotations for {id}", + "name" : "GFF3 format file with RFAM", + "id" : "nmdc:dobj-11-m8wsj755" + }, + { + "output" : "ko_ec_gff", + "data_object_type" : "KO_EC Annotation GFF", + "description" : "KO_EC Annotations for {id}", + "name" : "GFF3 format file with KO_EC", + "id" : "nmdc:dobj-11-4mqqx605" + }, + { + "output" : "product_names_tsv", + "data_object_type" : "Product Names", + "description" : "Product names for {id}", + "name" : "Product names file", + "id" : "nmdc:dobj-11-wvhhv202" + }, + { + "output" : "gene_phylogeny_tsv", + "data_object_type" : "Gene Phylogeny tsv", + "description" : "Gene Phylogeny for {id}", + "name" : "Gene Phylogeny file", + "id" : "nmdc:dobj-11-k3q61q69" + }, + { + "output" : "crt_crisprs", + "data_object_type" : "Crispr Terms", + "description" : "Crispr Terms for {id}", + "name" : "Crispr Terms", + "id" : "nmdc:dobj-11-nhgfya98" + }, + { + "output" : "stats_tsv", + "data_object_type" : "Annotation Statistics", + "description" : "Annotation Stats for {id}", + "name" : "Annotation statistics report", + "id" : "nmdc:dobj-11-h80q9f77" + }, + { + "output" : "renamed_fasta", + "name" : "Renamed assembly contigs fasta", + "data_object_type" : "Assembly Contigs", + "description" : "Assembly contigs (remapped) for {id}", + "id" : "nmdc:dobj-11-hdbvxx08" + }, + { + "output" : "map_file", + "data_object_type" : "Contig Mapping File", + "description" : "Contig mappings file for {id}", + "name" : "Contig mappings between contigs and scaffolds", + "suffix" : "_contig_names_mapping.tsv", + "optional" : true, + "id" : "nmdc:dobj-11-65qdwa51" + }, + { + "output" : "imgap_version", + "data_object_type" : "Annotation Info File", + "description" : "Annotation info for {id}", + "name" : "File containing annotation info", + "id" : "nmdc:dobj-11-ps99c760" + } + ] + }, + "claims" : [ + { + "op_id" : "nmdc:sys0hsm3xt04", + "site_id" : "NERSC" + } + ] +} + +] diff --git a/tests/test_models.py b/tests/test_models.py index 026f2aa2..9fcb8ab4 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -3,6 +3,11 @@ from pytest import mark from nmdc_automation.workflow_automation.models import( DataObject, + Job, + JobClaim, + JobConfig, + JobOutput, + JobWorkflow, WorkflowProcessNode, workflow_process_factory, ) @@ -99,3 +104,30 @@ def test_data_object_creation_from_db_records(test_db): data_obj_dict = data_obj.as_dict() assert data_obj_dict == db_record + + +def test_job_output_creation(): + outputs = [ + { + "output": "proteins_faa", + "data_object_type": "Annotation Amino Acid FASTA", + "description": "FASTA Amino Acid File for {id}", + "name": "FASTA amino acid file for annotated proteins", + "id": "nmdc:dobj-11-tt8ykk73" + }, + { + "output": "structural_gff", + "data_object_type": "Structural Annotation GFF", + "description": "Structural Annotation for {id}", + "name": "GFF3 format file with structural annotations", + "id": "nmdc:dobj-11-xh82sm39" + } + ] + for output in outputs: + job_output = JobOutput(**output) + +def test_job_creation(): + job_record = db_utils.read_json("job_record.json") + job = Job(**job_record) + assert job.id == job_record["id"] + assert isinstance(job.workflow, JobWorkflow) \ No newline at end of file diff --git a/tests/test_sched.py b/tests/test_sched.py index 51b918d6..6d25a253 100644 --- a/tests/test_sched.py +++ b/tests/test_sched.py @@ -1,4 +1,4 @@ -from nmdc_automation.workflow_automation.sched import Scheduler, Job +from nmdc_automation.workflow_automation.sched import Scheduler, SchedulerJob from pytest import mark From d1b6af5298d7e6dada64fd27635baa4f37b8697d Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Fri, 27 Sep 2024 12:45:18 -0700 Subject: [PATCH 41/52] Add beginning of Job model to represent jobs in the DB --- nmdc_automation/workflow_automation/models.py | 85 +++++++++++++++++-- 1 file changed, 80 insertions(+), 5 deletions(-) diff --git a/nmdc_automation/workflow_automation/models.py b/nmdc_automation/workflow_automation/models.py index 4c1f4a6c..b2b97693 100644 --- a/nmdc_automation/workflow_automation/models.py +++ b/nmdc_automation/workflow_automation/models.py @@ -1,6 +1,8 @@ """ Model classes for the workflow automation app. """ from dataclasses import dataclass, field -from typing import List, Dict, Any, Optional, Set +from dateutil import parser +from datetime import datetime +from typing import List, Dict, Any, Optional, Set, Union from nmdc_schema.nmdc import ( FileTypeEnum, @@ -14,6 +16,7 @@ PlannedProcess, ReadBasedTaxonomyAnalysis, ReadQcAnalysis, + WorkflowExecution ) from nmdc_schema import nmdc @@ -45,8 +48,8 @@ def workflow_process_factory(record: Dict[str, Any]) -> PlannedProcess: class WorkflowProcessNode(object): """ - Class to represent a workflow execution node. This is a node in a tree - structure that represents the execution hierarchy of data generation and + Class to represent a workflow processing node. This is a node in a tree + structure that represents the tree of data generation and workflow execution objects with their associated data objects. """ def __init__(self, record: Dict[str, Any], workflow: "WorkflowConfig"): @@ -116,6 +119,8 @@ def __init__(self, **record): """ Initialize the object from a dictionary """ # _id is a MongoDB field that makes the parent class fail to initialize record.pop("_id", None) + if "type" not in record: + record["type"] = "nmdc:DataObject" super().__init__(**record) def as_dict(self): @@ -144,7 +149,7 @@ def data_object_type(self, value): @dataclass class WorkflowConfig: - """ Configuration for a workflow execution """ + """ Configuration for a workflow execution. Defined by .yaml files in nmdc_automation/config/workflows """ # Sequencing workflows only have these fields name: str collection: str @@ -196,4 +201,74 @@ def add_child(self, child: "WorkflowConfig"): def add_parent(self, parent: "WorkflowConfig"): """ Add a parent workflow """ - self.parents.add(parent) \ No newline at end of file + self.parents.add(parent) + +@dataclass +class WorkflowJobState: + """ State data for a workflow job """ + type: str + cromwell_job_id: str + nmdc_job_id: str + type: str + + +@dataclass +class JobWorkflow: + id: str + + +@dataclass +class JobWorkflow: + id: str + +@dataclass +class JobConfig: + """ Represents a job configuration from the NMDC API jobs endpoint / MongoDB jobs collection """ + object_id: str + +@dataclass +class JobClaim: + op_id: str + site_id: str + +@dataclass +class JobOutput: + """ Represents a job output specification. """ + output: str + data_object: DataObject = field(init=False) + + # Raw fields that will map to DataObject fields + data_object_type: str + description: Optional[str] + name: str + id: str + + def __post_init__(self): + """ Initialize the object """ + self.data_object = DataObject( + id=self.id, + name=self.name, + data_object_type=self.data_object_type, + description=self.description, + ) + +@dataclass +class Job: + """ Represents a job from the NMDC API jobs endpoint / MongoDB jobs collection """ + id: str + workflow: JobWorkflow + config: JobConfig + created_at: Optional[datetime] = field(default=None) + claims: List[JobClaim] = field(default_factory=list) + input_data_objects: List[DataObject] = field(default_factory=list) + outputs: List[JobOutput] = field(default_factory=list) + + def __post_init__(self): + """ If created_at is a string, convert it to a datetime object """ + if isinstance(self.created_at, str): + self.created_at = parser.isoparse(self.created_at) + + if isinstance(self.workflow, dict): + self.workflow = JobWorkflow(**self.workflow) + + From 77ab9048c53d595ff05438820e1bd6390fc837bc Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Fri, 27 Sep 2024 12:45:47 -0700 Subject: [PATCH 42/52] add docstrings and minor cleanup --- nmdc_automation/workflow_automation/wfutils.py | 4 ++-- nmdc_automation/workflow_automation/workflow_job.py | 9 +++++++++ nmdc_automation/workflow_automation/workflow_process.py | 1 + nmdc_automation/workflow_automation/workflows.py | 2 +- 4 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 nmdc_automation/workflow_automation/workflow_job.py diff --git a/nmdc_automation/workflow_automation/wfutils.py b/nmdc_automation/workflow_automation/wfutils.py index 526f9b78..47e398a8 100755 --- a/nmdc_automation/workflow_automation/wfutils.py +++ b/nmdc_automation/workflow_automation/wfutils.py @@ -43,7 +43,7 @@ class WorkflowJob: def __init__( self, site_config, - typ=None, + type=None, workflow_config=None, nmdc_jobid=None, opid=None, @@ -56,7 +56,7 @@ def __init__( self.set_config_attributes() if workflow_config: self.load_workflow_config() - self.set_initial_state(state, activity_id, typ, nmdc_jobid, opid) + self.set_initial_state(state, activity_id, type, nmdc_jobid, opid) if self.jobid and not nocheck: self.check_status() diff --git a/nmdc_automation/workflow_automation/workflow_job.py b/nmdc_automation/workflow_automation/workflow_job.py new file mode 100644 index 00000000..e0c2cd26 --- /dev/null +++ b/nmdc_automation/workflow_automation/workflow_job.py @@ -0,0 +1,9 @@ +""" +Classes and methods for managing workflow jobs. +""" +from typing import List, Dict, Any + + +class WorkflowJob: + def __init__(self): + pass \ No newline at end of file diff --git a/nmdc_automation/workflow_automation/workflow_process.py b/nmdc_automation/workflow_automation/workflow_process.py index 33431f06..1e2b5382 100644 --- a/nmdc_automation/workflow_automation/workflow_process.py +++ b/nmdc_automation/workflow_automation/workflow_process.py @@ -1,3 +1,4 @@ +""" This module contains functions to load workflow process nodes from the database. """ import logging from functools import lru_cache from typing import List, Dict diff --git a/nmdc_automation/workflow_automation/workflows.py b/nmdc_automation/workflow_automation/workflows.py index af8e9193..df586fea 100644 --- a/nmdc_automation/workflow_automation/workflows.py +++ b/nmdc_automation/workflow_automation/workflows.py @@ -1,4 +1,4 @@ -from __future__ import annotations +""" This module reads the workflows yaml file and returns a list of WorkflowConfig objects""" from yaml import load try: From 3c1ee81cbe252be06391c85ad6dc3e95d3b7f90c Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Fri, 27 Sep 2024 12:47:43 -0700 Subject: [PATCH 43/52] Udate MAGs version to 1.3.10 --- nmdc_automation/config/workflows/workflows.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nmdc_automation/config/workflows/workflows.yaml b/nmdc_automation/config/workflows/workflows.yaml index 3837660e..ed3256fc 100644 --- a/nmdc_automation/config/workflows/workflows.yaml +++ b/nmdc_automation/config/workflows/workflows.yaml @@ -289,7 +289,7 @@ Workflows: Enabled: True Analyte Category: Metagenome Git_repo: https://github.com/microbiomedata/metaMAGs - Version: v1.3.4 + Version: v1.3.10 WDL: mbin_nmdc.wdl Collection: workflow_execution_set Predecessors: From bb546e3eb31b0927465535e98d5b84ed6135e019 Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Fri, 27 Sep 2024 13:00:38 -0700 Subject: [PATCH 44/52] add metaT types to activity_map --- nmdc_automation/workflow_automation/wfutils.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/nmdc_automation/workflow_automation/wfutils.py b/nmdc_automation/workflow_automation/wfutils.py index 47e398a8..6f9dc25b 100755 --- a/nmdc_automation/workflow_automation/wfutils.py +++ b/nmdc_automation/workflow_automation/wfutils.py @@ -361,14 +361,26 @@ def activity_map(self): self.nmdc_db.workflow_execution_set, nmdc.MetagenomeAssembly, ), + "nmdc:MetatranscriptomeAssembly": ( + self.nmdc_db.workflow_execution_set, + nmdc.MetatranscriptomeAssembly, + ), "nmdc:MetagenomeAnnotation": ( self.nmdc_db.workflow_execution_set, nmdc.MetagenomeAnnotation, ), + "nmdc:MetatranscriptomeAnnotation": ( + self.nmdc_db.workflow_execution_set, + nmdc.MetatranscriptomeAnnotation, + ), "nmdc:MagsAnalysis": ( self.nmdc_db.workflow_execution_set, nmdc.MagsAnalysis, ), + "nmdc:MetatranscriptomeExpressionAnalysis": ( + self.nmdc_db.workflow_execution_set, + nmdc.MetatranscriptomeExpressionAnalysis, + ), } return activity_store_dict From dbd715fa8d71406d782dd228621a3bfac06d8cac Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Fri, 27 Sep 2024 13:05:04 -0700 Subject: [PATCH 45/52] delete unused mags fixture --- tests/fixtures/mags_activity.json | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 tests/fixtures/mags_activity.json diff --git a/tests/fixtures/mags_activity.json b/tests/fixtures/mags_activity.json deleted file mode 100644 index 3d99cd5e..00000000 --- a/tests/fixtures/mags_activity.json +++ /dev/null @@ -1,25 +0,0 @@ -[ - { - "has_input": [ - "nmdc:37573bca240f88091720ae61ae5c9452", - "nmdc:da186671c5a581af0a7d195bd857c871", - "nmdc:4d41794368ed796500bb6d2c82a6787a" - ], - "git_url": "https://github.com/microbiomedata/mg_annotation/releases/tag/0.1", - "has_output": [ - "nmdc:d41d8cd98f00b204e9800998ecf8427e", - "nmdc:38f5521b558377503f6e9a635998dd37", - "nmdc:cf96331e23aa34224990105374272877", - "nmdc:4d12e1cab7ee7e72ea48151dfc0354c6", - "nmdc:52309bf9398a5b0c401e1e23f5e414df", - "nmdc:77b1712067645b362aee53aad59000e2" - ], - "was_informed_by": "nmdc:omprc-11-nhy4pz43", - "id": "nmdc:fdefb3fa15098906cf788f5cadf17bb3", - "execution_resource": "NERSC-Cori", - "name": "MAGs Analysis Activity for nmdc:mga0vx38", - "started_at_time": "2021-08-05T14:48:51+00:00", - "type": "nmdc:MAGsAnalysis", - "ended_at_time": "2021-09-15T10:13:20+00:00" - } -] From c8273f94fe1feae4b75eb8eca0de9773fe685b93 Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Fri, 27 Sep 2024 13:36:19 -0700 Subject: [PATCH 46/52] remove unused workflows_test.yaml files --- tests/workflows_test.yaml | 446 ------------------------------------- tests/workflows_test2.yaml | 398 --------------------------------- 2 files changed, 844 deletions(-) delete mode 100644 tests/workflows_test.yaml delete mode 100644 tests/workflows_test2.yaml diff --git a/tests/workflows_test.yaml b/tests/workflows_test.yaml deleted file mode 100644 index 293f22be..00000000 --- a/tests/workflows_test.yaml +++ /dev/null @@ -1,446 +0,0 @@ -Workflows: - - Name: Sequencing Noninterleaved - Collection: data_generation_set - Enabled: True - Filter Output Objects: - - Metagenome Raw Read 1 - - Metagenome Raw Read 2 - - - Name: Sequencing Interleaved - Collection: data_generation_set - Enabled: True - Filter Output Objects: - - Metagenome Raw Reads - - - Name: Sequencing - Type: nmdc:MetagenomeSequencing - Enabled: False - Git_repo: https://github.com/microbiomedata/RawSequencingData - Version: v1.0.0 - Collection: workflow_execution_set - Outputs: [] - - - Name: Reads QC - Type: nmdc:ReadQcAnalysis - Enabled: True - Git_repo: https://github.com/microbiomedata/ReadsQC - Version: v1.0.7 - WDL: rqcfilter.wdl - Collection: workflow_execution_set - Filter Input Objects: - - Metagenome Raw Reads - Predecessors: - - Sequencing - - Sequencing Interleaved - Input_prefix: nmdc_rqcfilter - Inputs: - input_files: do:Metagenome Raw Reads - proj: "{activity_id}" - Workflow Execution: - name: "Read QC for {id}" - input_read_bases: "{outputs.stats.input_read_bases}" - input_read_count: "{outputs.stats.input_read_count}" - output_read_bases: "{outputs.stats.output_read_bases}" - output_read_count: "{outputs.stats.output_read_count}" - type: nmdc:ReadQcAnalysis - Outputs: - - output: filtered_final - name: Reads QC result fastq (clean data) - suffix: "_filtered.fastq.gz" - data_object_type: Filtered Sequencing Reads - description: "Reads QC for {id}" - - output: filtered_stats_final - name: Reads QC summary statistics - suffix: "_filterStats.txt" - data_object_type: QC Statistics - description: "Reads QC summary for {id}" - - output: rqc_info - name: File containing read filtering information - suffix: "_readsQC.info" - data_object_type: Read Filtering Info File - description: "Read filtering info for {id}" - - - Name: Reads QC Interleave - Type: nmdc:ReadQcAnalysis - Enabled: True - Git_repo: https://github.com/microbiomedata/ReadsQC - Version: v1.0.7 - Collection: workflow_execution_set - WDL: interleave_rqcfilter.wdl - Input_prefix: nmdc_rqcfilter - Inputs: - proj: "{activity_id}" - input_fastq1: do:Metagenome Raw Read 1 - input_fastq2: do:Metagenome Raw Read 2 - Filter Input Objects: - - Metagenome Raw Read 1 - - Metagenome Raw Read 2 - Predecessors: - - Sequencing Noninterleaved - Workflow Execution: - name: "Read QC for {id}" - input_read_bases: "{outputs.stats.input_read_bases}" - input_read_count: "{outputs.stats.input_read_count}" - output_read_bases: "{outputs.stats.output_read_bases}" - output_read_count: "{outputs.stats.output_read_count}" - type: nmdc:ReadQcAnalysis - Outputs: - - output: filtered_final - name: Reads QC result fastq (clean data) - suffix: "_filtered.fastq.gz" - data_object_type: Filtered Sequencing Reads - description: "Reads QC for {id}" - - output: filtered_stats_final - name: Reads QC summary statistics - suffix: "_filterStats.txt" - data_object_type: QC Statistics - description: "Reads QC summary for {id}" - - output: rqc_info - name: File containing read filtering information - suffix: "_readsQC.info" - data_object_type: Read Filtering Info File - description: "Read filtering info for {id}" - - - Name: Metagenome Assembly - Type: nmdc:MetagenomeAssembly - Enabled: True - Git_repo: https://github.com/microbiomedata/metaAssembly - Version: v1.0.3 - WDL: jgi_assembly.wdl - Collection: workflow_execution_set - Predecessors: - - Reads QC - - Reads QC Interleave - Input_prefix: jgi_metaASM - Inputs: - input_file: do:Filtered Sequencing Reads - rename_contig_prefix: "{activity_id}" - proj: "{activity_id}" - Workflow Execution: - name: "Metagenome Assembly for {id}" - type: nmdc:MetagenomeAssembly - asm_score: "{outputs.stats.asm_score}" - contig_bp: "{outputs.stats.contig_bp}" - contigs: "{outputs.stats.contigs}" - ctg_l50: "{outputs.stats.ctg_l50}" - ctg_l90: "{outputs.stats.ctg_l90}" - ctg_logsum: "{outputs.stats.ctg_logsum}" - ctg_max: "{outputs.stats.ctg_max}" - ctg_n50: "{outputs.stats.ctg_n50}" - ctg_n90: "{outputs.stats.ctg_n90}" - ctg_powsum: "{outputs.stats.ctg_powsum}" - gap_pct: "{outputs.stats.gap_pct}" - gc_avg: "{outputs.stats.gc_avg}" - gc_std: "{outputs.stats.gc_std}" - scaf_bp: "{outputs.stats.scaf_bp}" - scaf_l50: "{outputs.stats.scaf_l50}" - scaf_l90: "{outputs.stats.scaf_l90}" - scaf_l_gt50k: "{outputs.stats.scaf_l_gt50k}" - scaf_logsum: "{outputs.stats.scaf_logsum}" - scaf_max: "{outputs.stats.scaf_max}" - scaf_n50: "{outputs.stats.scaf_n50}" - scaf_n90: "{outputs.stats.scaf_n90}" - scaf_n_gt50k: "{outputs.stats.scaf_n_gt50k}" - scaf_pct_gt50k: "{outputs.stats.scaf_pct_gt50k}" - scaf_powsum: "{outputs.stats.scaf_powsum}" - scaffolds: "{outputs.stats.scaffolds}" - Outputs: - - output: contig - name: Final assembly contigs fasta - suffix: "_contigs.fna" - data_object_type: Assembly Contigs - description: "Assembly contigs for {id}" - - output: scaffold - name: Final assembly scaffolds fasta - suffix: "_scaffolds.fna" - data_object_type: Assembly Scaffolds - description: "Assembly scaffolds for {id}" - - output: covstats - name: Assembled contigs coverage information - suffix: "_covstats.txt" - data_object_type: Assembly Coverage Stats - description: "Coverage Stats for {id}" - - output: agp - name: An AGP format file that describes the assembly - suffix: "_assembly.agp" - data_object_type: Assembly AGP - description: "AGP for {id}" - - output: bam - name: Sorted bam file of reads mapping back to the final assembly - suffix: "_pairedMapped_sorted.bam" - data_object_type: Assembly Coverage BAM - description: "Sorted Bam for {id}" - - output: asminfo - name: File containing assembly info - suffix: "_metaAsm.info" - data_object_type: Assembly Info File - description: "Assembly info for {id}" - - - Name: Metagenome Annotation - Type: nmdc:MetagenomeAnnotation - Enabled: True - Git_repo: https://github.com/microbiomedata/mg_annotation - Version: v1.0.4 - WDL: annotation_full.wdl - Collection: workflow_execution_set - Predecessors: - - Metagenome Assembly - Input_prefix: annotation - Inputs: - input_file: do:Assembly Contigs - imgap_project_id: "scaffold" - proj: "{activity_id}" - assembly_id: "{predecessor_activity_id}" - Workflow Execution: - name: "Metagenome Annotation Analysis for {id}" - type: nmdc:MetagenomeAnnotation - Outputs: - - output: proteins_faa - data_object_type: Annotation Amino Acid FASTA - description: FASTA Amino Acid File for {id} - name: FASTA amino acid file for annotated proteins - suffix: _proteins.faa - - output: structural_gff - data_object_type: Structural Annotation GFF - description: Structural Annotation for {id} - name: GFF3 format file with structural annotations - suffix: _structural_annotation.gff - - output: functional_gff - data_object_type: Functional Annotation GFF - description: Functional Annotation for {id} - name: GFF3 format file with functional annotations - suffix: _functional_annotation.gff - - output: ko_tsv - data_object_type: Annotation KEGG Orthology - description: KEGG Orthology for {id} - name: Tab delimited file for KO annotation - suffix: _ko.tsv - - output: ec_tsv - data_object_type: Annotation Enzyme Commission - description: EC Annotations for {id} - name: Tab delimited file for EC annotation - suffix: _ec.tsv - - output: cog_gff - data_object_type: Clusters of Orthologous Groups (COG) Annotation GFF - description: COGs for {id} - name: GFF3 format file with COGs - suffix: _cog.gff - - output: pfam_gff - data_object_type: Pfam Annotation GFF - description: Pfam Annotation for {id} - name: GFF3 format file with Pfam - suffix: _pfam.gff - - output: tigrfam_gff - data_object_type: TIGRFam Annotation GFF - description: TIGRFam for {id} - name: GFF3 format file with TIGRfam - suffix: _tigrfam.gff - - output: smart_gff - data_object_type: SMART Annotation GFF - description: SMART Annotations for {id} - name: GFF3 format file with SMART - suffix: _smart.gff - - output: supfam_gff - data_object_type: SUPERFam Annotation GFF - description: SUPERFam Annotations for {id} - name: GFF3 format file with SUPERFam - suffix: _supfam.gff - - output: cath_funfam_gff - data_object_type: CATH FunFams (Functional Families) Annotation GFF - description: CATH FunFams for {id} - name: GFF3 format file with CATH FunFams - suffix: _cath_funfam.gff - - output: crt_gff - data_object_type: CRT Annotation GFF - description: CRT Annotations for {id} - name: GFF3 format file with CRT - suffix: _crt.gff - - output: genemark_gff - data_object_type: Genemark Annotation GFF - description: Genemark Annotations for {id} - name: GFF3 format file with Genemark - suffix: _genemark.gff - - output: prodigal_gff - data_object_type: Prodigal Annotation GFF - description: Prodigal Annotations {id} - name: GFF3 format file with Prodigal - suffix: _prodigal.gff - - output: trna_gff - data_object_type: TRNA Annotation GFF - description: TRNA Annotations {id} - name: GFF3 format file with TRNA - suffix: _trna.gff - - output: final_rfam_gff - data_object_type: RFAM Annotation GFF - description: RFAM Annotations for {id} - name: GFF3 format file with RFAM - suffix: _rfam.gff - - output: ko_ec_gff - data_object_type: KO_EC Annotation GFF - description: KO_EC Annotations for {id} - name: GFF3 format file with KO_EC - suffix: _ko_ec.gff - - output: product_names_tsv - data_object_type: Product Names - description: Product names for {id} - name: Product names file - suffix: _product_names.tsv - - output: gene_phylogeny_tsv - data_object_type: Gene Phylogeny tsv - description: Gene Phylogeny for {id} - name: Gene Phylogeny file - suffix: _gene_phylogeny.tsv - - output: crt_crisprs - data_object_type: Crispr Terms - description: Crispr Terms for {id} - name: Crispr Terms - suffix: _crt.crisprs - - output: stats_tsv - data_object_type: Annotation Statistics - description: Annotation Stats for {id} - name: Annotation statistics report - suffix: _stats.tsv - - output: contig_mapping - data_object_type: Contig Mapping File - description: Contig mappings file for {id} - name: Contig mappings between contigs and scaffolds - suffix: _contig_names_mapping.tsv - optional: True - - output: imgap_version - data_object_type: Annotation Info File - description: Annotation info for {id} - name: File containing annotation info - suffix: _imgap.info - - output: renamed_fasta - data_object_type: Assembly Contigs - description: Assembly contigs (remapped) for {id} - name: File containing contigs with annotation headers - - - Name: MAGs - Type: nmdc:MagsAnalysis - Enabled: True - Git_repo: https://github.com/microbiomedata/metaMAGs - Version: v1.0.6 - WDL: mbin_nmdc.wdl - Collection: workflow_execution_set - Predecessors: - - Metagenome Annotation - Input_prefix: nmdc_mags - Inputs: - contig_file: do:Assembly Contigs - gff_file: do:Functional Annotation GFF - cath_funfam_file: do:CATH FunFams (Functional Families) Annotation GFF - supfam_file: do:SUPERFam Annotation GFF - cog_file: do:Clusters of Orthologous Groups (COG) Annotation GFF - proj_name: "{activity_id}" - pfam_file: do:Pfam Annotation GFF - product_names_file: do:Product Names - tigrfam_file: do:TIGRFam Annotation GFF - ec_file: do:Annotation Enzyme Commission - ko_file: do:Annotation KEGG Orthology - sam_file: do:Assembly Coverage BAM - smart_file: do:SMART Annotation GFF - proteins_file: do:Annotation Amino Acid FASTA - gene_phylogeny_file: do:Gene Phylogeny tsv - proj: "{activity_id}" - map_file: do:Annotation Mapping File - Optional Inputs: - - map_file - Workflow Execution: - name: "Metagenome Assembled Genomes Analysis for {id}" - type: nmdc:MagsAnalysis - Outputs: - - output: final_checkm - data_object_type: CheckM Statistics - description: CheckM for {id} - name: CheckM statistics report - suffix: _checkm_qa.out - - output: final_hqmq_bins_zip - data_object_type: Metagenome Bins - description: Metagenome Bins for {id} - name: Metagenome bin tarfiles archive - suffix: _hqmq_bin.zip - - output: final_gtdbtk_bac_summary - data_object_type: GTDBTK Bacterial Summary - description: Bacterial Summary for {id} - name: GTDBTK bacterial summary - suffix: _gtdbtk.bac122.summary.tsv - - output: final_gtdbtk_ar_summary - data_object_type: GTDBTK Archaeal Summary - description: Archaeal Summary for {id} - name: GTDBTK archaeal summary - suffix: _gtdbtk.ar122.summary.tsv - - output: mags_version - data_object_type: Metagenome Bins Info File - description: Metagenome Bins Info File for {id} - name: Metagenome Bins Info File - suffix: _bin.info - - - Name: Readbased Analysis - Type: nmdc:ReadBasedTaxonomyAnalysis - Enabled: True - Git_repo: https://github.com/microbiomedata/ReadbasedAnalysis - Version: v1.0.5 - WDL: ReadbasedAnalysis.wdl - Collection: workflow_execution_set - Predecessors: - - Reads QC - - Reads QC Interleave - Input_prefix: ReadbasedAnalysis - Inputs: - input_file: do:Filtered Sequencing Reads - proj: "{activity_id}" - Workflow Execution: - name: "Readbased Taxonomy Analysis for {id}" - type: nmdc:ReadBasedTaxonomyAnalysis - Outputs: - - output: final_gottcha2_report_tsv - data_object_type: GOTTCHA2 Classification Report - description: GOTTCHA2 Classification for {id} - name: GOTTCHA2 classification report file - suffix: _gottcha2_report.tsv - - output: final_gottcha2_full_tsv - data_object_type: GOTTCHA2 Report Full - description: GOTTCHA2 Full Report for {id} - name: GOTTCHA2 report file - suffix: _gottcha2_full_tsv - - output: final_gottcha2_krona_html - data_object_type: GOTTCHA2 Krona Plot - description: GOTTCHA2 Krona for {id} - name: GOTTCHA2 krona plot HTML file - suffix: _gottcha2_krona.html - - output: final_centrifuge_classification_tsv - data_object_type: Centrifuge Taxonomic Classification - description: Centrifuge Classification for {id} - name: Centrifuge output read classification file - suffix: _centrifuge_classification.tsv - - output: final_centrifuge_report_tsv - data_object_type: Centrifuge output report file - description: Centrifuge Report for {id} - name: Centrifuge Classification Report - suffix: _centrifuge_report.tsv - - output: final_centrifuge_krona_html - data_object_type: Centrifuge Krona Plot - description: Centrifuge Krona for {id} - name: Centrifug krona plot HTML file - suffix: _centrifuge_krona.html - - output: final_kraken2_classification_tsv - data_object_type: Kraken2 Taxonomic Classification - description: Kraken2 Classification for {id} - name: Kraken2 output read classification file - suffix: _kraken2_classification.tsv - - output: final_kraken2_report_tsv - data_object_type: Kraken2 Classification Report - description: Kraken2 Report for {id} - name: Kraken2 output report file - suffix: _kraken2_report.tsv - - output: final_kraken2_krona_html - data_object_type: Kraken2 Krona Plot - description: Kraken2 Krona for {id} - name: Kraken2 Krona plot HTML file - suffix: _kraken2_krona.html - - output: info_file - data_object_type: Read Based Analysis Info File - description: Read based analysis info for {id} - name: File containing reads based analysis information - suffix: profiler.info diff --git a/tests/workflows_test2.yaml b/tests/workflows_test2.yaml deleted file mode 100644 index a559ebaf..00000000 --- a/tests/workflows_test2.yaml +++ /dev/null @@ -1,398 +0,0 @@ -Workflows: - - Name: Sequencing Noninterleaved - Collection: data_generation_set - Enabled: True - Filter Output Objects: - - Metagenome Raw Read 1 - - Metagenome Raw Read 2 - - - Name: Sequencing Interleaved - Collection: data_generation_set - Enabled: True - Filter Output Objects: - - Metagenome Raw Reads - - - Name: Sequencing - Type: nmdc:MetagenomeSequencing - Enabled: False - Git_repo: https://github.com/microbiomedata/RawSequencingData - Version: v1.0.0 - Collection: workflow_execution_set - - - Name: Reads QC - Type: nmdc:ReadQcAnalysis - Enabled: True - Git_repo: https://github.com/microbiomedata/ReadsQC - Version: v1.0.7 - WDL: rqcfilter.wdl - Collection: workflow_execution_set - Filter Input Objects: - - Metagenome Raw Reads - Predecessors: - - Sequencing - - Sequencing Interleaved - Input_prefix: nmdc_rqcfilter - Inputs: - input_files: do:Metagenome Raw Reads - proj: "{activity_id}" - WorkflowExecution: - name: "Read QC for {id}" - input_read_bases: "{outputs.stats.input_read_bases}" - input_read_count: "{outputs.stats.input_read_count}" - output_read_bases: "{outputs.stats.output_read_bases}" - output_read_count: "{outputs.stats.output_read_count}" - type: nmdc:ReadQcAnalysis - Outputs: - - output: filtered_final - name: Reads QC result fastq (clean data) - data_object_type: Filtered Sequencing Reads - description: "Reads QC for {id}" - - output: filtered_stats_final - name: Reads QC summary statistics - data_object_type: QC Statistics - description: "Reads QC summary for {id}" - - - Name: Reads QC - Type: nmdc:ReadQcAnalysis - Enabled: True - Git_repo: https://github.com/microbiomedata/ReadsQC - Version: v1.1.8 - WDL: rqcfilter.wdl - Collection: workflow_execution_set - Filter Input Objects: - - Metagenome Raw Reads - Predecessors: - - Sequencing - - Sequencing Interleaved - Input_prefix: nmdc_rqcfilter - Inputs: - input_files: do:Metagenome Raw Reads - proj: "{activity_id}" - WorkflowExecution: - name: "Read QC for {id}" - input_read_bases: "{outputs.stats.input_read_bases}" - input_read_count: "{outputs.stats.input_read_count}" - output_read_bases: "{outputs.stats.output_read_bases}" - output_read_count: "{outputs.stats.output_read_count}" - type: nmdc:ReadQcAnalysis - Outputs: - - output: filtered_final - name: Reads QC result fastq (clean data) - data_object_type: Filtered Sequencing Reads - description: "Reads QC for {id}" - - output: filtered_stats_final - name: Reads QC summary statistics - data_object_type: QC Statistics - description: "Reads QC summary for {id}" - - - Name: ReadsQC Interleave - Type: nmdc:ReadQcAnalysis - Enabled: True - Git_repo: https://github.com/microbiomedata/ReadsQC - Version: v1.0.7 - Collection: workflow_execution_set - WDL: make_interleave_reads.wdl - Inputs: - proj: "{activity_id}" - input_file_1: do:Metagenome Raw Read 1 - input_file_2: do:Metagenome Raw Read 2 - Filter Input Objects: - - Metagenome Raw Read 1 - - Metagenome Raw Read 2 - Predecessors: - - Sequencing Noninterleaved - Input_prefix: nmdc_rqcfilter - WorkflowExecution: - name: "Read QC for {id}" - input_read_bases: "{outputs.stats.input_read_bases}" - input_read_count: "{outputs.stats.input_read_count}" - output_read_bases: "{outputs.stats.output_read_bases}" - output_read_count: "{outputs.stats.output_read_count}" - type: nmdc:ReadQcAnalysis - Outputs: - - output: filtered_final - name: Reads QC result fastq (clean data) - data_object_type: Filtered Sequencing Reads - description: "Reads QC for {id}" - - output: filtered_stats_final - name: Reads QC summary statistics - data_object_type: QC Statistics - description: "Reads QC summary for {id}" - - output: rqc_info - name: File containing read filtering information - data_object_type: Read Filtering Info File - description: "Read filtering info for {id}" - - - Name: Metagenome Assembly - Type: nmdc:MetagenomeAssembly - Enabled: True - Git_repo: https://github.com/microbiomedata/metaAssembly - Version: v1.0.3 - WDL: jgi_assembly.wdl - Collection: workflow_execution_set - Predecessors: - - Reads QC - - Reads QC Interleave - Input_prefix: jgi_metaASM - Inputs: - input_file: do:Filtered Sequencing Reads - rename_contig_prefix: "{activity_id}" - proj: "{activity_id}" - WorkflowExecution: - name: "Metagenome Assembly for {id}" - type: nmdc:MetagenomeAssembly - asm_score: "{outputs.stats.asm_score}" - contig_bp: "{outputs.stats.contig_bp}" - contigs: "{outputs.stats.contigs}" - ctg_l50: "{outputs.stats.ctg_l50}" - ctg_l90: "{outputs.stats.ctg_l90}" - ctg_logsum: "{outputs.stats.ctg_logsum}" - ctg_max: "{outputs.stats.ctg_max}" - ctg_n50: "{outputs.stats.ctg_n50}" - ctg_n90: "{outputs.stats.ctg_n90}" - ctg_powsum: "{outputs.stats.ctg_powsum}" - gap_pct: "{outputs.stats.gap_pct}" - gc_avg: "{outputs.stats.gc_avg}" - gc_std: "{outputs.stats.gc_std}" - scaf_bp: "{outputs.stats.scaf_bp}" - scaf_l50: "{outputs.stats.scaf_l50}" - scaf_l90: "{outputs.stats.scaf_l90}" - scaf_l_gt50k: "{outputs.stats.scaf_l_gt50k}" - scaf_logsum: "{outputs.stats.scaf_logsum}" - scaf_max: "{outputs.stats.scaf_max}" - scaf_n50: "{outputs.stats.scaf_n50}" - scaf_n90: "{outputs.stats.scaf_n90}" - scaf_n_gt50k: "{outputs.stats.scaf_n_gt50k}" - scaf_pct_gt50k: "{outputs.stats.scaf_pct_gt50k}" - scaf_powsum: "{outputs.stats.scaf_powsum}" - scaffolds: "{outputs.stats.scaffolds}" - Outputs: - - output: contig - name: Final assembly contigs fasta - data_object_type: Assembly Contigs - description: "Assembly contigs for {id}" - - output: scaffold - name: Final assembly scaffolds fasta - data_object_type: Assembly Scaffolds - description: "Assembly scaffolds for {id}" - - output: covstats - name: Assembled contigs coverage information - data_object_type: Assembly Coverage Stats - description: "Coverage Stats for {id}" - - output: agp - name: An AGP format file that describes the assembly - data_object_type: Assembly AGP - description: "AGP for {id}" - - output: bam - name: Sorted bam file of reads mapping back to the final assembly - data_object_type: Assembly Coverage BAM - description: "Sorted Bam for {id}" - - - Name: Metagenome Annotation - Type: nmdc:MetagenomeAnnotation - Enabled: True - Git_repo: https://github.com/microbiomedata/mg_annotation - Version: v1.0.4 - WDL: annotation_full.wdl - Collection: workflow_execution_set - Predecessors: - - Metagenome Assembly - Input_prefix: annotation - Inputs: - input_file: do:Assembly Contigs - imgap_project_id: "scaffold" - proj: "{activity_id}" - WorkflowExecution: - name: "Metagenome Annotation Analysis for {id}" - type: nmdc:MetagenomeAnnotation - Outputs: - - output: proteins_faa - data_object_type: Annotation Amino Acid FASTA - description: FASTA Amino Acid File for {id} - name: FASTA amino acid file for annotated proteins - - output: structural_gff - data_object_type: Structural Annotation GFF - description: Structural Annotation for {id} - name: GFF3 format file with structural annotations - - output: functional_gff - data_object_type: Functional Annotation GFF - description: Functional Annotation for {id} - name: GFF3 format file with functional annotations - - output: ko_tsv - data_object_type: Annotation KEGG Orthology - description: KEGG Orthology for {id} - name: Tab delimited file for KO annotation - - output: ec_tsv - data_object_type: Annotation Enzyme Commission - description: EC Annotations for {id} - name: Tab delimited file for EC annotation - - output: cog_gff - data_object_type: Clusters of Orthologous Groups (COG) Annotation GFF - description: COGs for {id} - name: GFF3 format file with COGs - - output: pfam_gff - data_object_type: Pfam Annotation GFF - description: Pfam Annotation for {id} - name: GFF3 format file with Pfam - - output: tigrfam_gff - data_object_type: TIGRFam Annotation GFF - description: TIGRFam for {id} - name: GFF3 format file with TIGRfam - - output: smart_gff - data_object_type: SMART Annotation GFF - description: SMART Annotations for {id} - name: GFF3 format file with SMART - - output: supfam_gff - data_object_type: SUPERFam Annotation GFF - description: SUPERFam Annotations for {id} - name: GFF3 format file with SUPERFam - - output: cath_funfam_gff - data_object_type: CATH FunFams (Functional Families) Annotation GFF - description: CATH FunFams for {id} - name: GFF3 format file with CATH FunFams - - output: crt_gff - data_object_type: CRT Annotation GFF - description: CRT Annotations for {id} - name: GFF3 format file with CRT - - output: genemark_gff - data_object_type: Genmark Annotation GFF - description: Genemark Annotations for {id} - name: GFF3 format file with Genemark - - output: prodigal_gff - data_object_type: Prodigal Annotation GFF - description: Prodigal Annotations {id} - name: GFF3 format file with Prodigal - - output: trna_gff - data_object_type: TRNA Annotation GFF - description: TRNA Annotations {id} - name: GFF3 format file with TRNA - - output: final_rfam_gff - data_object_type: RFAM Annotation GFF - description: RFAM Annotations for {id} - name: GFF3 format file with RFAM - - output: ko_ec_gff - data_object_type: KO_EC Annotation GFF - description: KO_EC Annotations for {id} - name: GFF3 format file with KO_EC - - output: product_names_tsv - data_object_type: Product Names - description: Product names for {id} - name: Product names file - - output: gene_phylogeny_tsv - data_object_type: Gene Phylogeny tsv - description: Gene Phylogeny for {id} - name: Gene Phylogeny file - - output: crt_crisprs - data_object_type: Crisprt Terms - description: Crispr Terms for {id} - name: Crispr Terms - - output: stats_tsv - data_object_type: Annotation Statistics - description: Annotation Stats for {id} - name: Annotation statistics report - - - Name: MAGs - Type: nmdc:MAGsAnalysis - Enabled: True - Git_repo: https://github.com/microbiomedata/mg_annotation - Version: v1.0.6 - WDL: mbin_nmdc.wdl - Collection: workflow_execution_set - Predecessors: - - Metagenome Annotation - Input_prefix: nmdc_mags - Inputs: - contig_file: do:Assembly Contigs - gff_file: do:Functional Annotation GFF - cath_funfam_file: do:CATH FunFams (Functional Families) Annotation GFF - supfam_file: do:SUPERFam Annotation GFF - cog_file: do:Clusters of Orthologous Groups (COG) Annotation GFF - proj_name: "{activity_id}" - pfam_file: do:Pfam Annotation GFF - product_names_file: do:Product Names - tigrfam_file: do:TIGRFam Annotation GFF - ec_file: do:Annotation Enzyme Commission - ko_file: do:Annotation KEGG Orthology - sam_file: do:Assembly Coverage BAM - smart_file: do:SMART Annotation GFF - proteins_file: do:Annotation Amino Acid FASTA - gene_phylogeny_file: do:Gene Phylogeny tsv - proj: "{activity_id}" - map_file: do:Annotation Mapping File - Optional Inputs: - - map_file - WorkflowExecution: - name: "Metagenome Assembled Genomes Analysis for {id}" - type: nmdc:MAGsAnalysis - Outputs: - - output: final_checkm - data_object_type: CheckM Statistics - description: CheckM for {id} - name: CheckM statistics report - - output: final_hqmq_bins_zip - data_object_type: Metagenome Bins - description: Metagenome Bins for {id} - name: Metagenome bin tarfiles archive - - output: final_gtdbtk_bac_summary - data_object_type: GTDBTK Bacterial Summary - description: Bacterial Summary for {id} - name: GTDBTK bacterial summary - - output: final_gtdbtk_ar_summary - data_object_type: GTDBTK Archaeal Summary - description: Archaeal Summary for {id} - name: GTDBTK archaeal summary - - - Name: Readbased Analysis - Type: nmdc:ReadBasedTaxonomyAnalysis - Enabled: True - Git_repo: https://github.com/microbiomedata/ReadbasedAnalysis - Version: v1.0.5 - WDL: ReadbasedAnalysis.wdl - Collection: workflow_execution_set - Predecessors: - - Reads QC - Input_prefix: ReadbasedAnalysis - Inputs: - input_file: do:Filtered Sequencing Reads - proj: "{activity_id}" - WorkflowExecution: - name: "Readbased Taxonomy Analysis for {id}" - type: nmdc:ReadBasedTaxonomyAnalysis - Outputs: - - output: final_gottcha2_report_tsv - data_object_type: GOTTCHA2 Classification Report - description: GOTTCHA2 Classification for {id} - name: GOTTCHA2 classification report file - - output: final_gottcha2_full_tsv - data_object_type: GOTTCHA2 Report Full - description: GOTTCHA2 Full Report for {id} - name: GOTTCHA2 report file - - output: final_gottcha2_krona_html - data_object_type: GOTTCHA2 Krona Plot - description: GOTTCHA2 Krona for {id} - name: GOTTCHA2 krona plot HTML file - - output: final_centrifuge_classification_tsv - data_object_type: Centrifuge Taxonomic Classification - description: Centrifuge Classification for {id} - name: Centrifuge output read classification file - - output: final_centrifuge_report_tsv - data_object_type: Centrifuge output report file - description: Centrifuge Report for {id} - name: Centrifuge Classification Report - - output: final_centrifuge_krona_html - data_object_type: Centrifuge Krona Plot - description: Centrifuge Krona for {id} - name: Centrifug krona plot HTML file - - output: final_kraken2_classification_tsv - data_object_type: Kraken2 Taxonomic Classification - description: Kraken2 Classification for {id} - name: Kraken2 output read classification file - - output: final_kraken2_report_tsv - data_object_type: Kraken2 Classification Report - description: Kraken2 Report for {id} - name: Kraken2 output report file - - output: final_kraken2_krona_html - data_object_type: Kraken2 Krona Plot - description: Kraken2 Krona for {id} - name: Kraken2 Krona plot HTML file - From 7a1c56d4f15c830a6c32c53c57549d4e217e3794 Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Mon, 30 Sep 2024 09:48:13 -0700 Subject: [PATCH 47/52] updated workflow_process_node.git_url to return None if there is no process.git_url set --- nmdc_automation/workflow_automation/models.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/nmdc_automation/workflow_automation/models.py b/nmdc_automation/workflow_automation/models.py index b2b97693..fbb14b3a 100644 --- a/nmdc_automation/workflow_automation/models.py +++ b/nmdc_automation/workflow_automation/models.py @@ -92,8 +92,7 @@ def has_output(self): @property def git_url(self): """ workflow executions have a git_url field, data generations do not""" - default_url = "http://github.com/microbiomedata" - return getattr(self.process, "git_url", default_url) + return getattr(self.process, "git_url", None) @property def version(self): From cc1c385c3a4a6e7005ca7330072409750321101a Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Mon, 30 Sep 2024 13:02:45 -0700 Subject: [PATCH 48/52] Add Job dataclass and frame out workflow_job classes --- nmdc_automation/workflow_automation/models.py | 33 +++--- .../workflow_automation/workflow_job.py | 112 +++++++++++++++++- 2 files changed, 127 insertions(+), 18 deletions(-) diff --git a/nmdc_automation/workflow_automation/models.py b/nmdc_automation/workflow_automation/models.py index fbb14b3a..610a81af 100644 --- a/nmdc_automation/workflow_automation/models.py +++ b/nmdc_automation/workflow_automation/models.py @@ -202,18 +202,6 @@ def add_parent(self, parent: "WorkflowConfig"): """ Add a parent workflow """ self.parents.add(parent) -@dataclass -class WorkflowJobState: - """ State data for a workflow job """ - type: str - cromwell_job_id: str - nmdc_job_id: str - type: str - - -@dataclass -class JobWorkflow: - id: str @dataclass @@ -223,7 +211,20 @@ class JobWorkflow: @dataclass class JobConfig: """ Represents a job configuration from the NMDC API jobs endpoint / MongoDB jobs collection """ - object_id: str + git_repo: str + release: str + wdl: str + activity_id: str + activity_set: str + was_informed_by: str + trigger_activity: str + iteration: int + input_prefix: str + inputs: Dict[str, str] + input_data_objects: List[DataObject] + activity: Dict[str, str] + outputs: List[Dict[str, str]] + @dataclass class JobClaim: @@ -259,8 +260,6 @@ class Job: config: JobConfig created_at: Optional[datetime] = field(default=None) claims: List[JobClaim] = field(default_factory=list) - input_data_objects: List[DataObject] = field(default_factory=list) - outputs: List[JobOutput] = field(default_factory=list) def __post_init__(self): """ If created_at is a string, convert it to a datetime object """ @@ -270,4 +269,8 @@ def __post_init__(self): if isinstance(self.workflow, dict): self.workflow = JobWorkflow(**self.workflow) + if isinstance(self.config, dict): + self.config = JobConfig(**self.config) + if isinstance(self.claims, list): + self.claims = [JobClaim(**claim) for claim in self.claims] diff --git a/nmdc_automation/workflow_automation/workflow_job.py b/nmdc_automation/workflow_automation/workflow_job.py index e0c2cd26..2bf20061 100644 --- a/nmdc_automation/workflow_automation/workflow_job.py +++ b/nmdc_automation/workflow_automation/workflow_job.py @@ -1,9 +1,115 @@ """ Classes and methods for managing workflow jobs. """ +import logging from typing import List, Dict, Any +from abc import ABC, abstractmethod +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +class JobRunner(ABC): + """ + Abstract base class for a job runner. This class defines the interface + that specific job runners (e.g., Cromwell, JAWS) must implement. + """ + + @abstractmethod + def submit_job(self, force: bool = False) -> Dict[str, Any]: + """ + Submit a workflow job. The force flag is used to force submission of a + job that has already been submitted. + """ + pass + + @abstractmethod + def check_job_status(self) -> Dict[str, Any]: + """ + Check the status of a workflow job. + """ + pass + + @abstractmethod + def get_job_metadata(self) -> Dict[str, Any]: + """ + Get metadata for a workflow job. + """ + pass + + +class CromwellJobRunner(JobRunner): + """ + A class for running Cromwell workflows. + """ + + def __init__(self, site_config, workflow_config, state=None): + pass + + def submit_job(self, force: bool = False) -> Dict[str, Any]: + """ + Submit a workflow job to Cromwell. + """ + # Implementation details omitted + pass + + def check_job_status(self) -> Dict[str, Any]: + """ + Check the status of a workflow job in Cromwell. + """ + # Implementation details omitted + pass + + def get_job_metadata(self) -> Dict[str, Any]: + """ + Get metadata for a workflow job in Cromwell. + """ + # Implementation details omitted + pass + + +class JawsJobRunner(JobRunner): + """ + Stub class for a JAWS job runner. + """ + def __init__(self, site_config, workflow_config, state=None): + pass + + def submit_job(self, force: bool = False) -> Dict[str, Any]: + """ + Submit a workflow job to JAWS. + """ + logger.info("JAWS job submission is not yet implemented.") + # Future implementation will submit a job to JAWS + pass + + def check_job_status(self) -> Dict[str, Any]: + """ + Check the status of a workflow job in JAWS. + """ + logger.info("JAWS job status check is not yet implemented.") + # Future implementation will check the status of a job in JAWS + pass + + def get_job_metadata(self) -> Dict[str, Any]: + """ + Get metadata for a workflow job in JAWS. + """ + logger.info("JAWS job metadata retrieval is not yet implemented.") + # Future implementation will get metadata for a job in JAWS + pass + + + +class WorkflowJobManager: + """ + A class for managing workflow jobs. + """ + + def __init__(self, runner_type: str, site_config, workflow_config=None, state=None): + if runner_type == 'Cromwell': + self.runner = CromwellJobRunner(site_config, workflow_config, state) + elif runner_type == 'JAWS': + self.runner = JawsJobRunner() + else: + raise ValueError(f"Unsupported runner type: {runner_type}") -class WorkflowJob: - def __init__(self): - pass \ No newline at end of file From 1ebc634c312249fa0a3280556a24e43d0d230b12 Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Mon, 30 Sep 2024 13:22:49 -0700 Subject: [PATCH 49/52] update a type hint --- nmdc_automation/workflow_automation/watch_nmdc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nmdc_automation/workflow_automation/watch_nmdc.py b/nmdc_automation/workflow_automation/watch_nmdc.py index 85557b36..457761df 100644 --- a/nmdc_automation/workflow_automation/watch_nmdc.py +++ b/nmdc_automation/workflow_automation/watch_nmdc.py @@ -18,7 +18,7 @@ class FileHandler: - def __init__(self, config): + def __init__(self, config: Config): self.config = config self.state_file = self.config.agent_state From dd8d78aec8afe045f982dd741b763805ba1c3cb5 Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Mon, 30 Sep 2024 15:16:47 -0700 Subject: [PATCH 50/52] Delete workflow_job.py --- .../workflow_automation/workflow_job.py | 115 ------------------ 1 file changed, 115 deletions(-) delete mode 100644 nmdc_automation/workflow_automation/workflow_job.py diff --git a/nmdc_automation/workflow_automation/workflow_job.py b/nmdc_automation/workflow_automation/workflow_job.py deleted file mode 100644 index 2bf20061..00000000 --- a/nmdc_automation/workflow_automation/workflow_job.py +++ /dev/null @@ -1,115 +0,0 @@ -""" -Classes and methods for managing workflow jobs. -""" -import logging -from typing import List, Dict, Any -from abc import ABC, abstractmethod - -logging.basicConfig(level=logging.INFO) -logger = logging.getLogger(__name__) - -class JobRunner(ABC): - """ - Abstract base class for a job runner. This class defines the interface - that specific job runners (e.g., Cromwell, JAWS) must implement. - """ - - @abstractmethod - def submit_job(self, force: bool = False) -> Dict[str, Any]: - """ - Submit a workflow job. The force flag is used to force submission of a - job that has already been submitted. - """ - pass - - @abstractmethod - def check_job_status(self) -> Dict[str, Any]: - """ - Check the status of a workflow job. - """ - pass - - @abstractmethod - def get_job_metadata(self) -> Dict[str, Any]: - """ - Get metadata for a workflow job. - """ - pass - - -class CromwellJobRunner(JobRunner): - """ - A class for running Cromwell workflows. - """ - - def __init__(self, site_config, workflow_config, state=None): - pass - - def submit_job(self, force: bool = False) -> Dict[str, Any]: - """ - Submit a workflow job to Cromwell. - """ - # Implementation details omitted - pass - - def check_job_status(self) -> Dict[str, Any]: - """ - Check the status of a workflow job in Cromwell. - """ - # Implementation details omitted - pass - - def get_job_metadata(self) -> Dict[str, Any]: - """ - Get metadata for a workflow job in Cromwell. - """ - # Implementation details omitted - pass - - -class JawsJobRunner(JobRunner): - """ - Stub class for a JAWS job runner. - """ - def __init__(self, site_config, workflow_config, state=None): - pass - - def submit_job(self, force: bool = False) -> Dict[str, Any]: - """ - Submit a workflow job to JAWS. - """ - logger.info("JAWS job submission is not yet implemented.") - # Future implementation will submit a job to JAWS - pass - - def check_job_status(self) -> Dict[str, Any]: - """ - Check the status of a workflow job in JAWS. - """ - logger.info("JAWS job status check is not yet implemented.") - # Future implementation will check the status of a job in JAWS - pass - - def get_job_metadata(self) -> Dict[str, Any]: - """ - Get metadata for a workflow job in JAWS. - """ - logger.info("JAWS job metadata retrieval is not yet implemented.") - # Future implementation will get metadata for a job in JAWS - pass - - - -class WorkflowJobManager: - """ - A class for managing workflow jobs. - """ - - def __init__(self, runner_type: str, site_config, workflow_config=None, state=None): - if runner_type == 'Cromwell': - self.runner = CromwellJobRunner(site_config, workflow_config, state) - elif runner_type == 'JAWS': - self.runner = JawsJobRunner() - else: - raise ValueError(f"Unsupported runner type: {runner_type}") - From bdee984649eb5c44c00616ee070feb51f7cd943b Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Mon, 30 Sep 2024 16:16:12 -0700 Subject: [PATCH 51/52] Update workflows.yaml --- .../config/workflows/workflows.yaml | 43 ++++++++++++++----- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/nmdc_automation/config/workflows/workflows.yaml b/nmdc_automation/config/workflows/workflows.yaml index ed3256fc..63ca3ad0 100644 --- a/nmdc_automation/config/workflows/workflows.yaml +++ b/nmdc_automation/config/workflows/workflows.yaml @@ -296,27 +296,32 @@ Workflows: - Metagenome Annotation Input_prefix: nmdc_mags Inputs: + proj: "{workflow_execution_id}" contig_file: do:Assembly Contigs + sam_file: do:Assembly Coverage BAM gff_file: do:Functional Annotation GFF - cath_funfam_file: do:CATH FunFams (Functional Families) Annotation GFF - supfam_file: do:SUPERFam Annotation GFF + proteins_file: do:Annotation Amino Acid FASTA cog_file: do:Clusters of Orthologous Groups (COG) Annotation GFF - proj_name: "{workflow_execution_id}" - pfam_file: do:Pfam Annotation GFF - product_names_file: do:Product Names - tigrfam_file: do:TIGRFam Annotation GFF ec_file: do:Annotation Enzyme Commission ko_file: do:Annotation KEGG Orthology + pfam_file: do:Pfam Annotation GFF + tigrfam_file: do:TIGRFam Annotation GFF + crispr_file: do:Crispr Terms + product_names_file: do:Product Names + gene_phylogeny_file: do:Gene Phylogeny tsv lineage_file: do:Scaffold Lineage tsv - sam_file: do:Assembly Coverage BAM - smart_file: do:SMART Annotation GFF - proteins_file: do:Annotation Amino Acid FASTA map_file: do:Contig Mapping File - gene_phylogeny_file: do:Gene Phylogeny tsv - proj: "{workflow_execution_id}" + Optional Inputs: + - map_file Workflow Execution: name: "Metagenome Assembled Genomes Analysis for {id}" type: nmdc:MagsAnalysis + binned_contig_num: "{outputs.final_stats_json.binned_contig_num}" + input_contig_num: "{outputs.final_stats_json.input_contig_num}" + low_depth_contig_num: "{outputs.final_stats_json.low_depth_contig_num}" + mags_list: "{outputs.final_stats_json.mags_list}" + too_short_contig_num: "{outputs.final_stats_json.too_short_contig_num}" + unbinned_contig_num: "{outputs.final_stats_json.unbinned_contig_num}" Outputs: - output: final_checkm data_object_type: CheckM Statistics @@ -339,6 +344,22 @@ Workflows: data_object_type: Metagenome Bins Info File description: Metagenome Bins Info File for {id} name: Metagenome Bins Info File + - output: final_lq_bins_zip + data_object_type: Metagenome LQ Bins Compression File + description: Metagenome LQ Bins for {id} + name: Metagenome lq bin zip archive + - output: heatmap + data_object_type: Metagenome Bins Heatmap + description: Metagenome heatmap for {id} + name: Metagenome Heatmap File + - output: barplot + data_object_type: Metagenome Bins Barplot + description: Metagenome barplot for {id} + name: Metagenome Barplot File + - output: kronaplot + data_object_type: Metagenome Bins Krona Plot + description: Metagenome Bins Krona Plot for {id} + name: Metagenome Krona Bins Plot File - Name: Readbased Analysis Type: nmdc:ReadBasedTaxonomyAnalysis From 696c8f6ad69c2ee478295bdca2aec3e952adec46 Mon Sep 17 00:00:00 2001 From: Michael Thornton Date: Tue, 1 Oct 2024 08:49:29 -0700 Subject: [PATCH 52/52] update HQMQ output definition --- nmdc_automation/config/workflows/workflows.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nmdc_automation/config/workflows/workflows.yaml b/nmdc_automation/config/workflows/workflows.yaml index 63ca3ad0..f01fbd7e 100644 --- a/nmdc_automation/config/workflows/workflows.yaml +++ b/nmdc_automation/config/workflows/workflows.yaml @@ -328,9 +328,9 @@ Workflows: description: CheckM for {id} name: CheckM statistics report - output: final_hqmq_bins_zip - data_object_type: Metagenome Bins - description: Metagenome Bins for {id} - name: Metagenome bin tarfiles archive + data_object_type: Metagenome HQMQ Bins Compression File + description: Metagenome HQMQ Bins for {id} + name: Metagenome hqmq bin zip archive - output: final_gtdbtk_bac_summary data_object_type: GTDBTK Bacterial Summary description: Bacterial Summary for {id}