From 382ff8afade830a7b687bf3ba577140a1ac2e21f Mon Sep 17 00:00:00 2001 From: "Laura Luebbert, Ph.D." <56094636+lauraluebbert@users.noreply.github.com> Date: Sun, 21 Jun 2026 22:01:16 -0400 Subject: [PATCH 01/34] Bump dev version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index ebe4ee23c..b38413c84 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ requires = [ "hatchling" ] [project] name = "gget" -version = "0.30.7" +version = "0.30.8" description = "Efficient querying of genomic databases." readme = "README.md" keywords = [ "gget" ] From f9eddbe2c4c512e2aeeaf7bba325897e1e824e2b Mon Sep 17 00:00:00 2001 From: "Laura Luebbert, Ph.D." <56094636+lauraluebbert@users.noreply.github.com> Date: Sun, 21 Jun 2026 22:01:56 -0400 Subject: [PATCH 02/34] Add space for new udpates --- docs/src/en/updates.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/src/en/updates.md b/docs/src/en/updates.md index f304a2013..80901c3f4 100644 --- a/docs/src/en/updates.md +++ b/docs/src/en/updates.md @@ -4,6 +4,9 @@ #### *gget* officially became part of *scverse* on June 9, 2026. 🥳🥳🥳 +**Version ≥ 0.30.8** (XXX XX, 2026): + + **Version ≥ 0.30.7** (Jun 21, 2026): - [`gget cellxgene`](cellxgene.md): Added support for the three non-human primate species available in the CZ CELLxGENE Census LTS `2025-11-08`: rhesus macaque (`macaca_mulatta`), common marmoset (`callithrix_jacchus`), and chimpanzee (`pan_troglodytes`). - The `species` argument (both Python and command line) now accepts all five supported organisms; the CLI `choices`, help text, and docstrings list them. From 41b3202323ec8473cb19e6f2c90ddee556237c44 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 22 Jun 2026 02:21:07 +0000 Subject: [PATCH 03/34] CI: update pytest results (dev) --- tests/pytest_results.txt | 948 +++++++++++++++++++-------------------- 1 file changed, 474 insertions(+), 474 deletions(-) diff --git a/tests/pytest_results.txt b/tests/pytest_results.txt index d1d7e3966..741762da6 100644 --- a/tests/pytest_results.txt +++ b/tests/pytest_results.txt @@ -1,420 +1,420 @@ -Pytest results (Python 3.14) - 2026-06-22T00:56:19Z +Pytest results (Python 3.14) - 2026-06-22T02:01:59Z ============================= test session starts ============================== platform linux -- Python 3.14.6, pytest-9.1.1, pluggy-1.6.0 -- /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/bin/python3 cachedir: .pytest_cache -Using --randomly-seed=579979726 +Using --randomly-seed=2193479127 rootdir: /home/runner/work/gget/gget configfile: pyproject.toml testpaths: tests plugins: randomly-3.16.0, rerunfailures-14.0, mock-3.15.1, cov-7.1.0, xdist-3.8.0 collecting ... collected 400 items -tests/test_8cube.py::TestGeneExpression::test_gene_expression_basic PASSED [ 0%] -tests/test_8cube.py::TestPsiBlock::test_psi_block_basic PASSED [ 0%] -tests/test_8cube.py::TestSpecificity::test_specificity_basic PASSED [ 0%] -tests/test_bgee.py::TestBgee::test_bgee_orthologs FAILED [ 1%] -tests/test_bgee.py::TestBgee::test_error_bgee_orthologs_no_exist PASSED [ 1%] -tests/test_bgee.py::TestBgee::test_error_bgee_unknown_type PASSED [ 1%] -tests/test_bgee.py::TestBgee::test_bgee_expression_multiple FAILED [ 1%] -tests/test_bgee.py::TestBgee::test_error_bgee_expression_no_exist PASSED [ 2%] -tests/test_bgee.py::TestBgee::test_bgee_expression FAILED [ 2%] -tests/test_utils.py::TestUtils::test_n_colors PASSED [ 2%] -tests/test_utils.py::TestUtils::test_get_uniprot_seqs PASSED [ 2%] -tests/test_utils.py::TestUtils::test_get_uniprot_info_gene PASSED [ 3%] -tests/test_utils.py::TestUtils::test_search_iv_species_options PASSED [ 3%] -tests/test_utils.py::TestUtils::test_rest_query PASSED [ 3%] -tests/test_utils.py::TestUtils::test_search_species_options_bad_type PASSED [ 3%] -tests/test_utils.py::TestUtils::test_ref_species_options_bad_type PASSED [ 4%] -tests/test_utils.py::TestUtils::test_search_species_options PASSED [ 4%] -tests/test_utils.py::TestUtils::test_get_uniprot_info_transcript PASSED [ 4%] -tests/test_utils.py::TestUtils::test_aa_colors PASSED [ 4%] -tests/test_utils.py::TestUtils::test_rest_query_bad_type PASSED [ 5%] -tests/test_utils.py::TestUtils::test_read_fasta PASSED [ 5%] -tests/test_utils.py::TestUtils::test_find_latest_ens_rel PASSED [ 5%] -tests/test_utils.py::TestUtils::test_ref_species_options PASSED [ 5%] -tests/test_utils.py::TestUtils::test_ref_iv_species_options PASSED [ 6%] -tests/test_search.py::TestSearch::test_search_gene_two_sw_limit PASSED [ 6%] -tests/test_search.py::TestSearch::test_search_plant PASSED [ 6%] -tests/test_search.py::TestSearch::test_search_db PASSED [ 6%] -tests/test_search.py::TestSearch::test_search_transcript_two_sw_or PASSED [ 7%] -tests/test_search.py::TestSearch::test_search_transcript_two_sw_and PASSED [ 7%] -tests/test_search.py::TestSearch::test_search_gene_two_sw_or PASSED [ 7%] -tests/test_search.py::TestSearch::test_search_plant_db PASSED [ 7%] -tests/test_search.py::TestSearch::test_search_gene_two_sw_and PASSED [ 8%] -tests/test_search.py::TestSearch::test_search_gene_bad_andor PASSED [ 8%] -tests/test_search.py::TestSearch::test_search_transcript_bad_species PASSED [ 8%] -tests/test_search.py::TestSearch::test_search_octopus PASSED [ 8%] -tests/test_search.py::TestSearch::test_search_gene_one_sw PASSED [ 9%] -tests/test_search.py::TestSearch::test_search_gene_bad_species PASSED [ 9%] -tests/test_search.py::TestSearch::test_search_transcript_one_sw PASSED [ 9%] -tests/test_search.py::TestSearch::test_search_gene_one_sw_json PASSED [ 9%] -tests/test_search.py::TestSearch::test_search_gene_one_sw_limit PASSED [ 10%] -tests/test_search.py::TestSearch::test_search_transcript_bad_andor PASSED [ 10%] -tests/test_search.py::TestSearch::test_search_release PASSED [ 10%] -tests/test_cbio.py::TestCbioSearch::test_cbio_search PASSED [ 10%] -tests/test_cbio.py::TestCbio::test_error_cbio_download PASSED [ 11%] -tests/test_cbio.py::TestCbio::test_cbio_download_partially_existing_files PASSED [ 11%] -tests/test_cbio.py::TestCbio::test_cbio_download PASSED [ 11%] -tests/test_gpt.py::TestGpt::test_gpt PASSED [ 11%] -tests/test_elm.py::TestELM::test_elm_uniprot_id_in_elm PASSED [ 12%] -tests/test_elm.py::TestELM::test_elm_uniprot_id_new PASSED [ 12%] -tests/test_elm.py::TestELM::test_elm_uniprot_aminoacidseq PASSED [ 12%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_transcription PASSED [ 12%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_json PASSED [ 13%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_gene PASSED [ 13%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_ensembl_ids PASSED [ 13%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_kinase_interactions PASSED [ 13%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_worm PASSED [ 14%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_none PASSED [ 14%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_celltypes PASSED [ 14%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_plot PASSED [ 14%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_fly PASSED [ 15%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_diseases_drugs PASSED [ 15%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_species PASSED [ 15%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background_list PASSED [ 15%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_mouse_is_human PASSED [ 16%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_fish PASSED [ 16%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_background PASSED [ 16%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_background_ensembl PASSED [ 16%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_database_shortcut PASSED [ 17%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_pathway PASSED [ 17%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background PASSED [ 17%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_yeast PASSED [ 17%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_ontology PASSED [ 18%] -tests/test_mutate.py::test_csv_of_mutations PASSED [ 18%] -tests/test_mutate.py::test_mismatch_error PASSED [ 18%] -tests/test_mutate.py::TestMutate::test_inversion_with_overlaps PASSED [ 18%] -tests/test_mutate.py::TestMutate::test_multi_insertion_with_left_repeats PASSED [ 19%] -tests/test_mutate.py::TestMutate::test_large_k PASSED [ 19%] -tests/test_mutate.py::TestMutate::test_multi_dup PASSED [ 19%] -tests/test_mutate.py::TestMutate::test_index_error PASSED [ 19%] -tests/test_mutate.py::TestMutate::test_single_deletion PASSED [ 20%] -tests/test_mutate.py::TestMutate::test_multi_delins_with_true_right_repeats PASSED [ 20%] -tests/test_mutate.py::TestMutate::test_single_substitution PASSED [ 20%] -tests/test_mutate.py::TestMutate::test_multi_delins_with_true_left_repeats PASSED [ 20%] -tests/test_mutate.py::TestMutate::test_uncertain_mutation PASSED [ 21%] -tests/test_mutate.py::TestMutate::test_intron_mutation_plus PASSED [ 21%] -tests/test_mutate.py::TestMutate::test_single_delins PASSED [ 21%] -tests/test_mutate.py::TestMutate::test_multi_deletion PASSED [ 21%] -tests/test_mutate.py::TestMutate::test_multi_insertion PASSED [ 22%] -tests/test_mutate.py::TestMutate::test_multi_delins PASSED [ 22%] -tests/test_mutate.py::TestMutate::test_multi_deletion_with_right_repeats PASSED [ 22%] -tests/test_mutate.py::TestMutate::test_ambiguous_mutation PASSED [ 22%] -tests/test_mutate.py::TestMutate::test_single_dup PASSED [ 23%] -tests/test_mutate.py::TestMutate::test_single_insertion PASSED [ 23%] -tests/test_mutate.py::TestMutate::test_single_substitution_near_left_end PASSED [ 23%] -tests/test_mutate.py::TestMutate::test_posttranslational_mutation PASSED [ 23%] -tests/test_mutate.py::TestMutate::test_multi_delins_with_psuedo_left_repeats PASSED [ 24%] -tests/test_mutate.py::TestMutate::test_single_deletion_with_left_repeats PASSED [ 24%] -tests/test_mutate.py::TestMutate::test_single_substitution_near_right_end PASSED [ 24%] -tests/test_mutate.py::TestMutate::test_intron_mutation_minus PASSED [ 24%] -tests/test_mutate.py::TestMutate::test_single_deletion_with_right_repeats PASSED [ 25%] -tests/test_mutate.py::TestMutate::test_list_of_mutations PASSED [ 25%] -tests/test_blat.py::TestBlat::test_blat_aa PASSED [ 25%] -tests/test_blat.py::TestBlat::test_blat_nt_json PASSED [ 25%] -tests/test_blat.py::TestBlat::test_blat_bad_txt PASSED [ 26%] -tests/test_blat.py::TestBlat::test_blat_nt_DNA PASSED [ 26%] -tests/test_blat.py::TestBlat::test_blat_shortseq PASSED [ 26%] -tests/test_blat.py::TestBlat::test_blat_bad_fileformat PASSED [ 26%] -tests/test_blat.py::TestBlat::test_blat_bad_assembly PASSED [ 27%] -tests/test_blat.py::TestBlat::test_blat_nt_protein PASSED [ 27%] -tests/test_blat.py::TestBlat::test_blat_aa_RNA PASSED [ 27%] -tests/test_blat.py::TestBlat::test_blat_nt_txt PASSED [ 27%] -tests/test_blat.py::TestBlat::test_blat_bad_seqtype PASSED [ 28%] -tests/test_blat.py::TestBlat::test_blat_nt_fasta PASSED [ 28%] -tests/test_blat.py::TestBlat::test_blat_nt PASSED [ 28%] -tests/test_blat.py::TestBlat::test_blat_aa_protein PASSED [ 28%] -tests/test_blat.py::TestBlat::test_blat_nt_transDNA PASSED [ 29%] -tests/test_blat.py::TestBlat::test_blat_nt_RNA PASSED [ 29%] -tests/test_blat.py::TestBlat::test_blat_bad_fasta PASSED [ 29%] -tests/test_diamond.py::TestDiamond::test_diamond_ref_file PASSED [ 29%] -tests/test_diamond.py::TestDiamond::test_diamond_seqs_single PASSED [ 30%] -tests/test_diamond.py::TestDiamond::test_diamond_both_files PASSED [ 30%] -tests/test_diamond.py::TestDiamond::test_diamond_query_file PASSED [ 30%] -tests/test_diamond.py::TestDiamond::test_diamond_JSON_out PASSED [ 30%] -tests/test_diamond.py::TestDiamond::test_diamond_seqs_multiple PASSED [ 31%] -tests/test_cosmic.py::TestCosmicWorkflow::test_cosmic_defaults PASSED [ 31%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_name PASSED [ 31%] -tests/test_virus.py::TestVirus::test_parse_accession_input_single PASSED [ 31%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_seq_length PASSED [ 32%] -tests/test_virus.py::TestVirus::test_virus_host_filter_verification PASSED [ 32%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_nonexistent_raises PASSED [ 32%] -tests/test_virus.py::TestVirus::test_deduplicate_all_existing PASSED [ 32%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_isolate PASSED [ 33%] -tests/test_virus.py::TestVirus::test_virus_with_collection_date_filters PASSED [ 33%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_false PASSED [ 33%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_invalid_attempt_returns_none PASSED [ 33%] -tests/test_virus.py::TestVirus::test_virus_with_length_filters PASSED [ 34%] -tests/test_virus.py::TestVirus::test_filter_cached_host_in_strategy_skipped PASSED [ 34%] -tests/test_virus.py::TestVirus::test_parse_partial_date_full_date PASSED [ 34%] -tests/test_virus.py::TestVirus::test_deduplicate_empty_baseline PASSED [ 34%] -tests/test_virus.py::TestVirus::test_track_failed_operation_none_dict PASSED [ 35%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_max_seq_length PASSED [ 35%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_segment PASSED [ 35%] -tests/test_virus.py::TestVirus::test_is_sars_cov2_query_accession_mode PASSED [ 35%] -tests/test_virus.py::TestVirus::test_validate_datasets_binary_valid PASSED [ 36%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_has_proteins PASSED [ 36%] -tests/test_virus.py::TestVirus::test_virus_with_completeness_filter PASSED [ 36%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_true PASSED [ 36%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_already_correct_returns_none PASSED [ 37%] +tests/test_muscle.py::TestMusclePrints::test_muscle_print_nt PASSED [ 0%] +tests/test_muscle.py::TestMuscleSeqsInput::test_muscle_seqs_as_input PASSED [ 0%] +tests/test_muscle.py::TestMuscle::test_muscle_nt_txt PASSED [ 0%] +tests/test_muscle.py::TestMuscle::test_muscle_nt PASSED [ 1%] +tests/test_muscle.py::TestMuscleAA::test_muscle_aa PASSED [ 1%] +tests/test_muscle.py::TestMuscleAASuper::test_muscle_aa_super5 PASSED [ 1%] +tests/test_muscle.py::TestMuscleSuper::test_muscle_nt_super5 PASSED [ 1%] +tests/test_ref.py::TestRef::test_ref_rel_ftp_octopus PASSED [ 2%] +tests/test_ref.py::TestRef::test_ref_bad_rel PASSED [ 2%] +tests/test_ref.py::TestRef::test_ref_bad_which PASSED [ 2%] +tests/test_ref.py::TestRef::test_ref PASSED [ 2%] +tests/test_ref.py::TestRef::test_ref_list PASSED [ 3%] +tests/test_ref.py::TestRef::test_ref_which_plant PASSED [ 3%] +tests/test_ref.py::TestRef::test_ref_ftp PASSED [ 3%] +tests/test_ref.py::TestRef::test_ref_plant PASSED [ 3%] +tests/test_ref.py::TestRef::test_ref_which PASSED [ 4%] +tests/test_ref.py::TestRef::test_ref_rel PASSED [ 4%] +tests/test_ref.py::TestRef::test_ref_rel_ftp PASSED [ 4%] +tests/test_ref.py::TestRef::test_ref_bad_species PASSED [ 4%] +tests/test_ref.py::TestRef::test_ref_rel_protist PASSED [ 5%] +tests/test_gpt.py::TestGpt::test_gpt PASSED [ 5%] +tests/test_bgee.py::TestBgee::test_bgee_expression FAILED [ 5%] +tests/test_bgee.py::TestBgee::test_bgee_expression_multiple FAILED [ 5%] +tests/test_bgee.py::TestBgee::test_error_bgee_unknown_type PASSED [ 6%] +tests/test_bgee.py::TestBgee::test_error_bgee_expression_no_exist PASSED [ 6%] +tests/test_bgee.py::TestBgee::test_error_bgee_orthologs_no_exist PASSED [ 6%] +tests/test_bgee.py::TestBgee::test_bgee_orthologs FAILED [ 6%] +tests/test_pdb.py::TestPDB::test_pdb_pdb PASSED [ 7%] +tests/test_pdb.py::TestPDB::test_pdb_assembly PASSED [ 7%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_empty_raises PASSED [ 7%] +tests/test_virus.py::TestVirus::test_merge_baseline_with_new_deduplicates PASSED [ 7%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_type PASSED [ 8%] +tests/test_virus.py::TestVirus::test_virus_host_filter_verification PASSED [ 8%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_collection_date PASSED [ 8%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_no_parentheses_returns_none PASSED [ 8%] +tests/test_virus.py::TestVirus::test_retry_helper_successful_operation PASSED [ 9%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_true PASSED [ 9%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_multiple PASSED [ 9%] +tests/test_virus.py::TestVirus::test_parse_date_various_formats PASSED [ 9%] +tests/test_virus.py::TestVirus::test_merge_metadata_csvs_fills_missing PASSED [ 10%] +tests/test_virus.py::TestVirus::test_local_name_without_namespace PASSED [ 10%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_min_comparison PASSED [ 10%] +tests/test_virus.py::TestVirus::test_virus_with_host_filter PASSED [ 10%] +tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_basic PASSED [ 11%] +tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter PASSED [ 11%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_no_filters PASSED [ 11%] +tests/test_virus.py::TestVirus::test_batch_accessions_for_url PASSED [ 11%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_release_date PASSED [ 12%] +tests/test_virus.py::TestVirus::test_check_min_max_date_valid PASSED [ 12%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_metadata_type PASSED [ 12%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_max_release_date PASSED [ 12%] +tests/test_virus.py::TestVirus::test_virus_invalid_lab_passaged_type PASSED [ 13%] +tests/test_virus.py::TestVirus::test_virus_with_collection_date_filters PASSED [ 13%] +tests/test_virus.py::TestVirus::test_merge_metadata_csvs_missing_standard_file PASSED [ 13%] +tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_accession_mode PASSED [ 13%] +tests/test_virus.py::TestVirus::test_virus_integer_virus_id PASSED [ 14%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype PASSED [ 14%] +tests/test_virus.py::TestVirus::test_virus_invalid_proteins_complete_type PASSED [ 14%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_zero PASSED [ 14%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_host PASSED [ 15%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_csv PASSED [ 15%] +tests/test_virus.py::TestVirus::test_virus_with_annotated_filter PASSED [ 15%] +tests/test_virus.py::TestVirus::test_stream_copy_fasta_with_accession_filter PASSED [ 15%] +tests/test_virus.py::TestVirus::test_parse_date_full PASSED [ 16%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_seq_length PASSED [ 16%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_true PASSED [ 16%] +tests/test_virus.py::TestVirus::test_virus_multiple_filters_relationship_check PASSED [ 16%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_has_proteins PASSED [ 17%] +tests/test_virus.py::TestVirus::test_virus_with_multiple_filters PASSED [ 17%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_max_seq_length PASSED [ 17%] +tests/test_virus.py::TestVirus::test_virus_none_virus_name PASSED [ 17%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_country PASSED [ 18%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_empty PASSED [ 18%] +tests/test_virus.py::TestVirus::test_virus_with_source_database_filter PASSED [ 18%] +tests/test_virus.py::TestVirus::test_get_datasets_version_returns_string_or_none PASSED [ 18%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_space_before_virus PASSED [ 19%] +tests/test_virus.py::TestVirus::test_filter_sequences_proteins_complete PASSED [ 19%] +tests/test_virus.py::TestVirus::test_genbank_xml_to_csv_basic PASSED [ 19%] +tests/test_virus.py::TestVirus::test_filter_cached_refseq_only PASSED [ 19%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_none_raises PASSED [ 20%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_nonexistent_raises PASSED [ 20%] +tests/test_virus.py::TestVirus::test_merge_metadata_csvs_no_overwrite PASSED [ 20%] +tests/test_virus.py::TestVirus::test_filter_sequences_no_filters PASSED [ 20%] +tests/test_virus.py::TestVirus::test_retry_helper_success_after_retry PASSED [ 21%] +tests/test_virus.py::TestVirus::test_save_command_summary_creates_file PASSED [ 21%] +tests/test_virus.py::TestVirus::test_merge_baseline_with_new_empty_new PASSED [ 21%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_mature_peptide_count PASSED [ 21%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_institution PASSED [ 22%] +tests/test_virus.py::TestVirus::test_save_partial_metadata_empty PASSED [ 22%] +tests/test_virus.py::TestVirus::test_get_memory_usage_returns_dict PASSED [ 22%] +tests/test_virus.py::TestVirus::test_filter_cached_annotated PASSED [ 22%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_collection_date_range PASSED [ 23%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_false PASSED [ 23%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_protein_count PASSED [ 23%] +tests/test_virus.py::TestVirus::test_validate_datasets_binary_empty_path PASSED [ 23%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_protein_count PASSED [ 24%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_max_gene_count PASSED [ 24%] +tests/test_virus.py::TestVirus::test_validate_datasets_binary_nonexistent PASSED [ 24%] +tests/test_virus.py::TestVirus::test_write_fasta_record_with_description PASSED [ 24%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_isolation_source PASSED [ 25%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_min_gene_count PASSED [ 25%] +tests/test_virus.py::TestVirus::test_save_command_summary_with_error PASSED [ 25%] +tests/test_virus.py::TestVirus::test_virus_invalid_is_accession_type PASSED [ 25%] +tests/test_virus.py::TestVirus::test_track_failed_operation_appends PASSED [ 26%] +tests/test_virus.py::TestVirus::test_get_datasets_path_uses_bundled_binary PASSED [ 26%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_max_comparison PASSED [ 26%] +tests/test_virus.py::TestVirus::test_parse_accession_input_single PASSED [ 26%] +tests/test_virus.py::TestVirus::test_parse_partial_date_empty_raises PASSED [ 27%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_true PASSED [ 27%] +tests/test_virus.py::TestVirus::test_validate_datasets_binary_valid PASSED [ 27%] +tests/test_virus.py::TestVirus::test_write_fasta_record_long_sequence_wraps PASSED [ 27%] +tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_empty PASSED [ 28%] +tests/test_virus.py::TestVirus::test_merge_baseline_with_new_csv PASSED [ 28%] +tests/test_virus.py::TestVirus::test_local_name_with_namespace PASSED [ 28%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_basic PASSED [ 28%] +tests/test_virus.py::TestVirus::test_filter_cached_geographic_location PASSED [ 29%] +tests/test_virus.py::TestVirus::test_is_sars_cov2_query_accession_mode PASSED [ 29%] +tests/test_virus.py::TestVirus::test_parse_partial_date_full_date PASSED [ 29%] +tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter PASSED [ 29%] +tests/test_virus.py::TestVirus::test_save_partial_metadata PASSED [ 30%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_json PASSED [ 30%] +tests/test_virus.py::TestVirus::test_virus_completeness_filter_verification PASSED [ 30%] +tests/test_virus.py::TestVirus::test_save_metadata_to_csv_empty_metadata PASSED [ 30%] +tests/test_virus.py::TestVirus::test_virus_release_date_filter_verification PASSED [ 31%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_geographic_location PASSED [ 31%] +tests/test_virus.py::TestVirus::test_unzip_file_bad_zip_raises PASSED [ 31%] +tests/test_virus.py::TestVirus::test_calculate_max_accessions_per_batch PASSED [ 31%] +tests/test_virus.py::TestVirus::test_parse_accession_input_nonexistent_file_raises_error PASSED [ 32%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_false PASSED [ 32%] +tests/test_virus.py::TestVirus::test_virus_with_length_filters PASSED [ 32%] +tests/test_virus.py::TestVirus::test_check_min_max_invalid_raises PASSED [ 32%] +tests/test_virus.py::TestVirus::test_virus_with_geographic_location_filter PASSED [ 33%] +tests/test_virus.py::TestVirus::test_parse_accession_input_from_file PASSED [ 33%] +tests/test_virus.py::TestVirus::test_is_sars_cov2_query_negative PASSED [ 33%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_combined_filters PASSED [ 33%] +tests/test_virus.py::TestVirus::test_get_gget_version_returns_string PASSED [ 34%] +tests/test_virus.py::TestVirus::test_retry_helper_non_retryable_exception PASSED [ 34%] +tests/test_virus.py::TestVirus::test_check_min_max_none_values PASSED [ 34%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_combined PASSED [ 34%] +tests/test_virus.py::TestVirus::test_stream_copy_fasta_all_records PASSED [ 35%] +tests/test_virus.py::TestVirus::test_parse_accession_input_empty_file_raises_error PASSED [ 35%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_empty PASSED [ 35%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_already_correct_returns_none PASSED [ 35%] +tests/test_virus.py::TestVirus::test_track_failed_operation_creates_key PASSED [ 36%] +tests/test_virus.py::TestVirus::test_filter_cached_host_not_in_strategy PASSED [ 36%] +tests/test_virus.py::TestVirus::test_check_min_max_date_invalid_raises PASSED [ 36%] +tests/test_virus.py::TestVirus::test_parse_accession_input_space_separated PASSED [ 36%] +tests/test_virus.py::TestVirus::test_track_failed_operation_none_dict PASSED [ 37%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_source_database PASSED [ 37%] tests/test_virus.py::TestVirus::test_parse_baseline_file_text PASSED [ 37%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_max_comparison PASSED [ 37%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_empty PASSED [ 37%] -tests/test_virus.py::TestVirus::test_get_datasets_path_uses_bundled_binary PASSED [ 38%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_empty_returns_none PASSED [ 38%] -tests/test_virus.py::TestVirus::test_virus_with_geographic_location_filter PASSED [ 38%] -tests/test_virus.py::TestVirus::test_parse_accession_input_from_file PASSED [ 38%] -tests/test_virus.py::TestVirus::test_virus_integer_virus_id PASSED [ 39%] -tests/test_virus.py::TestVirus::test_virus_release_date_filter_verification PASSED [ 39%] -tests/test_virus.py::TestVirus::test_unzip_file_bad_zip_raises PASSED [ 39%] -tests/test_virus.py::TestVirus::test_clean_xml_declarations PASSED [ 39%] -tests/test_virus.py::TestVirus::test_merge_baseline_with_new_empty_new PASSED [ 40%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_empty_raises PASSED [ 40%] -tests/test_virus.py::TestVirus::test_virus_multiple_filters_relationship_check PASSED [ 40%] -tests/test_virus.py::TestVirus::test_save_metadata_to_csv_basic PASSED [ 40%] -tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter PASSED [ 41%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_gene_count PASSED [ 41%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_true PASSED [ 41%] -tests/test_virus.py::TestVirus::test_filter_cached_no_filters PASSED [ 41%] -tests/test_virus.py::TestVirus::test_get_memory_usage_returns_dict PASSED [ 42%] -tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_empty PASSED [ 42%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_false PASSED [ 42%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_no_parentheses_returns_none PASSED [ 42%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_false PASSED [ 43%] -tests/test_virus.py::TestVirus::test_validate_datasets_binary_nonexistent PASSED [ 43%] -tests/test_virus.py::TestVirus::test_save_partial_metadata_empty PASSED [ 43%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_json PASSED [ 43%] -tests/test_virus.py::TestVirus::test_check_min_max_equal PASSED [ 44%] -tests/test_virus.py::TestVirus::test_get_datasets_version_returns_string_or_none PASSED [ 44%] -tests/test_virus.py::TestVirus::test_unzip_file_nonexistent_raises PASSED [ 44%] -tests/test_virus.py::TestVirus::test_track_failed_operation_appends PASSED [ 44%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_true PASSED [ 45%] -tests/test_virus.py::TestVirus::test_virus_invalid_is_accession_type PASSED [ 45%] -tests/test_virus.py::TestVirus::test_save_metadata_to_csv_empty_metadata PASSED [ 45%] -tests/test_virus.py::TestVirus::test_virus_empty_virus_name PASSED [ 45%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_nuc_completeness_partial PASSED [ 37%] +tests/test_virus.py::TestVirus::test_clean_xml_declarations PASSED [ 38%] +tests/test_virus.py::TestVirus::test_virus_metadata_schema_validation PASSED [ 38%] +tests/test_virus.py::TestVirus::test_clean_xml_declarations_no_declarations PASSED [ 38%] +tests/test_virus.py::TestVirus::test_filter_cached_min_release_date PASSED [ 38%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_false PASSED [ 39%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_env_source PASSED [ 39%] +tests/test_virus.py::TestVirus::test_virus_invalid_annotated_type PASSED [ 39%] +tests/test_virus.py::TestVirus::test_check_min_max_equal PASSED [ 39%] +tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter PASSED [ 40%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_segment PASSED [ 40%] +tests/test_virus.py::TestVirus::test_parse_genbank_xml_basic PASSED [ 40%] +tests/test_virus.py::TestVirus::test_deduplicate_empty_baseline PASSED [ 40%] +tests/test_virus.py::TestVirus::test_unzip_file_nonexistent_raises PASSED [ 41%] +tests/test_virus.py::TestVirus::test_virus_invalid_keep_temp_type PASSED [ 41%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_missing_accession PASSED [ 41%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_negative PASSED [ 41%] +tests/test_virus.py::TestVirus::test_datasets_cli_version_output PASSED [ 42%] +tests/test_virus.py::TestVirus::test_virus_with_genbank_metadata_retrieval PASSED [ 42%] +tests/test_virus.py::TestVirus::test_virus_invalid_completeness PASSED [ 42%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_gene_count PASSED [ 42%] +tests/test_virus.py::TestVirus::test_virus_relationship_check_counts_match PASSED [ 43%] +tests/test_virus.py::TestVirus::test_retry_helper_custom_retryable_exceptions PASSED [ 43%] +tests/test_virus.py::TestVirus::test_check_min_max_valid PASSED [ 43%] +tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_common_names PASSED [ 43%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_peptide_count PASSED [ 44%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_true PASSED [ 44%] +tests/test_virus.py::TestVirus::test_virus_multi_accession_file_input PASSED [ 44%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_isolate PASSED [ 44%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype_list PASSED [ 45%] +tests/test_virus.py::TestVirus::test_unzip_file_valid PASSED [ 45%] +tests/test_virus.py::TestVirus::test_force_garbage_collection_runs PASSED [ 45%] +tests/test_virus.py::TestVirus::test_virus_specific_accession_file_creation PASSED [ 45%] +tests/test_virus.py::TestVirus::test_get_datasets_path_returns_valid_path PASSED [ 46%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_gen_mol_type PASSED [ 46%] tests/test_virus.py::TestVirus::test_parse_date_invalid_raises PASSED [ 46%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_institution PASSED [ 46%] -tests/test_virus.py::TestVirus::test_parse_date_various_formats PASSED [ 46%] -tests/test_virus.py::TestVirus::test_filter_cached_complete_only PASSED [ 46%] -tests/test_virus.py::TestVirus::test_local_name_with_namespace PASSED [ 47%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_zero PASSED [ 47%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_gen_mol_type PASSED [ 47%] -tests/test_virus.py::TestVirus::test_local_name_without_namespace PASSED [ 47%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_collection_date PASSED [ 48%] -tests/test_virus.py::TestVirus::test_validate_datasets_binary_empty_path PASSED [ 48%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_remove_parentheses PASSED [ 48%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_missing_accession PASSED [ 48%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_min_gene_count PASSED [ 49%] -tests/test_virus.py::TestVirus::test_merge_metadata_csvs_no_overwrite PASSED [ 49%] -tests/test_virus.py::TestVirus::test_virus_with_annotated_filter PASSED [ 49%] -tests/test_virus.py::TestVirus::test_save_command_summary_creates_file PASSED [ 49%] -tests/test_virus.py::TestVirus::test_filter_cached_geographic_location PASSED [ 50%] -tests/test_virus.py::TestVirus::test_filter_cached_min_release_date PASSED [ 50%] -tests/test_virus.py::TestVirus::test_virus_invalid_keep_temp_type PASSED [ 50%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_jsonl PASSED [ 50%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype PASSED [ 51%] -tests/test_virus.py::TestVirus::test_calculate_max_accessions_per_batch PASSED [ 51%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_virus_suffix PASSED [ 51%] -tests/test_virus.py::TestVirus::test_write_fasta_record_with_description PASSED [ 51%] -tests/test_virus.py::TestVirus::test_merge_baseline_with_new_csv PASSED [ 52%] -tests/test_virus.py::TestVirus::test_parse_accession_input_empty_file_raises_error PASSED [ 52%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_max PASSED [ 52%] -tests/test_virus.py::TestVirus::test_parse_accession_input_space_separated PASSED [ 52%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_none_raises PASSED [ 53%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_empty PASSED [ 53%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_basic PASSED [ 53%] -tests/test_virus.py::TestVirus::test_stream_copy_fasta_with_accession_filter PASSED [ 53%] -tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_common_names PASSED [ 54%] -tests/test_virus.py::TestVirus::test_filter_cached_annotated PASSED [ 54%] -tests/test_virus.py::TestVirus::test_virus_multi_accession_file_input PASSED [ 54%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_geographic_location PASSED [ 54%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_max_gene_count PASSED [ 55%] -tests/test_virus.py::TestVirus::test_retry_helper_failed_commands_tracking PASSED [ 55%] -tests/test_virus.py::TestVirus::test_retry_helper_custom_retryable_exceptions PASSED [ 55%] -tests/test_virus.py::TestVirus::test_track_failed_operation_creates_key PASSED [ 55%] -tests/test_virus.py::TestVirus::test_parse_genbank_xml_invalid_raises PASSED [ 56%] -tests/test_virus.py::TestVirus::test_virus_completeness_filter_verification PASSED [ 56%] -tests/test_virus.py::TestVirus::test_parse_partial_date_empty_raises PASSED [ 56%] -tests/test_virus.py::TestVirus::test_filter_cached_refseq_only PASSED [ 56%] -tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_accession_mode PASSED [ 57%] -tests/test_virus.py::TestVirus::test_virus_relationship_check_counts_match PASSED [ 57%] -tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter PASSED [ 57%] -tests/test_virus.py::TestVirus::test_stream_copy_fasta_all_records PASSED [ 57%] -tests/test_virus.py::TestVirus::test_merge_metadata_csvs_missing_standard_file PASSED [ 58%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_host PASSED [ 58%] -tests/test_virus.py::TestVirus::test_check_min_max_valid PASSED [ 58%] -tests/test_virus.py::TestVirus::test_parse_genbank_xml_empty_set PASSED [ 58%] -tests/test_virus.py::TestVirus::test_is_sars_cov2_query_negative PASSED [ 59%] -tests/test_virus.py::TestVirus::test_virus_invalid_annotated_type PASSED [ 59%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_space_before_virus PASSED [ 59%] -tests/test_virus.py::TestVirus::test_virus_multi_accession_space_separated PASSED [ 59%] -tests/test_virus.py::TestVirus::test_get_datasets_path_returns_valid_path PASSED [ 60%] -tests/test_virus.py::TestVirus::test_filter_sequences_max_ambiguous_chars PASSED [ 60%] -tests/test_virus.py::TestVirus::test_retry_helper_exponential_backoff_timing PASSED [ 60%] -tests/test_virus.py::TestVirus::test_virus_with_host_filter PASSED [ 60%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_mature_peptide_count PASSED [ 61%] -tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_negative PASSED [ 61%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_min PASSED [ 61%] -tests/test_virus.py::TestVirus::test_merge_metadata_csvs_fills_missing PASSED [ 61%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_combined PASSED [ 62%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_release_date PASSED [ 62%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_peptide_count PASSED [ 62%] -tests/test_virus.py::TestVirus::test_parse_accession_input_nonexistent_file_raises_error PASSED [ 62%] -tests/test_virus.py::TestVirus::test_filter_sequences_proteins_complete PASSED [ 63%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_no_filters PASSED [ 63%] -tests/test_virus.py::TestVirus::test_retry_helper_success_after_retry PASSED [ 63%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_min_comparison PASSED [ 63%] -tests/test_virus.py::TestVirus::test_deduplicate_metadata_against_baseline PASSED [ 64%] -tests/test_virus.py::TestVirus::test_virus_with_multiple_filters PASSED [ 64%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_min_seq_length PASSED [ 64%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_false PASSED [ 64%] -tests/test_virus.py::TestVirus::test_virus_invalid_proteins_complete_type PASSED [ 65%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_protein_count PASSED [ 65%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_true PASSED [ 65%] -tests/test_virus.py::TestVirus::test_check_min_max_none_values PASSED [ 65%] -tests/test_virus.py::TestVirus::test_save_command_summary_with_error PASSED [ 66%] -tests/test_virus.py::TestVirus::test_is_sars_cov2_query_common_names PASSED [ 66%] -tests/test_virus.py::TestVirus::test_virus_specific_accession_file_creation PASSED [ 66%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_max_release_date PASSED [ 66%] -tests/test_virus.py::TestVirus::test_unzip_file_valid PASSED [ 67%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_no_filters PASSED [ 67%] -tests/test_virus.py::TestVirus::test_retry_helper_non_retryable_exception PASSED [ 67%] -tests/test_virus.py::TestVirus::test_merge_baseline_with_new_deduplicates PASSED [ 67%] -tests/test_virus.py::TestVirus::test_retry_helper_successful_operation PASSED [ 68%] -tests/test_virus.py::TestVirus::test_datasets_cli_version_output PASSED [ 68%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_collection_date_range PASSED [ 68%] -tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters PASSED [ 68%] -tests/test_virus.py::TestVirus::test_save_partial_metadata PASSED [ 69%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_multiple PASSED [ 69%] -tests/test_virus.py::TestVirus::test_virus_metadata_schema_validation PASSED [ 69%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_type PASSED [ 69%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_csv PASSED [ 70%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_country PASSED [ 70%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_env_source PASSED [ 70%] -tests/test_virus.py::TestVirus::test_check_min_max_date_valid PASSED [ 70%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_negative PASSED [ 71%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_metadata_type PASSED [ 71%] -tests/test_virus.py::TestVirus::test_force_garbage_collection_runs PASSED [ 71%] -tests/test_virus.py::TestVirus::test_virus_none_virus_name PASSED [ 71%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_combined_filters PASSED [ 72%] -tests/test_virus.py::TestVirus::test_virus_invalid_lab_passaged_type PASSED [ 72%] -tests/test_virus.py::TestVirus::test_parse_date_full PASSED [ 72%] -tests/test_virus.py::TestVirus::test_filter_sequences_no_filters PASSED [ 72%] -tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_basic PASSED [ 73%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_isolation_source PASSED [ 73%] -tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter PASSED [ 73%] -tests/test_virus.py::TestVirus::test_get_gget_version_returns_string PASSED [ 73%] -tests/test_virus.py::TestVirus::test_genbank_xml_to_csv_basic PASSED [ 74%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype_list PASSED [ 74%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_nuc_completeness_partial PASSED [ 74%] -tests/test_virus.py::TestVirus::test_write_fasta_record_without_description PASSED [ 74%] -tests/test_virus.py::TestVirus::test_virus_with_genbank_metadata_retrieval PASSED [ 75%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_protein_count PASSED [ 75%] -tests/test_virus.py::TestVirus::test_virus_with_source_database_filter PASSED [ 75%] -tests/test_virus.py::TestVirus::test_check_min_max_invalid_raises PASSED [ 75%] -tests/test_virus.py::TestVirus::test_filter_cached_host_not_in_strategy PASSED [ 76%] -tests/test_virus.py::TestVirus::test_check_min_max_date_invalid_raises PASSED [ 76%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_source_database PASSED [ 76%] -tests/test_virus.py::TestVirus::test_parse_genbank_xml_basic PASSED [ 76%] -tests/test_virus.py::TestVirus::test_batch_accessions_for_url PASSED [ 77%] -tests/test_virus.py::TestVirus::test_virus_invalid_completeness PASSED [ 77%] -tests/test_virus.py::TestVirus::test_clean_xml_declarations_no_declarations PASSED [ 77%] -tests/test_virus.py::TestVirus::test_write_fasta_record_long_sequence_wraps PASSED [ 77%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap_filter PASSED [ 78%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_limit PASSED [ 78%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap PASSED [ 78%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_expression PASSED [ 78%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_drugs PASSED [ 79%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions PASSED [ 79%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_diseases_filter PASSED [ 79%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_expression_no_limit PASSED [ 79%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_nonexistent_id PASSED [ 80%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_drugs_invalid_filter PASSED [ 80%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_simple_filter PASSED [ 80%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_tractability PASSED [ 80%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets PASSED [ 81%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_no_limit PASSED [ 81%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_resource PASSED [ 81%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_pharmacogenetics PASSED [ 81%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_diseases PASSED [ 82%] -tests/test_ref.py::TestRef::test_ref_rel_protist PASSED [ 82%] -tests/test_ref.py::TestRef::test_ref_rel PASSED [ 82%] -tests/test_ref.py::TestRef::test_ref_bad_species PASSED [ 82%] -tests/test_ref.py::TestRef::test_ref_bad_rel PASSED [ 83%] -tests/test_ref.py::TestRef::test_ref_rel_ftp_octopus PASSED [ 83%] -tests/test_ref.py::TestRef::test_ref_ftp PASSED [ 83%] -tests/test_ref.py::TestRef::test_ref_list PASSED [ 83%] -tests/test_ref.py::TestRef::test_ref_bad_which PASSED [ 84%] -tests/test_ref.py::TestRef::test_ref_which_plant PASSED [ 84%] -tests/test_ref.py::TestRef::test_ref_plant PASSED [ 84%] -tests/test_ref.py::TestRef::test_ref_which PASSED [ 84%] -tests/test_ref.py::TestRef::test_ref_rel_ftp PASSED [ 85%] -tests/test_ref.py::TestRef::test_ref PASSED [ 85%] -tests/test_g2p.py::TestG2P::test_g2p_alignment PASSED [ 85%] -tests/test_g2p.py::TestG2P::test_g2p_map PASSED [ 85%] -tests/test_g2p.py::TestG2P::test_g2p_features PASSED [ 86%] -tests/test_g2p.py::TestG2PValidation::test_invalid_resource_raises PASSED [ 86%] -tests/test_g2p.py::TestG2PValidation::test_alignment_requires_isoform PASSED [ 86%] -tests/test_g2p.py::TestG2PValidation::test_missing_uniprot_raises PASSED [ 86%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue_json PASSED [ 87%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_species PASSED [ 87%] -tests/test_archs4.py::TestArchs4::test_archs4_defaults PASSED [ 87%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_ensembl PASSED [ 87%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_gene PASSED [ 88%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue PASSED [ 88%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue_ensembl PASSED [ 88%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_which PASSED [ 88%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue_mouse PASSED [ 89%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_gene_tissue PASSED [ 89%] -tests/test_archs4.py::TestArchs4::test_archs4_mouse_json_ensembl PASSED [ 89%] -tests/test_seq.py::TestSeq::test_seq_gene_transcript_iso PASSED [ 89%] -tests/test_seq.py::TestSeq::test_seq_transcript_transcript_WB PASSED [ 90%] -tests/test_seq.py::TestSeq::test_seq_transcript_transcript_iso PASSED [ 90%] -tests/test_seq.py::TestSeq::test_seq_transcript_gene_WB PASSED [ 90%] -tests/test_seq.py::TestSeq::test_seq_transcript_gene_iso PASSED [ 90%] -tests/test_seq.py::TestSeq::test_seq_transcript_gene PASSED [ 91%] -tests/test_seq.py::TestSeq::test_seq_gene PASSED [ 91%] -tests/test_seq.py::TestSeq::test_seq_transcript PASSED [ 91%] -tests/test_seq.py::TestSeq::test_seq_missing_uniprot_gene_name PASSED [ 91%] -tests/test_seq.py::TestSeq::test_seq_gene_iso PASSED [ 92%] -tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata_macaca_mulatta SKIPPED [ 92%] -tests/test_cellxgene.py::TestCellxgene::test_cellxgene_adata SKIPPED [ 92%] -tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata SKIPPED [ 92%] -tests/test_cellxgene.py::TestCellxgeneValidation::test_typo_species_raises_valueerror PASSED [ 93%] -tests/test_cellxgene.py::TestCellxgeneValidation::test_supported_species_includes_new_primates PASSED [ 93%] -tests/test_cellxgene.py::TestCellxgeneValidation::test_invalid_species_raises_valueerror PASSED [ 93%] -tests/test_muscle.py::TestMuscle::test_muscle_nt_txt PASSED [ 93%] -tests/test_muscle.py::TestMuscle::test_muscle_nt PASSED [ 94%] -tests/test_muscle.py::TestMuscleAA::test_muscle_aa PASSED [ 94%] -tests/test_muscle.py::TestMuscleSeqsInput::test_muscle_seqs_as_input PASSED [ 94%] -tests/test_muscle.py::TestMuscleSuper::test_muscle_nt_super5 PASSED [ 94%] -tests/test_muscle.py::TestMusclePrints::test_muscle_print_nt PASSED [ 95%] -tests/test_muscle.py::TestMuscleAASuper::test_muscle_aa_super5 PASSED [ 95%] -tests/test_blast.py::TestBlast::test_blast_bad_seq PASSED [ 95%] -tests/test_blast.py::TestBlast::test_blast_db_missing PASSED [ 95%] -tests/test_blast.py::TestBlast::test_blast_nt PASSED [ 96%] -tests/test_blast.py::TestBlast::test_blast_bad_program PASSED [ 96%] -tests/test_blast.py::TestBlast::test_blast_bad_db1 PASSED [ 96%] -tests/test_blast.py::TestBlast::test_blast_bad_db2 PASSED [ 96%] -tests/test_blast.py::TestBlast::test_blast_bad_fasta PASSED [ 97%] -tests/test_info.py::TestInfo::test_info_ncbifalse_uniprotfalse PASSED [ 97%] -tests/test_info.py::TestInfo::test_info_exon PASSED [ 97%] -tests/test_info.py::TestInfo::test_info_ncbitrue_uniprotfalse PASSED [ 97%] -tests/test_info.py::TestInfo::test_info_transcript PASSED [ 98%] -tests/test_info.py::TestInfo::test_info_gene_list_non_model PASSED [ 98%] -tests/test_info.py::TestInfo::test_info_WB_transcript PASSED [ 98%] -tests/test_info.py::TestInfo::test_info_ncbifalse_uniprottrue PASSED [ 98%] -tests/test_info.py::TestInfo::test_info_mix PASSED [ 99%] -tests/test_info.py::TestInfo::test_info_gene PASSED [ 99%] -tests/test_compile.py::TestCompilerWindows::test_compiler_windows PASSED [ 99%] -tests/test_pdb.py::TestPDB::test_pdb_pdb PASSED [ 99%] -tests/test_pdb.py::TestPDB::test_pdb_assembly PASSED [100%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_max PASSED [ 46%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_empty_returns_none PASSED [ 47%] +tests/test_virus.py::TestVirus::test_filter_cached_host_in_strategy_skipped PASSED [ 47%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_virus_suffix PASSED [ 47%] +tests/test_virus.py::TestVirus::test_write_fasta_record_without_description PASSED [ 47%] +tests/test_virus.py::TestVirus::test_deduplicate_metadata_against_baseline PASSED [ 48%] +tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters PASSED [ 48%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_invalid_attempt_returns_none PASSED [ 48%] +tests/test_virus.py::TestVirus::test_parse_genbank_xml_invalid_raises PASSED [ 48%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_false PASSED [ 49%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_name PASSED [ 49%] +tests/test_virus.py::TestVirus::test_virus_with_completeness_filter PASSED [ 49%] +tests/test_virus.py::TestVirus::test_virus_empty_virus_name PASSED [ 49%] +tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_negative PASSED [ 50%] +tests/test_virus.py::TestVirus::test_virus_multi_accession_space_separated PASSED [ 50%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_remove_parentheses PASSED [ 50%] +tests/test_virus.py::TestVirus::test_retry_helper_failed_commands_tracking PASSED [ 50%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_min_seq_length PASSED [ 51%] +tests/test_virus.py::TestVirus::test_save_metadata_to_csv_basic PASSED [ 51%] +tests/test_virus.py::TestVirus::test_retry_helper_exponential_backoff_timing PASSED [ 51%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_jsonl PASSED [ 51%] +tests/test_virus.py::TestVirus::test_filter_cached_complete_only PASSED [ 52%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_no_filters PASSED [ 52%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_min PASSED [ 52%] +tests/test_virus.py::TestVirus::test_is_sars_cov2_query_common_names PASSED [ 52%] +tests/test_virus.py::TestVirus::test_filter_cached_no_filters PASSED [ 53%] +tests/test_virus.py::TestVirus::test_deduplicate_all_existing PASSED [ 53%] +tests/test_virus.py::TestVirus::test_parse_genbank_xml_empty_set PASSED [ 53%] +tests/test_virus.py::TestVirus::test_filter_sequences_max_ambiguous_chars PASSED [ 53%] +tests/test_compile.py::TestCompilerWindows::test_compiler_windows PASSED [ 54%] +tests/test_seq.py::TestSeq::test_seq_transcript_gene PASSED [ 54%] +tests/test_seq.py::TestSeq::test_seq_transcript_transcript_iso PASSED [ 54%] +tests/test_seq.py::TestSeq::test_seq_transcript_transcript_WB PASSED [ 54%] +tests/test_seq.py::TestSeq::test_seq_gene PASSED [ 55%] +tests/test_seq.py::TestSeq::test_seq_missing_uniprot_gene_name PASSED [ 55%] +tests/test_seq.py::TestSeq::test_seq_gene_iso PASSED [ 55%] +tests/test_seq.py::TestSeq::test_seq_gene_transcript_iso PASSED [ 55%] +tests/test_seq.py::TestSeq::test_seq_transcript_gene_iso PASSED [ 56%] +tests/test_seq.py::TestSeq::test_seq_transcript_gene_WB PASSED [ 56%] +tests/test_seq.py::TestSeq::test_seq_transcript PASSED [ 56%] +tests/test_cosmic.py::TestCosmicWorkflow::test_cosmic_defaults PASSED [ 56%] +tests/test_mutate.py::TestMutate::test_index_error PASSED [ 57%] +tests/test_mutate.py::TestMutate::test_multi_delins_with_psuedo_left_repeats PASSED [ 57%] +tests/test_mutate.py::TestMutate::test_ambiguous_mutation PASSED [ 57%] +tests/test_mutate.py::TestMutate::test_single_deletion PASSED [ 57%] +tests/test_mutate.py::TestMutate::test_uncertain_mutation PASSED [ 58%] +tests/test_mutate.py::TestMutate::test_intron_mutation_plus PASSED [ 58%] +tests/test_mutate.py::TestMutate::test_multi_delins_with_true_left_repeats PASSED [ 58%] +tests/test_mutate.py::TestMutate::test_multi_dup PASSED [ 58%] +tests/test_mutate.py::TestMutate::test_single_deletion_with_right_repeats PASSED [ 59%] +tests/test_mutate.py::TestMutate::test_single_dup PASSED [ 59%] +tests/test_mutate.py::TestMutate::test_single_substitution_near_right_end PASSED [ 59%] +tests/test_mutate.py::TestMutate::test_multi_deletion_with_right_repeats PASSED [ 59%] +tests/test_mutate.py::TestMutate::test_multi_insertion_with_left_repeats PASSED [ 60%] +tests/test_mutate.py::TestMutate::test_large_k PASSED [ 60%] +tests/test_mutate.py::TestMutate::test_multi_deletion PASSED [ 60%] +tests/test_mutate.py::TestMutate::test_inversion_with_overlaps PASSED [ 60%] +tests/test_mutate.py::TestMutate::test_multi_insertion PASSED [ 61%] +tests/test_mutate.py::TestMutate::test_posttranslational_mutation PASSED [ 61%] +tests/test_mutate.py::TestMutate::test_single_substitution_near_left_end PASSED [ 61%] +tests/test_mutate.py::TestMutate::test_multi_delins PASSED [ 61%] +tests/test_mutate.py::TestMutate::test_single_insertion PASSED [ 62%] +tests/test_mutate.py::TestMutate::test_single_deletion_with_left_repeats PASSED [ 62%] +tests/test_mutate.py::TestMutate::test_multi_delins_with_true_right_repeats PASSED [ 62%] +tests/test_mutate.py::TestMutate::test_intron_mutation_minus PASSED [ 62%] +tests/test_mutate.py::TestMutate::test_single_substitution PASSED [ 63%] +tests/test_mutate.py::TestMutate::test_list_of_mutations PASSED [ 63%] +tests/test_mutate.py::TestMutate::test_single_delins PASSED [ 63%] +tests/test_mutate.py::test_mismatch_error PASSED [ 63%] +tests/test_mutate.py::test_csv_of_mutations PASSED [ 64%] +tests/test_elm.py::TestELM::test_elm_uniprot_id_in_elm PASSED [ 64%] +tests/test_elm.py::TestELM::test_elm_uniprot_aminoacidseq PASSED [ 64%] +tests/test_elm.py::TestELM::test_elm_uniprot_id_new PASSED [ 64%] +tests/test_diamond.py::TestDiamond::test_diamond_seqs_multiple PASSED [ 65%] +tests/test_diamond.py::TestDiamond::test_diamond_JSON_out PASSED [ 65%] +tests/test_diamond.py::TestDiamond::test_diamond_both_files PASSED [ 65%] +tests/test_diamond.py::TestDiamond::test_diamond_seqs_single PASSED [ 65%] +tests/test_diamond.py::TestDiamond::test_diamond_ref_file PASSED [ 66%] +tests/test_diamond.py::TestDiamond::test_diamond_query_file PASSED [ 66%] +tests/test_g2p.py::TestG2P::test_g2p_alignment PASSED [ 66%] +tests/test_g2p.py::TestG2P::test_g2p_features PASSED [ 66%] +tests/test_g2p.py::TestG2P::test_g2p_map PASSED [ 67%] +tests/test_g2p.py::TestG2PValidation::test_alignment_requires_isoform PASSED [ 67%] +tests/test_g2p.py::TestG2PValidation::test_missing_uniprot_raises PASSED [ 67%] +tests/test_g2p.py::TestG2PValidation::test_invalid_resource_raises PASSED [ 67%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_diseases_filter PASSED [ 68%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_pharmacogenetics PASSED [ 68%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_expression PASSED [ 68%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap_filter PASSED [ 68%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_drugs_invalid_filter PASSED [ 69%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_limit PASSED [ 69%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap PASSED [ 69%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_drugs PASSED [ 69%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_diseases PASSED [ 70%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets PASSED [ 70%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_tractability PASSED [ 70%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_expression_no_limit PASSED [ 70%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_simple_filter PASSED [ 71%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_resource PASSED [ 71%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_nonexistent_id PASSED [ 71%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_no_limit PASSED [ 71%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions PASSED [ 72%] +tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata_macaca_mulatta SKIPPED [ 72%] +tests/test_cellxgene.py::TestCellxgene::test_cellxgene_adata SKIPPED [ 72%] +tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata SKIPPED [ 72%] +tests/test_cellxgene.py::TestCellxgeneValidation::test_typo_species_raises_valueerror PASSED [ 73%] +tests/test_cellxgene.py::TestCellxgeneValidation::test_supported_species_includes_new_primates PASSED [ 73%] +tests/test_cellxgene.py::TestCellxgeneValidation::test_invalid_species_raises_valueerror PASSED [ 73%] +tests/test_utils.py::TestUtils::test_aa_colors PASSED [ 73%] +tests/test_utils.py::TestUtils::test_read_fasta PASSED [ 74%] +tests/test_utils.py::TestUtils::test_search_species_options_bad_type PASSED [ 74%] +tests/test_utils.py::TestUtils::test_ref_iv_species_options PASSED [ 74%] +tests/test_utils.py::TestUtils::test_n_colors PASSED [ 74%] +tests/test_utils.py::TestUtils::test_search_species_options PASSED [ 75%] +tests/test_utils.py::TestUtils::test_get_uniprot_info_gene PASSED [ 75%] +tests/test_utils.py::TestUtils::test_rest_query_bad_type PASSED [ 75%] +tests/test_utils.py::TestUtils::test_find_latest_ens_rel PASSED [ 75%] +tests/test_utils.py::TestUtils::test_ref_species_options_bad_type PASSED [ 76%] +tests/test_utils.py::TestUtils::test_ref_species_options PASSED [ 76%] +tests/test_utils.py::TestUtils::test_search_iv_species_options PASSED [ 76%] +tests/test_utils.py::TestUtils::test_get_uniprot_info_transcript PASSED [ 76%] +tests/test_utils.py::TestUtils::test_get_uniprot_seqs PASSED [ 77%] +tests/test_utils.py::TestUtils::test_rest_query PASSED [ 77%] +tests/test_8cube.py::TestGeneExpression::test_gene_expression_basic PASSED [ 77%] +tests/test_8cube.py::TestSpecificity::test_specificity_basic PASSED [ 77%] +tests/test_8cube.py::TestPsiBlock::test_psi_block_basic PASSED [ 78%] +tests/test_blast.py::TestBlast::test_blast_bad_seq PASSED [ 78%] +tests/test_blast.py::TestBlast::test_blast_bad_db2 PASSED [ 78%] +tests/test_blast.py::TestBlast::test_blast_bad_program PASSED [ 78%] +tests/test_blast.py::TestBlast::test_blast_bad_fasta PASSED [ 79%] +tests/test_blast.py::TestBlast::test_blast_bad_db1 PASSED [ 79%] +tests/test_blast.py::TestBlast::test_blast_nt PASSED [ 79%] +tests/test_blast.py::TestBlast::test_blast_db_missing PASSED [ 79%] +tests/test_search.py::TestSearch::test_search_gene_one_sw_limit PASSED [ 80%] +tests/test_search.py::TestSearch::test_search_gene_bad_species PASSED [ 80%] +tests/test_search.py::TestSearch::test_search_transcript_one_sw PASSED [ 80%] +tests/test_search.py::TestSearch::test_search_gene_two_sw_and PASSED [ 80%] +tests/test_search.py::TestSearch::test_search_transcript_bad_species PASSED [ 81%] +tests/test_search.py::TestSearch::test_search_octopus PASSED [ 81%] +tests/test_search.py::TestSearch::test_search_plant PASSED [ 81%] +tests/test_search.py::TestSearch::test_search_gene_bad_andor PASSED [ 81%] +tests/test_search.py::TestSearch::test_search_transcript_two_sw_and PASSED [ 82%] +tests/test_search.py::TestSearch::test_search_release PASSED [ 82%] +tests/test_search.py::TestSearch::test_search_transcript_bad_andor PASSED [ 82%] +tests/test_search.py::TestSearch::test_search_gene_one_sw PASSED [ 82%] +tests/test_search.py::TestSearch::test_search_plant_db PASSED [ 83%] +tests/test_search.py::TestSearch::test_search_gene_two_sw_limit PASSED [ 83%] +tests/test_search.py::TestSearch::test_search_db PASSED [ 83%] +tests/test_search.py::TestSearch::test_search_transcript_two_sw_or PASSED [ 83%] +tests/test_search.py::TestSearch::test_search_gene_two_sw_or PASSED [ 84%] +tests/test_search.py::TestSearch::test_search_gene_one_sw_json PASSED [ 84%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_yeast PASSED [ 84%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_background_ensembl PASSED [ 84%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_celltypes PASSED [ 85%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background_list PASSED [ 85%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_none PASSED [ 85%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_mouse_is_human PASSED [ 85%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_diseases_drugs PASSED [ 86%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_plot PASSED [ 86%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_transcription PASSED [ 86%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_background PASSED [ 86%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_species PASSED [ 87%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_fly PASSED [ 87%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_gene PASSED [ 87%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_kinase_interactions PASSED [ 87%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_worm PASSED [ 88%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_ontology PASSED [ 88%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_database_shortcut PASSED [ 88%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background PASSED [ 88%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_pathway PASSED [ 89%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_json PASSED [ 89%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_ensembl_ids PASSED [ 89%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_fish PASSED [ 89%] +tests/test_info.py::TestInfo::test_info_WB_transcript PASSED [ 90%] +tests/test_info.py::TestInfo::test_info_ncbifalse_uniprotfalse PASSED [ 90%] +tests/test_info.py::TestInfo::test_info_transcript PASSED [ 90%] +tests/test_info.py::TestInfo::test_info_gene PASSED [ 90%] +tests/test_info.py::TestInfo::test_info_ncbifalse_uniprottrue PASSED [ 91%] +tests/test_info.py::TestInfo::test_info_gene_list_non_model PASSED [ 91%] +tests/test_info.py::TestInfo::test_info_exon PASSED [ 91%] +tests/test_info.py::TestInfo::test_info_mix PASSED [ 91%] +tests/test_info.py::TestInfo::test_info_ncbitrue_uniprotfalse PASSED [ 92%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue_json PASSED [ 92%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_gene PASSED [ 92%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_species PASSED [ 92%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_ensembl PASSED [ 93%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_which PASSED [ 93%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue_mouse PASSED [ 93%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_gene_tissue PASSED [ 93%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue_ensembl PASSED [ 94%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue PASSED [ 94%] +tests/test_archs4.py::TestArchs4::test_archs4_mouse_json_ensembl PASSED [ 94%] +tests/test_archs4.py::TestArchs4::test_archs4_defaults PASSED [ 94%] +tests/test_cbio.py::TestCbio::test_cbio_download_partially_existing_files PASSED [ 95%] +tests/test_cbio.py::TestCbio::test_error_cbio_download PASSED [ 95%] +tests/test_cbio.py::TestCbio::test_cbio_download PASSED [ 95%] +tests/test_cbio.py::TestCbioSearch::test_cbio_search PASSED [ 95%] +tests/test_blat.py::TestBlat::test_blat_bad_assembly PASSED [ 96%] +tests/test_blat.py::TestBlat::test_blat_bad_fileformat PASSED [ 96%] +tests/test_blat.py::TestBlat::test_blat_nt_DNA PASSED [ 96%] +tests/test_blat.py::TestBlat::test_blat_shortseq PASSED [ 96%] +tests/test_blat.py::TestBlat::test_blat_bad_fasta PASSED [ 97%] +tests/test_blat.py::TestBlat::test_blat_nt_json PASSED [ 97%] +tests/test_blat.py::TestBlat::test_blat_aa_protein PASSED [ 97%] +tests/test_blat.py::TestBlat::test_blat_nt_RNA PASSED [ 97%] +tests/test_blat.py::TestBlat::test_blat_nt_transDNA PASSED [ 98%] +tests/test_blat.py::TestBlat::test_blat_nt_txt PASSED [ 98%] +tests/test_blat.py::TestBlat::test_blat_nt_fasta PASSED [ 98%] +tests/test_blat.py::TestBlat::test_blat_nt_protein PASSED [ 98%] +tests/test_blat.py::TestBlat::test_blat_aa_RNA PASSED [ 99%] +tests/test_blat.py::TestBlat::test_blat_nt PASSED [ 99%] +tests/test_blat.py::TestBlat::test_blat_bad_seqtype PASSED [ 99%] +tests/test_blat.py::TestBlat::test_blat_aa PASSED [ 99%] +tests/test_blat.py::TestBlat::test_blat_bad_txt PASSED [100%] =================================== FAILURES =================================== -_________________________ TestBgee.test_bgee_orthologs _________________________ +________________________ TestBgee.test_bgee_expression _________________________ -self = +self = def assert_equal(self: unittest.TestCase): test = name @@ -427,12 +427,12 @@ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/from_json.py:60: in do_call return func(**args) ^^^^^^^^^^^^ -gget/gget_bgee.py:192: in bgee - return _bgee_orthologs(gene_id, json=json, verbose=verbose) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -gget/gget_bgee.py:60: in _bgee_orthologs - species = _bgee_species(gene_id, verbose=verbose) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +gget/gget_bgee.py:190: in bgee + return _bgee_expression(gene_id, json=json, verbose=verbose) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +gget/gget_bgee.py:117: in _bgee_expression + species_set = {_bgee_species(gene_id, verbose=verbose) for gene_id in gene_ids} + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ gget/gget_bgee.py:24: in _bgee_species payload = http_json( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @@ -440,7 +440,7 @@ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ method = 'GET', url = 'https://bgee.org/api/' context = 'Bgee API (species lookup)', timeout = (10, 60), retries = 3 backoff = 1.0 -kwargs = {'params': {'display_type': 'json', 'page': 'gene', 'action': 'general_info', 'gene_id': 'ENSOARG00000019163'}} +kwargs = {'params': {'display_type': 'json', 'page': 'gene', 'action': 'general_info', 'gene_id': 'ENSBTAG00000047356'}} def http_json( method: str, @@ -494,7 +494,7 @@ E RuntimeError: Bgee API (species lookup) returned HTTP 403. B gget/utils.py:147: RuntimeError ------------------------------ Captured log call ------------------------------- -INFO gget.utils:gget_bgee.py:22 Getting species ID for gene ENSOARG00000019163 from Bgee +INFO gget.utils:gget_bgee.py:22 Getting species ID for gene ENSBTAG00000047356 from Bgee ____________________ TestBgee.test_bgee_expression_multiple ____________________ self = @@ -578,9 +578,9 @@ E RuntimeError: Bgee API (species lookup) returned HTTP 403. B gget/utils.py:147: RuntimeError ------------------------------ Captured log call ------------------------------- INFO gget.utils:gget_bgee.py:22 Getting species ID for gene ENSBTAG00000047356 from Bgee -________________________ TestBgee.test_bgee_expression _________________________ +_________________________ TestBgee.test_bgee_orthologs _________________________ -self = +self = def assert_equal(self: unittest.TestCase): test = name @@ -593,12 +593,12 @@ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/from_json.py:60: in do_call return func(**args) ^^^^^^^^^^^^ -gget/gget_bgee.py:190: in bgee - return _bgee_expression(gene_id, json=json, verbose=verbose) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -gget/gget_bgee.py:117: in _bgee_expression - species_set = {_bgee_species(gene_id, verbose=verbose) for gene_id in gene_ids} - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +gget/gget_bgee.py:192: in bgee + return _bgee_orthologs(gene_id, json=json, verbose=verbose) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +gget/gget_bgee.py:60: in _bgee_orthologs + species = _bgee_species(gene_id, verbose=verbose) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ gget/gget_bgee.py:24: in _bgee_species payload = http_json( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @@ -606,7 +606,7 @@ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ method = 'GET', url = 'https://bgee.org/api/' context = 'Bgee API (species lookup)', timeout = (10, 60), retries = 3 backoff = 1.0 -kwargs = {'params': {'display_type': 'json', 'page': 'gene', 'action': 'general_info', 'gene_id': 'ENSBTAG00000047356'}} +kwargs = {'params': {'display_type': 'json', 'page': 'gene', 'action': 'general_info', 'gene_id': 'ENSOARG00000019163'}} def http_json( method: str, @@ -660,52 +660,65 @@ E RuntimeError: Bgee API (species lookup) returned HTTP 403. B gget/utils.py:147: RuntimeError ------------------------------ Captured log call ------------------------------- -INFO gget.utils:gget_bgee.py:22 Getting species ID for gene ENSBTAG00000047356 from Bgee +INFO gget.utils:gget_bgee.py:22 Getting species ID for gene ENSOARG00000019163 from Bgee =============================== warnings summary =============================== -tests/test_utils.py::TestUtils::test_search_iv_species_options -tests/test_utils.py::TestUtils::test_search_iv_species_options -tests/test_utils.py::TestUtils::test_search_iv_species_options -tests/test_utils.py::TestUtils::test_search_iv_species_options -tests/test_search.py::TestSearch::test_search_gene_two_sw_limit -tests/test_search.py::TestSearch::test_search_gene_two_sw_limit -tests/test_search.py::TestSearch::test_search_gene_two_sw_limit -tests/test_search.py::TestSearch::test_search_gene_two_sw_limit - /home/runner/work/gget/gget/gget/utils.py:882: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. - for subsoup in soup.body.findAll("a"): - -tests/test_utils.py::TestUtils::test_search_species_options -tests/test_search.py::TestSearch::test_search_gene_two_sw_limit -tests/test_search.py::TestSearch::test_search_transcript_two_sw_or -tests/test_search.py::TestSearch::test_search_release - /home/runner/work/gget/gget/gget/utils.py:898: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. - for subsoup in soup.body.findAll("a"): - -tests/test_utils.py: 1 warning tests/test_ref.py: 11 warnings +tests/test_utils.py: 1 warning /home/runner/work/gget/gget/gget/utils.py:997: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. for subsoup in soup.body.findAll("a"): -tests/test_utils.py: 4 warnings tests/test_ref.py: 24 warnings +tests/test_utils.py: 4 warnings /home/runner/work/gget/gget/gget/utils.py:974: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. for subsoup in soup.body.findAll("a"): -tests/test_search.py::TestSearch::test_search_gene_two_sw_limit -tests/test_search.py::TestSearch::test_search_transcript_two_sw_or -tests/test_search.py::TestSearch::test_search_transcript_two_sw_and -tests/test_search.py::TestSearch::test_search_transcript_one_sw - /home/runner/work/gget/gget/gget/gget_search.py:270: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy. - df_temp = pd.read_sql(query, con=db_connection) - -tests/test_search.py: 19 warnings tests/test_ref.py: 7 warnings +tests/test_search.py: 19 warnings /home/runner/work/gget/gget/gget/utils.py:921: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. for subsoup in soup.body.findAll("a"): +tests/test_ref.py: 39 warnings + /home/runner/work/gget/gget/gget/gget_ref.py:49: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. + links = [stuff.text.strip() for stuff in soup.findAll("td")] + +tests/test_ref.py::TestRef::test_ref +tests/test_ref.py::TestRef::test_ref_ftp + /home/runner/work/gget/gget/gget/gget_ref.py:325: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. + links = [stuff.text.strip() for stuff in soup.findAll("td")] + +tests/test_mutate.py: 29 warnings + /home/runner/work/gget/gget/gget/gget_mutate.py:667: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract. + mask = mutations[mut_column].str.contains(combined_pattern) + +tests/test_utils.py::TestUtils::test_search_species_options +tests/test_search.py::TestSearch::test_search_gene_one_sw_limit +tests/test_search.py::TestSearch::test_search_release +tests/test_search.py::TestSearch::test_search_transcript_two_sw_or + /home/runner/work/gget/gget/gget/utils.py:898: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. + for subsoup in soup.body.findAll("a"): + +tests/test_utils.py::TestUtils::test_search_iv_species_options +tests/test_utils.py::TestUtils::test_search_iv_species_options +tests/test_utils.py::TestUtils::test_search_iv_species_options +tests/test_utils.py::TestUtils::test_search_iv_species_options +tests/test_search.py::TestSearch::test_search_gene_one_sw_limit +tests/test_search.py::TestSearch::test_search_gene_one_sw_limit +tests/test_search.py::TestSearch::test_search_gene_one_sw_limit +tests/test_search.py::TestSearch::test_search_gene_one_sw_limit + /home/runner/work/gget/gget/gget/utils.py:882: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. + for subsoup in soup.body.findAll("a"): + tests/test_search.py: 10 warnings /home/runner/work/gget/gget/gget/gget_search.py:235: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy. df_temp = pd.read_sql(query, con=db_connection) +tests/test_search.py::TestSearch::test_search_transcript_one_sw +tests/test_search.py::TestSearch::test_search_transcript_two_sw_and +tests/test_search.py::TestSearch::test_search_gene_two_sw_limit +tests/test_search.py::TestSearch::test_search_transcript_two_sw_or + /home/runner/work/gget/gget/gget/gget_search.py:270: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy. + df_temp = pd.read_sql(query, con=db_connection) + tests/test_cbio.py::TestCbioSearch::test_cbio_search tests/test_cbio.py::TestCbioSearch::test_cbio_search /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/swagger_spec_validator/validator12.py:18: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. @@ -732,36 +745,23 @@ tests/test_cbio.py: 16 warnings /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/bravado_core/model.py:888: DeprecationWarning: jsonschema.RefResolver.in_scope is deprecated and will be removed in a future release. with spec.resolver.in_scope(additional_uri): -tests/test_mutate.py: 29 warnings - /home/runner/work/gget/gget/gget/gget_mutate.py:667: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract. - mask = mutations[mut_column].str.contains(combined_pattern) - -tests/test_ref.py: 39 warnings - /home/runner/work/gget/gget/gget/gget_ref.py:49: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. - links = [stuff.text.strip() for stuff in soup.findAll("td")] - -tests/test_ref.py::TestRef::test_ref_ftp -tests/test_ref.py::TestRef::test_ref - /home/runner/work/gget/gget/gget/gget_ref.py:325: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. - links = [stuff.text.strip() for stuff in soup.findAll("td")] - -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html ============================= slowest 10 durations ============================= -175.04s call tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter -130.13s call tests/test_virus.py::TestVirus::test_virus_with_source_database_filter -128.02s call tests/test_virus.py::TestVirus::test_virus_integer_virus_id -125.52s call tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter -73.73s call tests/test_blast.py::TestBlast::test_blast_nt -72.65s call tests/test_virus.py::TestVirus::test_virus_with_annotated_filter -61.57s call tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter -37.17s call tests/test_search.py::TestSearch::test_search_gene_two_sw_limit -25.96s call tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters -21.37s call tests/test_virus.py::TestVirus::test_virus_with_length_filters +128.37s call tests/test_virus.py::TestVirus::test_virus_with_source_database_filter +127.70s call tests/test_virus.py::TestVirus::test_virus_integer_virus_id +126.97s call tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter +125.46s call tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter +74.71s call tests/test_blast.py::TestBlast::test_blast_nt +73.02s call tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters +62.78s call tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter +36.92s call tests/test_8cube.py::TestSpecificity::test_specificity_basic +24.17s call tests/test_virus.py::TestVirus::test_virus_with_annotated_filter +19.26s call tests/test_virus.py::TestVirus::test_virus_with_length_filters =========================== short test summary info ============================ SKIPPED [1] tests/test_cellxgene.py:65: cellxgene-census is not installed SKIPPED [1] tests/test_cellxgene.py:45: cellxgene-census is not installed SKIPPED [1] tests/test_cellxgene.py:55: cellxgene-census is not installed -FAILED tests/test_bgee.py::TestBgee::test_bgee_orthologs - RuntimeError: Bgee API (species lookup) returned HTTP 403. Body: Just a moment...Just a moment...Just a moment...Just a moment...Just a moment... Date: Tue, 23 Jun 2026 01:11:00 +0800 Subject: [PATCH 04/34] feat(pdb): support PDBx/mmCIF format with automatic fallback (#178, #177) (#222) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(pdb): support PDBx/mmCIF format and auto-fallback (#178, #177) The legacy PDB format is being phased out by RCSB and is unavailable for large structures (e.g. 6Q38, 7A01), causing `gget pdb` to fail with "not found" — the bug reported in #177. - Add `resource="mmcif"` to download the structure in PDBx/mmCIF (.cif). - `resource="pdb"` (default) now automatically falls back to PDBx/mmCIF when the legacy PDB file is unavailable, logging a warning. Saved files use the correct extension (.cif vs .pdb) based on the format fetched. - Backward compatible: existing commands that already worked are unchanged. - Tests: explicit mmcif download + legacy->mmcif fallback regression (6Q38). - Docs + updates.md. Co-Authored-By: Claude Opus 4.8 (1M context) * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fix: ruff lint errors flagged by pre-commit.ci - gget_g2p.py: collapse the multi-line docstring summary into a single line + blank line (ruff D205). - main.py: add the missing # noqa: E402 to the 6 new import lines (g2p, ref, search, seq, setup, virus). All earlier imports already carry this noqa because dt_string is computed at module top before the import block, so E402 fires on any unmarked later import. Also drops the stray "# Module functions" comment that was splitting one alphabetical import list into two. --------- Co-authored-by: Claude Opus 4.8 (1M context) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Laura Luebbert --- .github/badges/tests.json | 7 +++- docs/src/en/pdb.md | 16 +++++++-- docs/src/en/updates.md | 3 ++ gget/gget_cbio.py | 4 ++- gget/gget_g2p.py | 21 +++++------ gget/gget_muscle.py | 4 +-- gget/gget_pdb.py | 60 ++++++++++++++++++++++--------- gget/gget_search.py | 3 +- gget/gget_setup.py | 4 +-- gget/gget_virus.py | 75 +++++++++++++++++++++++++++++++-------- gget/main.py | 53 +++++++++------------------ gget/utils.py | 6 ++-- pyproject.toml | 8 ++--- tests/pytest_results.txt | 30 ++++++++-------- tests/test_g2p.py | 1 + tests/test_pdb.py | 28 ++++++++++++--- 16 files changed, 202 insertions(+), 121 deletions(-) diff --git a/.github/badges/tests.json b/.github/badges/tests.json index ee922eff3..b902293bd 100644 --- a/.github/badges/tests.json +++ b/.github/badges/tests.json @@ -1 +1,6 @@ -{"schemaVersion": 1, "label": "tests", "message": "394/400 passing", "color": "yellow"} +{ + "schemaVersion": 1, + "label": "tests", + "message": "394/400 passing", + "color": "yellow" +} diff --git a/docs/src/en/pdb.md b/docs/src/en/pdb.md index b369bada3..84e0b24e0 100644 --- a/docs/src/en/pdb.md +++ b/docs/src/en/pdb.md @@ -3,7 +3,7 @@ > Python arguments are equivalent to long-option arguments (`--arg`), unless otherwise specified. Flags are True/False arguments in Python. The manual for any gget tool can be called from the command-line using the `-h` `--help` flag. # gget pdb 🔮 Query [RCSB Protein Data Bank (PDB)](https://www.rcsb.org/) for the protein structure/metadata of a given PDB ID. -Return format: Resource 'pdb' is returned in PDB format. All other resources are returned in JSON format. +Return format: Resource 'pdb' is returned in legacy PDB format (or PDBx/mmCIF if the legacy PDB file is unavailable), 'mmcif' in PDBx/mmCIF format. All other resources are returned in JSON format. **Positional argument** `pdb_id` @@ -12,7 +12,8 @@ PDB ID to be queried, e.g. '7S7U'. **Optional arguments** `-r` `--resource` Defines type of information to be returned. One of the following: - 'pdb': Returns the protein structure in PDB format (default). + 'pdb': Returns the protein structure in legacy PDB format (default). The legacy PDB format is being phased out by RCSB and is unavailable for large structures; in that case gget automatically falls back to the PDBx/mmCIF format. + 'mmcif': Returns the protein structure in PDBx/mmCIF format (.cif). 'entry': Information about PDB structures at the top level of PDB structure hierarchical data organization. 'pubmed': Get PubMed annotations (data integrated from PubMed) for a given entry's primary citation. 'assembly': Information about PDB structures at the quaternary structure level. @@ -42,6 +43,17 @@ gget.pdb("7S7U", save=True) ``` → Saves the structure of 7S7U in PDB format as '7S7U.pdb' in the current working directory. +**Fetch a structure in PDBx/mmCIF format (recommended for large structures, which have no legacy PDB file):** +```bash +gget pdb 6Q38 -r mmcif -o 6Q38.cif +``` +```python +# Python +gget.pdb("6Q38", resource="mmcif", save=True) +``` +→ Saves the structure of 6Q38 in PDBx/mmCIF format as '6Q38.cif' in the current working directory. +Note: `gget pdb 6Q38` (without `-r mmcif`) also works — since 6Q38 has no legacy PDB file, gget automatically falls back to PDBx/mmCIF and saves a '.cif' file. + **Find PDB crystal structures for a comparative analysis of protein structure:** ```bash # Find PDB IDs associated with an Ensembl ID diff --git a/docs/src/en/updates.md b/docs/src/en/updates.md index 80901c3f4..44d10ab55 100644 --- a/docs/src/en/updates.md +++ b/docs/src/en/updates.md @@ -5,6 +5,9 @@ #### *gget* officially became part of *scverse* on June 9, 2026. 🥳🥳🥳 **Version ≥ 0.30.8** (XXX XX, 2026): +- [`gget pdb`](pdb.md): Added support for the PDBx/mmCIF structure format (fixes [issue 178](https://github.com/scverse/gget/issues/178) and [issue 177](https://github.com/scverse/gget/issues/177)). + - New `resource="mmcif"` option downloads the structure in PDBx/mmCIF format (`.cif`). + - The default `resource="pdb"` now automatically falls back to PDBx/mmCIF when the legacy PDB file is unavailable (e.g. for large structures), since the legacy PDB format is being phased out by RCSB. A warning is logged and saved files use the correct extension (`.cif`). **Version ≥ 0.30.7** (Jun 21, 2026): diff --git a/gget/gget_cbio.py b/gget/gget_cbio.py index d957525b2..55659a060 100644 --- a/gget/gget_cbio.py +++ b/gget/gget_cbio.py @@ -415,7 +415,9 @@ def _get_ensembl_gene_name_bulk(gene_ids: list[str]) -> dict[str, Any]: raise e -def _get_valid_ensembl_gene_id(row: pd.Series, transcript_column: str = "seq_ID", gene_column: str = "gene_name") -> Any: +def _get_valid_ensembl_gene_id( + row: pd.Series, transcript_column: str = "seq_ID", gene_column: str = "gene_name" +) -> Any: ensembl_gene_id = _get_ensembl_gene_id(row[transcript_column]) if ensembl_gene_id == "Unknown": return row[gene_column] diff --git a/gget/gget_g2p.py b/gget/gget_g2p.py index 224ae1876..cc7bd77ea 100644 --- a/gget/gget_g2p.py +++ b/gget/gget_g2p.py @@ -1,11 +1,12 @@ from __future__ import annotations import io + import pandas as pd import requests from .constants import G2P_API -from .utils import set_up_logger, DEFAULT_REQUESTS_TIMEOUT +from .utils import DEFAULT_REQUESTS_TIMEOUT, set_up_logger logger = set_up_logger() @@ -18,9 +19,9 @@ def g2p( save: bool = False, verbose: bool = True, ) -> pd.DataFrame | None: - """ - Query the Genomics 2 Proteins (G2P) portal (https://g2p.broadinstitute.org/) to link - genes/proteins to per-residue structural and functional annotations. + """Query the Genomics 2 Proteins (G2P) portal to link genes/proteins to per-residue structural and functional annotations. + + Portal: https://g2p.broadinstitute.org/ Args: - gene Gene symbol, e.g. "BRCA1" (str). @@ -43,9 +44,7 @@ def g2p( """ resources = ["features", "map", "alignment"] if resource not in resources: - raise ValueError( - f"'resource' argument specified as {resource}. Expected one of: {', '.join(resources)}" - ) + raise ValueError(f"'resource' argument specified as {resource}. Expected one of: {', '.join(resources)}") if not uniprot_id: raise ValueError( @@ -69,9 +68,7 @@ def g2p( url = f"{base}/{isoform}/alignment" if verbose: - logger.info( - f"Querying the Genomics 2 Proteins portal ('{resource}') for {gene} / {uniprot_id}..." - ) + logger.info(f"Querying the Genomics 2 Proteins portal ('{resource}') for {gene} / {uniprot_id}...") try: r = requests.get( @@ -92,9 +89,7 @@ def g2p( return if not r.text.strip(): - logger.warning( - "The Genomics 2 Proteins portal returned an empty result for this query." - ) + logger.warning("The Genomics 2 Proteins portal returned an empty result for this query.") return pd.DataFrame() df = pd.read_csv(io.StringIO(r.text), sep="\t") diff --git a/gget/gget_muscle.py b/gget/gget_muscle.py index 12bb7b7d7..69d0dcd82 100644 --- a/gget/gget_muscle.py +++ b/gget/gget_muscle.py @@ -113,9 +113,7 @@ def muscle(fasta: str | list[str], super5: bool = False, out: str | None = None, diagnosis = diagnose_binary_load_error(stderr_2, "muscle") if diagnosis: raise RuntimeError(diagnosis) - raise RuntimeError( - f"MUSCLE failed with exit code {process_2.returncode}. See stderr above for details." - ) + raise RuntimeError(f"MUSCLE failed with exit code {process_2.returncode}. See stderr above for details.") if verbose: logger.info(f"MUSCLE alignment complete. Alignment time: {round(time.time() - start_time, 2)} seconds") diff --git a/gget/gget_pdb.py b/gget/gget_pdb.py index dd657e0b0..3d4b7b6c7 100644 --- a/gget/gget_pdb.py +++ b/gget/gget_pdb.py @@ -1,8 +1,7 @@ from __future__ import annotations -from typing import Any - import json +from typing import Any from urllib.error import HTTPError from urllib.request import urlopen @@ -19,7 +18,11 @@ def pdb(pdb_id: str, resource: str = "pdb", identifier: str | int | None = None, Args: - pdb_id PDB ID to be queried (str), e.g. "7S7U". - resource Defines type of information to be returned. - "pdb": Returns the protein structure in PDB format (default). + "pdb": Returns the protein structure in legacy PDB format (default). + Note: the legacy PDB format is being phased out by RCSB and is + not available for large structures. When the legacy PDB file does + not exist, gget automatically falls back to the PDBx/mmCIF format. + "mmcif": Returns the protein structure in PDBx/mmCIF format (.cif). "entry": Information about PDB structures at the top level of PDB structure hierarchical data organization. "pubmed": Get PubMed annotations (data integrated from PubMed) for a given entry's primary citation. "assembly": Information about PDB structures at the quaternary structure level. @@ -34,11 +37,16 @@ def pdb(pdb_id: str, resource: str = "pdb", identifier: str | int | None = None, Assembly/entity IDs are numbers (e.g. 1), and chain IDs are letters (e.g. "A"). - save True/False wether to save JSON/PDB with query results in the current working directory (default: False). - Returns requested information in JSON format (except for resource="pdb" which returns protein structure in PDB format). + Returns requested information in JSON format (except for resource="pdb"/"mmcif" which + return the protein structure in PDB/PDBx-mmCIF format). """ + # Resources that download a structure file (text), not JSON + structure_resources = ["pdb", "mmcif"] + # Check if resource argument is valid resources = [ "pdb", + "mmcif", "entry", "pubmed", "assembly", @@ -74,26 +82,34 @@ def pdb(pdb_id: str, resource: str = "pdb", identifier: str | int | None = None, if resource in need_chain_id and identifier is None: raise ValueError("Please define chain ID (e.g. 'A') as 'identifier'.") - # Define URLs for HTTP request - if resource != "pdb": - # URLs to request resources other than PDB file + # Define URLs for HTTP request. + # Each entry is (url, fetched_format) so we can track which structure format + # was actually returned ("pdb"/"mmcif"/None for JSON resources). + if resource not in structure_resources: + # URLs to request resources other than a structure file if identifier is not None: url = f"{RCSB_PDB_API}{resource}/{pdb_id}/{identifier}" else: url = f"{RCSB_PDB_API}{resource}/{pdb_id}" - urls = [url] # only one option for JSON resources + urls = [(url, None)] # only one option for JSON resources + elif resource == "mmcif": + # PDBx/mmCIF file + urls = [(f"https://files.rcsb.org/download/{pdb_id}.cif", "mmcif")] else: - # Try wwPDB first, then RCSB as fallback + # Legacy PDB format: try wwPDB first, then RCSB, then automatically + # fall back to PDBx/mmCIF (legacy PDB is unavailable for large structures). urls = [ - f"https://files.wwpdb.org/download/{pdb_id}.pdb", - f"https://files.rcsb.org/download/{pdb_id}.pdb", + (f"https://files.wwpdb.org/download/{pdb_id}.pdb", "pdb"), + (f"https://files.rcsb.org/download/{pdb_id}.pdb", "pdb"), + (f"https://files.rcsb.org/download/{pdb_id}.cif", "mmcif"), ] # Submit URL request with fallback logic r = None code = None - for url in urls: + fetched_format = None + for url, fmt in urls: try: r = urlopen(url) @@ -103,6 +119,7 @@ def pdb(pdb_id: str, resource: str = "pdb", identifier: str | int | None = None, code = r.getcode() if code == 200: + fetched_format = fmt break except HTTPError: continue @@ -124,7 +141,7 @@ def pdb(pdb_id: str, resource: str = "pdb", identifier: str | int | None = None, logger.error(f"{resource} for {pdb_id} was not found. Please double-check arguments and try again.") return - if resource != "pdb": + if resource not in structure_resources: # Read json formatted results results = json.load(r) @@ -133,11 +150,19 @@ def pdb(pdb_id: str, resource: str = "pdb", identifier: str | int | None = None, if ids is not None: ids.sort() else: - # Read PDB file + # Read structure file (PDB or PDBx/mmCIF) results = r.read().decode() + # Inform the user if a legacy PDB request was served as mmCIF instead + if resource == "pdb" and fetched_format == "mmcif": + logger.warning( + f"The legacy PDB format is not available for {pdb_id} (it is being phased out " + f"by RCSB). Returning the PDBx/mmCIF format instead. " + f"Use resource='mmcif' to request it directly and silence this warning." + ) + if save: - if resource != "pdb": + if resource not in structure_resources: # Save the results in json format if identifier is not None: out_name = f"{pdb_id}_{identifier}_{resource}.json" @@ -148,8 +173,9 @@ def pdb(pdb_id: str, resource: str = "pdb", identifier: str | int | None = None, json.dump(results, f, ensure_ascii=False, indent=4) else: - # Save the PDB file - with open(f"{pdb_id}.pdb", "w") as f: + # Save the structure file using the extension of the format actually fetched + extension = "cif" if fetched_format == "mmcif" else "pdb" + with open(f"{pdb_id}.{extension}", "w") as f: f.write(results) return results diff --git a/gget/gget_search.py b/gget/gget_search.py index 76aa18767..a5ed75529 100644 --- a/gget/gget_search.py +++ b/gget/gget_search.py @@ -310,8 +310,7 @@ def search( # inside the list to None so an empty-synonym row is [None] rather than # [nan]. (SQL LEFT JOIN on external_synonym surfaces missing rows as NaN.) df["synonym"] = [ - [None if pd.isna(item) else item - for item in np.sort(syn if isinstance(syn, list) else [syn]).tolist()] + [None if pd.isna(item) else item for item in np.sort(syn if isinstance(syn, list) else [syn]).tolist()] for syn in df["synonym"].values ] diff --git a/gget/gget_setup.py b/gget/gget_setup.py index 53340b7d5..e83927059 100644 --- a/gget/gget_setup.py +++ b/gget/gget_setup.py @@ -115,9 +115,7 @@ def setup(module: str, verbose: bool = True, out: str | None = None) -> None: raise ValueError(f"'module' argument specified as {module}. Expected one of: {', '.join(supported_modules)}") if module == "gpt": - logger.warning( - "gget gpt is no longer actively maintained." - ) + logger.warning("gget gpt is no longer actively maintained.") _install("openai<=0.28.1", "openai", verbose=verbose) elif module == "cellxgene": diff --git a/gget/gget_virus.py b/gget/gget_virus.py index 807d06a83..8a04dfdec 100644 --- a/gget/gget_virus.py +++ b/gget/gget_virus.py @@ -341,7 +341,10 @@ def _retry_with_exponential_backoff( initial_delay: float = API_INITIAL_RETRY_DELAY, backoff_multiplier: float = API_RETRY_BACKOFF_MULTIPLIER, max_delay: int = MAX_RETRY_DELAY, - retryable_exceptions: tuple[type[BaseException], ...] = (requests.exceptions.ConnectionError, requests.exceptions.HTTPError), + retryable_exceptions: tuple[type[BaseException], ...] = ( + requests.exceptions.ConnectionError, + requests.exceptions.HTTPError, + ), failed_commands: dict[str, Any] | None = None, ) -> tuple[bool, Any, dict[str, Any] | None]: """Execute an operation with exponential backoff retry logic. @@ -414,7 +417,9 @@ def _retry_with_exponential_backoff( return False, None, error_info -def _track_failed_operation(failed_commands: dict[str, Any] | None, operation_type: str, batch_info: dict[str, Any], error_info: dict[str, Any]) -> None: +def _track_failed_operation( + failed_commands: dict[str, Any] | None, operation_type: str, batch_info: dict[str, Any], error_info: dict[str, Any] +) -> None: """Track a failed operation in the failed_commands dictionary. This ensures consistent error tracking across all operation types for @@ -864,7 +869,9 @@ def _parse_baseline_file(baseline_path: str) -> set[str]: return baseline_accessions -def _deduplicate_metadata_against_baseline(metadata_dict: dict[str, Any], baseline_accessions: set[str]) -> tuple[dict[str, Any], int]: +def _deduplicate_metadata_against_baseline( + metadata_dict: dict[str, Any], baseline_accessions: set[str] +) -> tuple[dict[str, Any], int]: """Remove metadata records whose accessions are already in the baseline set. Args: @@ -889,7 +896,9 @@ def _deduplicate_metadata_against_baseline(metadata_dict: dict[str, Any], baseli return new_metadata, skipped_count -def _save_partial_metadata(metadata_dict: dict[str, Any], outfolder: str, virus_clean: str, reason: str = "api_failure") -> str | None: +def _save_partial_metadata( + metadata_dict: dict[str, Any], outfolder: str, virus_clean: str, reason: str = "api_failure" +) -> str | None: """Save partial metadata to CSV for recovery via --baseline. Args: @@ -2786,7 +2795,9 @@ def process_cached_download(zip_file: str, virus_type: str = "virus") -> tuple[s return cached_fasta_file, cached_metadata_jsonl_path, True -def _monitor_subprocess_with_progress(process: subprocess.Popen[Any], cmd: list[str], timeout: int | None = None, progress_timeout: int | None = None) -> subprocess.CompletedProcess[Any]: +def _monitor_subprocess_with_progress( + process: subprocess.Popen[Any], cmd: list[str], timeout: int | None = None, progress_timeout: int | None = None +) -> subprocess.CompletedProcess[Any]: """Monitor a subprocess with progress tracking and timeout handling. This helper function monitors a running subprocess. When stdout/stderr are piped, it checks for progress indicators. When they're not piped (output goes to console), it simply polls for completion. @@ -3463,7 +3474,13 @@ def download_alphainfluenza_optimized( ) -def download_sequences_by_accessions(accessions: list[str], outdir: str | None = None, batch_size: int = 200, failed_commands: dict[str, Any] | None = None, api_key: str | None = None) -> str: +def download_sequences_by_accessions( + accessions: list[str], + outdir: str | None = None, + batch_size: int = 200, + failed_commands: dict[str, Any] | None = None, + api_key: str | None = None, +) -> str: """Download virus genome sequences for a specific list of accession numbers. This function downloads sequences for a pre-filtered list of accessions, @@ -3590,7 +3607,9 @@ def download_sequences_by_accessions(accessions: list[str], outdir: str | None = ) -def _download_sequences_epost_efetch(accessions: list[str], fasta_path: str, failed_commands: dict[str, Any] | None = None, api_key: str | None = None) -> str: +def _download_sequences_epost_efetch( + accessions: list[str], fasta_path: str, failed_commands: dict[str, Any] | None = None, api_key: str | None = None +) -> str: """Download FASTA sequences using NCBI EPost + EFetch History Server pipeline. This is NCBI's recommended approach for large datasets. It uploads accession @@ -3756,7 +3775,11 @@ def _fetch_fasta_batch(rs=retstart): def _download_sequences_single_batch( - accessions: list[str], NCBI_EUTILS_BASE_EFETCH: str, fasta_path: str, failed_commands: dict[str, Any] | None = None, api_key: str | None = None + accessions: list[str], + NCBI_EUTILS_BASE_EFETCH: str, + fasta_path: str, + failed_commands: dict[str, Any] | None = None, + api_key: str | None = None, ) -> str: """Download sequences in a single E-utilities request with exponential backoff retries. @@ -3882,7 +3905,12 @@ def execute_request(): def _download_sequences_batched( - accessions: list[str], NCBI_EUTILS_BASE_EFETCH: str, fasta_path: str, batch_size: int, failed_commands: dict[str, Any] | None = None, api_key: str | None = None + accessions: list[str], + NCBI_EUTILS_BASE_EFETCH: str, + fasta_path: str, + batch_size: int, + failed_commands: dict[str, Any] | None = None, + api_key: str | None = None, ) -> str: """Download sequences using multiple batched E-utilities requests with incremental file writing. @@ -4154,7 +4182,9 @@ def _parse_date(date_str: str, filtername: str = "") -> datetime: # return None -def _parse_partial_date_for_range_check(date_str: str, for_min_comparison: bool = True, filtername: str = "") -> datetime: +def _parse_partial_date_for_range_check( + date_str: str, for_min_comparison: bool = True, filtername: str = "" +) -> datetime: """Parse partial dates with range-aware handling for comparison. When comparing partial dates (year-only or year-month) against specific dates, @@ -4749,7 +4779,9 @@ def load_metadata_from_api_reports(api_reports: list[dict[str, Any]]) -> dict[st return metadata_dict -def _check_protein_requirements(record: Any, metadata: dict[str, Any], has_proteins: Any, proteins_complete: bool) -> bool: +def _check_protein_requirements( + record: Any, metadata: dict[str, Any], has_proteins: Any, proteins_complete: bool +) -> bool: """Check if a sequence meets protein/gene requirements based on FASTA header. This function validates whether a virus sequence contains required proteins @@ -5491,7 +5523,9 @@ def merge_metadata_csvs(genbank_csv_path: str, standard_csv_path: str) -> bool: return False -def save_metadata_to_csv(filtered_metadata: list[dict[str, Any]], protein_headers: list[Any], output_metadata_file: str) -> None: +def save_metadata_to_csv( + filtered_metadata: list[dict[str, Any]], protein_headers: list[Any], output_metadata_file: str +) -> None: """Save filtered metadata to a CSV file with a specific column order. This function creates a comprehensive CSV file containing all relevant metadata @@ -5968,7 +6002,14 @@ def _epost_accessions(accessions: list[str], api_key: str | None = None) -> tupl return None, None -def _efetch_with_history(web_env: str, query_key: str, retstart: int, retmax: int, api_key: str | None = None, failed_log_path: str | None = None) -> tuple[dict[str, Any], str]: +def _efetch_with_history( + web_env: str, + query_key: str, + retstart: int, + retmax: int, + api_key: str | None = None, + failed_log_path: str | None = None, +) -> tuple[dict[str, Any], str]: """Fetch GenBank records using History Server reference (WebEnv/query_key). This is the NCBI-recommended method for large datasets. After uploading UIDs @@ -6609,7 +6650,9 @@ def fetch_genbank_metadata( return all_metadata, failed_log_path if os.path.exists(failed_log_path) else None -def _fetch_genbank_batch(accessions: list[str], failed_log_path: str | None = None) -> tuple[dict[str, Any], str | None]: +def _fetch_genbank_batch( + accessions: list[str], failed_log_path: str | None = None +) -> tuple[dict[str, Any], str | None]: """Fetch GenBank metadata for a single batch of accessions. Includes retry logic with exponential backoff and automatic batch splitting @@ -7188,7 +7231,9 @@ def _parse_genbank_xml(xml_content: str) -> dict[str, Any]: return metadata_dict -def save_genbank_metadata_to_csv(genbank_metadata: dict[str, Any], output_file: str, virus_metadata: list[dict[str, Any]] | None = None) -> None: +def save_genbank_metadata_to_csv( + genbank_metadata: dict[str, Any], output_file: str, virus_metadata: list[dict[str, Any]] | None = None +) -> None: """Save GenBank metadata to a CSV file with the same column headers as the standard metadata CSV. Args: diff --git a/gget/main.py b/gget/main.py index 8c8467b28..36bdb3da8 100644 --- a/gget/main.py +++ b/gget/main.py @@ -1,10 +1,9 @@ from __future__ import annotations -from typing import Any - import argparse import sys from datetime import datetime +from typing import Any import pandas as pd @@ -31,38 +30,18 @@ from .gget_diamond import diamond # noqa: E402 from .gget_elm import elm # noqa: E402 from .gget_enrichr import enrichr # noqa: E402 +from .gget_g2p import g2p # noqa: E402 from .gget_gpt import gpt # noqa: E402 from .gget_info import info # noqa: E402 from .gget_muscle import muscle # noqa: E402 from .gget_mutate import mutate # noqa: E402 from .gget_opentargets import OPENTARGETS_RESOURCES, opentargets # noqa: E402 from .gget_pdb import pdb # noqa: E402 - -# Module functions -from .gget_ref import ref -from .gget_search import search -from .gget_info import info -from .gget_seq import seq -from .gget_muscle import muscle -from .gget_blast import blast -from .gget_blat import blat -from .gget_enrichr import enrichr -from .gget_archs4 import archs4 -from .gget_alphafold import alphafold -from .gget_setup import setup -from .gget_pdb import pdb -from .gget_gpt import gpt -from .gget_cellxgene import cellxgene -from .gget_elm import elm -from .gget_diamond import diamond -from .gget_cosmic import cosmic -from .gget_mutate import mutate -from .gget_opentargets import opentargets, OPENTARGETS_RESOURCES -from .gget_cbio import cbio_plot, cbio_search -from .gget_bgee import bgee -from .gget_g2p import g2p -from .gget_8cube import specificity, psi_block, gene_expression -from .gget_virus import virus +from .gget_ref import ref # noqa: E402 +from .gget_search import search # noqa: E402 +from .gget_seq import seq # noqa: E402 +from .gget_setup import setup # noqa: E402 +from .gget_virus import virus # noqa: E402 # Custom formatter for help messages that preserved the text formatting and adds the default value to the end of the help message @@ -1382,6 +1361,7 @@ def main() -> None: type=str, choices=[ "pdb", + "mmcif", "entry", "pubmed", "assembly", @@ -1396,7 +1376,10 @@ def main() -> None: required=False, help=( "Defines type of information to be returned.\n\n" - '"pdb": Returns the protein structure in PDB format.\n' + '"pdb": Returns the protein structure in legacy PDB format. Automatically falls\n' + " back to PDBx/mmCIF when the legacy PDB file is unavailable (e.g. for\n" + " large structures), since the legacy PDB format is being phased out by RCSB.\n" + '"mmcif": Returns the protein structure in PDBx/mmCIF format (.cif).\n' '"entry": Information about PDB structures at the top level of PDB structure hierarchical data organization.\n' '"pubmed": Get PubMed annotations (data integrated from PubMed) for a given entry\'s primary citation.\n' '"assembly": Information about PDB structures at the quaternary structure level.\n' @@ -1427,7 +1410,7 @@ def main() -> None: required=False, help=( "Path to the file the results will be saved in, e.g. path/to/directory/7S7U.pdb or path/to/directory/7S7U_entry.json.\n" - "Resource 'pdb' is returned in PDB format. All other resources are returned in JSON format.\n" + "Resource 'pdb' is returned in PDB format (or PDBx/mmCIF if the legacy PDB file is unavailable), 'mmcif' in PDBx/mmCIF format. All other resources are returned in JSON format.\n" "Default: Standard out." ), ) @@ -3708,7 +3691,7 @@ def main() -> None: ) if pdb_results: - if args.resource == "pdb": + if args.resource in ("pdb", "mmcif"): if args.out: # Create saving directory directory = "/".join(args.out.split("/")[:-1]) @@ -3835,16 +3818,12 @@ def main() -> None: if args.csv: g2p_results.to_csv(f, index=False) else: - g2p_results.to_json( - f, orient="records", force_ascii=False, indent=4 - ) + g2p_results.to_json(f, orient="records", force_ascii=False, indent=4) else: if args.csv: g2p_results.to_csv(sys.stdout, index=False) else: - print( - g2p_results.to_json(orient="records", force_ascii=False, indent=4) - ) + print(g2p_results.to_json(orient="records", force_ascii=False, indent=4)) ## 8cube return if args.command == "8cube": diff --git a/gget/utils.py b/gget/utils.py index 7aa372550..112a97488 100644 --- a/gget/utils.py +++ b/gget/utils.py @@ -7,7 +7,8 @@ import os import time import uuid -from typing import TYPE_CHECKING, Any, Callable, Iterable +from collections.abc import Callable, Iterable +from typing import TYPE_CHECKING, Any import numpy as np import pandas as pd @@ -1296,8 +1297,7 @@ def _shared_library_install_hint(lib_basename: str, system: str) -> str: if system == "Darwin": return ( - "Install the package that provides this library via Homebrew (https://brew.sh) " - "or another package manager." + "Install the package that provides this library via Homebrew (https://brew.sh) or another package manager." ) if system == "Linux": return "Install the package that provides this library via your system package manager." diff --git a/pyproject.toml b/pyproject.toml index b38413c84..59deb2859 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -126,7 +126,6 @@ lint.per-file-ignores."tests/*" = [ "D" ] lint.pydocstyle.convention = "numpy" [tool.mypy] -python_version = "3.12" files = [ "gget" ] # `gget/constants.py` (module) coexists with `gget/constants/` (data dir, no # __init__.py). Mypy's default namespace-package discovery treats the data dir @@ -135,11 +134,12 @@ files = [ "gget" ] namespace_packages = false ignore_missing_imports = true follow_imports = "silent" -check_untyped_defs = false -disallow_untyped_defs = false +python_version = "3.12" disallow_any_generics = false -warn_unused_ignores = true +disallow_untyped_defs = false +check_untyped_defs = false warn_redundant_casts = true +warn_unused_ignores = true show_error_codes = true [tool.pytest] diff --git a/tests/pytest_results.txt b/tests/pytest_results.txt index 741762da6..235486d02 100644 --- a/tests/pytest_results.txt +++ b/tests/pytest_results.txt @@ -422,8 +422,8 @@ self = > result_to_test = do_call(func, td[test]["args"]) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -tests/from_json.py:68: -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +tests/from_json.py:68: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/from_json.py:60: in do_call return func(**args) ^^^^^^^^^^^^ @@ -435,7 +435,7 @@ gget/gget_bgee.py:117: in _bgee_expression ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ gget/gget_bgee.py:24: in _bgee_species payload = http_json( -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ method = 'GET', url = 'https://bgee.org/api/' context = 'Bgee API (species lookup)', timeout = (10, 60), retries = 3 @@ -453,10 +453,10 @@ kwargs = {'params': {'display_type': 'json', 'page': 'gene', 'action': 'general_ **kwargs: Any, ) -> Any: """Issue an HTTP request and return the parsed JSON body, raising a - + RuntimeError with consistent context if the request fails or the body is not valid JSON. - + `context` is a short human-readable label (e.g. "Bgee API") used in error messages so users can identify which upstream service failed. Transient failures (connection errors, read timeouts, HTTP 5xx) are @@ -505,8 +505,8 @@ self = > result_to_test = do_call(func, td[test]["args"]) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -tests/from_json.py:68: -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +tests/from_json.py:68: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/from_json.py:60: in do_call return func(**args) ^^^^^^^^^^^^ @@ -518,7 +518,7 @@ gget/gget_bgee.py:117: in _bgee_expression ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ gget/gget_bgee.py:24: in _bgee_species payload = http_json( -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ method = 'GET', url = 'https://bgee.org/api/' context = 'Bgee API (species lookup)', timeout = (10, 60), retries = 3 @@ -536,10 +536,10 @@ kwargs = {'params': {'display_type': 'json', 'page': 'gene', 'action': 'general_ **kwargs: Any, ) -> Any: """Issue an HTTP request and return the parsed JSON body, raising a - + RuntimeError with consistent context if the request fails or the body is not valid JSON. - + `context` is a short human-readable label (e.g. "Bgee API") used in error messages so users can identify which upstream service failed. Transient failures (connection errors, read timeouts, HTTP 5xx) are @@ -588,8 +588,8 @@ self = > result_to_test = do_call(func, td[test]["args"]) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -tests/from_json.py:68: -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +tests/from_json.py:68: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/from_json.py:60: in do_call return func(**args) ^^^^^^^^^^^^ @@ -601,7 +601,7 @@ gget/gget_bgee.py:60: in _bgee_orthologs ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ gget/gget_bgee.py:24: in _bgee_species payload = http_json( -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ method = 'GET', url = 'https://bgee.org/api/' context = 'Bgee API (species lookup)', timeout = (10, 60), retries = 3 @@ -619,10 +619,10 @@ kwargs = {'params': {'display_type': 'json', 'page': 'gene', 'action': 'general_ **kwargs: Any, ) -> Any: """Issue an HTTP request and return the parsed JSON body, raising a - + RuntimeError with consistent context if the request fails or the body is not valid JSON. - + `context` is a short human-readable label (e.g. "Bgee API") used in error messages so users can identify which upstream service failed. Transient failures (connection errors, read timeouts, HTTP 5xx) are diff --git a/tests/test_g2p.py b/tests/test_g2p.py index 48afd9332..e3ecbc18b 100644 --- a/tests/test_g2p.py +++ b/tests/test_g2p.py @@ -1,4 +1,5 @@ import unittest + from gget.gget_g2p import g2p diff --git a/tests/test_pdb.py b/tests/test_pdb.py index a805e09a1..a0b02e7a5 100644 --- a/tests/test_pdb.py +++ b/tests/test_pdb.py @@ -78,10 +78,28 @@ def test_pdb_pdb(self): "The reference and fetched PDB are not the same.", ) + def test_pdb_mmcif(self): + # Explicit PDBx/mmCIF download returns a CIF document (starts with "data_") + result = pdb("4ACQ", resource="mmcif") + self.assertTrue( + result.startswith("data_4ACQ"), + "resource='mmcif' did not return a PDBx/mmCIF document.", + ) + + def test_pdb_legacy_fallback_to_mmcif(self): + # Regression test for #177/#178: 6Q38 has no legacy PDB file, so a + # resource='pdb' request must transparently fall back to PDBx/mmCIF. + result = pdb("6Q38", resource="pdb") + self.assertTrue( + result.startswith("data_6Q38"), + "resource='pdb' did not fall back to PDBx/mmCIF when the legacy PDB file is missing.", + ) + def tearDown(self): super().tearDown() - # Delete temporary result file - try: - os.remove("4ACQ.pdb") - except OSError: - pass + # Delete temporary result files + for fname in ("4ACQ.pdb", "4ACQ.cif", "6Q38.cif"): + try: + os.remove(fname) + except OSError: + pass From 99e5f47dbdf393fe87575cb4bee428211840d798 Mon Sep 17 00:00:00 2001 From: "Laura Luebbert, Ph.D." <56094636+lauraluebbert@users.noreply.github.com> Date: Mon, 22 Jun 2026 13:18:38 -0400 Subject: [PATCH 05/34] feat(bgee): identify gget in outbound Bgee API requests (#224) Send `User-Agent: gget/ (+https://github.com/scverse/gget)` on all Bgee API calls so the upstream service can attribute traffic to gget and reach the project if needed. Co-authored-by: Claude Opus 4.7 --- gget/gget_bgee.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/gget/gget_bgee.py b/gget/gget_bgee.py index 7788c3bed..0fe5ac3ef 100644 --- a/gget/gget_bgee.py +++ b/gget/gget_bgee.py @@ -1,6 +1,7 @@ from __future__ import annotations import json as json_ +from importlib.metadata import PackageNotFoundError, version from typing import TYPE_CHECKING, Any from .utils import dig, http_json, json_list_to_df, set_up_logger @@ -10,6 +11,13 @@ logger = set_up_logger() +try: + _GGET_VERSION = version("gget") +except PackageNotFoundError: + _GGET_VERSION = "unknown" + +_BGEE_HEADERS = {"User-Agent": f"gget/{_GGET_VERSION} (+https://github.com/scverse/gget)"} + def _bgee_species(gene_id: str, verbose: bool = True) -> int: """Get species ID from Bgee. @@ -25,6 +33,7 @@ def _bgee_species(gene_id: str, verbose: bool = True) -> int: "GET", "https://bgee.org/api/", context="Bgee API (species lookup)", + headers=_BGEE_HEADERS, params={ "display_type": "json", "page": "gene", @@ -67,6 +76,7 @@ def _bgee_orthologs(gene_id: str, json: bool = False, verbose: bool = True) -> p "GET", "https://bgee.org/api/", context="Bgee API (orthologs)", + headers=_BGEE_HEADERS, params={ "display_type": "json", "page": "gene", @@ -130,6 +140,7 @@ def _bgee_expression(gene_id: str | list[str], json: bool = False, verbose: bool "GET", "https://bgee.org/api/", context="Bgee API (expression)", + headers=_BGEE_HEADERS, params={ "display_type": "json", "page": "data", From 81ac6e9f51322d4233fd135cdc67468f9bd93865 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 22 Jun 2026 17:19:03 +0000 Subject: [PATCH 06/34] CI: update pytest results (dev) --- .github/badges/tests.json | 7 +- tests/pytest_results.txt | 862 +++++--------------------------------- 2 files changed, 104 insertions(+), 765 deletions(-) diff --git a/.github/badges/tests.json b/.github/badges/tests.json index b902293bd..6c55dc113 100644 --- a/.github/badges/tests.json +++ b/.github/badges/tests.json @@ -1,6 +1 @@ -{ - "schemaVersion": 1, - "label": "tests", - "message": "394/400 passing", - "color": "yellow" -} +{"schemaVersion": 1, "label": "tests", "message": "no results", "color": "lightgrey"} diff --git a/tests/pytest_results.txt b/tests/pytest_results.txt index 235486d02..c18b1ed76 100644 --- a/tests/pytest_results.txt +++ b/tests/pytest_results.txt @@ -1,767 +1,111 @@ -Pytest results (Python 3.14) - 2026-06-22T02:01:59Z +Pytest results (Python 3.14) - 2026-06-22T17:14:44Z ============================= test session starts ============================== platform linux -- Python 3.14.6, pytest-9.1.1, pluggy-1.6.0 -- /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/bin/python3 cachedir: .pytest_cache -Using --randomly-seed=2193479127 +Using --randomly-seed=4083812791 rootdir: /home/runner/work/gget/gget configfile: pyproject.toml testpaths: tests plugins: randomly-3.16.0, rerunfailures-14.0, mock-3.15.1, cov-7.1.0, xdist-3.8.0 -collecting ... collected 400 items - -tests/test_muscle.py::TestMusclePrints::test_muscle_print_nt PASSED [ 0%] -tests/test_muscle.py::TestMuscleSeqsInput::test_muscle_seqs_as_input PASSED [ 0%] -tests/test_muscle.py::TestMuscle::test_muscle_nt_txt PASSED [ 0%] -tests/test_muscle.py::TestMuscle::test_muscle_nt PASSED [ 1%] -tests/test_muscle.py::TestMuscleAA::test_muscle_aa PASSED [ 1%] -tests/test_muscle.py::TestMuscleAASuper::test_muscle_aa_super5 PASSED [ 1%] -tests/test_muscle.py::TestMuscleSuper::test_muscle_nt_super5 PASSED [ 1%] -tests/test_ref.py::TestRef::test_ref_rel_ftp_octopus PASSED [ 2%] -tests/test_ref.py::TestRef::test_ref_bad_rel PASSED [ 2%] -tests/test_ref.py::TestRef::test_ref_bad_which PASSED [ 2%] -tests/test_ref.py::TestRef::test_ref PASSED [ 2%] -tests/test_ref.py::TestRef::test_ref_list PASSED [ 3%] -tests/test_ref.py::TestRef::test_ref_which_plant PASSED [ 3%] -tests/test_ref.py::TestRef::test_ref_ftp PASSED [ 3%] -tests/test_ref.py::TestRef::test_ref_plant PASSED [ 3%] -tests/test_ref.py::TestRef::test_ref_which PASSED [ 4%] -tests/test_ref.py::TestRef::test_ref_rel PASSED [ 4%] -tests/test_ref.py::TestRef::test_ref_rel_ftp PASSED [ 4%] -tests/test_ref.py::TestRef::test_ref_bad_species PASSED [ 4%] -tests/test_ref.py::TestRef::test_ref_rel_protist PASSED [ 5%] -tests/test_gpt.py::TestGpt::test_gpt PASSED [ 5%] -tests/test_bgee.py::TestBgee::test_bgee_expression FAILED [ 5%] -tests/test_bgee.py::TestBgee::test_bgee_expression_multiple FAILED [ 5%] -tests/test_bgee.py::TestBgee::test_error_bgee_unknown_type PASSED [ 6%] -tests/test_bgee.py::TestBgee::test_error_bgee_expression_no_exist PASSED [ 6%] -tests/test_bgee.py::TestBgee::test_error_bgee_orthologs_no_exist PASSED [ 6%] -tests/test_bgee.py::TestBgee::test_bgee_orthologs FAILED [ 6%] -tests/test_pdb.py::TestPDB::test_pdb_pdb PASSED [ 7%] -tests/test_pdb.py::TestPDB::test_pdb_assembly PASSED [ 7%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_empty_raises PASSED [ 7%] -tests/test_virus.py::TestVirus::test_merge_baseline_with_new_deduplicates PASSED [ 7%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_type PASSED [ 8%] -tests/test_virus.py::TestVirus::test_virus_host_filter_verification PASSED [ 8%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_collection_date PASSED [ 8%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_no_parentheses_returns_none PASSED [ 8%] -tests/test_virus.py::TestVirus::test_retry_helper_successful_operation PASSED [ 9%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_true PASSED [ 9%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_multiple PASSED [ 9%] -tests/test_virus.py::TestVirus::test_parse_date_various_formats PASSED [ 9%] -tests/test_virus.py::TestVirus::test_merge_metadata_csvs_fills_missing PASSED [ 10%] -tests/test_virus.py::TestVirus::test_local_name_without_namespace PASSED [ 10%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_min_comparison PASSED [ 10%] -tests/test_virus.py::TestVirus::test_virus_with_host_filter PASSED [ 10%] -tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_basic PASSED [ 11%] -tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter PASSED [ 11%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_no_filters PASSED [ 11%] -tests/test_virus.py::TestVirus::test_batch_accessions_for_url PASSED [ 11%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_release_date PASSED [ 12%] -tests/test_virus.py::TestVirus::test_check_min_max_date_valid PASSED [ 12%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_metadata_type PASSED [ 12%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_max_release_date PASSED [ 12%] -tests/test_virus.py::TestVirus::test_virus_invalid_lab_passaged_type PASSED [ 13%] -tests/test_virus.py::TestVirus::test_virus_with_collection_date_filters PASSED [ 13%] -tests/test_virus.py::TestVirus::test_merge_metadata_csvs_missing_standard_file PASSED [ 13%] -tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_accession_mode PASSED [ 13%] -tests/test_virus.py::TestVirus::test_virus_integer_virus_id PASSED [ 14%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype PASSED [ 14%] -tests/test_virus.py::TestVirus::test_virus_invalid_proteins_complete_type PASSED [ 14%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_zero PASSED [ 14%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_host PASSED [ 15%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_csv PASSED [ 15%] -tests/test_virus.py::TestVirus::test_virus_with_annotated_filter PASSED [ 15%] -tests/test_virus.py::TestVirus::test_stream_copy_fasta_with_accession_filter PASSED [ 15%] -tests/test_virus.py::TestVirus::test_parse_date_full PASSED [ 16%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_seq_length PASSED [ 16%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_true PASSED [ 16%] -tests/test_virus.py::TestVirus::test_virus_multiple_filters_relationship_check PASSED [ 16%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_has_proteins PASSED [ 17%] -tests/test_virus.py::TestVirus::test_virus_with_multiple_filters PASSED [ 17%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_max_seq_length PASSED [ 17%] -tests/test_virus.py::TestVirus::test_virus_none_virus_name PASSED [ 17%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_country PASSED [ 18%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_empty PASSED [ 18%] -tests/test_virus.py::TestVirus::test_virus_with_source_database_filter PASSED [ 18%] -tests/test_virus.py::TestVirus::test_get_datasets_version_returns_string_or_none PASSED [ 18%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_space_before_virus PASSED [ 19%] -tests/test_virus.py::TestVirus::test_filter_sequences_proteins_complete PASSED [ 19%] -tests/test_virus.py::TestVirus::test_genbank_xml_to_csv_basic PASSED [ 19%] -tests/test_virus.py::TestVirus::test_filter_cached_refseq_only PASSED [ 19%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_none_raises PASSED [ 20%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_nonexistent_raises PASSED [ 20%] -tests/test_virus.py::TestVirus::test_merge_metadata_csvs_no_overwrite PASSED [ 20%] -tests/test_virus.py::TestVirus::test_filter_sequences_no_filters PASSED [ 20%] -tests/test_virus.py::TestVirus::test_retry_helper_success_after_retry PASSED [ 21%] -tests/test_virus.py::TestVirus::test_save_command_summary_creates_file PASSED [ 21%] -tests/test_virus.py::TestVirus::test_merge_baseline_with_new_empty_new PASSED [ 21%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_mature_peptide_count PASSED [ 21%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_institution PASSED [ 22%] -tests/test_virus.py::TestVirus::test_save_partial_metadata_empty PASSED [ 22%] -tests/test_virus.py::TestVirus::test_get_memory_usage_returns_dict PASSED [ 22%] -tests/test_virus.py::TestVirus::test_filter_cached_annotated PASSED [ 22%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_collection_date_range PASSED [ 23%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_false PASSED [ 23%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_protein_count PASSED [ 23%] -tests/test_virus.py::TestVirus::test_validate_datasets_binary_empty_path PASSED [ 23%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_protein_count PASSED [ 24%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_max_gene_count PASSED [ 24%] -tests/test_virus.py::TestVirus::test_validate_datasets_binary_nonexistent PASSED [ 24%] -tests/test_virus.py::TestVirus::test_write_fasta_record_with_description PASSED [ 24%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_isolation_source PASSED [ 25%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_min_gene_count PASSED [ 25%] -tests/test_virus.py::TestVirus::test_save_command_summary_with_error PASSED [ 25%] -tests/test_virus.py::TestVirus::test_virus_invalid_is_accession_type PASSED [ 25%] -tests/test_virus.py::TestVirus::test_track_failed_operation_appends PASSED [ 26%] -tests/test_virus.py::TestVirus::test_get_datasets_path_uses_bundled_binary PASSED [ 26%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_max_comparison PASSED [ 26%] -tests/test_virus.py::TestVirus::test_parse_accession_input_single PASSED [ 26%] -tests/test_virus.py::TestVirus::test_parse_partial_date_empty_raises PASSED [ 27%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_true PASSED [ 27%] -tests/test_virus.py::TestVirus::test_validate_datasets_binary_valid PASSED [ 27%] -tests/test_virus.py::TestVirus::test_write_fasta_record_long_sequence_wraps PASSED [ 27%] -tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_empty PASSED [ 28%] -tests/test_virus.py::TestVirus::test_merge_baseline_with_new_csv PASSED [ 28%] -tests/test_virus.py::TestVirus::test_local_name_with_namespace PASSED [ 28%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_basic PASSED [ 28%] -tests/test_virus.py::TestVirus::test_filter_cached_geographic_location PASSED [ 29%] -tests/test_virus.py::TestVirus::test_is_sars_cov2_query_accession_mode PASSED [ 29%] -tests/test_virus.py::TestVirus::test_parse_partial_date_full_date PASSED [ 29%] -tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter PASSED [ 29%] -tests/test_virus.py::TestVirus::test_save_partial_metadata PASSED [ 30%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_json PASSED [ 30%] -tests/test_virus.py::TestVirus::test_virus_completeness_filter_verification PASSED [ 30%] -tests/test_virus.py::TestVirus::test_save_metadata_to_csv_empty_metadata PASSED [ 30%] -tests/test_virus.py::TestVirus::test_virus_release_date_filter_verification PASSED [ 31%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_geographic_location PASSED [ 31%] -tests/test_virus.py::TestVirus::test_unzip_file_bad_zip_raises PASSED [ 31%] -tests/test_virus.py::TestVirus::test_calculate_max_accessions_per_batch PASSED [ 31%] -tests/test_virus.py::TestVirus::test_parse_accession_input_nonexistent_file_raises_error PASSED [ 32%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_false PASSED [ 32%] -tests/test_virus.py::TestVirus::test_virus_with_length_filters PASSED [ 32%] -tests/test_virus.py::TestVirus::test_check_min_max_invalid_raises PASSED [ 32%] -tests/test_virus.py::TestVirus::test_virus_with_geographic_location_filter PASSED [ 33%] -tests/test_virus.py::TestVirus::test_parse_accession_input_from_file PASSED [ 33%] -tests/test_virus.py::TestVirus::test_is_sars_cov2_query_negative PASSED [ 33%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_combined_filters PASSED [ 33%] -tests/test_virus.py::TestVirus::test_get_gget_version_returns_string PASSED [ 34%] -tests/test_virus.py::TestVirus::test_retry_helper_non_retryable_exception PASSED [ 34%] -tests/test_virus.py::TestVirus::test_check_min_max_none_values PASSED [ 34%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_combined PASSED [ 34%] -tests/test_virus.py::TestVirus::test_stream_copy_fasta_all_records PASSED [ 35%] -tests/test_virus.py::TestVirus::test_parse_accession_input_empty_file_raises_error PASSED [ 35%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_empty PASSED [ 35%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_already_correct_returns_none PASSED [ 35%] -tests/test_virus.py::TestVirus::test_track_failed_operation_creates_key PASSED [ 36%] -tests/test_virus.py::TestVirus::test_filter_cached_host_not_in_strategy PASSED [ 36%] -tests/test_virus.py::TestVirus::test_check_min_max_date_invalid_raises PASSED [ 36%] -tests/test_virus.py::TestVirus::test_parse_accession_input_space_separated PASSED [ 36%] -tests/test_virus.py::TestVirus::test_track_failed_operation_none_dict PASSED [ 37%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_source_database PASSED [ 37%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_text PASSED [ 37%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_nuc_completeness_partial PASSED [ 37%] -tests/test_virus.py::TestVirus::test_clean_xml_declarations PASSED [ 38%] -tests/test_virus.py::TestVirus::test_virus_metadata_schema_validation PASSED [ 38%] -tests/test_virus.py::TestVirus::test_clean_xml_declarations_no_declarations PASSED [ 38%] -tests/test_virus.py::TestVirus::test_filter_cached_min_release_date PASSED [ 38%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_false PASSED [ 39%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_env_source PASSED [ 39%] -tests/test_virus.py::TestVirus::test_virus_invalid_annotated_type PASSED [ 39%] -tests/test_virus.py::TestVirus::test_check_min_max_equal PASSED [ 39%] -tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter PASSED [ 40%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_segment PASSED [ 40%] -tests/test_virus.py::TestVirus::test_parse_genbank_xml_basic PASSED [ 40%] -tests/test_virus.py::TestVirus::test_deduplicate_empty_baseline PASSED [ 40%] -tests/test_virus.py::TestVirus::test_unzip_file_nonexistent_raises PASSED [ 41%] -tests/test_virus.py::TestVirus::test_virus_invalid_keep_temp_type PASSED [ 41%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_missing_accession PASSED [ 41%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_negative PASSED [ 41%] -tests/test_virus.py::TestVirus::test_datasets_cli_version_output PASSED [ 42%] -tests/test_virus.py::TestVirus::test_virus_with_genbank_metadata_retrieval PASSED [ 42%] -tests/test_virus.py::TestVirus::test_virus_invalid_completeness PASSED [ 42%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_gene_count PASSED [ 42%] -tests/test_virus.py::TestVirus::test_virus_relationship_check_counts_match PASSED [ 43%] -tests/test_virus.py::TestVirus::test_retry_helper_custom_retryable_exceptions PASSED [ 43%] -tests/test_virus.py::TestVirus::test_check_min_max_valid PASSED [ 43%] -tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_common_names PASSED [ 43%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_peptide_count PASSED [ 44%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_true PASSED [ 44%] -tests/test_virus.py::TestVirus::test_virus_multi_accession_file_input PASSED [ 44%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_isolate PASSED [ 44%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype_list PASSED [ 45%] -tests/test_virus.py::TestVirus::test_unzip_file_valid PASSED [ 45%] -tests/test_virus.py::TestVirus::test_force_garbage_collection_runs PASSED [ 45%] -tests/test_virus.py::TestVirus::test_virus_specific_accession_file_creation PASSED [ 45%] -tests/test_virus.py::TestVirus::test_get_datasets_path_returns_valid_path PASSED [ 46%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_gen_mol_type PASSED [ 46%] -tests/test_virus.py::TestVirus::test_parse_date_invalid_raises PASSED [ 46%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_max PASSED [ 46%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_empty_returns_none PASSED [ 47%] -tests/test_virus.py::TestVirus::test_filter_cached_host_in_strategy_skipped PASSED [ 47%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_virus_suffix PASSED [ 47%] -tests/test_virus.py::TestVirus::test_write_fasta_record_without_description PASSED [ 47%] -tests/test_virus.py::TestVirus::test_deduplicate_metadata_against_baseline PASSED [ 48%] -tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters PASSED [ 48%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_invalid_attempt_returns_none PASSED [ 48%] -tests/test_virus.py::TestVirus::test_parse_genbank_xml_invalid_raises PASSED [ 48%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_false PASSED [ 49%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_name PASSED [ 49%] -tests/test_virus.py::TestVirus::test_virus_with_completeness_filter PASSED [ 49%] -tests/test_virus.py::TestVirus::test_virus_empty_virus_name PASSED [ 49%] -tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_negative PASSED [ 50%] -tests/test_virus.py::TestVirus::test_virus_multi_accession_space_separated PASSED [ 50%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_remove_parentheses PASSED [ 50%] -tests/test_virus.py::TestVirus::test_retry_helper_failed_commands_tracking PASSED [ 50%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_min_seq_length PASSED [ 51%] -tests/test_virus.py::TestVirus::test_save_metadata_to_csv_basic PASSED [ 51%] -tests/test_virus.py::TestVirus::test_retry_helper_exponential_backoff_timing PASSED [ 51%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_jsonl PASSED [ 51%] -tests/test_virus.py::TestVirus::test_filter_cached_complete_only PASSED [ 52%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_no_filters PASSED [ 52%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_min PASSED [ 52%] -tests/test_virus.py::TestVirus::test_is_sars_cov2_query_common_names PASSED [ 52%] -tests/test_virus.py::TestVirus::test_filter_cached_no_filters PASSED [ 53%] -tests/test_virus.py::TestVirus::test_deduplicate_all_existing PASSED [ 53%] -tests/test_virus.py::TestVirus::test_parse_genbank_xml_empty_set PASSED [ 53%] -tests/test_virus.py::TestVirus::test_filter_sequences_max_ambiguous_chars PASSED [ 53%] -tests/test_compile.py::TestCompilerWindows::test_compiler_windows PASSED [ 54%] -tests/test_seq.py::TestSeq::test_seq_transcript_gene PASSED [ 54%] -tests/test_seq.py::TestSeq::test_seq_transcript_transcript_iso PASSED [ 54%] -tests/test_seq.py::TestSeq::test_seq_transcript_transcript_WB PASSED [ 54%] -tests/test_seq.py::TestSeq::test_seq_gene PASSED [ 55%] -tests/test_seq.py::TestSeq::test_seq_missing_uniprot_gene_name PASSED [ 55%] -tests/test_seq.py::TestSeq::test_seq_gene_iso PASSED [ 55%] -tests/test_seq.py::TestSeq::test_seq_gene_transcript_iso PASSED [ 55%] -tests/test_seq.py::TestSeq::test_seq_transcript_gene_iso PASSED [ 56%] -tests/test_seq.py::TestSeq::test_seq_transcript_gene_WB PASSED [ 56%] -tests/test_seq.py::TestSeq::test_seq_transcript PASSED [ 56%] -tests/test_cosmic.py::TestCosmicWorkflow::test_cosmic_defaults PASSED [ 56%] -tests/test_mutate.py::TestMutate::test_index_error PASSED [ 57%] -tests/test_mutate.py::TestMutate::test_multi_delins_with_psuedo_left_repeats PASSED [ 57%] -tests/test_mutate.py::TestMutate::test_ambiguous_mutation PASSED [ 57%] -tests/test_mutate.py::TestMutate::test_single_deletion PASSED [ 57%] -tests/test_mutate.py::TestMutate::test_uncertain_mutation PASSED [ 58%] -tests/test_mutate.py::TestMutate::test_intron_mutation_plus PASSED [ 58%] -tests/test_mutate.py::TestMutate::test_multi_delins_with_true_left_repeats PASSED [ 58%] -tests/test_mutate.py::TestMutate::test_multi_dup PASSED [ 58%] -tests/test_mutate.py::TestMutate::test_single_deletion_with_right_repeats PASSED [ 59%] -tests/test_mutate.py::TestMutate::test_single_dup PASSED [ 59%] -tests/test_mutate.py::TestMutate::test_single_substitution_near_right_end PASSED [ 59%] -tests/test_mutate.py::TestMutate::test_multi_deletion_with_right_repeats PASSED [ 59%] -tests/test_mutate.py::TestMutate::test_multi_insertion_with_left_repeats PASSED [ 60%] -tests/test_mutate.py::TestMutate::test_large_k PASSED [ 60%] -tests/test_mutate.py::TestMutate::test_multi_deletion PASSED [ 60%] -tests/test_mutate.py::TestMutate::test_inversion_with_overlaps PASSED [ 60%] -tests/test_mutate.py::TestMutate::test_multi_insertion PASSED [ 61%] -tests/test_mutate.py::TestMutate::test_posttranslational_mutation PASSED [ 61%] -tests/test_mutate.py::TestMutate::test_single_substitution_near_left_end PASSED [ 61%] -tests/test_mutate.py::TestMutate::test_multi_delins PASSED [ 61%] -tests/test_mutate.py::TestMutate::test_single_insertion PASSED [ 62%] -tests/test_mutate.py::TestMutate::test_single_deletion_with_left_repeats PASSED [ 62%] -tests/test_mutate.py::TestMutate::test_multi_delins_with_true_right_repeats PASSED [ 62%] -tests/test_mutate.py::TestMutate::test_intron_mutation_minus PASSED [ 62%] -tests/test_mutate.py::TestMutate::test_single_substitution PASSED [ 63%] -tests/test_mutate.py::TestMutate::test_list_of_mutations PASSED [ 63%] -tests/test_mutate.py::TestMutate::test_single_delins PASSED [ 63%] -tests/test_mutate.py::test_mismatch_error PASSED [ 63%] -tests/test_mutate.py::test_csv_of_mutations PASSED [ 64%] -tests/test_elm.py::TestELM::test_elm_uniprot_id_in_elm PASSED [ 64%] -tests/test_elm.py::TestELM::test_elm_uniprot_aminoacidseq PASSED [ 64%] -tests/test_elm.py::TestELM::test_elm_uniprot_id_new PASSED [ 64%] -tests/test_diamond.py::TestDiamond::test_diamond_seqs_multiple PASSED [ 65%] -tests/test_diamond.py::TestDiamond::test_diamond_JSON_out PASSED [ 65%] -tests/test_diamond.py::TestDiamond::test_diamond_both_files PASSED [ 65%] -tests/test_diamond.py::TestDiamond::test_diamond_seqs_single PASSED [ 65%] -tests/test_diamond.py::TestDiamond::test_diamond_ref_file PASSED [ 66%] -tests/test_diamond.py::TestDiamond::test_diamond_query_file PASSED [ 66%] -tests/test_g2p.py::TestG2P::test_g2p_alignment PASSED [ 66%] -tests/test_g2p.py::TestG2P::test_g2p_features PASSED [ 66%] -tests/test_g2p.py::TestG2P::test_g2p_map PASSED [ 67%] -tests/test_g2p.py::TestG2PValidation::test_alignment_requires_isoform PASSED [ 67%] -tests/test_g2p.py::TestG2PValidation::test_missing_uniprot_raises PASSED [ 67%] -tests/test_g2p.py::TestG2PValidation::test_invalid_resource_raises PASSED [ 67%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_diseases_filter PASSED [ 68%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_pharmacogenetics PASSED [ 68%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_expression PASSED [ 68%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap_filter PASSED [ 68%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_drugs_invalid_filter PASSED [ 69%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_limit PASSED [ 69%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap PASSED [ 69%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_drugs PASSED [ 69%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_diseases PASSED [ 70%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets PASSED [ 70%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_tractability PASSED [ 70%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_expression_no_limit PASSED [ 70%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_simple_filter PASSED [ 71%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_resource PASSED [ 71%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_nonexistent_id PASSED [ 71%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_no_limit PASSED [ 71%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions PASSED [ 72%] -tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata_macaca_mulatta SKIPPED [ 72%] -tests/test_cellxgene.py::TestCellxgene::test_cellxgene_adata SKIPPED [ 72%] -tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata SKIPPED [ 72%] -tests/test_cellxgene.py::TestCellxgeneValidation::test_typo_species_raises_valueerror PASSED [ 73%] -tests/test_cellxgene.py::TestCellxgeneValidation::test_supported_species_includes_new_primates PASSED [ 73%] -tests/test_cellxgene.py::TestCellxgeneValidation::test_invalid_species_raises_valueerror PASSED [ 73%] -tests/test_utils.py::TestUtils::test_aa_colors PASSED [ 73%] -tests/test_utils.py::TestUtils::test_read_fasta PASSED [ 74%] -tests/test_utils.py::TestUtils::test_search_species_options_bad_type PASSED [ 74%] -tests/test_utils.py::TestUtils::test_ref_iv_species_options PASSED [ 74%] -tests/test_utils.py::TestUtils::test_n_colors PASSED [ 74%] -tests/test_utils.py::TestUtils::test_search_species_options PASSED [ 75%] -tests/test_utils.py::TestUtils::test_get_uniprot_info_gene PASSED [ 75%] -tests/test_utils.py::TestUtils::test_rest_query_bad_type PASSED [ 75%] -tests/test_utils.py::TestUtils::test_find_latest_ens_rel PASSED [ 75%] -tests/test_utils.py::TestUtils::test_ref_species_options_bad_type PASSED [ 76%] -tests/test_utils.py::TestUtils::test_ref_species_options PASSED [ 76%] -tests/test_utils.py::TestUtils::test_search_iv_species_options PASSED [ 76%] -tests/test_utils.py::TestUtils::test_get_uniprot_info_transcript PASSED [ 76%] -tests/test_utils.py::TestUtils::test_get_uniprot_seqs PASSED [ 77%] -tests/test_utils.py::TestUtils::test_rest_query PASSED [ 77%] -tests/test_8cube.py::TestGeneExpression::test_gene_expression_basic PASSED [ 77%] -tests/test_8cube.py::TestSpecificity::test_specificity_basic PASSED [ 77%] -tests/test_8cube.py::TestPsiBlock::test_psi_block_basic PASSED [ 78%] -tests/test_blast.py::TestBlast::test_blast_bad_seq PASSED [ 78%] -tests/test_blast.py::TestBlast::test_blast_bad_db2 PASSED [ 78%] -tests/test_blast.py::TestBlast::test_blast_bad_program PASSED [ 78%] -tests/test_blast.py::TestBlast::test_blast_bad_fasta PASSED [ 79%] -tests/test_blast.py::TestBlast::test_blast_bad_db1 PASSED [ 79%] -tests/test_blast.py::TestBlast::test_blast_nt PASSED [ 79%] -tests/test_blast.py::TestBlast::test_blast_db_missing PASSED [ 79%] -tests/test_search.py::TestSearch::test_search_gene_one_sw_limit PASSED [ 80%] -tests/test_search.py::TestSearch::test_search_gene_bad_species PASSED [ 80%] -tests/test_search.py::TestSearch::test_search_transcript_one_sw PASSED [ 80%] -tests/test_search.py::TestSearch::test_search_gene_two_sw_and PASSED [ 80%] -tests/test_search.py::TestSearch::test_search_transcript_bad_species PASSED [ 81%] -tests/test_search.py::TestSearch::test_search_octopus PASSED [ 81%] -tests/test_search.py::TestSearch::test_search_plant PASSED [ 81%] -tests/test_search.py::TestSearch::test_search_gene_bad_andor PASSED [ 81%] -tests/test_search.py::TestSearch::test_search_transcript_two_sw_and PASSED [ 82%] -tests/test_search.py::TestSearch::test_search_release PASSED [ 82%] -tests/test_search.py::TestSearch::test_search_transcript_bad_andor PASSED [ 82%] -tests/test_search.py::TestSearch::test_search_gene_one_sw PASSED [ 82%] -tests/test_search.py::TestSearch::test_search_plant_db PASSED [ 83%] -tests/test_search.py::TestSearch::test_search_gene_two_sw_limit PASSED [ 83%] -tests/test_search.py::TestSearch::test_search_db PASSED [ 83%] -tests/test_search.py::TestSearch::test_search_transcript_two_sw_or PASSED [ 83%] -tests/test_search.py::TestSearch::test_search_gene_two_sw_or PASSED [ 84%] -tests/test_search.py::TestSearch::test_search_gene_one_sw_json PASSED [ 84%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_yeast PASSED [ 84%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_background_ensembl PASSED [ 84%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_celltypes PASSED [ 85%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background_list PASSED [ 85%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_none PASSED [ 85%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_mouse_is_human PASSED [ 85%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_diseases_drugs PASSED [ 86%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_plot PASSED [ 86%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_transcription PASSED [ 86%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_background PASSED [ 86%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_species PASSED [ 87%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_fly PASSED [ 87%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_gene PASSED [ 87%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_kinase_interactions PASSED [ 87%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_worm PASSED [ 88%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_ontology PASSED [ 88%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_database_shortcut PASSED [ 88%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background PASSED [ 88%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_pathway PASSED [ 89%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_json PASSED [ 89%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_ensembl_ids PASSED [ 89%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_fish PASSED [ 89%] -tests/test_info.py::TestInfo::test_info_WB_transcript PASSED [ 90%] -tests/test_info.py::TestInfo::test_info_ncbifalse_uniprotfalse PASSED [ 90%] -tests/test_info.py::TestInfo::test_info_transcript PASSED [ 90%] -tests/test_info.py::TestInfo::test_info_gene PASSED [ 90%] -tests/test_info.py::TestInfo::test_info_ncbifalse_uniprottrue PASSED [ 91%] -tests/test_info.py::TestInfo::test_info_gene_list_non_model PASSED [ 91%] -tests/test_info.py::TestInfo::test_info_exon PASSED [ 91%] -tests/test_info.py::TestInfo::test_info_mix PASSED [ 91%] -tests/test_info.py::TestInfo::test_info_ncbitrue_uniprotfalse PASSED [ 92%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue_json PASSED [ 92%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_gene PASSED [ 92%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_species PASSED [ 92%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_ensembl PASSED [ 93%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_which PASSED [ 93%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue_mouse PASSED [ 93%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_gene_tissue PASSED [ 93%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue_ensembl PASSED [ 94%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue PASSED [ 94%] -tests/test_archs4.py::TestArchs4::test_archs4_mouse_json_ensembl PASSED [ 94%] -tests/test_archs4.py::TestArchs4::test_archs4_defaults PASSED [ 94%] -tests/test_cbio.py::TestCbio::test_cbio_download_partially_existing_files PASSED [ 95%] -tests/test_cbio.py::TestCbio::test_error_cbio_download PASSED [ 95%] -tests/test_cbio.py::TestCbio::test_cbio_download PASSED [ 95%] -tests/test_cbio.py::TestCbioSearch::test_cbio_search PASSED [ 95%] -tests/test_blat.py::TestBlat::test_blat_bad_assembly PASSED [ 96%] -tests/test_blat.py::TestBlat::test_blat_bad_fileformat PASSED [ 96%] -tests/test_blat.py::TestBlat::test_blat_nt_DNA PASSED [ 96%] -tests/test_blat.py::TestBlat::test_blat_shortseq PASSED [ 96%] -tests/test_blat.py::TestBlat::test_blat_bad_fasta PASSED [ 97%] -tests/test_blat.py::TestBlat::test_blat_nt_json PASSED [ 97%] -tests/test_blat.py::TestBlat::test_blat_aa_protein PASSED [ 97%] -tests/test_blat.py::TestBlat::test_blat_nt_RNA PASSED [ 97%] -tests/test_blat.py::TestBlat::test_blat_nt_transDNA PASSED [ 98%] -tests/test_blat.py::TestBlat::test_blat_nt_txt PASSED [ 98%] -tests/test_blat.py::TestBlat::test_blat_nt_fasta PASSED [ 98%] -tests/test_blat.py::TestBlat::test_blat_nt_protein PASSED [ 98%] -tests/test_blat.py::TestBlat::test_blat_aa_RNA PASSED [ 99%] -tests/test_blat.py::TestBlat::test_blat_nt PASSED [ 99%] -tests/test_blat.py::TestBlat::test_blat_bad_seqtype PASSED [ 99%] -tests/test_blat.py::TestBlat::test_blat_aa PASSED [ 99%] -tests/test_blat.py::TestBlat::test_blat_bad_txt PASSED [100%] - -=================================== FAILURES =================================== -________________________ TestBgee.test_bgee_expression _________________________ - -self = - - def assert_equal(self: unittest.TestCase): - test = name - expected_result = td[test]["expected_result"] -> result_to_test = do_call(func, td[test]["args"]) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -tests/from_json.py:68: -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ -tests/from_json.py:60: in do_call - return func(**args) - ^^^^^^^^^^^^ -gget/gget_bgee.py:190: in bgee - return _bgee_expression(gene_id, json=json, verbose=verbose) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -gget/gget_bgee.py:117: in _bgee_expression - species_set = {_bgee_species(gene_id, verbose=verbose) for gene_id in gene_ids} - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -gget/gget_bgee.py:24: in _bgee_species - payload = http_json( -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - -method = 'GET', url = 'https://bgee.org/api/' -context = 'Bgee API (species lookup)', timeout = (10, 60), retries = 3 -backoff = 1.0 -kwargs = {'params': {'display_type': 'json', 'page': 'gene', 'action': 'general_info', 'gene_id': 'ENSBTAG00000047356'}} - - def http_json( - method: str, - url: str, - *, - context: str = "", - timeout: float = DEFAULT_REQUESTS_TIMEOUT, - retries: int = 3, - backoff: float = 1.0, - **kwargs: Any, - ) -> Any: - """Issue an HTTP request and return the parsed JSON body, raising a - - RuntimeError with consistent context if the request fails or the body - is not valid JSON. - - `context` is a short human-readable label (e.g. "Bgee API") used in - error messages so users can identify which upstream service failed. - Transient failures (connection errors, read timeouts, HTTP 5xx) are - retried up to `retries` additional times with exponential backoff - (`backoff * 2**i` seconds between attempts). Set `retries=0` to disable. - All other keyword arguments are forwarded to `requests.request`. - """ - label = context or url - last_exc = None - last_status = None - last_body = "" - attempts = retries + 1 - for attempt in range(attempts): - try: - response = requests.request(method, url, timeout=timeout, **kwargs) - except (requests.exceptions.ConnectionError, requests.exceptions.Timeout) as e: - last_exc = e - last_status = None - last_body = "" - else: - if response.ok: - try: - return response.json() - except json.JSONDecodeError as e: - body = response.text[:200] if response.text else "" - raise RuntimeError( - f"{label} returned non-JSON response (HTTP {response.status_code}): {body}" - ) from e - # Retry on transient server errors only; client errors are returned - # to the caller without retry. - if response.status_code < 500: - body = response.text[:200] if response.text else "" -> raise RuntimeError(f"{label} returned HTTP {response.status_code}. Body: {body}") -E RuntimeError: Bgee API (species lookup) returned HTTP 403. Body: Just a moment... - - def assert_equal(self: unittest.TestCase): - test = name - expected_result = td[test]["expected_result"] -> result_to_test = do_call(func, td[test]["args"]) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -tests/from_json.py:68: -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ -tests/from_json.py:60: in do_call - return func(**args) - ^^^^^^^^^^^^ -gget/gget_bgee.py:190: in bgee - return _bgee_expression(gene_id, json=json, verbose=verbose) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -gget/gget_bgee.py:117: in _bgee_expression - species_set = {_bgee_species(gene_id, verbose=verbose) for gene_id in gene_ids} - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -gget/gget_bgee.py:24: in _bgee_species - payload = http_json( -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - -method = 'GET', url = 'https://bgee.org/api/' -context = 'Bgee API (species lookup)', timeout = (10, 60), retries = 3 -backoff = 1.0 -kwargs = {'params': {'display_type': 'json', 'page': 'gene', 'action': 'general_info', 'gene_id': 'ENSBTAG00000047356'}} - - def http_json( - method: str, - url: str, - *, - context: str = "", - timeout: float = DEFAULT_REQUESTS_TIMEOUT, - retries: int = 3, - backoff: float = 1.0, - **kwargs: Any, - ) -> Any: - """Issue an HTTP request and return the parsed JSON body, raising a - - RuntimeError with consistent context if the request fails or the body - is not valid JSON. - - `context` is a short human-readable label (e.g. "Bgee API") used in - error messages so users can identify which upstream service failed. - Transient failures (connection errors, read timeouts, HTTP 5xx) are - retried up to `retries` additional times with exponential backoff - (`backoff * 2**i` seconds between attempts). Set `retries=0` to disable. - All other keyword arguments are forwarded to `requests.request`. - """ - label = context or url - last_exc = None - last_status = None - last_body = "" - attempts = retries + 1 - for attempt in range(attempts): - try: - response = requests.request(method, url, timeout=timeout, **kwargs) - except (requests.exceptions.ConnectionError, requests.exceptions.Timeout) as e: - last_exc = e - last_status = None - last_body = "" - else: - if response.ok: - try: - return response.json() - except json.JSONDecodeError as e: - body = response.text[:200] if response.text else "" - raise RuntimeError( - f"{label} returned non-JSON response (HTTP {response.status_code}): {body}" - ) from e - # Retry on transient server errors only; client errors are returned - # to the caller without retry. - if response.status_code < 500: - body = response.text[:200] if response.text else "" -> raise RuntimeError(f"{label} returned HTTP {response.status_code}. Body: {body}") -E RuntimeError: Bgee API (species lookup) returned HTTP 403. Body: Just a moment... - - def assert_equal(self: unittest.TestCase): - test = name - expected_result = td[test]["expected_result"] -> result_to_test = do_call(func, td[test]["args"]) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -tests/from_json.py:68: -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ -tests/from_json.py:60: in do_call - return func(**args) - ^^^^^^^^^^^^ -gget/gget_bgee.py:192: in bgee - return _bgee_orthologs(gene_id, json=json, verbose=verbose) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -gget/gget_bgee.py:60: in _bgee_orthologs - species = _bgee_species(gene_id, verbose=verbose) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -gget/gget_bgee.py:24: in _bgee_species - payload = http_json( -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - -method = 'GET', url = 'https://bgee.org/api/' -context = 'Bgee API (species lookup)', timeout = (10, 60), retries = 3 -backoff = 1.0 -kwargs = {'params': {'display_type': 'json', 'page': 'gene', 'action': 'general_info', 'gene_id': 'ENSOARG00000019163'}} - - def http_json( - method: str, - url: str, - *, - context: str = "", - timeout: float = DEFAULT_REQUESTS_TIMEOUT, - retries: int = 3, - backoff: float = 1.0, - **kwargs: Any, - ) -> Any: - """Issue an HTTP request and return the parsed JSON body, raising a - - RuntimeError with consistent context if the request fails or the body - is not valid JSON. - - `context` is a short human-readable label (e.g. "Bgee API") used in - error messages so users can identify which upstream service failed. - Transient failures (connection errors, read timeouts, HTTP 5xx) are - retried up to `retries` additional times with exponential backoff - (`backoff * 2**i` seconds between attempts). Set `retries=0` to disable. - All other keyword arguments are forwarded to `requests.request`. - """ - label = context or url - last_exc = None - last_status = None - last_body = "" - attempts = retries + 1 - for attempt in range(attempts): - try: - response = requests.request(method, url, timeout=timeout, **kwargs) - except (requests.exceptions.ConnectionError, requests.exceptions.Timeout) as e: - last_exc = e - last_status = None - last_body = "" - else: - if response.ok: - try: - return response.json() - except json.JSONDecodeError as e: - body = response.text[:200] if response.text else "" - raise RuntimeError( - f"{label} returned non-JSON response (HTTP {response.status_code}): {body}" - ) from e - # Retry on transient server errors only; client errors are returned - # to the caller without retry. - if response.status_code < 500: - body = response.text[:200] if response.text else "" -> raise RuntimeError(f"{label} returned HTTP {response.status_code}. Body: {body}") -E RuntimeError: Bgee API (species lookup) returned HTTP 403. Body: Just a moment...Just a moment...Just a moment...Just a moment... Date: Mon, 22 Jun 2026 18:43:53 +0000 Subject: [PATCH 07/34] CI: update pytest results (dev) --- .github/badges/tests.json | 7 +- tests/pytest_results.txt | 1137 +++++++++++++++---------------------- 2 files changed, 446 insertions(+), 698 deletions(-) diff --git a/.github/badges/tests.json b/.github/badges/tests.json index 3ebecd1dc..a7cade404 100644 --- a/.github/badges/tests.json +++ b/.github/badges/tests.json @@ -1,6 +1 @@ -{ - "schemaVersion": 1, - "label": "tests", - "message": "397/400 passing", - "color": "brightgreen" -} +{"schemaVersion": 1, "label": "tests", "message": "399/402 passing", "color": "brightgreen"} diff --git a/tests/pytest_results.txt b/tests/pytest_results.txt index c1d7cbdc9..cdb03b9f5 100644 --- a/tests/pytest_results.txt +++ b/tests/pytest_results.txt @@ -1,723 +1,465 @@ -Pytest results (Python 3.14) - 2026-06-22T16:56:28Z +Pytest results (Python 3.14) - 2026-06-22T18:25:39Z ============================= test session starts ============================== platform linux -- Python 3.14.6, pytest-9.1.1, pluggy-1.6.0 -- /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/bin/python3 cachedir: .pytest_cache -Using --randomly-seed=3575349013 +Using --randomly-seed=1119495841 rootdir: /home/runner/work/gget/gget configfile: pyproject.toml testpaths: tests plugins: randomly-3.16.0, rerunfailures-14.0, mock-3.15.1, cov-7.1.0, xdist-3.8.0 -collecting ... collected 400 items - -tests/test_muscle.py::TestMuscleSeqsInput::test_muscle_seqs_as_input PASSED [ 0%] -tests/test_muscle.py::TestMuscleAASuper::test_muscle_aa_super5 PASSED [ 0%] -tests/test_muscle.py::TestMuscleAA::test_muscle_aa PASSED [ 0%] -tests/test_muscle.py::TestMuscleSuper::test_muscle_nt_super5 PASSED [ 1%] -tests/test_muscle.py::TestMusclePrints::test_muscle_print_nt PASSED [ 1%] -tests/test_muscle.py::TestMuscle::test_muscle_nt PASSED [ 1%] -tests/test_muscle.py::TestMuscle::test_muscle_nt_txt PASSED [ 1%] -tests/test_utils.py::TestUtils::test_ref_species_options PASSED [ 2%] -tests/test_utils.py::TestUtils::test_search_species_options_bad_type PASSED [ 2%] -tests/test_utils.py::TestUtils::test_aa_colors PASSED [ 2%] -tests/test_utils.py::TestUtils::test_find_latest_ens_rel PASSED [ 2%] -tests/test_utils.py::TestUtils::test_read_fasta PASSED [ 3%] -tests/test_utils.py::TestUtils::test_rest_query_bad_type PASSED [ 3%] -tests/test_utils.py::TestUtils::test_get_uniprot_info_gene PASSED [ 3%] -tests/test_utils.py::TestUtils::test_search_iv_species_options PASSED [ 3%] -tests/test_utils.py::TestUtils::test_n_colors PASSED [ 4%] -tests/test_utils.py::TestUtils::test_rest_query PASSED [ 4%] -tests/test_utils.py::TestUtils::test_get_uniprot_info_transcript PASSED [ 4%] -tests/test_utils.py::TestUtils::test_ref_iv_species_options PASSED [ 4%] -tests/test_utils.py::TestUtils::test_ref_species_options_bad_type PASSED [ 5%] -tests/test_utils.py::TestUtils::test_get_uniprot_seqs PASSED [ 5%] -tests/test_utils.py::TestUtils::test_search_species_options PASSED [ 5%] -tests/test_seq.py::TestSeq::test_seq_gene_iso PASSED [ 5%] -tests/test_seq.py::TestSeq::test_seq_missing_uniprot_gene_name PASSED [ 6%] -tests/test_seq.py::TestSeq::test_seq_gene PASSED [ 6%] -tests/test_seq.py::TestSeq::test_seq_gene_transcript_iso PASSED [ 6%] -tests/test_seq.py::TestSeq::test_seq_transcript_gene PASSED [ 6%] -tests/test_seq.py::TestSeq::test_seq_transcript PASSED [ 7%] -tests/test_seq.py::TestSeq::test_seq_transcript_transcript_iso PASSED [ 7%] -tests/test_seq.py::TestSeq::test_seq_transcript_transcript_WB PASSED [ 7%] -tests/test_seq.py::TestSeq::test_seq_transcript_gene_iso PASSED [ 7%] -tests/test_seq.py::TestSeq::test_seq_transcript_gene_WB PASSED [ 8%] -tests/test_cosmic.py::TestCosmicWorkflow::test_cosmic_defaults PASSED [ 8%] -tests/test_cellxgene.py::TestCellxgeneValidation::test_typo_species_raises_valueerror PASSED [ 8%] -tests/test_cellxgene.py::TestCellxgeneValidation::test_supported_species_includes_new_primates PASSED [ 8%] -tests/test_cellxgene.py::TestCellxgeneValidation::test_invalid_species_raises_valueerror PASSED [ 9%] -tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata_macaca_mulatta SKIPPED [ 9%] -tests/test_cellxgene.py::TestCellxgene::test_cellxgene_adata SKIPPED [ 9%] -tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata SKIPPED [ 9%] -tests/test_blat.py::TestBlat::test_blat_nt_fasta PASSED [ 10%] -tests/test_blat.py::TestBlat::test_blat_bad_txt PASSED [ 10%] -tests/test_blat.py::TestBlat::test_blat_nt_protein PASSED [ 10%] -tests/test_blat.py::TestBlat::test_blat_nt_RNA PASSED [ 10%] -tests/test_blat.py::TestBlat::test_blat_bad_assembly PASSED [ 11%] -tests/test_blat.py::TestBlat::test_blat_nt_txt PASSED [ 11%] -tests/test_blat.py::TestBlat::test_blat_nt_transDNA PASSED [ 11%] -tests/test_blat.py::TestBlat::test_blat_bad_seqtype PASSED [ 11%] -tests/test_blat.py::TestBlat::test_blat_bad_fileformat PASSED [ 12%] -tests/test_blat.py::TestBlat::test_blat_shortseq PASSED [ 12%] -tests/test_blat.py::TestBlat::test_blat_bad_fasta PASSED [ 12%] -tests/test_blat.py::TestBlat::test_blat_aa_protein PASSED [ 12%] -tests/test_blat.py::TestBlat::test_blat_nt_json PASSED [ 13%] -tests/test_blat.py::TestBlat::test_blat_aa PASSED [ 13%] -tests/test_blat.py::TestBlat::test_blat_nt PASSED [ 13%] -tests/test_blat.py::TestBlat::test_blat_aa_RNA PASSED [ 13%] -tests/test_blat.py::TestBlat::test_blat_nt_DNA PASSED [ 14%] -tests/test_compile.py::TestCompilerWindows::test_compiler_windows PASSED [ 14%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_zero PASSED [ 14%] -tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter PASSED [ 14%] -tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_negative PASSED [ 15%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_max_seq_length PASSED [ 15%] +collecting ... collected 402 items + +tests/test_cosmic.py::TestCosmicWorkflow::test_cosmic_defaults PASSED [ 0%] +tests/test_blat.py::TestBlat::test_blat_nt_transDNA PASSED [ 0%] +tests/test_blat.py::TestBlat::test_blat_nt PASSED [ 0%] +tests/test_blat.py::TestBlat::test_blat_bad_txt PASSED [ 0%] +tests/test_blat.py::TestBlat::test_blat_shortseq PASSED [ 1%] +tests/test_blat.py::TestBlat::test_blat_nt_DNA PASSED [ 1%] +tests/test_blat.py::TestBlat::test_blat_aa_RNA PASSED [ 1%] +tests/test_blat.py::TestBlat::test_blat_nt_RNA PASSED [ 1%] +tests/test_blat.py::TestBlat::test_blat_nt_json PASSED [ 2%] +tests/test_blat.py::TestBlat::test_blat_bad_seqtype PASSED [ 2%] +tests/test_blat.py::TestBlat::test_blat_nt_fasta PASSED [ 2%] +tests/test_blat.py::TestBlat::test_blat_nt_txt PASSED [ 2%] +tests/test_blat.py::TestBlat::test_blat_aa PASSED [ 3%] +tests/test_blat.py::TestBlat::test_blat_nt_protein PASSED [ 3%] +tests/test_blat.py::TestBlat::test_blat_bad_fileformat PASSED [ 3%] +tests/test_blat.py::TestBlat::test_blat_bad_assembly PASSED [ 3%] +tests/test_blat.py::TestBlat::test_blat_bad_fasta PASSED [ 4%] +tests/test_blat.py::TestBlat::test_blat_aa_protein PASSED [ 4%] +tests/test_cellxgene.py::TestCellxgeneValidation::test_supported_species_includes_new_primates PASSED [ 4%] +tests/test_cellxgene.py::TestCellxgeneValidation::test_invalid_species_raises_valueerror PASSED [ 4%] +tests/test_cellxgene.py::TestCellxgeneValidation::test_typo_species_raises_valueerror PASSED [ 5%] +tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata SKIPPED [ 5%] +tests/test_cellxgene.py::TestCellxgene::test_cellxgene_adata SKIPPED [ 5%] +tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata_macaca_mulatta SKIPPED [ 5%] +tests/test_8cube.py::TestSpecificity::test_specificity_basic PASSED [ 6%] +tests/test_8cube.py::TestPsiBlock::test_psi_block_basic PASSED [ 6%] +tests/test_8cube.py::TestGeneExpression::test_gene_expression_basic PASSED [ 6%] +tests/test_utils.py::TestUtils::test_get_uniprot_seqs PASSED [ 6%] +tests/test_utils.py::TestUtils::test_n_colors PASSED [ 7%] +tests/test_utils.py::TestUtils::test_find_latest_ens_rel PASSED [ 7%] +tests/test_utils.py::TestUtils::test_get_uniprot_info_gene PASSED [ 7%] +tests/test_utils.py::TestUtils::test_get_uniprot_info_transcript PASSED [ 7%] +tests/test_utils.py::TestUtils::test_search_iv_species_options PASSED [ 8%] +tests/test_utils.py::TestUtils::test_search_species_options PASSED [ 8%] +tests/test_utils.py::TestUtils::test_aa_colors PASSED [ 8%] +tests/test_utils.py::TestUtils::test_rest_query PASSED [ 8%] +tests/test_utils.py::TestUtils::test_read_fasta PASSED [ 9%] +tests/test_utils.py::TestUtils::test_ref_iv_species_options PASSED [ 9%] +tests/test_utils.py::TestUtils::test_rest_query_bad_type PASSED [ 9%] +tests/test_utils.py::TestUtils::test_ref_species_options PASSED [ 9%] +tests/test_utils.py::TestUtils::test_search_species_options_bad_type PASSED [ 10%] +tests/test_utils.py::TestUtils::test_ref_species_options_bad_type PASSED [ 10%] +tests/test_gpt.py::TestGpt::test_gpt PASSED [ 10%] +tests/test_archs4.py::TestArchs4::test_archs4_defaults PASSED [ 10%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_ensembl PASSED [ 11%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue PASSED [ 11%] +tests/test_archs4.py::TestArchs4::test_archs4_mouse_json_ensembl PASSED [ 11%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_species PASSED [ 11%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue_ensembl PASSED [ 12%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_gene PASSED [ 12%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue_mouse PASSED [ 12%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue_json PASSED [ 12%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_which PASSED [ 13%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_gene_tissue PASSED [ 13%] +tests/test_virus.py::TestVirus::test_deduplicate_metadata_against_baseline PASSED [ 13%] +tests/test_virus.py::TestVirus::test_parse_accession_input_empty_file_raises_error PASSED [ 13%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_protein_count PASSED [ 14%] +tests/test_virus.py::TestVirus::test_deduplicate_all_existing PASSED [ 14%] +tests/test_virus.py::TestVirus::test_write_fasta_record_long_sequence_wraps PASSED [ 14%] +tests/test_virus.py::TestVirus::test_parse_accession_input_single PASSED [ 14%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_isolate PASSED [ 15%] +tests/test_virus.py::TestVirus::test_virus_host_filter_verification PASSED [ 15%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_jsonl PASSED [ 15%] tests/test_virus.py::TestVirus::test_get_modified_virus_name_remove_parentheses PASSED [ 15%] -tests/test_virus.py::TestVirus::test_get_datasets_path_uses_bundled_binary PASSED [ 15%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_empty_returns_none PASSED [ 16%] -tests/test_virus.py::TestVirus::test_check_min_max_invalid_raises PASSED [ 16%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_already_correct_returns_none PASSED [ 16%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_negative PASSED [ 16%] -tests/test_virus.py::TestVirus::test_get_memory_usage_returns_dict PASSED [ 17%] -tests/test_virus.py::TestVirus::test_write_fasta_record_long_sequence_wraps PASSED [ 17%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_combined_filters PASSED [ 17%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_env_source PASSED [ 17%] -tests/test_virus.py::TestVirus::test_parse_accession_input_empty_file_raises_error PASSED [ 18%] -tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_accession_mode PASSED [ 18%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_collection_date PASSED [ 18%] -tests/test_virus.py::TestVirus::test_save_command_summary_creates_file PASSED [ 18%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_space_before_virus PASSED [ 19%] -tests/test_virus.py::TestVirus::test_filter_cached_annotated PASSED [ 19%] -tests/test_virus.py::TestVirus::test_parse_genbank_xml_empty_set PASSED [ 19%] -tests/test_virus.py::TestVirus::test_clean_xml_declarations_no_declarations PASSED [ 19%] -tests/test_virus.py::TestVirus::test_filter_sequences_no_filters PASSED [ 20%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_max_release_date PASSED [ 20%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_protein_count PASSED [ 20%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_csv PASSED [ 20%] -tests/test_virus.py::TestVirus::test_save_metadata_to_csv_empty_metadata PASSED [ 21%] -tests/test_virus.py::TestVirus::test_retry_helper_successful_operation PASSED [ 21%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_nuc_completeness_partial PASSED [ 21%] -tests/test_virus.py::TestVirus::test_local_name_without_namespace PASSED [ 21%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_no_filters PASSED [ 22%] -tests/test_virus.py::TestVirus::test_save_partial_metadata PASSED [ 22%] -tests/test_virus.py::TestVirus::test_track_failed_operation_appends PASSED [ 22%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_isolate PASSED [ 22%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_false PASSED [ 23%] -tests/test_virus.py::TestVirus::test_retry_helper_success_after_retry PASSED [ 23%] -tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter PASSED [ 23%] -tests/test_virus.py::TestVirus::test_validate_datasets_binary_nonexistent PASSED [ 23%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype_list PASSED [ 24%] -tests/test_virus.py::TestVirus::test_virus_none_virus_name PASSED [ 24%] -tests/test_virus.py::TestVirus::test_track_failed_operation_none_dict PASSED [ 24%] -tests/test_virus.py::TestVirus::test_merge_baseline_with_new_empty_new PASSED [ 24%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_none_raises PASSED [ 25%] -tests/test_virus.py::TestVirus::test_clean_xml_declarations PASSED [ 25%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_empty_raises PASSED [ 25%] -tests/test_virus.py::TestVirus::test_merge_baseline_with_new_deduplicates PASSED [ 25%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_isolation_source PASSED [ 26%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_max_comparison PASSED [ 26%] -tests/test_virus.py::TestVirus::test_virus_invalid_lab_passaged_type PASSED [ 26%] -tests/test_virus.py::TestVirus::test_virus_relationship_check_counts_match PASSED [ 26%] -tests/test_virus.py::TestVirus::test_save_metadata_to_csv_basic PASSED [ 27%] -tests/test_virus.py::TestVirus::test_filter_cached_host_in_strategy_skipped PASSED [ 27%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_multiple PASSED [ 27%] -tests/test_virus.py::TestVirus::test_deduplicate_empty_baseline PASSED [ 27%] +tests/test_virus.py::TestVirus::test_merge_baseline_with_new_deduplicates PASSED [ 16%] +tests/test_virus.py::TestVirus::test_get_gget_version_returns_string PASSED [ 16%] +tests/test_virus.py::TestVirus::test_parse_genbank_xml_basic PASSED [ 16%] +tests/test_virus.py::TestVirus::test_virus_relationship_check_counts_match PASSED [ 16%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_gene_count PASSED [ 17%] +tests/test_virus.py::TestVirus::test_virus_invalid_keep_temp_type PASSED [ 17%] +tests/test_virus.py::TestVirus::test_virus_with_collection_date_filters PASSED [ 17%] +tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_negative PASSED [ 17%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_collection_date_range PASSED [ 18%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_min_comparison PASSED [ 18%] +tests/test_virus.py::TestVirus::test_stream_copy_fasta_all_records PASSED [ 18%] +tests/test_virus.py::TestVirus::test_merge_metadata_csvs_no_overwrite PASSED [ 18%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype PASSED [ 19%] +tests/test_virus.py::TestVirus::test_parse_partial_date_full_date PASSED [ 19%] +tests/test_virus.py::TestVirus::test_validate_datasets_binary_valid PASSED [ 19%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_segment PASSED [ 19%] +tests/test_virus.py::TestVirus::test_check_min_max_valid PASSED [ 20%] +tests/test_virus.py::TestVirus::test_filter_cached_host_in_strategy_skipped PASSED [ 20%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_virus_suffix PASSED [ 20%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_mature_peptide_count PASSED [ 20%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_invalid_attempt_returns_none PASSED [ 21%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_metadata_type PASSED [ 21%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_source_database PASSED [ 21%] +tests/test_virus.py::TestVirus::test_get_datasets_path_uses_bundled_binary PASSED [ 21%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_seq_length PASSED [ 22%] +tests/test_virus.py::TestVirus::test_virus_with_geographic_location_filter PASSED [ 22%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_false PASSED [ 22%] +tests/test_virus.py::TestVirus::test_virus_with_multiple_filters PASSED [ 22%] +tests/test_virus.py::TestVirus::test_check_min_max_none_values PASSED [ 23%] +tests/test_virus.py::TestVirus::test_save_command_summary_creates_file PASSED [ 23%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_min PASSED [ 23%] +tests/test_virus.py::TestVirus::test_stream_copy_fasta_with_accession_filter PASSED [ 23%] +tests/test_virus.py::TestVirus::test_virus_release_date_filter_verification PASSED [ 24%] +tests/test_virus.py::TestVirus::test_merge_baseline_with_new_csv PASSED [ 24%] +tests/test_virus.py::TestVirus::test_parse_date_various_formats PASSED [ 24%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_gen_mol_type PASSED [ 24%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_false PASSED [ 25%] +tests/test_virus.py::TestVirus::test_force_garbage_collection_runs PASSED [ 25%] +tests/test_virus.py::TestVirus::test_virus_multi_accession_file_input PASSED [ 25%] +tests/test_virus.py::TestVirus::test_validate_datasets_binary_nonexistent PASSED [ 25%] +tests/test_virus.py::TestVirus::test_get_datasets_version_returns_string_or_none PASSED [ 26%] +tests/test_virus.py::TestVirus::test_filter_cached_host_not_in_strategy PASSED [ 26%] +tests/test_virus.py::TestVirus::test_parse_partial_date_empty_raises PASSED [ 26%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_negative PASSED [ 26%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_nuc_completeness_partial PASSED [ 27%] +tests/test_virus.py::TestVirus::test_unzip_file_valid PASSED [ 27%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_max_release_date PASSED [ 27%] +tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_common_names PASSED [ 27%] +tests/test_virus.py::TestVirus::test_virus_specific_accession_file_creation PASSED [ 28%] tests/test_virus.py::TestVirus::test_merge_metadata_csvs_missing_standard_file PASSED [ 28%] -tests/test_virus.py::TestVirus::test_parse_date_full PASSED [ 28%] -tests/test_virus.py::TestVirus::test_save_command_summary_with_error PASSED [ 28%] -tests/test_virus.py::TestVirus::test_virus_completeness_filter_verification PASSED [ 28%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_text PASSED [ 29%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_min_gene_count PASSED [ 29%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_seq_length PASSED [ 29%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_min PASSED [ 29%] -tests/test_virus.py::TestVirus::test_virus_multiple_filters_relationship_check PASSED [ 30%] -tests/test_virus.py::TestVirus::test_virus_release_date_filter_verification PASSED [ 30%] -tests/test_virus.py::TestVirus::test_force_garbage_collection_runs PASSED [ 30%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_invalid_attempt_returns_none PASSED [ 30%] -tests/test_virus.py::TestVirus::test_write_fasta_record_without_description PASSED [ 31%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_no_filters PASSED [ 28%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_true PASSED [ 28%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_combined_filters PASSED [ 29%] +tests/test_virus.py::TestVirus::test_merge_metadata_csvs_fills_missing PASSED [ 29%] +tests/test_virus.py::TestVirus::test_is_sars_cov2_query_negative PASSED [ 29%] +tests/test_virus.py::TestVirus::test_batch_accessions_for_url PASSED [ 29%] +tests/test_virus.py::TestVirus::test_save_partial_metadata_empty PASSED [ 30%] +tests/test_virus.py::TestVirus::test_virus_with_length_filters PASSED [ 30%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_no_parentheses_returns_none PASSED [ 30%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_max_gene_count PASSED [ 30%] +tests/test_virus.py::TestVirus::test_virus_invalid_lab_passaged_type PASSED [ 31%] +tests/test_virus.py::TestVirus::test_retry_helper_success_after_retry PASSED [ 31%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_empty PASSED [ 31%] tests/test_virus.py::TestVirus::test_filter_cached_geographic_location PASSED [ 31%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_max_gene_count PASSED [ 31%] -tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter PASSED [ 31%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_true PASSED [ 32%] -tests/test_virus.py::TestVirus::test_unzip_file_bad_zip_raises PASSED [ 32%] -tests/test_virus.py::TestVirus::test_retry_helper_custom_retryable_exceptions PASSED [ 32%] -tests/test_virus.py::TestVirus::test_virus_invalid_proteins_complete_type PASSED [ 32%] -tests/test_virus.py::TestVirus::test_parse_partial_date_empty_raises PASSED [ 33%] -tests/test_virus.py::TestVirus::test_merge_baseline_with_new_csv PASSED [ 33%] -tests/test_virus.py::TestVirus::test_calculate_max_accessions_per_batch PASSED [ 33%] -tests/test_virus.py::TestVirus::test_virus_with_collection_date_filters PASSED [ 33%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_no_parentheses_returns_none PASSED [ 34%] +tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_empty PASSED [ 32%] +tests/test_virus.py::TestVirus::test_virus_invalid_completeness PASSED [ 32%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_empty PASSED [ 32%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_false PASSED [ 32%] +tests/test_virus.py::TestVirus::test_parse_genbank_xml_empty_set PASSED [ 33%] +tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter PASSED [ 33%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_release_date PASSED [ 33%] +tests/test_virus.py::TestVirus::test_track_failed_operation_creates_key PASSED [ 33%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_true PASSED [ 34%] tests/test_virus.py::TestVirus::test_parse_date_invalid_raises PASSED [ 34%] -tests/test_virus.py::TestVirus::test_filter_cached_host_not_in_strategy PASSED [ 34%] -tests/test_virus.py::TestVirus::test_filter_sequences_max_ambiguous_chars PASSED [ 34%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_mature_peptide_count PASSED [ 35%] -tests/test_virus.py::TestVirus::test_validate_datasets_binary_empty_path PASSED [ 35%] -tests/test_virus.py::TestVirus::test_virus_empty_virus_name PASSED [ 35%] -tests/test_virus.py::TestVirus::test_get_datasets_path_returns_valid_path PASSED [ 35%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_nonexistent_raises PASSED [ 36%] -tests/test_virus.py::TestVirus::test_stream_copy_fasta_with_accession_filter PASSED [ 36%] -tests/test_virus.py::TestVirus::test_virus_with_geographic_location_filter PASSED [ 36%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_name PASSED [ 36%] -tests/test_virus.py::TestVirus::test_deduplicate_all_existing PASSED [ 37%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_host PASSED [ 37%] -tests/test_virus.py::TestVirus::test_retry_helper_non_retryable_exception PASSED [ 37%] -tests/test_virus.py::TestVirus::test_virus_multi_accession_space_separated PASSED [ 37%] -tests/test_virus.py::TestVirus::test_parse_genbank_xml_invalid_raises PASSED [ 38%] -tests/test_virus.py::TestVirus::test_parse_accession_input_single PASSED [ 38%] -tests/test_virus.py::TestVirus::test_unzip_file_valid PASSED [ 38%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_peptide_count PASSED [ 38%] -tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters PASSED [ 39%] -tests/test_virus.py::TestVirus::test_virus_integer_virus_id PASSED [ 39%] -tests/test_virus.py::TestVirus::test_check_min_max_none_values PASSED [ 39%] -tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_common_names PASSED [ 39%] -tests/test_virus.py::TestVirus::test_validate_datasets_binary_valid PASSED [ 40%] -tests/test_virus.py::TestVirus::test_get_gget_version_returns_string PASSED [ 40%] -tests/test_virus.py::TestVirus::test_parse_accession_input_from_file PASSED [ 40%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_segment PASSED [ 40%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_combined PASSED [ 41%] -tests/test_virus.py::TestVirus::test_filter_cached_refseq_only PASSED [ 41%] -tests/test_virus.py::TestVirus::test_virus_with_genbank_metadata_retrieval PASSED [ 41%] -tests/test_virus.py::TestVirus::test_stream_copy_fasta_all_records PASSED [ 41%] -tests/test_virus.py::TestVirus::test_merge_metadata_csvs_no_overwrite PASSED [ 42%] -tests/test_virus.py::TestVirus::test_virus_with_host_filter PASSED [ 42%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_country PASSED [ 42%] -tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_empty PASSED [ 42%] -tests/test_virus.py::TestVirus::test_virus_metadata_schema_validation PASSED [ 43%] -tests/test_virus.py::TestVirus::test_filter_cached_no_filters PASSED [ 43%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_gen_mol_type PASSED [ 43%] -tests/test_virus.py::TestVirus::test_save_partial_metadata_empty PASSED [ 43%] -tests/test_virus.py::TestVirus::test_deduplicate_metadata_against_baseline PASSED [ 44%] -tests/test_virus.py::TestVirus::test_virus_specific_accession_file_creation PASSED [ 44%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_true PASSED [ 44%] -tests/test_virus.py::TestVirus::test_virus_with_multiple_filters PASSED [ 44%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_empty PASSED [ 45%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype PASSED [ 45%] -tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_basic PASSED [ 45%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_institution PASSED [ 45%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_gene_count PASSED [ 46%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_true PASSED [ 34%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_nonexistent_raises PASSED [ 34%] +tests/test_virus.py::TestVirus::test_genbank_xml_to_csv_basic PASSED [ 35%] +tests/test_virus.py::TestVirus::test_filter_cached_refseq_only PASSED [ 35%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_host PASSED [ 35%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_min_gene_count PASSED [ 35%] +tests/test_virus.py::TestVirus::test_write_fasta_record_without_description PASSED [ 36%] +tests/test_virus.py::TestVirus::test_virus_completeness_filter_verification PASSED [ 36%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_none_raises PASSED [ 36%] +tests/test_virus.py::TestVirus::test_save_metadata_to_csv_empty_metadata PASSED [ 36%] +tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter PASSED [ 37%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_country PASSED [ 37%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_max PASSED [ 37%] +tests/test_virus.py::TestVirus::test_retry_helper_custom_retryable_exceptions PASSED [ 37%] +tests/test_virus.py::TestVirus::test_local_name_with_namespace PASSED [ 38%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_name PASSED [ 38%] +tests/test_virus.py::TestVirus::test_filter_cached_annotated PASSED [ 38%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_space_before_virus PASSED [ 38%] +tests/test_virus.py::TestVirus::test_parse_accession_input_space_separated PASSED [ 39%] +tests/test_virus.py::TestVirus::test_check_min_max_date_valid PASSED [ 39%] +tests/test_virus.py::TestVirus::test_check_min_max_equal PASSED [ 39%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_empty_returns_none PASSED [ 39%] +tests/test_virus.py::TestVirus::test_unzip_file_bad_zip_raises PASSED [ 40%] +tests/test_virus.py::TestVirus::test_virus_integer_virus_id PASSED [ 40%] +tests/test_virus.py::TestVirus::test_virus_invalid_is_accession_type PASSED [ 40%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_env_source PASSED [ 40%] +tests/test_virus.py::TestVirus::test_virus_invalid_proteins_complete_type PASSED [ 41%] +tests/test_virus.py::TestVirus::test_parse_accession_input_nonexistent_file_raises_error PASSED [ 41%] +tests/test_virus.py::TestVirus::test_write_fasta_record_with_description PASSED [ 41%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_geographic_location PASSED [ 41%] +tests/test_virus.py::TestVirus::test_virus_with_completeness_filter PASSED [ 42%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_missing_accession PASSED [ 42%] +tests/test_virus.py::TestVirus::test_get_memory_usage_returns_dict PASSED [ 42%] +tests/test_virus.py::TestVirus::test_clean_xml_declarations_no_declarations PASSED [ 42%] +tests/test_virus.py::TestVirus::test_filter_cached_complete_only PASSED [ 43%] +tests/test_virus.py::TestVirus::test_save_partial_metadata PASSED [ 43%] +tests/test_virus.py::TestVirus::test_virus_none_virus_name PASSED [ 43%] +tests/test_virus.py::TestVirus::test_track_failed_operation_none_dict PASSED [ 43%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_max_seq_length PASSED [ 44%] +tests/test_virus.py::TestVirus::test_virus_invalid_annotated_type PASSED [ 44%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype_list PASSED [ 44%] +tests/test_virus.py::TestVirus::test_save_command_summary_with_error PASSED [ 44%] +tests/test_virus.py::TestVirus::test_parse_accession_input_from_file PASSED [ 45%] +tests/test_virus.py::TestVirus::test_retry_helper_failed_commands_tracking PASSED [ 45%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_collection_date PASSED [ 45%] +tests/test_virus.py::TestVirus::test_save_metadata_to_csv_basic PASSED [ 45%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_peptide_count PASSED [ 46%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_true PASSED [ 46%] tests/test_virus.py::TestVirus::test_filter_metadata_only_min_seq_length PASSED [ 46%] -tests/test_virus.py::TestVirus::test_virus_with_annotated_filter PASSED [ 46%] -tests/test_virus.py::TestVirus::test_parse_accession_input_space_separated PASSED [ 46%] -tests/test_virus.py::TestVirus::test_virus_invalid_keep_temp_type PASSED [ 47%] -tests/test_virus.py::TestVirus::test_batch_accessions_for_url PASSED [ 47%] -tests/test_virus.py::TestVirus::test_filter_cached_min_release_date PASSED [ 47%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_min_comparison PASSED [ 47%] -tests/test_virus.py::TestVirus::test_write_fasta_record_with_description PASSED [ 48%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_jsonl PASSED [ 48%] -tests/test_virus.py::TestVirus::test_parse_partial_date_full_date PASSED [ 48%] -tests/test_virus.py::TestVirus::test_parse_date_various_formats PASSED [ 48%] -tests/test_virus.py::TestVirus::test_virus_with_completeness_filter PASSED [ 49%] -tests/test_virus.py::TestVirus::test_virus_invalid_annotated_type PASSED [ 49%] -tests/test_virus.py::TestVirus::test_is_sars_cov2_query_accession_mode PASSED [ 49%] -tests/test_virus.py::TestVirus::test_virus_multi_accession_file_input PASSED [ 49%] -tests/test_virus.py::TestVirus::test_virus_host_filter_verification PASSED [ 50%] -tests/test_virus.py::TestVirus::test_merge_metadata_csvs_fills_missing PASSED [ 50%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_release_date PASSED [ 50%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_collection_date_range PASSED [ 50%] -tests/test_virus.py::TestVirus::test_check_min_max_valid PASSED [ 51%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_true PASSED [ 51%] -tests/test_virus.py::TestVirus::test_genbank_xml_to_csv_basic PASSED [ 51%] -tests/test_virus.py::TestVirus::test_datasets_cli_version_output PASSED [ 51%] -tests/test_virus.py::TestVirus::test_filter_cached_complete_only PASSED [ 52%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_false PASSED [ 52%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_false PASSED [ 52%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_protein_count PASSED [ 52%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_missing_accession PASSED [ 53%] -tests/test_virus.py::TestVirus::test_virus_with_length_filters PASSED [ 53%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_virus_suffix PASSED [ 53%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_no_filters PASSED [ 53%] -tests/test_virus.py::TestVirus::test_check_min_max_date_valid PASSED [ 54%] -tests/test_virus.py::TestVirus::test_check_min_max_date_invalid_raises PASSED [ 54%] -tests/test_virus.py::TestVirus::test_filter_sequences_proteins_complete PASSED [ 54%] -tests/test_virus.py::TestVirus::test_virus_invalid_is_accession_type PASSED [ 54%] -tests/test_virus.py::TestVirus::test_check_min_max_equal PASSED [ 55%] -tests/test_virus.py::TestVirus::test_get_datasets_version_returns_string_or_none PASSED [ 55%] -tests/test_virus.py::TestVirus::test_parse_accession_input_nonexistent_file_raises_error PASSED [ 55%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_false PASSED [ 55%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_has_proteins PASSED [ 56%] -tests/test_virus.py::TestVirus::test_retry_helper_failed_commands_tracking PASSED [ 56%] -tests/test_virus.py::TestVirus::test_retry_helper_exponential_backoff_timing PASSED [ 56%] -tests/test_virus.py::TestVirus::test_local_name_with_namespace PASSED [ 56%] -tests/test_virus.py::TestVirus::test_virus_with_source_database_filter PASSED [ 57%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_empty PASSED [ 57%] -tests/test_virus.py::TestVirus::test_is_sars_cov2_query_negative PASSED [ 57%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_true PASSED [ 57%] -tests/test_virus.py::TestVirus::test_is_sars_cov2_query_common_names PASSED [ 58%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_basic PASSED [ 58%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_json PASSED [ 58%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_metadata_type PASSED [ 58%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_type PASSED [ 59%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_geographic_location PASSED [ 59%] -tests/test_virus.py::TestVirus::test_track_failed_operation_creates_key PASSED [ 59%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_max PASSED [ 59%] -tests/test_virus.py::TestVirus::test_virus_invalid_completeness PASSED [ 60%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_source_database PASSED [ 60%] -tests/test_virus.py::TestVirus::test_unzip_file_nonexistent_raises PASSED [ 60%] -tests/test_virus.py::TestVirus::test_parse_genbank_xml_basic PASSED [ 60%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_species PASSED [ 61%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue_ensembl PASSED [ 61%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue_mouse PASSED [ 61%] -tests/test_archs4.py::TestArchs4::test_archs4_mouse_json_ensembl PASSED [ 61%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue_json PASSED [ 62%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue PASSED [ 62%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_gene_tissue PASSED [ 62%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_which PASSED [ 62%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_gene PASSED [ 63%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_ensembl PASSED [ 63%] -tests/test_archs4.py::TestArchs4::test_archs4_defaults PASSED [ 63%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_resource PASSED [ 63%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_diseases PASSED [ 64%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_tractability PASSED [ 64%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_simple_filter PASSED [ 64%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_limit PASSED [ 64%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_expression_no_limit PASSED [ 65%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_drugs_invalid_filter PASSED [ 65%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets PASSED [ 65%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap_filter PASSED [ 65%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions PASSED [ 66%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_drugs PASSED [ 66%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_no_limit PASSED [ 66%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap PASSED [ 66%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_pharmacogenetics PASSED [ 67%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_diseases_filter PASSED [ 67%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_expression PASSED [ 67%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_nonexistent_id PASSED [ 67%] -tests/test_bgee.py::TestBgee::test_error_bgee_expression_no_exist PASSED [ 68%] -tests/test_bgee.py::TestBgee::test_error_bgee_unknown_type PASSED [ 68%] -tests/test_bgee.py::TestBgee::test_bgee_expression PASSED [ 68%] -tests/test_bgee.py::TestBgee::test_error_bgee_orthologs_no_exist PASSED [ 68%] -tests/test_bgee.py::TestBgee::test_bgee_expression_multiple PASSED [ 69%] -tests/test_bgee.py::TestBgee::test_bgee_orthologs PASSED [ 69%] -tests/test_gpt.py::TestGpt::test_gpt PASSED [ 69%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_already_correct_returns_none PASSED [ 46%] +tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters PASSED [ 47%] +tests/test_virus.py::TestVirus::test_retry_helper_exponential_backoff_timing PASSED [ 47%] +tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_basic PASSED [ 47%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_csv PASSED [ 47%] +tests/test_virus.py::TestVirus::test_calculate_max_accessions_per_batch PASSED [ 48%] +tests/test_virus.py::TestVirus::test_merge_baseline_with_new_empty_new PASSED [ 48%] +tests/test_virus.py::TestVirus::test_filter_sequences_no_filters PASSED [ 48%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_has_proteins PASSED [ 48%] +tests/test_virus.py::TestVirus::test_retry_helper_non_retryable_exception PASSED [ 49%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_text PASSED [ 49%] +tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter PASSED [ 49%] +tests/test_virus.py::TestVirus::test_filter_sequences_proteins_complete PASSED [ 49%] +tests/test_virus.py::TestVirus::test_virus_with_host_filter PASSED [ 50%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_protein_count PASSED [ 50%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_false PASSED [ 50%] +tests/test_virus.py::TestVirus::test_local_name_without_namespace PASSED [ 50%] +tests/test_virus.py::TestVirus::test_virus_empty_virus_name PASSED [ 50%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_isolation_source PASSED [ 51%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_empty_raises PASSED [ 51%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_combined PASSED [ 51%] +tests/test_virus.py::TestVirus::test_virus_with_source_database_filter PASSED [ 51%] +tests/test_virus.py::TestVirus::test_check_min_max_date_invalid_raises PASSED [ 52%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_no_filters PASSED [ 52%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_json PASSED [ 52%] +tests/test_virus.py::TestVirus::test_parse_genbank_xml_invalid_raises PASSED [ 52%] +tests/test_virus.py::TestVirus::test_deduplicate_empty_baseline PASSED [ 53%] +tests/test_virus.py::TestVirus::test_get_datasets_path_returns_valid_path PASSED [ 53%] +tests/test_virus.py::TestVirus::test_check_min_max_invalid_raises PASSED [ 53%] +tests/test_virus.py::TestVirus::test_datasets_cli_version_output PASSED [ 53%] +tests/test_virus.py::TestVirus::test_is_sars_cov2_query_accession_mode PASSED [ 54%] +tests/test_virus.py::TestVirus::test_unzip_file_nonexistent_raises PASSED [ 54%] +tests/test_virus.py::TestVirus::test_validate_datasets_binary_empty_path PASSED [ 54%] +tests/test_virus.py::TestVirus::test_retry_helper_successful_operation PASSED [ 54%] +tests/test_virus.py::TestVirus::test_filter_cached_no_filters PASSED [ 55%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_basic PASSED [ 55%] +tests/test_virus.py::TestVirus::test_filter_sequences_max_ambiguous_chars PASSED [ 55%] +tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_accession_mode PASSED [ 55%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_max_comparison PASSED [ 56%] +tests/test_virus.py::TestVirus::test_clean_xml_declarations PASSED [ 56%] +tests/test_virus.py::TestVirus::test_track_failed_operation_appends PASSED [ 56%] +tests/test_virus.py::TestVirus::test_is_sars_cov2_query_common_names PASSED [ 56%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_multiple PASSED [ 57%] +tests/test_virus.py::TestVirus::test_virus_with_genbank_metadata_retrieval PASSED [ 57%] +tests/test_virus.py::TestVirus::test_parse_date_full PASSED [ 57%] +tests/test_virus.py::TestVirus::test_virus_with_annotated_filter PASSED [ 57%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_type PASSED [ 58%] +tests/test_virus.py::TestVirus::test_virus_metadata_schema_validation PASSED [ 58%] +tests/test_virus.py::TestVirus::test_virus_multiple_filters_relationship_check PASSED [ 58%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_zero PASSED [ 58%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_institution PASSED [ 59%] +tests/test_virus.py::TestVirus::test_virus_multi_accession_space_separated PASSED [ 59%] +tests/test_virus.py::TestVirus::test_filter_cached_min_release_date PASSED [ 59%] +tests/test_ref.py::TestRef::test_ref_which PASSED [ 59%] +tests/test_ref.py::TestRef::test_ref_list PASSED [ 60%] +tests/test_ref.py::TestRef::test_ref_rel_ftp PASSED [ 60%] +tests/test_ref.py::TestRef::test_ref_rel_ftp_octopus PASSED [ 60%] +tests/test_ref.py::TestRef::test_ref_ftp PASSED [ 60%] +tests/test_ref.py::TestRef::test_ref PASSED [ 61%] +tests/test_ref.py::TestRef::test_ref_bad_which PASSED [ 61%] +tests/test_ref.py::TestRef::test_ref_rel_protist PASSED [ 61%] +tests/test_ref.py::TestRef::test_ref_plant PASSED [ 61%] +tests/test_ref.py::TestRef::test_ref_rel PASSED [ 62%] +tests/test_ref.py::TestRef::test_ref_bad_species PASSED [ 62%] +tests/test_ref.py::TestRef::test_ref_bad_rel PASSED [ 62%] +tests/test_ref.py::TestRef::test_ref_which_plant PASSED [ 62%] +tests/test_mutate.py::TestMutate::test_single_deletion PASSED [ 63%] +tests/test_mutate.py::TestMutate::test_multi_insertion PASSED [ 63%] +tests/test_mutate.py::TestMutate::test_intron_mutation_minus PASSED [ 63%] +tests/test_mutate.py::TestMutate::test_posttranslational_mutation PASSED [ 63%] +tests/test_mutate.py::TestMutate::test_multi_deletion_with_right_repeats PASSED [ 64%] +tests/test_mutate.py::TestMutate::test_index_error PASSED [ 64%] +tests/test_mutate.py::TestMutate::test_uncertain_mutation PASSED [ 64%] +tests/test_mutate.py::TestMutate::test_large_k PASSED [ 64%] +tests/test_mutate.py::TestMutate::test_multi_delins_with_true_left_repeats PASSED [ 65%] +tests/test_mutate.py::TestMutate::test_inversion_with_overlaps PASSED [ 65%] +tests/test_mutate.py::TestMutate::test_multi_deletion PASSED [ 65%] +tests/test_mutate.py::TestMutate::test_multi_delins PASSED [ 65%] +tests/test_mutate.py::TestMutate::test_single_substitution_near_left_end PASSED [ 66%] +tests/test_mutate.py::TestMutate::test_single_deletion_with_right_repeats PASSED [ 66%] +tests/test_mutate.py::TestMutate::test_single_substitution PASSED [ 66%] +tests/test_mutate.py::TestMutate::test_list_of_mutations PASSED [ 66%] +tests/test_mutate.py::TestMutate::test_single_insertion PASSED [ 67%] +tests/test_mutate.py::TestMutate::test_multi_dup PASSED [ 67%] +tests/test_mutate.py::TestMutate::test_single_substitution_near_right_end PASSED [ 67%] +tests/test_mutate.py::TestMutate::test_multi_delins_with_true_right_repeats PASSED [ 67%] +tests/test_mutate.py::TestMutate::test_intron_mutation_plus PASSED [ 68%] +tests/test_mutate.py::TestMutate::test_multi_delins_with_psuedo_left_repeats PASSED [ 68%] +tests/test_mutate.py::TestMutate::test_multi_insertion_with_left_repeats PASSED [ 68%] +tests/test_mutate.py::TestMutate::test_single_dup PASSED [ 68%] +tests/test_mutate.py::TestMutate::test_single_deletion_with_left_repeats PASSED [ 69%] +tests/test_mutate.py::TestMutate::test_ambiguous_mutation PASSED [ 69%] +tests/test_mutate.py::TestMutate::test_single_delins PASSED [ 69%] tests/test_mutate.py::test_mismatch_error PASSED [ 69%] tests/test_mutate.py::test_csv_of_mutations PASSED [ 70%] -tests/test_mutate.py::TestMutate::test_single_deletion_with_right_repeats PASSED [ 70%] -tests/test_mutate.py::TestMutate::test_large_k PASSED [ 70%] -tests/test_mutate.py::TestMutate::test_multi_delins PASSED [ 70%] -tests/test_mutate.py::TestMutate::test_list_of_mutations PASSED [ 71%] -tests/test_mutate.py::TestMutate::test_multi_insertion_with_left_repeats PASSED [ 71%] -tests/test_mutate.py::TestMutate::test_index_error PASSED [ 71%] -tests/test_mutate.py::TestMutate::test_single_substitution_near_left_end PASSED [ 71%] -tests/test_mutate.py::TestMutate::test_single_deletion_with_left_repeats PASSED [ 72%] -tests/test_mutate.py::TestMutate::test_inversion_with_overlaps PASSED [ 72%] -tests/test_mutate.py::TestMutate::test_multi_dup PASSED [ 72%] -tests/test_mutate.py::TestMutate::test_multi_delins_with_true_right_repeats PASSED [ 72%] -tests/test_mutate.py::TestMutate::test_multi_delins_with_psuedo_left_repeats PASSED [ 73%] -tests/test_mutate.py::TestMutate::test_uncertain_mutation PASSED [ 73%] -tests/test_mutate.py::TestMutate::test_posttranslational_mutation PASSED [ 73%] -tests/test_mutate.py::TestMutate::test_multi_delins_with_true_left_repeats PASSED [ 73%] -tests/test_mutate.py::TestMutate::test_single_deletion PASSED [ 74%] -tests/test_mutate.py::TestMutate::test_intron_mutation_minus PASSED [ 74%] -tests/test_mutate.py::TestMutate::test_single_substitution PASSED [ 74%] -tests/test_mutate.py::TestMutate::test_single_substitution_near_right_end PASSED [ 74%] -tests/test_mutate.py::TestMutate::test_intron_mutation_plus PASSED [ 75%] -tests/test_mutate.py::TestMutate::test_single_dup PASSED [ 75%] -tests/test_mutate.py::TestMutate::test_single_delins PASSED [ 75%] -tests/test_mutate.py::TestMutate::test_multi_insertion PASSED [ 75%] -tests/test_mutate.py::TestMutate::test_single_insertion PASSED [ 76%] -tests/test_mutate.py::TestMutate::test_multi_deletion PASSED [ 76%] -tests/test_mutate.py::TestMutate::test_ambiguous_mutation PASSED [ 76%] -tests/test_mutate.py::TestMutate::test_multi_deletion_with_right_repeats PASSED [ 76%] -tests/test_elm.py::TestELM::test_elm_uniprot_aminoacidseq PASSED [ 77%] -tests/test_elm.py::TestELM::test_elm_uniprot_id_in_elm PASSED [ 77%] -tests/test_elm.py::TestELM::test_elm_uniprot_id_new PASSED [ 77%] -tests/test_search.py::TestSearch::test_search_gene_bad_andor PASSED [ 77%] -tests/test_search.py::TestSearch::test_search_transcript_bad_species PASSED [ 78%] -tests/test_search.py::TestSearch::test_search_plant PASSED [ 78%] -tests/test_search.py::TestSearch::test_search_gene_two_sw_and PASSED [ 78%] -tests/test_search.py::TestSearch::test_search_gene_one_sw PASSED [ 78%] -tests/test_search.py::TestSearch::test_search_plant_db PASSED [ 79%] -tests/test_search.py::TestSearch::test_search_gene_two_sw_limit PASSED [ 79%] -tests/test_search.py::TestSearch::test_search_octopus PASSED [ 79%] -tests/test_search.py::TestSearch::test_search_release PASSED [ 79%] -tests/test_search.py::TestSearch::test_search_gene_two_sw_or PASSED [ 80%] -tests/test_search.py::TestSearch::test_search_gene_one_sw_limit PASSED [ 80%] -tests/test_search.py::TestSearch::test_search_gene_bad_species PASSED [ 80%] -tests/test_search.py::TestSearch::test_search_db PASSED [ 80%] -tests/test_search.py::TestSearch::test_search_gene_one_sw_json PASSED [ 81%] -tests/test_search.py::TestSearch::test_search_transcript_two_sw_and PASSED [ 81%] -tests/test_search.py::TestSearch::test_search_transcript_one_sw PASSED [ 81%] -tests/test_search.py::TestSearch::test_search_transcript_bad_andor PASSED [ 81%] -tests/test_search.py::TestSearch::test_search_transcript_two_sw_or PASSED [ 82%] -tests/test_info.py::TestInfo::test_info_WB_transcript PASSED [ 82%] -tests/test_info.py::TestInfo::test_info_ncbitrue_uniprotfalse PASSED [ 82%] -tests/test_info.py::TestInfo::test_info_exon PASSED [ 82%] -tests/test_info.py::TestInfo::test_info_gene PASSED [ 83%] -tests/test_info.py::TestInfo::test_info_ncbifalse_uniprottrue PASSED [ 83%] -tests/test_info.py::TestInfo::test_info_gene_list_non_model PASSED [ 83%] +tests/test_bgee.py::TestBgee::test_error_bgee_unknown_type PASSED [ 70%] +tests/test_bgee.py::TestBgee::test_error_bgee_orthologs_no_exist PASSED [ 70%] +tests/test_bgee.py::TestBgee::test_bgee_expression_multiple PASSED [ 70%] +tests/test_bgee.py::TestBgee::test_error_bgee_expression_no_exist PASSED [ 71%] +tests/test_bgee.py::TestBgee::test_bgee_orthologs PASSED [ 71%] +tests/test_bgee.py::TestBgee::test_bgee_expression PASSED [ 71%] +tests/test_g2p.py::TestG2PValidation::test_missing_uniprot_raises PASSED [ 71%] +tests/test_g2p.py::TestG2PValidation::test_alignment_requires_isoform PASSED [ 72%] +tests/test_g2p.py::TestG2PValidation::test_invalid_resource_raises PASSED [ 72%] +tests/test_g2p.py::TestG2P::test_g2p_map PASSED [ 72%] +tests/test_g2p.py::TestG2P::test_g2p_features PASSED [ 72%] +tests/test_g2p.py::TestG2P::test_g2p_alignment PASSED [ 73%] +tests/test_pdb.py::TestPDB::test_pdb_legacy_fallback_to_mmcif PASSED [ 73%] +tests/test_pdb.py::TestPDB::test_pdb_mmcif PASSED [ 73%] +tests/test_pdb.py::TestPDB::test_pdb_pdb PASSED [ 73%] +tests/test_pdb.py::TestPDB::test_pdb_assembly PASSED [ 74%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_background_ensembl PASSED [ 74%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background_list PASSED [ 74%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_transcription PASSED [ 74%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_fly PASSED [ 75%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_database_shortcut PASSED [ 75%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_mouse_is_human PASSED [ 75%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_diseases_drugs PASSED [ 75%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_gene PASSED [ 76%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_fish PASSED [ 76%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_pathway PASSED [ 76%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_ontology PASSED [ 76%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_species PASSED [ 77%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_celltypes PASSED [ 77%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_yeast PASSED [ 77%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_plot PASSED [ 77%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_background PASSED [ 78%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_ensembl_ids PASSED [ 78%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_kinase_interactions PASSED [ 78%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_none PASSED [ 78%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_json PASSED [ 79%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_worm PASSED [ 79%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background PASSED [ 79%] +tests/test_cbio.py::TestCbio::test_cbio_download PASSED [ 79%] +tests/test_cbio.py::TestCbio::test_error_cbio_download PASSED [ 80%] +tests/test_cbio.py::TestCbio::test_cbio_download_partially_existing_files PASSED [ 80%] +tests/test_cbio.py::TestCbioSearch::test_cbio_search PASSED [ 80%] +tests/test_muscle.py::TestMuscleSuper::test_muscle_nt_super5 PASSED [ 80%] +tests/test_muscle.py::TestMuscle::test_muscle_nt_txt PASSED [ 81%] +tests/test_muscle.py::TestMuscle::test_muscle_nt PASSED [ 81%] +tests/test_muscle.py::TestMusclePrints::test_muscle_print_nt PASSED [ 81%] +tests/test_muscle.py::TestMuscleSeqsInput::test_muscle_seqs_as_input PASSED [ 81%] +tests/test_muscle.py::TestMuscleAASuper::test_muscle_aa_super5 PASSED [ 82%] +tests/test_muscle.py::TestMuscleAA::test_muscle_aa PASSED [ 82%] +tests/test_info.py::TestInfo::test_info_ncbifalse_uniprottrue PASSED [ 82%] +tests/test_info.py::TestInfo::test_info_ncbifalse_uniprotfalse PASSED [ 82%] tests/test_info.py::TestInfo::test_info_mix PASSED [ 83%] -tests/test_info.py::TestInfo::test_info_ncbifalse_uniprotfalse PASSED [ 84%] -tests/test_info.py::TestInfo::test_info_transcript PASSED [ 84%] -tests/test_blast.py::TestBlast::test_blast_bad_fasta PASSED [ 84%] -tests/test_blast.py::TestBlast::test_blast_bad_db1 PASSED [ 84%] -tests/test_blast.py::TestBlast::test_blast_bad_program PASSED [ 85%] -tests/test_blast.py::TestBlast::test_blast_bad_seq PASSED [ 85%] -tests/test_blast.py::TestBlast::test_blast_db_missing PASSED [ 85%] -tests/test_blast.py::TestBlast::test_blast_nt PASSED [ 85%] -tests/test_blast.py::TestBlast::test_blast_bad_db2 PASSED [ 86%] -tests/test_pdb.py::TestPDB::test_pdb_pdb PASSED [ 86%] -tests/test_pdb.py::TestPDB::test_pdb_assembly PASSED [ 86%] -tests/test_ref.py::TestRef::test_ref_plant PASSED [ 86%] -tests/test_ref.py::TestRef::test_ref_rel_protist PASSED [ 87%] -tests/test_ref.py::TestRef::test_ref_ftp PASSED [ 87%] -tests/test_ref.py::TestRef::test_ref_which_plant PASSED [ 87%] -tests/test_ref.py::TestRef::test_ref_bad_which PASSED [ 87%] -tests/test_ref.py::TestRef::test_ref_rel_ftp PASSED [ 88%] -tests/test_ref.py::TestRef::test_ref_rel_ftp_octopus PASSED [ 88%] -tests/test_ref.py::TestRef::test_ref_bad_species PASSED [ 88%] -tests/test_ref.py::TestRef::test_ref_rel PASSED [ 88%] -tests/test_ref.py::TestRef::test_ref PASSED [ 89%] -tests/test_ref.py::TestRef::test_ref_which PASSED [ 89%] -tests/test_ref.py::TestRef::test_ref_list PASSED [ 89%] -tests/test_ref.py::TestRef::test_ref_bad_rel PASSED [ 89%] -tests/test_8cube.py::TestGeneExpression::test_gene_expression_basic PASSED [ 90%] -tests/test_8cube.py::TestPsiBlock::test_psi_block_basic PASSED [ 90%] -tests/test_8cube.py::TestSpecificity::test_specificity_basic PASSED [ 90%] -tests/test_cbio.py::TestCbio::test_cbio_download_partially_existing_files PASSED [ 90%] -tests/test_cbio.py::TestCbio::test_error_cbio_download PASSED [ 91%] -tests/test_cbio.py::TestCbio::test_cbio_download PASSED [ 91%] -tests/test_cbio.py::TestCbioSearch::test_cbio_search PASSED [ 91%] -tests/test_g2p.py::TestG2P::test_g2p_map PASSED [ 91%] -tests/test_g2p.py::TestG2P::test_g2p_alignment PASSED [ 92%] -tests/test_g2p.py::TestG2P::test_g2p_features PASSED [ 92%] -tests/test_g2p.py::TestG2PValidation::test_missing_uniprot_raises PASSED [ 92%] -tests/test_g2p.py::TestG2PValidation::test_invalid_resource_raises PASSED [ 92%] -tests/test_g2p.py::TestG2PValidation::test_alignment_requires_isoform PASSED [ 93%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_transcription PASSED [ 93%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_kinase_interactions PASSED [ 93%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_mouse_is_human PASSED [ 93%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_worm PASSED [ 94%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_yeast PASSED [ 94%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_species PASSED [ 94%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_pathway PASSED [ 94%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background PASSED [ 95%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_background PASSED [ 95%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_diseases_drugs PASSED [ 95%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_database_shortcut PASSED [ 95%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_celltypes PASSED [ 96%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background_list PASSED [ 96%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_none PASSED [ 96%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_gene PASSED [ 96%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_json PASSED [ 97%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_fish PASSED [ 97%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_background_ensembl PASSED [ 97%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_ensembl_ids PASSED [ 97%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_fly PASSED [ 98%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_ontology PASSED [ 98%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_plot PASSED [ 98%] -tests/test_diamond.py::TestDiamond::test_diamond_ref_file PASSED [ 98%] -tests/test_diamond.py::TestDiamond::test_diamond_query_file PASSED [ 99%] -tests/test_diamond.py::TestDiamond::test_diamond_both_files PASSED [ 99%] -tests/test_diamond.py::TestDiamond::test_diamond_JSON_out PASSED [ 99%] -tests/test_diamond.py::TestDiamond::test_diamond_seqs_multiple PASSED [ 99%] -tests/test_diamond.py::TestDiamond::test_diamond_seqs_single PASSED [100%] - -_________________________ TestBgee.test_bgee_orthologs _________________________ - -self = - - def assert_equal(self: unittest.TestCase): - test = name - expected_result = td[test]["expected_result"] -> result_to_test = do_call(func, td[test]["args"]) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -tests/from_json.py:68: -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ -tests/from_json.py:60: in do_call - return func(**args) - ^^^^^^^^^^^^ -gget/gget_bgee.py:192: in bgee - return _bgee_orthologs(gene_id, json=json, verbose=verbose) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -gget/gget_bgee.py:60: in _bgee_orthologs - species = _bgee_species(gene_id, verbose=verbose) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -gget/gget_bgee.py:24: in _bgee_species - payload = http_json( -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - -method = 'GET', url = 'https://bgee.org/api/' -context = 'Bgee API (species lookup)', timeout = (10, 60), retries = 3 -backoff = 1.0 -kwargs = {'params': {'display_type': 'json', 'page': 'gene', 'action': 'general_info', 'gene_id': 'ENSOARG00000019163'}} - - def http_json( - method: str, - url: str, - *, - context: str = "", - timeout: float = DEFAULT_REQUESTS_TIMEOUT, - retries: int = 3, - backoff: float = 1.0, - **kwargs: Any, - ) -> Any: - """Issue an HTTP request and return the parsed JSON body, raising a - - RuntimeError with consistent context if the request fails or the body - is not valid JSON. - - `context` is a short human-readable label (e.g. "Bgee API") used in - error messages so users can identify which upstream service failed. - Transient failures (connection errors, read timeouts, HTTP 5xx) are - retried up to `retries` additional times with exponential backoff - (`backoff * 2**i` seconds between attempts). Set `retries=0` to disable. - All other keyword arguments are forwarded to `requests.request`. - """ - label = context or url - last_exc = None - last_status = None - last_body = "" - attempts = retries + 1 - for attempt in range(attempts): - try: - response = requests.request(method, url, timeout=timeout, **kwargs) - except (requests.exceptions.ConnectionError, requests.exceptions.Timeout) as e: - last_exc = e - last_status = None - last_body = "" - else: - if response.ok: - try: - return response.json() - except json.JSONDecodeError as e: - body = response.text[:200] if response.text else "" - raise RuntimeError( - f"{label} returned non-JSON response (HTTP {response.status_code}): {body}" - ) from e - # Retry on transient server errors only; client errors are returned - # to the caller without retry. - if response.status_code < 500: - body = response.text[:200] if response.text else "" -> raise RuntimeError(f"{label} returned HTTP {response.status_code}. Body: {body}") -E RuntimeError: Bgee API (species lookup) returned HTTP 403. Body: Just a moment... - - def assert_equal(self: unittest.TestCase): - test = name - expected_result = td[test]["expected_result"] -> result_to_test = do_call(func, td[test]["args"]) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -tests/from_json.py:68: -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ -tests/from_json.py:60: in do_call - return func(**args) - ^^^^^^^^^^^^ -gget/gget_bgee.py:190: in bgee - return _bgee_expression(gene_id, json=json, verbose=verbose) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -gget/gget_bgee.py:117: in _bgee_expression - species_set = {_bgee_species(gene_id, verbose=verbose) for gene_id in gene_ids} - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -gget/gget_bgee.py:24: in _bgee_species - payload = http_json( -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - -method = 'GET', url = 'https://bgee.org/api/' -context = 'Bgee API (species lookup)', timeout = (10, 60), retries = 3 -backoff = 1.0 -kwargs = {'params': {'display_type': 'json', 'page': 'gene', 'action': 'general_info', 'gene_id': 'ENSBTAG00000047356'}} - - def http_json( - method: str, - url: str, - *, - context: str = "", - timeout: float = DEFAULT_REQUESTS_TIMEOUT, - retries: int = 3, - backoff: float = 1.0, - **kwargs: Any, - ) -> Any: - """Issue an HTTP request and return the parsed JSON body, raising a - - RuntimeError with consistent context if the request fails or the body - is not valid JSON. - - `context` is a short human-readable label (e.g. "Bgee API") used in - error messages so users can identify which upstream service failed. - Transient failures (connection errors, read timeouts, HTTP 5xx) are - retried up to `retries` additional times with exponential backoff - (`backoff * 2**i` seconds between attempts). Set `retries=0` to disable. - All other keyword arguments are forwarded to `requests.request`. - """ - label = context or url - last_exc = None - last_status = None - last_body = "" - attempts = retries + 1 - for attempt in range(attempts): - try: - response = requests.request(method, url, timeout=timeout, **kwargs) - except (requests.exceptions.ConnectionError, requests.exceptions.Timeout) as e: - last_exc = e - last_status = None - last_body = "" - else: - if response.ok: - try: - return response.json() - except json.JSONDecodeError as e: - body = response.text[:200] if response.text else "" - raise RuntimeError( - f"{label} returned non-JSON response (HTTP {response.status_code}): {body}" - ) from e - # Retry on transient server errors only; client errors are returned - # to the caller without retry. - if response.status_code < 500: - body = response.text[:200] if response.text else "" -> raise RuntimeError(f"{label} returned HTTP {response.status_code}. Body: {body}") -E RuntimeError: Bgee API (species lookup) returned HTTP 403. Body: Just a moment... - - def assert_equal(self: unittest.TestCase): - test = name - expected_result = td[test]["expected_result"] -> result_to_test = do_call(func, td[test]["args"]) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -tests/from_json.py:68: -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ -tests/from_json.py:60: in do_call - return func(**args) - ^^^^^^^^^^^^ -gget/gget_bgee.py:190: in bgee - return _bgee_expression(gene_id, json=json, verbose=verbose) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -gget/gget_bgee.py:117: in _bgee_expression - species_set = {_bgee_species(gene_id, verbose=verbose) for gene_id in gene_ids} - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -gget/gget_bgee.py:24: in _bgee_species - payload = http_json( -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - -method = 'GET', url = 'https://bgee.org/api/' -context = 'Bgee API (species lookup)', timeout = (10, 60), retries = 3 -backoff = 1.0 -kwargs = {'params': {'display_type': 'json', 'page': 'gene', 'action': 'general_info', 'gene_id': 'ENSBTAG00000047356'}} - - def http_json( - method: str, - url: str, - *, - context: str = "", - timeout: float = DEFAULT_REQUESTS_TIMEOUT, - retries: int = 3, - backoff: float = 1.0, - **kwargs: Any, - ) -> Any: - """Issue an HTTP request and return the parsed JSON body, raising a - - RuntimeError with consistent context if the request fails or the body - is not valid JSON. - - `context` is a short human-readable label (e.g. "Bgee API") used in - error messages so users can identify which upstream service failed. - Transient failures (connection errors, read timeouts, HTTP 5xx) are - retried up to `retries` additional times with exponential backoff - (`backoff * 2**i` seconds between attempts). Set `retries=0` to disable. - All other keyword arguments are forwarded to `requests.request`. - """ - label = context or url - last_exc = None - last_status = None - last_body = "" - attempts = retries + 1 - for attempt in range(attempts): - try: - response = requests.request(method, url, timeout=timeout, **kwargs) - except (requests.exceptions.ConnectionError, requests.exceptions.Timeout) as e: - last_exc = e - last_status = None - last_body = "" - else: - if response.ok: - try: - return response.json() - except json.JSONDecodeError as e: - body = response.text[:200] if response.text else "" - raise RuntimeError( - f"{label} returned non-JSON response (HTTP {response.status_code}): {body}" - ) from e - # Retry on transient server errors only; client errors are returned - # to the caller without retry. - if response.status_code < 500: - body = response.text[:200] if response.text else "" -> raise RuntimeError(f"{label} returned HTTP {response.status_code}. Body: {body}") -E RuntimeError: Bgee API (species lookup) returned HTTP 403. Body: Just a moment... Date: Mon, 22 Jun 2026 17:02:07 -0400 Subject: [PATCH 08/34] feat(types): pay down mypy errors (var-annotated + json overloads) (#225) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(types): pay down 67 mypy errors (var-annotated + json overloads) mypy baseline: 613 → 546 (−67, ~11%). No behavior changes — every edit is annotation-only and verified with python -m py_compile + `import gget` smoke test + `pytest --collect-only` (400 tests, 0 collection errors). Resolves part of #216. Two passes: 1. var-annotated quick wins (−21 errors, → 0 remaining) - Added explicit type annotations to 13 empty container literals across utils.py, gget_ref.py, gget_info.py, gget_blat.py, gget_muscle.py, gget_virus.py. Inferred element type from surrounding code (list[str], dict[str, Any], etc.) — fell back to Any only when the type was genuinely dynamic. 2. typing.overload for the json= flag pattern (−~20 union-attr, plus ~26 other category errors that depended on the narrowed return type) - Added @typing.overload signatures for the 12 modules with `def f(..., json: bool = False, ...) -> DataFrame | dict`: gget_8cube, gget_archs4, gget_bgee, gget_blast, gget_blat, gget_cosmic, gget_diamond, gget_elm, gget_enrichr, gget_info, gget_opentargets, gget_search. - Now `f(...)` returns DataFrame and `f(..., json=True)` returns dict at the type-check level. Implementation signature unchanged. Why only 67 and not the predicted ~150: - Most remaining [union-attr] errors come from BeautifulSoup (`Tag | None` from `.find()`) and `str | None` checks, not the json= flag pattern. Those need per-callsite None-guards, which is the next batch. Remaining categories (sorted, top 6): [index] ~157 (pandas df["col"] indexing — needs cast() or # type: ignore) [union-attr] 115 (BeautifulSoup / str|None — needs None-guards) [attr-defined] 68 (dynamic JSON response shapes) [call-overload] 58 (pandas/numpy stubs) [assignment] ~56 [arg-type] ~53 * fix(bgee): restore Literal + overload imports lost in dev merge The merge of dev into feat/mypy-cleanup (925f66de) collided on gget_bgee.py's typing import line. Git auto-resolved by taking dev's version (`from typing import TYPE_CHECKING, Any` — added by the bgee user-agent PR #224) and silently dropped the `Literal, overload` additions from this branch, while keeping the @overload decorators at lines 183/192 that use them. Result: module-load NameError that broke test collection for every test file that imports gget. Restore the full import: TYPE_CHECKING, Any, Literal, overload. * ci: re-trigger pre-commit.ci * fix(pre-commit): exclude .github/badges/*.json from formatting The badge JSON is regenerated by ci.yml's "Generate tests badge JSON" step using json.dumps() with no `indent` parameter — single-line compact output. biome's default JSON formatter wants multi-line tab- indented output. So every CI run writes the compact form, and every pre-commit.ci run reformats it back, and we get a permanent biome-format failure that never resolves. Same fix as the tests/pytest_results.txt entry: just exclude the auto-generated file from formatting hooks. --- .pre-commit-config.yaml | 1 + gget/gget_8cube.py | 70 +++++++++++++++++++++++++++++++++++++--- gget/gget_archs4.py | 28 +++++++++++++++- gget/gget_bgee.py | 32 ++++++++++++++++-- gget/gget_blast.py | 35 +++++++++++++++++++- gget/gget_blat.py | 26 +++++++++++++-- gget/gget_cosmic.py | 51 +++++++++++++++++++++++++++-- gget/gget_diamond.py | 37 +++++++++++++++++++-- gget/gget_elm.py | 32 ++++++++++++++++-- gget/gget_enrichr.py | 42 +++++++++++++++++++++++- gget/gget_info.py | 35 ++++++++++++++++++-- gget/gget_muscle.py | 2 +- gget/gget_opentargets.py | 28 ++++++++++++++-- gget/gget_ref.py | 2 +- gget/gget_search.py | 36 +++++++++++++++++++-- gget/gget_virus.py | 30 ++++++++--------- gget/utils.py | 4 +-- 17 files changed, 449 insertions(+), 42 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ccff9d2d3..7513579ff 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -26,6 +26,7 @@ exclude: | | gget/constants/ | tests/fixtures/ | tests/pytest_results.*\.txt + | \.github/badges/.*\.json ) repos: - repo: https://github.com/biomejs/pre-commit diff --git a/gget/gget_8cube.py b/gget/gget_8cube.py index 16481e7cf..4e76c4dde 100644 --- a/gget/gget_8cube.py +++ b/gget/gget_8cube.py @@ -2,7 +2,7 @@ import io import json as json_package -from typing import Any +from typing import Any, Literal, overload import pandas as pd import requests @@ -54,12 +54,30 @@ def _normalize_gene_list(gene_list: list[str] | tuple[str, ...]) -> list[str]: # -------------------------------------------------------------------- # 1. SPECIFICITY # -------------------------------------------------------------------- +@overload +def specificity( + gene_list: list[str] | tuple[str, ...], + json: Literal[False] = False, + save: bool = False, + verbose: bool = True, +) -> pd.DataFrame: ... + + +@overload +def specificity( + gene_list: list[str] | tuple[str, ...], + json: Literal[True], + save: bool = False, + verbose: bool = True, +) -> list[dict[str, Any]]: ... + + def specificity( gene_list: list[str] | tuple[str, ...], json: bool = False, save: bool = False, verbose: bool = True, -) -> Any: +) -> pd.DataFrame | list[dict[str, Any]]: """Retrieve gene-level specificity statistics from the 8cubeDB. (https://eightcubedb.onrender.com/). @@ -126,6 +144,28 @@ def specificity( # -------------------------------------------------------------------- # 2. PSI BLOCK # -------------------------------------------------------------------- +@overload +def psi_block( + gene_list: list[str] | tuple[str, ...], + analysis_level: str, + analysis_type: str, + json: Literal[False] = False, + save: bool = False, + verbose: bool = True, +) -> pd.DataFrame: ... + + +@overload +def psi_block( + gene_list: list[str] | tuple[str, ...], + analysis_level: str, + analysis_type: str, + json: Literal[True], + save: bool = False, + verbose: bool = True, +) -> list[dict[str, Any]]: ... + + def psi_block( gene_list: list[str] | tuple[str, ...], analysis_level: str, @@ -133,7 +173,7 @@ def psi_block( json: bool = False, save: bool = False, verbose: bool = True, -) -> Any: +) -> pd.DataFrame | list[dict[str, Any]]: """Retrieve ψ_block (psi-block) specificity scores from the 8cubeDB. ψ_block quantifies the specificity of a gene to a particular block @@ -194,6 +234,28 @@ def psi_block( # -------------------------------------------------------------------- # 3. GENE EXPRESSION # -------------------------------------------------------------------- +@overload +def gene_expression( + gene_list: list[str] | tuple[str, ...], + analysis_level: str, + analysis_type: str, + json: Literal[False] = False, + save: bool = False, + verbose: bool = True, +) -> pd.DataFrame: ... + + +@overload +def gene_expression( + gene_list: list[str] | tuple[str, ...], + analysis_level: str, + analysis_type: str, + json: Literal[True], + save: bool = False, + verbose: bool = True, +) -> list[dict[str, Any]]: ... + + def gene_expression( gene_list: list[str] | tuple[str, ...], analysis_level: str, @@ -201,7 +263,7 @@ def gene_expression( json: bool = False, save: bool = False, verbose: bool = True, -) -> Any: +) -> pd.DataFrame | list[dict[str, Any]]: """Retrieve normalized gene expression values from 8cubeDB. This endpoint returns mean and variance of normalized expression for the diff --git a/gget/gget_archs4.py b/gget/gget_archs4.py index 36a46d4e0..e582dfaf5 100644 --- a/gget/gget_archs4.py +++ b/gget/gget_archs4.py @@ -2,7 +2,7 @@ import io import json as json_package -from typing import Any +from typing import Any, Literal, overload import pandas as pd import requests @@ -17,6 +17,32 @@ from .gget_info import info # noqa: E402 +@overload +def archs4( + gene: str, + ensembl: bool = False, + which: str = "correlation", + gene_count: int = 100, + species: str = "human", + json: Literal[True] = ..., + save: bool = False, + verbose: bool = True, +) -> list[dict[str, Any]] | None: ... + + +@overload +def archs4( + gene: str, + ensembl: bool = False, + which: str = "correlation", + gene_count: int = 100, + species: str = "human", + json: Literal[False] = False, + save: bool = False, + verbose: bool = True, +) -> pd.DataFrame | None: ... + + def archs4( gene: str, ensembl: bool = False, diff --git a/gget/gget_bgee.py b/gget/gget_bgee.py index 0fe5ac3ef..d35e629b5 100644 --- a/gget/gget_bgee.py +++ b/gget/gget_bgee.py @@ -2,7 +2,7 @@ import json as json_ from importlib.metadata import PackageNotFoundError, version -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING, Any, Literal, overload from .utils import dig, http_json, json_list_to_df, set_up_logger @@ -180,13 +180,41 @@ def _bgee_expression(gene_id: str | list[str], json: bool = False, verbose: bool return df +@overload +def bgee( + gene_id: str | list[str], + type: str, + json: Literal[True], + verbose: bool = ..., +) -> list[dict[str, Any]]: ... + + +@overload +def bgee( + gene_id: str | list[str], + type: str = ..., + *, + json: Literal[True], + verbose: bool = ..., +) -> list[dict[str, Any]]: ... + + +@overload +def bgee( + gene_id: str | list[str], + type: str = ..., + json: Literal[False] = False, + verbose: bool = ..., +) -> pd.DataFrame: ... + + # noinspection PyShadowingBuiltins def bgee( gene_id: str | list[str], type: str = "orthologs", json: bool = False, verbose: bool = True, -) -> pd.DataFrame | Any: +) -> pd.DataFrame | list[dict[str, Any]]: """Get orthologs/expression data for a gene from Bgee (https://www.bgee.org/). Args: diff --git a/gget/gget_blast.py b/gget/gget_blast.py index bb0f5b48c..c072820d3 100644 --- a/gget/gget_blast.py +++ b/gget/gget_blast.py @@ -3,7 +3,7 @@ import json as json_package import time from io import StringIO -from typing import Any +from typing import Any, Literal, overload from urllib.parse import urlencode # Using urllib instead of requests here because requests does not @@ -25,6 +25,39 @@ ) +@overload +def blast( + sequence: str, + program: str = "default", + database: str = "default", + limit: int = 50, + expect: float = 10.0, + low_comp_filt: bool = False, + megablast: bool = True, + verbose: bool = True, + wrap_text: bool = False, + *, + json: Literal[True], + save: bool = False, +) -> list[dict[str, Any]] | None: ... + + +@overload +def blast( + sequence: str, + program: str = "default", + database: str = "default", + limit: int = 50, + expect: float = 10.0, + low_comp_filt: bool = False, + megablast: bool = True, + verbose: bool = True, + wrap_text: bool = False, + json: Literal[False] = False, + save: bool = False, +) -> pd.DataFrame | None: ... + + def blast( sequence: str, program: str = "default", diff --git a/gget/gget_blat.py b/gget/gget_blat.py index d1f88509f..0939eb0a0 100644 --- a/gget/gget_blat.py +++ b/gget/gget_blat.py @@ -3,7 +3,7 @@ import json as json_package import time from json.decoder import JSONDecodeError -from typing import Any +from typing import Any, Literal, overload from urllib import request from urllib.error import HTTPError, URLError @@ -18,6 +18,28 @@ _BLAT_BACKOFF_BASE_SECONDS = 1.5 +@overload +def blat( + sequence: str, + seqtype: str = ..., + assembly: str = ..., + json: Literal[True] = ..., + save: bool = ..., + verbose: bool = ..., +) -> list[dict[str, Any]] | None: ... + + +@overload +def blat( + sequence: str, + seqtype: str = ..., + assembly: str = ..., + json: Literal[False] = ..., + save: bool = ..., + verbose: bool = ..., +) -> pd.DataFrame | None: ... + + def blat( sequence: str, seqtype: str = "default", @@ -133,7 +155,7 @@ def blat( ## Build data frame to resemble BLAT web search results # Define dataframe from dictionary - df_dict = {} + df_dict: dict[str, list[Any]] = {} for field in results["fields"]: df_dict.update({field: []}) diff --git a/gget/gget_cosmic.py b/gget/gget_cosmic.py index 020fdad58..594e9bf8e 100644 --- a/gget/gget_cosmic.py +++ b/gget/gget_cosmic.py @@ -9,7 +9,7 @@ import shutil import subprocess import tarfile -from typing import Any +from typing import Any, Literal, overload import pandas as pd @@ -315,6 +315,53 @@ def match_and_limit(mask, extract_fn): return results +@overload +def cosmic( + searchterm: str | None, + cosmic_tsv_path: str | None = None, + limit: int = 100, + *, + json: Literal[True], + download_cosmic: bool = False, + cosmic_project: str | None = None, + cosmic_version: int | None = None, + grch_version: int = 37, + email: str | None = None, + password: str | None = None, + gget_mutate: bool = False, + keep_genome_info: bool = False, + remove_duplicates: bool = False, + seq_id_column: str = "seq_ID", + mutation_column: str = "mutation", + mut_id_column: str = "mutation_id", + out: str | None = None, + verbose: bool = True, +) -> list[dict[str, Any]] | None: ... + + +@overload +def cosmic( + searchterm: str | None, + cosmic_tsv_path: str | None = None, + limit: int = 100, + json: Literal[False] = False, + download_cosmic: bool = False, + cosmic_project: str | None = None, + cosmic_version: int | None = None, + grch_version: int = 37, + email: str | None = None, + password: str | None = None, + gget_mutate: bool = False, + keep_genome_info: bool = False, + remove_duplicates: bool = False, + seq_id_column: str = "seq_ID", + mutation_column: str = "mutation", + mut_id_column: str = "mutation_id", + out: str | None = None, + verbose: bool = True, +) -> pd.DataFrame | None: ... + + def cosmic( searchterm: str | None, cosmic_tsv_path: str | None = None, @@ -334,7 +381,7 @@ def cosmic( mut_id_column: str = "mutation_id", out: str | None = None, verbose: bool = True, -) -> Any: +) -> pd.DataFrame | list[dict[str, Any]] | None: """Search for genes, mutations, etc associated with cancers using the COSMIC database. (Catalogue Of Somatic Mutations In Cancer) database diff --git a/gget/gget_diamond.py b/gget/gget_diamond.py index f68bef39f..455b2bf7d 100644 --- a/gget/gget_diamond.py +++ b/gget/gget_diamond.py @@ -6,7 +6,9 @@ import subprocess import sys import uuid -from typing import Any +from typing import Any, Literal, overload + +import pandas as pd from .compile import PACKAGE_PATH from .utils import ( @@ -26,6 +28,37 @@ PRECOMPILED_DIAMOND_PATH = os.path.join(PACKAGE_PATH, f"bins/{platform.system()}/diamond") +@overload +def diamond( + query: str | list[str], + reference: str | list[str], + translated: bool = ..., + diamond_db: str | None = ..., + sensitivity: str = ..., + threads: int = ..., + diamond_binary: str | None = ..., + verbose: bool = ..., + *, + json: Literal[True], + out: str | None = ..., +) -> list[dict[str, Any]]: ... + + +@overload +def diamond( + query: str | list[str], + reference: str | list[str], + translated: bool = ..., + diamond_db: str | None = ..., + sensitivity: str = ..., + threads: int = ..., + diamond_binary: str | None = ..., + verbose: bool = ..., + json: Literal[False] = False, + out: str | None = ..., +) -> pd.DataFrame: ... + + def diamond( query: str | list[str], reference: str | list[str], @@ -37,7 +70,7 @@ def diamond( verbose: bool = True, json: bool = False, out: str | None = None, -) -> Any: +) -> pd.DataFrame | list[dict[str, Any]]: """Align multiple protein or translated DNA sequences using DIAMOND (https://www.nature.com/articles/nmeth.3176). Args: diff --git a/gget/gget_elm.py b/gget/gget_elm.py index f53e6f59e..f45680ae9 100644 --- a/gget/gget_elm.py +++ b/gget/gget_elm.py @@ -3,7 +3,7 @@ import json as json_package import os import re -from typing import Any +from typing import Any, Literal, overload import numpy as np import pandas as pd @@ -223,6 +223,34 @@ def regex_match(sequence: str) -> pd.DataFrame: return df_final +@overload +def elm( + sequence: str, + uniprot: bool = ..., + sensitivity: str = ..., + threads: int = ..., + diamond_binary: str | None = ..., + expand: bool = ..., + verbose: bool = ..., + json: Literal[True] = ..., + out: str | None = ..., +) -> tuple[list[dict[str, Any]], list[dict[str, Any]]]: ... + + +@overload +def elm( + sequence: str, + uniprot: bool = ..., + sensitivity: str = ..., + threads: int = ..., + diamond_binary: str | None = ..., + expand: bool = ..., + verbose: bool = ..., + json: Literal[False] = ..., + out: str | None = ..., +) -> tuple[pd.DataFrame, pd.DataFrame]: ... + + def elm( sequence: str, uniprot: bool = False, @@ -233,7 +261,7 @@ def elm( verbose: bool = True, json: bool = False, out: str | None = None, -) -> tuple[Any, Any]: +) -> tuple[pd.DataFrame, pd.DataFrame] | tuple[list[dict[str, Any]], list[dict[str, Any]]]: """Locally predicts Eukaryotic Linear Motifs from an amino acid sequence or UniProt Acc using data from the ELM database (http://elm.eu.org/). diff --git a/gget/gget_enrichr.py b/gget/gget_enrichr.py index 769316d6c..deb2c75b7 100644 --- a/gget/gget_enrichr.py +++ b/gget/gget_enrichr.py @@ -2,7 +2,7 @@ import json as json_package import textwrap -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING, Any, Literal, overload # Plotting packages import matplotlib.pyplot as plt @@ -64,6 +64,46 @@ def clean_genes_list(genes_list: list[Any]) -> list[Any]: return genes_clean +@overload +def enrichr( + genes: str | list[str], + database: str, + species: str = "human", + background_list: list[str] | None = None, + background: bool = False, + ensembl: bool = False, + ensembl_bkg: bool = False, + plot: bool = False, + figsize: tuple[float, float] = (10, 10), + ax: Axes | None = None, + kegg_out: str | None = None, + kegg_rank: int = 1, + json: Literal[True] = ..., + save: bool = False, + verbose: bool = True, +) -> list[dict[str, Any]] | None: ... + + +@overload +def enrichr( + genes: str | list[str], + database: str, + species: str = "human", + background_list: list[str] | None = None, + background: bool = False, + ensembl: bool = False, + ensembl_bkg: bool = False, + plot: bool = False, + figsize: tuple[float, float] = (10, 10), + ax: Axes | None = None, + kegg_out: str | None = None, + kegg_rank: int = 1, + json: Literal[False] = False, + save: bool = False, + verbose: bool = True, +) -> pd.DataFrame | None: ... + + def enrichr( genes: str | list[str], database: str, diff --git a/gget/gget_info.py b/gget/gget_info.py index c38bd794f..a4005f612 100644 --- a/gget/gget_info.py +++ b/gget/gget_info.py @@ -1,7 +1,7 @@ from __future__ import annotations import json as json_package -from typing import Any +from typing import Any, Literal, overload import numpy as np import pandas as pd @@ -29,6 +29,37 @@ ## gget info +@overload +def info( + ens_ids: str | list[str], + wrap_text: bool = ..., + ncbi: bool = ..., + uniprot: bool = ..., + pdb: bool = ..., + *, + json: Literal[True], + verbose: bool = ..., + save: bool = ..., + expand: bool = ..., + ensembl_only: bool = ..., +) -> dict[str, Any] | None: ... + + +@overload +def info( + ens_ids: str | list[str], + wrap_text: bool = ..., + ncbi: bool = ..., + uniprot: bool = ..., + pdb: bool = ..., + json: Literal[False] = ..., + verbose: bool = ..., + save: bool = ..., + expand: bool = ..., + ensembl_only: bool = ..., +) -> pd.DataFrame | None: ... + + def info( ens_ids: str | list[str], wrap_text: bool = False, @@ -393,7 +424,7 @@ def info( ens_ids = [] # Dictionary to save clean info - data = { + data: dict[str, list[Any]] = { "all_transcripts": [], "transcript_biotypes": [], "transcript_names": [], diff --git a/gget/gget_muscle.py b/gget/gget_muscle.py index 69d0dcd82..a5053954d 100644 --- a/gget/gget_muscle.py +++ b/gget/gget_muscle.py @@ -122,7 +122,7 @@ def muscle(fasta: str | list[str], super5: bool = False, out: str | None = None, # Get the titles and sequences from the generated .afa file titles = [] seqs_master = [] - seqs = [] + seqs: list[str] = [] with open(abs_out_path) as aln_file: for i, line in enumerate(aln_file): # Recognize title lines by the '>' character diff --git a/gget/gget_opentargets.py b/gget/gget_opentargets.py index edd90bc3f..8037fb342 100644 --- a/gget/gget_opentargets.py +++ b/gget/gget_opentargets.py @@ -2,7 +2,7 @@ import json as json_ import textwrap -from typing import Any +from typing import Any, Literal, overload import pandas as pd @@ -255,6 +255,30 @@ def _unhash(x: Any) -> Any: return x +@overload +def opentargets( + ensembl_id: str, + resource: str = "diseases", + limit: int | None = None, + verbose: bool = True, + wrap_text: bool = False, + filters: dict[str, Any] | None = None, + json: Literal[False] = False, +) -> pd.DataFrame: ... + + +@overload +def opentargets( + ensembl_id: str, + resource: str = "diseases", + limit: int | None = None, + verbose: bool = True, + wrap_text: bool = False, + filters: dict[str, Any] | None = None, + json: Literal[True] = ..., +) -> list[dict[str, Any]]: ... + + def opentargets( ensembl_id: str, resource: str = "diseases", @@ -263,7 +287,7 @@ def opentargets( wrap_text: bool = False, filters: dict[str, Any] | None = None, json: bool = False, -) -> Any: +) -> pd.DataFrame | list[dict[str, Any]]: """Query OpenTargets for data associated with a given Ensembl gene ID. Args: diff --git a/gget/gget_ref.py b/gget/gget_ref.py index f81b7fc4a..b16391c41 100644 --- a/gget/gget_ref.py +++ b/gget/gget_ref.py @@ -359,7 +359,7 @@ def ref( ## Return results # If FTP=False, return dictionary/json of specified results if ftp is False: - ref_dict = {species: {}} + ref_dict: dict[str, dict[str, Any]] = {species: {}} for return_val in which: if return_val == "all": ref_dict = { diff --git a/gget/gget_search.py b/gget/gget_search.py index a5ed75529..e8df84c85 100644 --- a/gget/gget_search.py +++ b/gget/gget_search.py @@ -3,7 +3,7 @@ import json as json_package import time import warnings -from typing import Any +from typing import Any, Literal, overload import mysql.connector as sql import numpy as np @@ -37,6 +37,38 @@ def clean_cols(x: Any) -> Any: return x +@overload +def search( + searchwords: str | list[str], + species: str, + release: int | None = None, + id_type: str = "gene", + seqtype: str | None = None, + andor: str = "or", + limit: int | None = None, + wrap_text: bool = False, + json: Literal[True] = ..., + save: bool = False, + verbose: bool = True, +) -> list[dict[str, Any]] | None: ... + + +@overload +def search( + searchwords: str | list[str], + species: str, + release: int | None = None, + id_type: str = "gene", + seqtype: str | None = None, + andor: str = "or", + limit: int | None = None, + wrap_text: bool = False, + json: Literal[False] = False, + save: bool = False, + verbose: bool = True, +) -> pd.DataFrame | None: ... + + def search( searchwords: str | list[str], species: str, @@ -49,7 +81,7 @@ def search( json: bool = False, save: bool = False, verbose: bool = True, -) -> Any: +) -> pd.DataFrame | list[dict[str, Any]] | None: """Function to query Ensembl for genes based on species and free form search terms. Automatically fetches results from latest Ensembl release, unless user specifies database (see 'species' argument) diff --git a/gget/gget_virus.py b/gget/gget_virus.py index 8a04dfdec..7742e6a91 100644 --- a/gget/gget_virus.py +++ b/gget/gget_virus.py @@ -1453,7 +1453,7 @@ def fetch_virus_metadata( # e.g., "NC_045512.2%2CMN908947.3%2CMT020781.1" url = f"{NCBI_API_BASE}/virus/accession/{virus}/dataset_report" logger.debug("Using accession endpoint for virus: %s", virus) - params = {} + params: dict[str, Any] = {} else: # For taxon names/IDs (e.g., 'Zika Virus', 'influenza'), use the taxon endpoint url = f"{NCBI_API_BASE}/virus/taxon/{virus}/dataset_report" @@ -4381,7 +4381,7 @@ def _load_metadata_dict_from_temp_jsonl(temp_file_path: str) -> dict[str, Any]: Same format as load_metadata_from_api_reports(). """ - metadata_dict = {} + metadata_dict: dict[str, Any] = {} processed_count = 0 skipped_count = 0 @@ -4471,7 +4471,7 @@ def _load_cached_metadata_from_jsonl(jsonl_path: str) -> dict[str, Any]: dict: Dictionary mapping accession numbers to metadata dictionaries. """ - metadata_dict = {} + metadata_dict: dict[str, Any] = {} processed_count = 0 if not jsonl_path or not os.path.exists(jsonl_path): @@ -4565,7 +4565,7 @@ def _stream_filter_cached_metadata_from_jsonl( if "min_release_date" in filters_active: min_release_date_parsed = _parse_date(min_release_date, filtername="min_release_date") - metadata_dict = {} + metadata_dict: dict[str, Any] = {} total_records = 0 filter_stats = { "host": 0, @@ -4967,7 +4967,7 @@ def filter_sequences( # Initialize lists to store filtered results (metadata is small, kept in memory) filtered_metadata = [] # Will store corresponding metadata dictionaries - protein_headers = [] # Will store protein/segment information from FASTA headers + protein_headers: list[Any] = [] # Will store protein/segment information from FASTA headers filtered_count = 0 # Count of sequences passing all filters # Counters for logging filter statistics @@ -5264,7 +5264,7 @@ def save_command_summary( f.write(f"Average sequence length: {sum(lengths) / len(lengths):.0f} bp\n\n") # Completeness breakdown - completeness_counts = {} + completeness_counts: dict[str, int] = {} for meta in filtered_metadata: comp = meta.get("completeness", "unknown") completeness_counts[comp] = completeness_counts.get(comp, 0) + 1 @@ -5274,7 +5274,7 @@ def save_command_summary( f.write("\n") # Source database breakdown - source_counts = {} + source_counts: dict[str, int] = {} for meta in filtered_metadata: source = meta.get("sourceDatabase", "unknown") source_counts[source] = source_counts.get(source, 0) + 1 @@ -6181,7 +6181,7 @@ def fetch_genbank_metadata( _log_memory_usage("GenBank fetch start") # Initialize tracking variables - all_metadata = {} # Only used for final return; populated from temp JSONL at end + all_metadata: dict[str, Any] = {} # Only used for final return; populated from temp JSONL at end failed_batches = [] total_metadata_written = 0 # Counter for metadata records streamed to disk @@ -7053,7 +7053,7 @@ def _parse_genbank_xml(xml_content: str) -> dict[str, Any]: logger.debug("Processing GenBank record: %s", accession) # Initialize metadata dictionary for this record - metadata = { + metadata: dict[str, Any] = { "accession": accession, "genbank_data": {}, # Store GenBank-specific fields } @@ -8741,14 +8741,14 @@ def virus( refseq_only = False # Initialize filter stats for each stage (populated by filter functions) - metadata_filter_stats = {} - genbank_filter_stats = {} - sequence_filter_stats = {} + metadata_filter_stats: dict[str, int] = {} + genbank_filter_stats: dict[str, int] = {} + sequence_filter_stats: dict[str, int] = {} total_after_genbank_filter = None total_after_sequence_filter = None # Initialize failed commands tracker for tracking all types of failures - failed_commands = { + failed_commands: dict[str, Any] = { "api_timeout": None, "empty_response": None, "sequence_batches": [], @@ -9768,7 +9768,7 @@ def virus( logger.warning("No sequences will pass the GenBank-based filters.") filtered_accessions = [] filtered_metadata = [] - genbank_data_prefetch = {} + genbank_data_prefetch: dict[str, Any] = {} save_command_summary( outfolder=outfolder, @@ -9985,7 +9985,7 @@ def virus( # For large datasets (millions of sequences), this avoids OOM errors total_final_sequences = _stream_copy_fasta(fna_file, output_fasta_file) filtered_metadata_final = filtered_metadata # No change to metadata - protein_headers = [] + protein_headers: list[Any] = [] logger.info("All %d downloaded sequences were streamed to output", total_final_sequences) _log_memory_usage("after streaming sequences to output") else: diff --git a/gget/utils.py b/gget/utils.py index 2d86a564c..dfa4a2011 100644 --- a/gget/utils.py +++ b/gget/utils.py @@ -1138,7 +1138,7 @@ def json_list_to_df(json_list: list[Any], columns: list[tuple[str, str]]) -> pd. Returns data frame with columns as specified in keys. """ - tmp_columns = [[] for _ in range(len(columns))] + tmp_columns: list[list[Any]] = [[] for _ in range(len(columns))] for json_obj in json_list: for i, column_key in enumerate(columns): @@ -1186,7 +1186,7 @@ def parse(filename: str, format: str | None = None) -> Iterator[FastaRecord]: with open(filename, encoding="utf-8") as handle: current_id = None current_description = "" - current_seq = [] + current_seq: list[str] = [] for line in handle: line = line.strip() From 5cf607f9eb3575799f92d63883f1b6619e1e7358 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 22 Jun 2026 21:26:29 +0000 Subject: [PATCH 09/34] CI: update pytest results (dev) --- .github/badges/tests.json | 2 +- tests/pytest_results.txt | 1585 ++++++++++++++++++++++++++----------- 2 files changed, 1132 insertions(+), 455 deletions(-) diff --git a/.github/badges/tests.json b/.github/badges/tests.json index a7cade404..a73d23f37 100644 --- a/.github/badges/tests.json +++ b/.github/badges/tests.json @@ -1 +1 @@ -{"schemaVersion": 1, "label": "tests", "message": "399/402 passing", "color": "brightgreen"} +{"schemaVersion": 1, "label": "tests", "message": "393/402 passing", "color": "yellow"} diff --git a/tests/pytest_results.txt b/tests/pytest_results.txt index cdb03b9f5..eb6f84af5 100644 --- a/tests/pytest_results.txt +++ b/tests/pytest_results.txt @@ -1,465 +1,987 @@ -Pytest results (Python 3.14) - 2026-06-22T18:25:39Z +Pytest results (Python 3.14) - 2026-06-22T21:02:57Z ============================= test session starts ============================== platform linux -- Python 3.14.6, pytest-9.1.1, pluggy-1.6.0 -- /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/bin/python3 cachedir: .pytest_cache -Using --randomly-seed=1119495841 +Using --randomly-seed=680721631 rootdir: /home/runner/work/gget/gget configfile: pyproject.toml testpaths: tests plugins: randomly-3.16.0, rerunfailures-14.0, mock-3.15.1, cov-7.1.0, xdist-3.8.0 collecting ... collected 402 items -tests/test_cosmic.py::TestCosmicWorkflow::test_cosmic_defaults PASSED [ 0%] -tests/test_blat.py::TestBlat::test_blat_nt_transDNA PASSED [ 0%] -tests/test_blat.py::TestBlat::test_blat_nt PASSED [ 0%] -tests/test_blat.py::TestBlat::test_blat_bad_txt PASSED [ 0%] -tests/test_blat.py::TestBlat::test_blat_shortseq PASSED [ 1%] -tests/test_blat.py::TestBlat::test_blat_nt_DNA PASSED [ 1%] -tests/test_blat.py::TestBlat::test_blat_aa_RNA PASSED [ 1%] -tests/test_blat.py::TestBlat::test_blat_nt_RNA PASSED [ 1%] -tests/test_blat.py::TestBlat::test_blat_nt_json PASSED [ 2%] -tests/test_blat.py::TestBlat::test_blat_bad_seqtype PASSED [ 2%] -tests/test_blat.py::TestBlat::test_blat_nt_fasta PASSED [ 2%] -tests/test_blat.py::TestBlat::test_blat_nt_txt PASSED [ 2%] -tests/test_blat.py::TestBlat::test_blat_aa PASSED [ 3%] -tests/test_blat.py::TestBlat::test_blat_nt_protein PASSED [ 3%] -tests/test_blat.py::TestBlat::test_blat_bad_fileformat PASSED [ 3%] -tests/test_blat.py::TestBlat::test_blat_bad_assembly PASSED [ 3%] -tests/test_blat.py::TestBlat::test_blat_bad_fasta PASSED [ 4%] -tests/test_blat.py::TestBlat::test_blat_aa_protein PASSED [ 4%] -tests/test_cellxgene.py::TestCellxgeneValidation::test_supported_species_includes_new_primates PASSED [ 4%] -tests/test_cellxgene.py::TestCellxgeneValidation::test_invalid_species_raises_valueerror PASSED [ 4%] -tests/test_cellxgene.py::TestCellxgeneValidation::test_typo_species_raises_valueerror PASSED [ 5%] -tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata SKIPPED [ 5%] -tests/test_cellxgene.py::TestCellxgene::test_cellxgene_adata SKIPPED [ 5%] -tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata_macaca_mulatta SKIPPED [ 5%] -tests/test_8cube.py::TestSpecificity::test_specificity_basic PASSED [ 6%] -tests/test_8cube.py::TestPsiBlock::test_psi_block_basic PASSED [ 6%] -tests/test_8cube.py::TestGeneExpression::test_gene_expression_basic PASSED [ 6%] -tests/test_utils.py::TestUtils::test_get_uniprot_seqs PASSED [ 6%] -tests/test_utils.py::TestUtils::test_n_colors PASSED [ 7%] -tests/test_utils.py::TestUtils::test_find_latest_ens_rel PASSED [ 7%] -tests/test_utils.py::TestUtils::test_get_uniprot_info_gene PASSED [ 7%] -tests/test_utils.py::TestUtils::test_get_uniprot_info_transcript PASSED [ 7%] -tests/test_utils.py::TestUtils::test_search_iv_species_options PASSED [ 8%] -tests/test_utils.py::TestUtils::test_search_species_options PASSED [ 8%] -tests/test_utils.py::TestUtils::test_aa_colors PASSED [ 8%] -tests/test_utils.py::TestUtils::test_rest_query PASSED [ 8%] -tests/test_utils.py::TestUtils::test_read_fasta PASSED [ 9%] -tests/test_utils.py::TestUtils::test_ref_iv_species_options PASSED [ 9%] -tests/test_utils.py::TestUtils::test_rest_query_bad_type PASSED [ 9%] -tests/test_utils.py::TestUtils::test_ref_species_options PASSED [ 9%] -tests/test_utils.py::TestUtils::test_search_species_options_bad_type PASSED [ 10%] -tests/test_utils.py::TestUtils::test_ref_species_options_bad_type PASSED [ 10%] -tests/test_gpt.py::TestGpt::test_gpt PASSED [ 10%] -tests/test_archs4.py::TestArchs4::test_archs4_defaults PASSED [ 10%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_ensembl PASSED [ 11%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue PASSED [ 11%] -tests/test_archs4.py::TestArchs4::test_archs4_mouse_json_ensembl PASSED [ 11%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_species PASSED [ 11%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue_ensembl PASSED [ 12%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_gene PASSED [ 12%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue_mouse PASSED [ 12%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue_json PASSED [ 12%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_which PASSED [ 13%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_gene_tissue PASSED [ 13%] -tests/test_virus.py::TestVirus::test_deduplicate_metadata_against_baseline PASSED [ 13%] -tests/test_virus.py::TestVirus::test_parse_accession_input_empty_file_raises_error PASSED [ 13%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_protein_count PASSED [ 14%] -tests/test_virus.py::TestVirus::test_deduplicate_all_existing PASSED [ 14%] -tests/test_virus.py::TestVirus::test_write_fasta_record_long_sequence_wraps PASSED [ 14%] -tests/test_virus.py::TestVirus::test_parse_accession_input_single PASSED [ 14%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_isolate PASSED [ 15%] -tests/test_virus.py::TestVirus::test_virus_host_filter_verification PASSED [ 15%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_jsonl PASSED [ 15%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_remove_parentheses PASSED [ 15%] -tests/test_virus.py::TestVirus::test_merge_baseline_with_new_deduplicates PASSED [ 16%] -tests/test_virus.py::TestVirus::test_get_gget_version_returns_string PASSED [ 16%] -tests/test_virus.py::TestVirus::test_parse_genbank_xml_basic PASSED [ 16%] -tests/test_virus.py::TestVirus::test_virus_relationship_check_counts_match PASSED [ 16%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_gene_count PASSED [ 17%] -tests/test_virus.py::TestVirus::test_virus_invalid_keep_temp_type PASSED [ 17%] -tests/test_virus.py::TestVirus::test_virus_with_collection_date_filters PASSED [ 17%] -tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_negative PASSED [ 17%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_collection_date_range PASSED [ 18%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_min_comparison PASSED [ 18%] -tests/test_virus.py::TestVirus::test_stream_copy_fasta_all_records PASSED [ 18%] -tests/test_virus.py::TestVirus::test_merge_metadata_csvs_no_overwrite PASSED [ 18%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype PASSED [ 19%] -tests/test_virus.py::TestVirus::test_parse_partial_date_full_date PASSED [ 19%] -tests/test_virus.py::TestVirus::test_validate_datasets_binary_valid PASSED [ 19%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_segment PASSED [ 19%] -tests/test_virus.py::TestVirus::test_check_min_max_valid PASSED [ 20%] -tests/test_virus.py::TestVirus::test_filter_cached_host_in_strategy_skipped PASSED [ 20%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_virus_suffix PASSED [ 20%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_mature_peptide_count PASSED [ 20%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_invalid_attempt_returns_none PASSED [ 21%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_metadata_type PASSED [ 21%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_source_database PASSED [ 21%] -tests/test_virus.py::TestVirus::test_get_datasets_path_uses_bundled_binary PASSED [ 21%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_seq_length PASSED [ 22%] -tests/test_virus.py::TestVirus::test_virus_with_geographic_location_filter PASSED [ 22%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_false PASSED [ 22%] -tests/test_virus.py::TestVirus::test_virus_with_multiple_filters PASSED [ 22%] -tests/test_virus.py::TestVirus::test_check_min_max_none_values PASSED [ 23%] -tests/test_virus.py::TestVirus::test_save_command_summary_creates_file PASSED [ 23%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_min PASSED [ 23%] -tests/test_virus.py::TestVirus::test_stream_copy_fasta_with_accession_filter PASSED [ 23%] -tests/test_virus.py::TestVirus::test_virus_release_date_filter_verification PASSED [ 24%] -tests/test_virus.py::TestVirus::test_merge_baseline_with_new_csv PASSED [ 24%] -tests/test_virus.py::TestVirus::test_parse_date_various_formats PASSED [ 24%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_gen_mol_type PASSED [ 24%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_false PASSED [ 25%] -tests/test_virus.py::TestVirus::test_force_garbage_collection_runs PASSED [ 25%] -tests/test_virus.py::TestVirus::test_virus_multi_accession_file_input PASSED [ 25%] -tests/test_virus.py::TestVirus::test_validate_datasets_binary_nonexistent PASSED [ 25%] -tests/test_virus.py::TestVirus::test_get_datasets_version_returns_string_or_none PASSED [ 26%] -tests/test_virus.py::TestVirus::test_filter_cached_host_not_in_strategy PASSED [ 26%] -tests/test_virus.py::TestVirus::test_parse_partial_date_empty_raises PASSED [ 26%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_negative PASSED [ 26%] +tests/test_gpt.py::TestGpt::test_gpt PASSED [ 0%] +tests/test_elm.py::TestELM::test_elm_uniprot_aminoacidseq PASSED [ 0%] +tests/test_elm.py::TestELM::test_elm_uniprot_id_in_elm PASSED [ 0%] +tests/test_elm.py::TestELM::test_elm_uniprot_id_new PASSED [ 0%] +tests/test_8cube.py::TestGeneExpression::test_gene_expression_basic PASSED [ 1%] +tests/test_8cube.py::TestSpecificity::test_specificity_basic PASSED [ 1%] +tests/test_8cube.py::TestPsiBlock::test_psi_block_basic PASSED [ 1%] +tests/test_cbio.py::TestCbio::test_cbio_download_partially_existing_files PASSED [ 1%] +tests/test_cbio.py::TestCbio::test_error_cbio_download PASSED [ 2%] +tests/test_cbio.py::TestCbio::test_cbio_download PASSED [ 2%] +tests/test_cbio.py::TestCbioSearch::test_cbio_search PASSED [ 2%] +tests/test_mutate.py::TestMutate::test_ambiguous_mutation PASSED [ 2%] +tests/test_mutate.py::TestMutate::test_posttranslational_mutation PASSED [ 3%] +tests/test_mutate.py::TestMutate::test_multi_deletion PASSED [ 3%] +tests/test_mutate.py::TestMutate::test_multi_dup PASSED [ 3%] +tests/test_mutate.py::TestMutate::test_list_of_mutations PASSED [ 3%] +tests/test_mutate.py::TestMutate::test_multi_insertion PASSED [ 4%] +tests/test_mutate.py::TestMutate::test_single_deletion_with_right_repeats PASSED [ 4%] +tests/test_mutate.py::TestMutate::test_multi_delins PASSED [ 4%] +tests/test_mutate.py::TestMutate::test_single_substitution_near_left_end PASSED [ 4%] +tests/test_mutate.py::TestMutate::test_large_k PASSED [ 5%] +tests/test_mutate.py::TestMutate::test_single_insertion PASSED [ 5%] +tests/test_mutate.py::TestMutate::test_multi_insertion_with_left_repeats PASSED [ 5%] +tests/test_mutate.py::TestMutate::test_inversion_with_overlaps PASSED [ 5%] +tests/test_mutate.py::TestMutate::test_intron_mutation_minus PASSED [ 6%] +tests/test_mutate.py::TestMutate::test_single_delins PASSED [ 6%] +tests/test_mutate.py::TestMutate::test_single_substitution_near_right_end PASSED [ 6%] +tests/test_mutate.py::TestMutate::test_multi_delins_with_true_right_repeats PASSED [ 6%] +tests/test_mutate.py::TestMutate::test_intron_mutation_plus PASSED [ 7%] +tests/test_mutate.py::TestMutate::test_multi_delins_with_true_left_repeats PASSED [ 7%] +tests/test_mutate.py::TestMutate::test_single_dup PASSED [ 7%] +tests/test_mutate.py::TestMutate::test_multi_delins_with_psuedo_left_repeats PASSED [ 7%] +tests/test_mutate.py::TestMutate::test_single_deletion PASSED [ 8%] +tests/test_mutate.py::TestMutate::test_single_substitution PASSED [ 8%] +tests/test_mutate.py::TestMutate::test_index_error PASSED [ 8%] +tests/test_mutate.py::TestMutate::test_multi_deletion_with_right_repeats PASSED [ 8%] +tests/test_mutate.py::TestMutate::test_single_deletion_with_left_repeats PASSED [ 9%] +tests/test_mutate.py::TestMutate::test_uncertain_mutation PASSED [ 9%] +tests/test_mutate.py::test_csv_of_mutations PASSED [ 9%] +tests/test_mutate.py::test_mismatch_error PASSED [ 9%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap_filter PASSED [ 10%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_drugs_invalid_filter PASSED [ 10%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_no_limit PASSED [ 10%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_diseases PASSED [ 10%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_diseases_filter PASSED [ 11%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_simple_filter PASSED [ 11%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_expression PASSED [ 11%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_tractability PASSED [ 11%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions PASSED [ 12%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_pharmacogenetics PASSED [ 12%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_limit PASSED [ 12%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_nonexistent_id PASSED [ 12%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_expression_no_limit PASSED [ 13%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap PASSED [ 13%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_drugs PASSED [ 13%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_resource PASSED [ 13%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets PASSED [ 14%] +tests/test_blat.py::TestBlat::test_blat_aa_protein PASSED [ 14%] +tests/test_blat.py::TestBlat::test_blat_nt_DNA PASSED [ 14%] +tests/test_blat.py::TestBlat::test_blat_aa PASSED [ 14%] +tests/test_blat.py::TestBlat::test_blat_aa_RNA PASSED [ 15%] +tests/test_blat.py::TestBlat::test_blat_nt_transDNA PASSED [ 15%] +tests/test_blat.py::TestBlat::test_blat_bad_txt PASSED [ 15%] +tests/test_blat.py::TestBlat::test_blat_nt_RNA PASSED [ 15%] +tests/test_blat.py::TestBlat::test_blat_bad_fileformat PASSED [ 16%] +tests/test_blat.py::TestBlat::test_blat_bad_seqtype PASSED [ 16%] +tests/test_blat.py::TestBlat::test_blat_shortseq PASSED [ 16%] +tests/test_blat.py::TestBlat::test_blat_nt_protein PASSED [ 16%] +tests/test_blat.py::TestBlat::test_blat_nt PASSED [ 17%] +tests/test_blat.py::TestBlat::test_blat_nt_fasta PASSED [ 17%] +tests/test_blat.py::TestBlat::test_blat_bad_fasta PASSED [ 17%] +tests/test_blat.py::TestBlat::test_blat_nt_txt PASSED [ 17%] +tests/test_blat.py::TestBlat::test_blat_nt_json PASSED [ 18%] +tests/test_blat.py::TestBlat::test_blat_bad_assembly PASSED [ 18%] +tests/test_cosmic.py::TestCosmicWorkflow::test_cosmic_defaults PASSED [ 18%] +tests/test_info.py::TestInfo::test_info_WB_transcript PASSED [ 18%] +tests/test_info.py::TestInfo::test_info_ncbifalse_uniprotfalse PASSED [ 19%] +tests/test_info.py::TestInfo::test_info_exon PASSED [ 19%] +tests/test_info.py::TestInfo::test_info_gene_list_non_model PASSED [ 19%] +tests/test_info.py::TestInfo::test_info_transcript PASSED [ 19%] +tests/test_info.py::TestInfo::test_info_gene FAILED [ 20%] +tests/test_info.py::TestInfo::test_info_ncbitrue_uniprotfalse PASSED [ 20%] +tests/test_info.py::TestInfo::test_info_ncbifalse_uniprottrue PASSED [ 20%] +tests/test_info.py::TestInfo::test_info_mix PASSED [ 20%] +tests/test_search.py::TestSearch::test_search_gene_bad_species PASSED [ 21%] +tests/test_search.py::TestSearch::test_search_transcript_one_sw PASSED [ 21%] +tests/test_search.py::TestSearch::test_search_plant PASSED [ 21%] +tests/test_search.py::TestSearch::test_search_gene_one_sw PASSED [ 21%] +tests/test_search.py::TestSearch::test_search_db PASSED [ 22%] +tests/test_search.py::TestSearch::test_search_release PASSED [ 22%] +tests/test_search.py::TestSearch::test_search_transcript_bad_andor PASSED [ 22%] +tests/test_search.py::TestSearch::test_search_gene_one_sw_limit PASSED [ 22%] +tests/test_search.py::TestSearch::test_search_plant_db PASSED [ 23%] +tests/test_search.py::TestSearch::test_search_gene_two_sw_limit PASSED [ 23%] +tests/test_search.py::TestSearch::test_search_gene_two_sw_and PASSED [ 23%] +tests/test_search.py::TestSearch::test_search_transcript_two_sw_and PASSED [ 23%] +tests/test_search.py::TestSearch::test_search_gene_two_sw_or PASSED [ 24%] +tests/test_search.py::TestSearch::test_search_gene_one_sw_json PASSED [ 24%] +tests/test_search.py::TestSearch::test_search_octopus PASSED [ 24%] +tests/test_search.py::TestSearch::test_search_transcript_bad_species PASSED [ 24%] +tests/test_search.py::TestSearch::test_search_transcript_two_sw_or PASSED [ 25%] +tests/test_search.py::TestSearch::test_search_gene_bad_andor PASSED [ 25%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_max PASSED [ 25%] +tests/test_virus.py::TestVirus::test_parse_accession_input_nonexistent_file_raises_error PASSED [ 25%] +tests/test_virus.py::TestVirus::test_save_partial_metadata_empty PASSED [ 26%] +tests/test_virus.py::TestVirus::test_merge_metadata_csvs_missing_standard_file PASSED [ 26%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_geographic_location PASSED [ 26%] +tests/test_virus.py::TestVirus::test_validate_datasets_binary_nonexistent PASSED [ 26%] +tests/test_virus.py::TestVirus::test_check_min_max_invalid_raises PASSED [ 27%] tests/test_virus.py::TestVirus::test_filter_metadata_only_nuc_completeness_partial PASSED [ 27%] -tests/test_virus.py::TestVirus::test_unzip_file_valid PASSED [ 27%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_max_release_date PASSED [ 27%] -tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_common_names PASSED [ 27%] -tests/test_virus.py::TestVirus::test_virus_specific_accession_file_creation PASSED [ 28%] -tests/test_virus.py::TestVirus::test_merge_metadata_csvs_missing_standard_file PASSED [ 28%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_no_filters PASSED [ 28%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_true PASSED [ 28%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_combined_filters PASSED [ 29%] -tests/test_virus.py::TestVirus::test_merge_metadata_csvs_fills_missing PASSED [ 29%] -tests/test_virus.py::TestVirus::test_is_sars_cov2_query_negative PASSED [ 29%] -tests/test_virus.py::TestVirus::test_batch_accessions_for_url PASSED [ 29%] -tests/test_virus.py::TestVirus::test_save_partial_metadata_empty PASSED [ 30%] -tests/test_virus.py::TestVirus::test_virus_with_length_filters PASSED [ 30%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_no_parentheses_returns_none PASSED [ 30%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_max_gene_count PASSED [ 30%] -tests/test_virus.py::TestVirus::test_virus_invalid_lab_passaged_type PASSED [ 31%] -tests/test_virus.py::TestVirus::test_retry_helper_success_after_retry PASSED [ 31%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_empty PASSED [ 31%] -tests/test_virus.py::TestVirus::test_filter_cached_geographic_location PASSED [ 31%] -tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_empty PASSED [ 32%] -tests/test_virus.py::TestVirus::test_virus_invalid_completeness PASSED [ 32%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_empty PASSED [ 32%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_false PASSED [ 32%] -tests/test_virus.py::TestVirus::test_parse_genbank_xml_empty_set PASSED [ 33%] -tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter PASSED [ 33%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_release_date PASSED [ 33%] -tests/test_virus.py::TestVirus::test_track_failed_operation_creates_key PASSED [ 33%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_true PASSED [ 34%] -tests/test_virus.py::TestVirus::test_parse_date_invalid_raises PASSED [ 34%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_true PASSED [ 34%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_nonexistent_raises PASSED [ 34%] -tests/test_virus.py::TestVirus::test_genbank_xml_to_csv_basic PASSED [ 35%] -tests/test_virus.py::TestVirus::test_filter_cached_refseq_only PASSED [ 35%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_host PASSED [ 35%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_min_gene_count PASSED [ 35%] -tests/test_virus.py::TestVirus::test_write_fasta_record_without_description PASSED [ 36%] -tests/test_virus.py::TestVirus::test_virus_completeness_filter_verification PASSED [ 36%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_none_raises PASSED [ 36%] -tests/test_virus.py::TestVirus::test_save_metadata_to_csv_empty_metadata PASSED [ 36%] -tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter PASSED [ 37%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_country PASSED [ 37%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_max PASSED [ 37%] -tests/test_virus.py::TestVirus::test_retry_helper_custom_retryable_exceptions PASSED [ 37%] -tests/test_virus.py::TestVirus::test_local_name_with_namespace PASSED [ 38%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_name PASSED [ 38%] -tests/test_virus.py::TestVirus::test_filter_cached_annotated PASSED [ 38%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_space_before_virus PASSED [ 38%] -tests/test_virus.py::TestVirus::test_parse_accession_input_space_separated PASSED [ 39%] -tests/test_virus.py::TestVirus::test_check_min_max_date_valid PASSED [ 39%] -tests/test_virus.py::TestVirus::test_check_min_max_equal PASSED [ 39%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_empty_returns_none PASSED [ 39%] -tests/test_virus.py::TestVirus::test_unzip_file_bad_zip_raises PASSED [ 40%] -tests/test_virus.py::TestVirus::test_virus_integer_virus_id PASSED [ 40%] -tests/test_virus.py::TestVirus::test_virus_invalid_is_accession_type PASSED [ 40%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_env_source PASSED [ 40%] -tests/test_virus.py::TestVirus::test_virus_invalid_proteins_complete_type PASSED [ 41%] -tests/test_virus.py::TestVirus::test_parse_accession_input_nonexistent_file_raises_error PASSED [ 41%] -tests/test_virus.py::TestVirus::test_write_fasta_record_with_description PASSED [ 41%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_geographic_location PASSED [ 41%] -tests/test_virus.py::TestVirus::test_virus_with_completeness_filter PASSED [ 42%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_missing_accession PASSED [ 42%] -tests/test_virus.py::TestVirus::test_get_memory_usage_returns_dict PASSED [ 42%] -tests/test_virus.py::TestVirus::test_clean_xml_declarations_no_declarations PASSED [ 42%] -tests/test_virus.py::TestVirus::test_filter_cached_complete_only PASSED [ 43%] -tests/test_virus.py::TestVirus::test_save_partial_metadata PASSED [ 43%] -tests/test_virus.py::TestVirus::test_virus_none_virus_name PASSED [ 43%] -tests/test_virus.py::TestVirus::test_track_failed_operation_none_dict PASSED [ 43%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_max_seq_length PASSED [ 44%] -tests/test_virus.py::TestVirus::test_virus_invalid_annotated_type PASSED [ 44%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype_list PASSED [ 44%] -tests/test_virus.py::TestVirus::test_save_command_summary_with_error PASSED [ 44%] -tests/test_virus.py::TestVirus::test_parse_accession_input_from_file PASSED [ 45%] -tests/test_virus.py::TestVirus::test_retry_helper_failed_commands_tracking PASSED [ 45%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_collection_date PASSED [ 45%] -tests/test_virus.py::TestVirus::test_save_metadata_to_csv_basic PASSED [ 45%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_peptide_count PASSED [ 46%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_true PASSED [ 46%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_min_seq_length PASSED [ 46%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_already_correct_returns_none PASSED [ 46%] -tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters PASSED [ 47%] -tests/test_virus.py::TestVirus::test_retry_helper_exponential_backoff_timing PASSED [ 47%] -tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_basic PASSED [ 47%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_csv PASSED [ 47%] -tests/test_virus.py::TestVirus::test_calculate_max_accessions_per_batch PASSED [ 48%] -tests/test_virus.py::TestVirus::test_merge_baseline_with_new_empty_new PASSED [ 48%] -tests/test_virus.py::TestVirus::test_filter_sequences_no_filters PASSED [ 48%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_has_proteins PASSED [ 48%] -tests/test_virus.py::TestVirus::test_retry_helper_non_retryable_exception PASSED [ 49%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_text PASSED [ 49%] -tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter PASSED [ 49%] -tests/test_virus.py::TestVirus::test_filter_sequences_proteins_complete PASSED [ 49%] -tests/test_virus.py::TestVirus::test_virus_with_host_filter PASSED [ 50%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_protein_count PASSED [ 50%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_false PASSED [ 50%] -tests/test_virus.py::TestVirus::test_local_name_without_namespace PASSED [ 50%] -tests/test_virus.py::TestVirus::test_virus_empty_virus_name PASSED [ 50%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_isolation_source PASSED [ 51%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_empty_raises PASSED [ 51%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_combined PASSED [ 51%] -tests/test_virus.py::TestVirus::test_virus_with_source_database_filter PASSED [ 51%] -tests/test_virus.py::TestVirus::test_check_min_max_date_invalid_raises PASSED [ 52%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_no_filters PASSED [ 52%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_json PASSED [ 52%] -tests/test_virus.py::TestVirus::test_parse_genbank_xml_invalid_raises PASSED [ 52%] -tests/test_virus.py::TestVirus::test_deduplicate_empty_baseline PASSED [ 53%] -tests/test_virus.py::TestVirus::test_get_datasets_path_returns_valid_path PASSED [ 53%] -tests/test_virus.py::TestVirus::test_check_min_max_invalid_raises PASSED [ 53%] -tests/test_virus.py::TestVirus::test_datasets_cli_version_output PASSED [ 53%] -tests/test_virus.py::TestVirus::test_is_sars_cov2_query_accession_mode PASSED [ 54%] -tests/test_virus.py::TestVirus::test_unzip_file_nonexistent_raises PASSED [ 54%] -tests/test_virus.py::TestVirus::test_validate_datasets_binary_empty_path PASSED [ 54%] -tests/test_virus.py::TestVirus::test_retry_helper_successful_operation PASSED [ 54%] -tests/test_virus.py::TestVirus::test_filter_cached_no_filters PASSED [ 55%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_basic PASSED [ 55%] -tests/test_virus.py::TestVirus::test_filter_sequences_max_ambiguous_chars PASSED [ 55%] -tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_accession_mode PASSED [ 55%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_max_comparison PASSED [ 56%] -tests/test_virus.py::TestVirus::test_clean_xml_declarations PASSED [ 56%] -tests/test_virus.py::TestVirus::test_track_failed_operation_appends PASSED [ 56%] -tests/test_virus.py::TestVirus::test_is_sars_cov2_query_common_names PASSED [ 56%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_multiple PASSED [ 57%] -tests/test_virus.py::TestVirus::test_virus_with_genbank_metadata_retrieval PASSED [ 57%] -tests/test_virus.py::TestVirus::test_parse_date_full PASSED [ 57%] -tests/test_virus.py::TestVirus::test_virus_with_annotated_filter PASSED [ 57%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_type PASSED [ 58%] -tests/test_virus.py::TestVirus::test_virus_metadata_schema_validation PASSED [ 58%] -tests/test_virus.py::TestVirus::test_virus_multiple_filters_relationship_check PASSED [ 58%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_zero PASSED [ 58%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_institution PASSED [ 59%] -tests/test_virus.py::TestVirus::test_virus_multi_accession_space_separated PASSED [ 59%] -tests/test_virus.py::TestVirus::test_filter_cached_min_release_date PASSED [ 59%] -tests/test_ref.py::TestRef::test_ref_which PASSED [ 59%] -tests/test_ref.py::TestRef::test_ref_list PASSED [ 60%] -tests/test_ref.py::TestRef::test_ref_rel_ftp PASSED [ 60%] -tests/test_ref.py::TestRef::test_ref_rel_ftp_octopus PASSED [ 60%] -tests/test_ref.py::TestRef::test_ref_ftp PASSED [ 60%] -tests/test_ref.py::TestRef::test_ref PASSED [ 61%] -tests/test_ref.py::TestRef::test_ref_bad_which PASSED [ 61%] -tests/test_ref.py::TestRef::test_ref_rel_protist PASSED [ 61%] -tests/test_ref.py::TestRef::test_ref_plant PASSED [ 61%] -tests/test_ref.py::TestRef::test_ref_rel PASSED [ 62%] -tests/test_ref.py::TestRef::test_ref_bad_species PASSED [ 62%] -tests/test_ref.py::TestRef::test_ref_bad_rel PASSED [ 62%] -tests/test_ref.py::TestRef::test_ref_which_plant PASSED [ 62%] -tests/test_mutate.py::TestMutate::test_single_deletion PASSED [ 63%] -tests/test_mutate.py::TestMutate::test_multi_insertion PASSED [ 63%] -tests/test_mutate.py::TestMutate::test_intron_mutation_minus PASSED [ 63%] -tests/test_mutate.py::TestMutate::test_posttranslational_mutation PASSED [ 63%] -tests/test_mutate.py::TestMutate::test_multi_deletion_with_right_repeats PASSED [ 64%] -tests/test_mutate.py::TestMutate::test_index_error PASSED [ 64%] -tests/test_mutate.py::TestMutate::test_uncertain_mutation PASSED [ 64%] -tests/test_mutate.py::TestMutate::test_large_k PASSED [ 64%] -tests/test_mutate.py::TestMutate::test_multi_delins_with_true_left_repeats PASSED [ 65%] -tests/test_mutate.py::TestMutate::test_inversion_with_overlaps PASSED [ 65%] -tests/test_mutate.py::TestMutate::test_multi_deletion PASSED [ 65%] -tests/test_mutate.py::TestMutate::test_multi_delins PASSED [ 65%] -tests/test_mutate.py::TestMutate::test_single_substitution_near_left_end PASSED [ 66%] -tests/test_mutate.py::TestMutate::test_single_deletion_with_right_repeats PASSED [ 66%] -tests/test_mutate.py::TestMutate::test_single_substitution PASSED [ 66%] -tests/test_mutate.py::TestMutate::test_list_of_mutations PASSED [ 66%] -tests/test_mutate.py::TestMutate::test_single_insertion PASSED [ 67%] -tests/test_mutate.py::TestMutate::test_multi_dup PASSED [ 67%] -tests/test_mutate.py::TestMutate::test_single_substitution_near_right_end PASSED [ 67%] -tests/test_mutate.py::TestMutate::test_multi_delins_with_true_right_repeats PASSED [ 67%] -tests/test_mutate.py::TestMutate::test_intron_mutation_plus PASSED [ 68%] -tests/test_mutate.py::TestMutate::test_multi_delins_with_psuedo_left_repeats PASSED [ 68%] -tests/test_mutate.py::TestMutate::test_multi_insertion_with_left_repeats PASSED [ 68%] -tests/test_mutate.py::TestMutate::test_single_dup PASSED [ 68%] -tests/test_mutate.py::TestMutate::test_single_deletion_with_left_repeats PASSED [ 69%] -tests/test_mutate.py::TestMutate::test_ambiguous_mutation PASSED [ 69%] -tests/test_mutate.py::TestMutate::test_single_delins PASSED [ 69%] -tests/test_mutate.py::test_mismatch_error PASSED [ 69%] -tests/test_mutate.py::test_csv_of_mutations PASSED [ 70%] -tests/test_bgee.py::TestBgee::test_error_bgee_unknown_type PASSED [ 70%] -tests/test_bgee.py::TestBgee::test_error_bgee_orthologs_no_exist PASSED [ 70%] -tests/test_bgee.py::TestBgee::test_bgee_expression_multiple PASSED [ 70%] -tests/test_bgee.py::TestBgee::test_error_bgee_expression_no_exist PASSED [ 71%] -tests/test_bgee.py::TestBgee::test_bgee_orthologs PASSED [ 71%] -tests/test_bgee.py::TestBgee::test_bgee_expression PASSED [ 71%] -tests/test_g2p.py::TestG2PValidation::test_missing_uniprot_raises PASSED [ 71%] -tests/test_g2p.py::TestG2PValidation::test_alignment_requires_isoform PASSED [ 72%] -tests/test_g2p.py::TestG2PValidation::test_invalid_resource_raises PASSED [ 72%] -tests/test_g2p.py::TestG2P::test_g2p_map PASSED [ 72%] -tests/test_g2p.py::TestG2P::test_g2p_features PASSED [ 72%] -tests/test_g2p.py::TestG2P::test_g2p_alignment PASSED [ 73%] -tests/test_pdb.py::TestPDB::test_pdb_legacy_fallback_to_mmcif PASSED [ 73%] -tests/test_pdb.py::TestPDB::test_pdb_mmcif PASSED [ 73%] -tests/test_pdb.py::TestPDB::test_pdb_pdb PASSED [ 73%] -tests/test_pdb.py::TestPDB::test_pdb_assembly PASSED [ 74%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_background_ensembl PASSED [ 74%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background_list PASSED [ 74%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_transcription PASSED [ 74%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_fly PASSED [ 75%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_database_shortcut PASSED [ 75%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_mouse_is_human PASSED [ 75%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_diseases_drugs PASSED [ 75%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_gene PASSED [ 76%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_fish PASSED [ 76%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_pathway PASSED [ 76%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_ontology PASSED [ 76%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_species PASSED [ 77%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_celltypes PASSED [ 77%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_yeast PASSED [ 77%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_plot PASSED [ 77%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_background PASSED [ 78%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_ensembl_ids PASSED [ 78%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_kinase_interactions PASSED [ 78%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_none PASSED [ 78%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_json PASSED [ 79%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_worm PASSED [ 79%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background PASSED [ 79%] -tests/test_cbio.py::TestCbio::test_cbio_download PASSED [ 79%] -tests/test_cbio.py::TestCbio::test_error_cbio_download PASSED [ 80%] -tests/test_cbio.py::TestCbio::test_cbio_download_partially_existing_files PASSED [ 80%] -tests/test_cbio.py::TestCbioSearch::test_cbio_search PASSED [ 80%] -tests/test_muscle.py::TestMuscleSuper::test_muscle_nt_super5 PASSED [ 80%] -tests/test_muscle.py::TestMuscle::test_muscle_nt_txt PASSED [ 81%] -tests/test_muscle.py::TestMuscle::test_muscle_nt PASSED [ 81%] -tests/test_muscle.py::TestMusclePrints::test_muscle_print_nt PASSED [ 81%] -tests/test_muscle.py::TestMuscleSeqsInput::test_muscle_seqs_as_input PASSED [ 81%] -tests/test_muscle.py::TestMuscleAASuper::test_muscle_aa_super5 PASSED [ 82%] -tests/test_muscle.py::TestMuscleAA::test_muscle_aa PASSED [ 82%] -tests/test_info.py::TestInfo::test_info_ncbifalse_uniprottrue PASSED [ 82%] -tests/test_info.py::TestInfo::test_info_ncbifalse_uniprotfalse PASSED [ 82%] -tests/test_info.py::TestInfo::test_info_mix PASSED [ 83%] -tests/test_info.py::TestInfo::test_info_gene_list_non_model PASSED [ 83%] -tests/test_info.py::TestInfo::test_info_exon PASSED [ 83%] -tests/test_info.py::TestInfo::test_info_transcript PASSED [ 83%] -tests/test_info.py::TestInfo::test_info_gene PASSED [ 84%] -tests/test_info.py::TestInfo::test_info_WB_transcript PASSED [ 84%] -tests/test_info.py::TestInfo::test_info_ncbitrue_uniprotfalse PASSED [ 84%] -tests/test_search.py::TestSearch::test_search_transcript_one_sw PASSED [ 84%] -tests/test_search.py::TestSearch::test_search_gene_two_sw_or PASSED [ 85%] -tests/test_search.py::TestSearch::test_search_gene_bad_andor PASSED [ 85%] -tests/test_search.py::TestSearch::test_search_transcript_bad_andor PASSED [ 85%] -tests/test_search.py::TestSearch::test_search_release PASSED [ 85%] -tests/test_search.py::TestSearch::test_search_transcript_two_sw_and PASSED [ 86%] -tests/test_search.py::TestSearch::test_search_gene_one_sw PASSED [ 86%] -tests/test_search.py::TestSearch::test_search_transcript_bad_species PASSED [ 86%] -tests/test_search.py::TestSearch::test_search_plant_db PASSED [ 86%] -tests/test_search.py::TestSearch::test_search_gene_one_sw_json PASSED [ 87%] -tests/test_search.py::TestSearch::test_search_db PASSED [ 87%] -tests/test_search.py::TestSearch::test_search_gene_two_sw_and PASSED [ 87%] -tests/test_search.py::TestSearch::test_search_gene_one_sw_limit PASSED [ 87%] -tests/test_search.py::TestSearch::test_search_octopus PASSED [ 88%] -tests/test_search.py::TestSearch::test_search_gene_two_sw_limit PASSED [ 88%] -tests/test_search.py::TestSearch::test_search_gene_bad_species PASSED [ 88%] -tests/test_search.py::TestSearch::test_search_plant PASSED [ 88%] -tests/test_search.py::TestSearch::test_search_transcript_two_sw_or PASSED [ 89%] -tests/test_diamond.py::TestDiamond::test_diamond_JSON_out PASSED [ 89%] +tests/test_virus.py::TestVirus::test_virus_with_host_filter PASSED [ 27%] +tests/test_virus.py::TestVirus::test_filter_cached_complete_only PASSED [ 27%] +tests/test_virus.py::TestVirus::test_virus_completeness_filter_verification PASSED [ 28%] +tests/test_virus.py::TestVirus::test_parse_accession_input_from_file PASSED [ 28%] +tests/test_virus.py::TestVirus::test_is_sars_cov2_query_negative PASSED [ 28%] +tests/test_virus.py::TestVirus::test_virus_host_filter_verification PASSED [ 28%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_env_source PASSED [ 29%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_no_parentheses_returns_none PASSED [ 29%] +tests/test_virus.py::TestVirus::test_deduplicate_empty_baseline PASSED [ 29%] +tests/test_virus.py::TestVirus::test_virus_relationship_check_counts_match PASSED [ 29%] +tests/test_virus.py::TestVirus::test_retry_helper_exponential_backoff_timing PASSED [ 30%] +tests/test_virus.py::TestVirus::test_retry_helper_success_after_retry PASSED [ 30%] +tests/test_virus.py::TestVirus::test_deduplicate_metadata_against_baseline PASSED [ 30%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_min_seq_length PASSED [ 30%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_name PASSED [ 31%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_empty_returns_none PASSED [ 31%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_true PASSED [ 31%] +tests/test_virus.py::TestVirus::test_retry_helper_non_retryable_exception PASSED [ 31%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_negative PASSED [ 32%] +tests/test_virus.py::TestVirus::test_genbank_xml_to_csv_basic PASSED [ 32%] +tests/test_virus.py::TestVirus::test_virus_multi_accession_space_separated PASSED [ 32%] +tests/test_virus.py::TestVirus::test_parse_accession_input_space_separated PASSED [ 32%] +tests/test_virus.py::TestVirus::test_merge_baseline_with_new_csv PASSED [ 33%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_collection_date_range PASSED [ 33%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_type PASSED [ 33%] +tests/test_virus.py::TestVirus::test_deduplicate_all_existing PASSED [ 33%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_already_correct_returns_none PASSED [ 34%] +tests/test_virus.py::TestVirus::test_parse_genbank_xml_empty_set PASSED [ 34%] +tests/test_virus.py::TestVirus::test_virus_with_collection_date_filters PASSED [ 34%] +tests/test_virus.py::TestVirus::test_local_name_without_namespace PASSED [ 34%] +tests/test_virus.py::TestVirus::test_save_command_summary_with_error PASSED [ 35%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_has_proteins PASSED [ 35%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_institution PASSED [ 35%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_metadata_type PASSED [ 35%] +tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_negative PASSED [ 36%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_empty_raises PASSED [ 36%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_space_before_virus PASSED [ 36%] +tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_basic PASSED [ 36%] +tests/test_virus.py::TestVirus::test_is_sars_cov2_query_accession_mode PASSED [ 37%] +tests/test_virus.py::TestVirus::test_parse_genbank_xml_invalid_raises PASSED [ 37%] +tests/test_virus.py::TestVirus::test_virus_with_multiple_filters PASSED [ 37%] +tests/test_virus.py::TestVirus::test_get_datasets_path_returns_valid_path PASSED [ 37%] +tests/test_virus.py::TestVirus::test_parse_date_various_formats PASSED [ 38%] +tests/test_virus.py::TestVirus::test_virus_integer_virus_id PASSED [ 38%] +tests/test_virus.py::TestVirus::test_parse_date_invalid_raises PASSED [ 38%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_basic PASSED [ 38%] +tests/test_virus.py::TestVirus::test_merge_metadata_csvs_fills_missing PASSED [ 39%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_seq_length PASSED [ 39%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_min PASSED [ 39%] +tests/test_virus.py::TestVirus::test_merge_baseline_with_new_empty_new PASSED [ 39%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_min_comparison PASSED [ 40%] +tests/test_virus.py::TestVirus::test_filter_cached_annotated PASSED [ 40%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_protein_count PASSED [ 40%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_zero PASSED [ 40%] +tests/test_virus.py::TestVirus::test_write_fasta_record_long_sequence_wraps PASSED [ 41%] +tests/test_virus.py::TestVirus::test_parse_accession_input_single PASSED [ 41%] +tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter PASSED [ 41%] +tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters PASSED [ 41%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_host PASSED [ 42%] +tests/test_virus.py::TestVirus::test_check_min_max_equal PASSED [ 42%] +tests/test_virus.py::TestVirus::test_virus_invalid_is_accession_type PASSED [ 42%] +tests/test_virus.py::TestVirus::test_stream_copy_fasta_all_records PASSED [ 42%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_min_gene_count PASSED [ 43%] +tests/test_virus.py::TestVirus::test_merge_metadata_csvs_no_overwrite PASSED [ 43%] +tests/test_virus.py::TestVirus::test_filter_cached_no_filters PASSED [ 43%] +tests/test_virus.py::TestVirus::test_datasets_cli_version_output PASSED [ 43%] +tests/test_virus.py::TestVirus::test_write_fasta_record_with_description PASSED [ 44%] +tests/test_virus.py::TestVirus::test_check_min_max_date_invalid_raises PASSED [ 44%] +tests/test_virus.py::TestVirus::test_virus_invalid_completeness PASSED [ 44%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_nonexistent_raises PASSED [ 44%] +tests/test_virus.py::TestVirus::test_virus_invalid_annotated_type PASSED [ 45%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_false PASSED [ 45%] +tests/test_virus.py::TestVirus::test_retry_helper_successful_operation PASSED [ 45%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_multiple PASSED [ 45%] +tests/test_virus.py::TestVirus::test_virus_specific_accession_file_creation PASSED [ 46%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_no_filters PASSED [ 46%] +tests/test_virus.py::TestVirus::test_unzip_file_nonexistent_raises PASSED [ 46%] +tests/test_virus.py::TestVirus::test_virus_release_date_filter_verification PASSED [ 46%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_false PASSED [ 47%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_gen_mol_type PASSED [ 47%] +tests/test_virus.py::TestVirus::test_force_garbage_collection_runs PASSED [ 47%] +tests/test_virus.py::TestVirus::test_virus_multi_accession_file_input PASSED [ 47%] +tests/test_virus.py::TestVirus::test_save_metadata_to_csv_empty_metadata PASSED [ 48%] +tests/test_virus.py::TestVirus::test_merge_baseline_with_new_deduplicates PASSED [ 48%] +tests/test_virus.py::TestVirus::test_virus_multiple_filters_relationship_check PASSED [ 48%] +tests/test_virus.py::TestVirus::test_virus_with_completeness_filter PASSED [ 48%] +tests/test_virus.py::TestVirus::test_parse_date_full PASSED [ 49%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_empty PASSED [ 49%] +tests/test_virus.py::TestVirus::test_track_failed_operation_creates_key PASSED [ 49%] +tests/test_virus.py::TestVirus::test_calculate_max_accessions_per_batch PASSED [ 49%] +tests/test_virus.py::TestVirus::test_retry_helper_custom_retryable_exceptions PASSED [ 50%] +tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter PASSED [ 50%] +tests/test_virus.py::TestVirus::test_virus_metadata_schema_validation PASSED [ 50%] +tests/test_virus.py::TestVirus::test_check_min_max_none_values PASSED [ 50%] +tests/test_virus.py::TestVirus::test_track_failed_operation_none_dict PASSED [ 50%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_release_date PASSED [ 51%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype PASSED [ 51%] +tests/test_virus.py::TestVirus::test_clean_xml_declarations PASSED [ 51%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_no_filters PASSED [ 51%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_jsonl PASSED [ 52%] +tests/test_virus.py::TestVirus::test_write_fasta_record_without_description PASSED [ 52%] +tests/test_virus.py::TestVirus::test_clean_xml_declarations_no_declarations PASSED [ 52%] +tests/test_virus.py::TestVirus::test_virus_invalid_proteins_complete_type PASSED [ 52%] +tests/test_virus.py::TestVirus::test_check_min_max_date_valid PASSED [ 53%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_missing_accession PASSED [ 53%] +tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter PASSED [ 53%] +tests/test_virus.py::TestVirus::test_retry_helper_failed_commands_tracking PASSED [ 53%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_true PASSED [ 54%] +tests/test_virus.py::TestVirus::test_filter_cached_host_in_strategy_skipped PASSED [ 54%] +tests/test_virus.py::TestVirus::test_save_command_summary_creates_file PASSED [ 54%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_json PASSED [ 54%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_max_comparison PASSED [ 55%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_peptide_count PASSED [ 55%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_source_database PASSED [ 55%] +tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_empty PASSED [ 55%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_gene_count PASSED [ 56%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_true PASSED [ 56%] +tests/test_virus.py::TestVirus::test_get_memory_usage_returns_dict PASSED [ 56%] +tests/test_virus.py::TestVirus::test_virus_with_genbank_metadata_retrieval PASSED [ 56%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_false PASSED [ 57%] +tests/test_virus.py::TestVirus::test_filter_cached_refseq_only PASSED [ 57%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_invalid_attempt_returns_none PASSED [ 57%] +tests/test_virus.py::TestVirus::test_virus_with_length_filters PASSED [ 57%] +tests/test_virus.py::TestVirus::test_virus_empty_virus_name PASSED [ 58%] +tests/test_virus.py::TestVirus::test_virus_invalid_keep_temp_type PASSED [ 58%] +tests/test_virus.py::TestVirus::test_validate_datasets_binary_valid PASSED [ 58%] +tests/test_virus.py::TestVirus::test_parse_accession_input_empty_file_raises_error PASSED [ 58%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_protein_count PASSED [ 59%] +tests/test_virus.py::TestVirus::test_check_min_max_valid PASSED [ 59%] +tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_common_names PASSED [ 59%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_collection_date PASSED [ 59%] +tests/test_virus.py::TestVirus::test_parse_partial_date_full_date PASSED [ 60%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_mature_peptide_count PASSED [ 60%] +tests/test_virus.py::TestVirus::test_filter_cached_host_not_in_strategy PASSED [ 60%] +tests/test_virus.py::TestVirus::test_virus_with_annotated_filter PASSED [ 60%] +tests/test_virus.py::TestVirus::test_virus_none_virus_name PASSED [ 61%] +tests/test_virus.py::TestVirus::test_is_sars_cov2_query_common_names PASSED [ 61%] +tests/test_virus.py::TestVirus::test_filter_sequences_proteins_complete PASSED [ 61%] +tests/test_virus.py::TestVirus::test_batch_accessions_for_url PASSED [ 61%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_isolate PASSED [ 62%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_false PASSED [ 62%] +tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_accession_mode PASSED [ 62%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_country PASSED [ 62%] +tests/test_virus.py::TestVirus::test_virus_with_geographic_location_filter PASSED [ 63%] +tests/test_virus.py::TestVirus::test_get_datasets_version_returns_string_or_none PASSED [ 63%] +tests/test_virus.py::TestVirus::test_filter_cached_geographic_location PASSED [ 63%] +tests/test_virus.py::TestVirus::test_local_name_with_namespace PASSED [ 63%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_text PASSED [ 64%] +tests/test_virus.py::TestVirus::test_filter_cached_min_release_date PASSED [ 64%] +tests/test_virus.py::TestVirus::test_validate_datasets_binary_empty_path PASSED [ 64%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_none_raises PASSED [ 64%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_csv PASSED [ 65%] +tests/test_virus.py::TestVirus::test_parse_partial_date_empty_raises PASSED [ 65%] +tests/test_virus.py::TestVirus::test_save_metadata_to_csv_basic PASSED [ 65%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_empty PASSED [ 65%] +tests/test_virus.py::TestVirus::test_get_datasets_path_uses_bundled_binary PASSED [ 66%] +tests/test_virus.py::TestVirus::test_virus_invalid_lab_passaged_type PASSED [ 66%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_true PASSED [ 66%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_remove_parentheses PASSED [ 66%] +tests/test_virus.py::TestVirus::test_virus_with_source_database_filter PASSED [ 67%] +tests/test_virus.py::TestVirus::test_parse_genbank_xml_basic PASSED [ 67%] +tests/test_virus.py::TestVirus::test_unzip_file_valid PASSED [ 67%] +tests/test_virus.py::TestVirus::test_save_partial_metadata PASSED [ 67%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_segment PASSED [ 68%] +tests/test_virus.py::TestVirus::test_track_failed_operation_appends PASSED [ 68%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype_list PASSED [ 68%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_max_seq_length PASSED [ 68%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_max_release_date PASSED [ 69%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_combined PASSED [ 69%] +tests/test_virus.py::TestVirus::test_filter_sequences_no_filters PASSED [ 69%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_max_gene_count PASSED [ 69%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_virus_suffix PASSED [ 70%] +tests/test_virus.py::TestVirus::test_filter_sequences_max_ambiguous_chars PASSED [ 70%] +tests/test_virus.py::TestVirus::test_unzip_file_bad_zip_raises PASSED [ 70%] +tests/test_virus.py::TestVirus::test_get_gget_version_returns_string PASSED [ 70%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_combined_filters PASSED [ 71%] +tests/test_virus.py::TestVirus::test_stream_copy_fasta_with_accession_filter PASSED [ 71%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_isolation_source PASSED [ 71%] +tests/test_utils.py::TestUtils::test_ref_species_options PASSED [ 71%] +tests/test_utils.py::TestUtils::test_n_colors PASSED [ 72%] +tests/test_utils.py::TestUtils::test_search_species_options PASSED [ 72%] +tests/test_utils.py::TestUtils::test_search_species_options_bad_type PASSED [ 72%] +tests/test_utils.py::TestUtils::test_get_uniprot_info_gene PASSED [ 72%] +tests/test_utils.py::TestUtils::test_read_fasta PASSED [ 73%] +tests/test_utils.py::TestUtils::test_rest_query_bad_type PASSED [ 73%] +tests/test_utils.py::TestUtils::test_find_latest_ens_rel PASSED [ 73%] +tests/test_utils.py::TestUtils::test_ref_species_options_bad_type PASSED [ 73%] +tests/test_utils.py::TestUtils::test_aa_colors PASSED [ 74%] +tests/test_utils.py::TestUtils::test_get_uniprot_info_transcript PASSED [ 74%] +tests/test_utils.py::TestUtils::test_ref_iv_species_options PASSED [ 74%] +tests/test_utils.py::TestUtils::test_search_iv_species_options PASSED [ 74%] +tests/test_utils.py::TestUtils::test_rest_query PASSED [ 75%] +tests/test_utils.py::TestUtils::test_get_uniprot_seqs PASSED [ 75%] +tests/test_pdb.py::TestPDB::test_pdb_mmcif PASSED [ 75%] +tests/test_pdb.py::TestPDB::test_pdb_pdb PASSED [ 75%] +tests/test_pdb.py::TestPDB::test_pdb_assembly PASSED [ 76%] +tests/test_pdb.py::TestPDB::test_pdb_legacy_fallback_to_mmcif PASSED [ 76%] +tests/test_bgee.py::TestBgee::test_bgee_orthologs PASSED [ 76%] +tests/test_bgee.py::TestBgee::test_error_bgee_expression_no_exist PASSED [ 76%] +tests/test_bgee.py::TestBgee::test_error_bgee_orthologs_no_exist PASSED [ 77%] +tests/test_bgee.py::TestBgee::test_error_bgee_unknown_type PASSED [ 77%] +tests/test_bgee.py::TestBgee::test_bgee_expression PASSED [ 77%] +tests/test_bgee.py::TestBgee::test_bgee_expression_multiple PASSED [ 77%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_transcription PASSED [ 78%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_json PASSED [ 78%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_ontology PASSED [ 78%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background PASSED [ 78%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_plot PASSED [ 79%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_background PASSED [ 79%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_background_ensembl PASSED [ 79%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_database_shortcut PASSED [ 79%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_fly PASSED [ 80%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_pathway PASSED [ 80%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_worm PASSED [ 80%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_diseases_drugs PASSED [ 80%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_none PASSED [ 81%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_species PASSED [ 81%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background_list PASSED [ 81%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_ensembl_ids PASSED [ 81%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_fish PASSED [ 82%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_celltypes PASSED [ 82%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_kinase_interactions PASSED [ 82%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_yeast PASSED [ 82%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_mouse_is_human PASSED [ 83%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_gene PASSED [ 83%] +tests/test_archs4.py::TestArchs4::test_archs4_defaults PASSED [ 83%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue_ensembl FAILED [ 83%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_gene PASSED [ 84%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_species PASSED [ 84%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_ensembl PASSED [ 84%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue FAILED [ 84%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue_json FAILED [ 85%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue_mouse FAILED [ 85%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_which PASSED [ 85%] +tests/test_archs4.py::TestArchs4::test_archs4_mouse_json_ensembl PASSED [ 85%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_gene_tissue FAILED [ 86%] +tests/test_cellxgene.py::TestCellxgeneValidation::test_invalid_species_raises_valueerror PASSED [ 86%] +tests/test_cellxgene.py::TestCellxgeneValidation::test_typo_species_raises_valueerror PASSED [ 86%] +tests/test_cellxgene.py::TestCellxgeneValidation::test_supported_species_includes_new_primates PASSED [ 86%] +tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata_macaca_mulatta SKIPPED [ 87%] +tests/test_cellxgene.py::TestCellxgene::test_cellxgene_adata SKIPPED [ 87%] +tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata SKIPPED [ 87%] +tests/test_muscle.py::TestMuscle::test_muscle_nt PASSED [ 87%] +tests/test_muscle.py::TestMuscle::test_muscle_nt_txt PASSED [ 88%] +tests/test_muscle.py::TestMuscleAASuper::test_muscle_aa_super5 PASSED [ 88%] +tests/test_muscle.py::TestMuscleAA::test_muscle_aa PASSED [ 88%] +tests/test_muscle.py::TestMuscleSeqsInput::test_muscle_seqs_as_input PASSED [ 88%] +tests/test_muscle.py::TestMuscleSuper::test_muscle_nt_super5 PASSED [ 89%] +tests/test_muscle.py::TestMusclePrints::test_muscle_print_nt PASSED [ 89%] tests/test_diamond.py::TestDiamond::test_diamond_seqs_single PASSED [ 89%] tests/test_diamond.py::TestDiamond::test_diamond_seqs_multiple PASSED [ 89%] +tests/test_diamond.py::TestDiamond::test_diamond_JSON_out PASSED [ 90%] tests/test_diamond.py::TestDiamond::test_diamond_query_file PASSED [ 90%] -tests/test_diamond.py::TestDiamond::test_diamond_ref_file PASSED [ 90%] tests/test_diamond.py::TestDiamond::test_diamond_both_files PASSED [ 90%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_tractability PASSED [ 90%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap PASSED [ 91%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_drugs PASSED [ 91%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap_filter PASSED [ 91%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions PASSED [ 91%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_nonexistent_id PASSED [ 92%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_expression PASSED [ 92%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_no_limit PASSED [ 92%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_resource PASSED [ 92%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets PASSED [ 93%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_simple_filter PASSED [ 93%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_pharmacogenetics PASSED [ 93%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_expression_no_limit PASSED [ 93%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_diseases PASSED [ 94%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_limit PASSED [ 94%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_diseases_filter PASSED [ 94%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_drugs_invalid_filter PASSED [ 94%] -tests/test_compile.py::TestCompilerWindows::test_compiler_windows PASSED [ 95%] -tests/test_blast.py::TestBlast::test_blast_nt PASSED [ 95%] -tests/test_blast.py::TestBlast::test_blast_db_missing PASSED [ 95%] -tests/test_blast.py::TestBlast::test_blast_bad_db2 PASSED [ 95%] -tests/test_blast.py::TestBlast::test_blast_bad_seq PASSED [ 96%] -tests/test_blast.py::TestBlast::test_blast_bad_program PASSED [ 96%] -tests/test_blast.py::TestBlast::test_blast_bad_db1 PASSED [ 96%] -tests/test_blast.py::TestBlast::test_blast_bad_fasta PASSED [ 96%] -tests/test_elm.py::TestELM::test_elm_uniprot_id_in_elm PASSED [ 97%] -tests/test_elm.py::TestELM::test_elm_uniprot_id_new PASSED [ 97%] -tests/test_elm.py::TestELM::test_elm_uniprot_aminoacidseq PASSED [ 97%] -tests/test_seq.py::TestSeq::test_seq_transcript_gene_WB PASSED [ 97%] -tests/test_seq.py::TestSeq::test_seq_transcript_gene PASSED [ 98%] -tests/test_seq.py::TestSeq::test_seq_transcript_transcript_iso PASSED [ 98%] -tests/test_seq.py::TestSeq::test_seq_gene PASSED [ 98%] -tests/test_seq.py::TestSeq::test_seq_transcript PASSED [ 98%] -tests/test_seq.py::TestSeq::test_seq_gene_iso PASSED [ 99%] -tests/test_seq.py::TestSeq::test_seq_gene_transcript_iso PASSED [ 99%] -tests/test_seq.py::TestSeq::test_seq_missing_uniprot_gene_name PASSED [ 99%] -tests/test_seq.py::TestSeq::test_seq_transcript_transcript_WB PASSED [ 99%] -tests/test_seq.py::TestSeq::test_seq_transcript_gene_iso PASSED [100%] +tests/test_diamond.py::TestDiamond::test_diamond_ref_file PASSED [ 90%] +tests/test_compile.py::TestCompilerWindows::test_compiler_windows PASSED [ 91%] +tests/test_ref.py::TestRef::test_ref_ftp PASSED [ 91%] +tests/test_ref.py::TestRef::test_ref_plant PASSED [ 91%] +tests/test_ref.py::TestRef::test_ref_bad_species PASSED [ 91%] +tests/test_ref.py::TestRef::test_ref PASSED [ 92%] +tests/test_ref.py::TestRef::test_ref_rel_protist PASSED [ 92%] +tests/test_ref.py::TestRef::test_ref_which_plant PASSED [ 92%] +tests/test_ref.py::TestRef::test_ref_bad_which PASSED [ 92%] +tests/test_ref.py::TestRef::test_ref_rel PASSED [ 93%] +tests/test_ref.py::TestRef::test_ref_bad_rel PASSED [ 93%] +tests/test_ref.py::TestRef::test_ref_rel_ftp_octopus PASSED [ 93%] +tests/test_ref.py::TestRef::test_ref_which PASSED [ 93%] +tests/test_ref.py::TestRef::test_ref_list PASSED [ 94%] +tests/test_ref.py::TestRef::test_ref_rel_ftp PASSED [ 94%] +tests/test_seq.py::TestSeq::test_seq_missing_uniprot_gene_name PASSED [ 94%] +tests/test_seq.py::TestSeq::test_seq_transcript_transcript_iso PASSED [ 94%] +tests/test_seq.py::TestSeq::test_seq_gene_iso PASSED [ 95%] +tests/test_seq.py::TestSeq::test_seq_transcript_gene PASSED [ 95%] +tests/test_seq.py::TestSeq::test_seq_transcript_gene_WB PASSED [ 95%] +tests/test_seq.py::TestSeq::test_seq_gene PASSED [ 95%] +tests/test_seq.py::TestSeq::test_seq_transcript_gene_iso PASSED [ 96%] +tests/test_seq.py::TestSeq::test_seq_transcript PASSED [ 96%] +tests/test_seq.py::TestSeq::test_seq_transcript_transcript_WB PASSED [ 96%] +tests/test_seq.py::TestSeq::test_seq_gene_transcript_iso PASSED [ 96%] +tests/test_blast.py::TestBlast::test_blast_bad_fasta PASSED [ 97%] +tests/test_blast.py::TestBlast::test_blast_bad_db2 PASSED [ 97%] +tests/test_blast.py::TestBlast::test_blast_db_missing PASSED [ 97%] +tests/test_blast.py::TestBlast::test_blast_bad_db1 PASSED [ 97%] +tests/test_blast.py::TestBlast::test_blast_bad_seq PASSED [ 98%] +tests/test_blast.py::TestBlast::test_blast_bad_program PASSED [ 98%] +tests/test_blast.py::TestBlast::test_blast_nt PASSED [ 98%] +tests/test_g2p.py::TestG2P::test_g2p_map PASSED [ 98%] +tests/test_g2p.py::TestG2P::test_g2p_alignment PASSED [ 99%] +tests/test_g2p.py::TestG2P::test_g2p_features PASSED [ 99%] +tests/test_g2p.py::TestG2PValidation::test_missing_uniprot_raises PASSED [ 99%] +tests/test_g2p.py::TestG2PValidation::test_invalid_resource_raises PASSED [ 99%] +tests/test_g2p.py::TestG2PValidation::test_alignment_requires_isoform PASSED [100%] -=============================== warnings summary =============================== -tests/test_utils.py::TestUtils::test_search_iv_species_options -tests/test_utils.py::TestUtils::test_search_iv_species_options -tests/test_utils.py::TestUtils::test_search_iv_species_options -tests/test_utils.py::TestUtils::test_search_iv_species_options -tests/test_search.py::TestSearch::test_search_release -tests/test_search.py::TestSearch::test_search_release -tests/test_search.py::TestSearch::test_search_release -tests/test_search.py::TestSearch::test_search_release - /home/runner/work/gget/gget/gget/utils.py:883: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. - for subsoup in soup.body.findAll("a"): +=================================== FAILURES =================================== +___________________________ TestInfo.test_info_gene ____________________________ -tests/test_utils.py::TestUtils::test_search_species_options -tests/test_search.py::TestSearch::test_search_release -tests/test_search.py::TestSearch::test_search_transcript_two_sw_and -tests/test_search.py::TestSearch::test_search_transcript_two_sw_or - /home/runner/work/gget/gget/gget/utils.py:899: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. - for subsoup in soup.body.findAll("a"): +self = -tests/test_utils.py: 4 warnings -tests/test_ref.py: 24 warnings - /home/runner/work/gget/gget/gget/utils.py:975: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. - for subsoup in soup.body.findAll("a"): + def assert_equal(self: unittest.TestCase): + test = name + expected_result = td[test]["expected_result"] + result_to_test = do_call(func, td[test]["args"]) + if test == "test_cosmic_defaults": # special case for cosmic + import numpy as np + + expected_result = pd.DataFrame(expected_result[0]) + expected_result = expected_result.replace({None: np.nan}) + # result_to_test.equals(expected_result) + pd.testing.assert_frame_equal(result_to_test, expected_result, check_dtype=False) + return + + # If result is a DataFrame, convert to list + if isinstance(result_to_test, pd.DataFrame): + result_to_test = result_to_test.dropna(axis=1).values.tolist() + +> self.assertEqual(result_to_test, expected_result) +E AssertionError: Lists differ: [['En[17 chars]6', 'mus_musculus', 'GRCm39', 'Gnai3', 'G prot[1000 chars]62]]] != [['En[17 chars]6', 'Q9DC51', '14679', 'mus_musculus', 'GRCm39[3072 chars]62]]] +E +E First differing element 0: +E ['Ens[16 chars]6', 'mus_musculus', 'GRCm39', 'Gnai3', 'G prot[999 chars]462]] +E ['Ens[16 chars]6', 'Q9DC51', '14679', 'mus_musculus', 'GRCm39[3071 chars]462]] +E +E [['EnsMUSG00000000001.6', +E + 'Q9DC51', +E + '14679', +E 'mus_musculus', +E 'GRCm39', +E 'Gnai3', +E + 'Gnai3', +E + ['Galphai3', 'Gnai-3', 'Hg1a'], +E + 'Guanine nucleotide-binding protein G(i) subunit alpha-3', +E 'G protein subunit alpha i3 [Source:MGI Symbol;Acc:MGI:95773]', +E + 'Heterotrimeric guanine nucleotide-binding proteins (G proteins) function as ' +E + 'transducers downstream of G protein-coupled receptors (GPCRs) in numerous ' +E + 'signaling cascades. The alpha chain contains the guanine nucleotide binding ' +E + 'site and alternates between an active, GTP-bound state and an inactive, ' +E + 'GDP-bound state. Signaling by an activated GPCR promotes GDP release and ' +E + 'GTP binding. The alpha subunit has a low GTPase activity that converts ' +E + 'bound GTP to GDP, thereby terminating the signal (By similarity). Both GDP ' +E + 'release and GTP hydrolysis are modulated by numerous regulatory proteins ' +E + '(By similarity). Signaling is mediated via effector proteins, such as ' +E + 'adenylate cyclase. Inhibits adenylate cyclase activity, leading to ' +E + 'decreased intracellular cAMP levels (By similarity). Stimulates the ' +E + 'activity of receptor-regulated K(+) channels (By similarity). The active ' +E + 'GTP-bound form prevents the association of RGS14 with centrosomes and is ' +E + 'required for the translocation of RGS14 from the cytoplasm to the plasma ' +E + 'membrane. May play a role in cell division (By similarity). The active ' +E + 'GTP-bound form activates the calcium permeant TRPC5 ion channels (By ' +E + 'similarity)', +E + 'Predicted to enable several functions, including G-protein ' +E + 'beta/gamma-subunit complex binding activity; GDP binding activity; and ' +E + 'GTPase activating protein binding activity. Predicted to be involved in ' +E + 'several processes, including G protein-coupled receptor signaling pathway; ' +E + 'positive regulation of metabolic process; and positive regulation of ' +E + 'vascular associated smooth muscle cell proliferation. Predicted to act ' +E + 'upstream of or within G protein-coupled receptor signaling pathway. Located ' +E + 'in Golgi apparatus. Is expressed in early conceptus; inner ear; and oocyte. ' +E + 'Orthologous to human GNAI3 (G protein subunit alpha i3). [provided by ' +E + 'Alliance of Genome Resources, Apr 2025]', +E + ['Cytoplasm', +E + 'Cell membrane', +E + 'Cytoplasm, cytoskeleton, microtubule organizing center, centrosome'], +E 'Gene', +E 'protein_coding', +E 'ENSMUST00000000001.6', +E '3', +E -1, +E 108014590, +E 108053469, +E ['ENSMUST00000000001.6', +E 'ENSMUST00000535596.1', +E 'ENSMUST00000535597.1', +E 'ENSMUST00000535598.1', +E 'ENSMUST00000535599.1', +E 'ENSMUST00000535600.1', +E 'ENSMUST00000535601.1', +E 'ENSMUST00000535602.1', +E 'ENSMUST00000535603.1', +E 'ENSMUST00000558104.1'], +E ['protein_coding', +E 'protein_coding', +E 'protein_coding', +E 'nonsense_mediated_decay', +E 'protein_coding', +E 'nonsense_mediated_decay', +E 'nonsense_mediated_decay', +E 'protein_coding', +E 'nonsense_mediated_decay', +E 'nonsense_mediated_decay'], +E ['Gnai3-201', +E 'Gnai3-202', +E 'Gnai3-203', +E 'Gnai3-204', +E 'Gnai3-205', +E 'Gnai3-206', +E 'Gnai3-207', +E 'Gnai3-208', +E 'Gnai3-209', +E 'Gnai3-210'], +E [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1], +E [108014596, +E 108014596, +E 108014597, +E 108014597, +E 108014592, +E 108014597, +E 108014590, +E 108014613, +E 108014611, +E 108014596], +E [108053469, +E 108053469, +E 108053469, +E 108053453, +E 108053469, +E 108053443, +E 108053435, +E 108053469, +E 108053426, +E 108053462]]] -tests/test_utils.py: 1 warning -tests/test_ref.py: 11 warnings - /home/runner/work/gget/gget/gget/utils.py:998: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. - for subsoup in soup.body.findAll("a"): +tests/from_json.py:82: AssertionError +------------------------------ Captured log call ------------------------------- +WARNING gget.utils:gget_info.py:226 UniProt server request for ID 'EnsMUSG00000000001' returned the following error: +('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer')) +____________________ TestArchs4.test_archs4_tissue_ensembl _____________________ -tests/test_ref.py: 39 warnings - /home/runner/work/gget/gget/gget/gget_ref.py:49: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. - links = [stuff.text.strip() for stuff in soup.findAll("td")] +self = -tests/test_ref.py: 7 warnings -tests/test_search.py: 19 warnings - /home/runner/work/gget/gget/gget/utils.py:922: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. - for subsoup in soup.body.findAll("a"): + def assert_equal(self: unittest.TestCase): + test = name + expected_result = td[test]["expected_result"] +> result_to_test = do_call(func, td[test]["args"]) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -tests/test_ref.py::TestRef::test_ref_ftp -tests/test_ref.py::TestRef::test_ref - /home/runner/work/gget/gget/gget/gget_ref.py:325: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. - links = [stuff.text.strip() for stuff in soup.findAll("td")] +tests/from_json.py:68: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +tests/from_json.py:60: in do_call + return func(**args) + ^^^^^^^^^^^^ +gget/gget_archs4.py:204: in archs4 + tissue_exp_df = tissue_exp_df.drop(["color"], axis=1) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/frame.py:6300: in drop + return super().drop( +../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/generic.py:4644: in drop + obj = obj._drop_axis(labels, axis, level=level, errors=errors) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/generic.py:4686: in _drop_axis + new_axis = axis.drop(labels, errors=errors) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ -tests/test_mutate.py: 29 warnings - /home/runner/work/gget/gget/gget/gget_mutate.py:667: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract. - mask = mutations[mut_column].str.contains(combined_pattern) +self = Index(['
'], dtype='str'), labels = array(['color'], dtype=object) +errors = 'raise' + + def drop( + self, + labels: Index | np.ndarray | Iterable[Hashable], + errors: IgnoreRaise = "raise", + ) -> Index: + """ + Make new Index with passed list of labels deleted. + + Parameters + ---------- + labels : array-like or scalar + Array-like object or a scalar value, representing the labels to be removed + from the Index. + errors : {'ignore', 'raise'}, default 'raise' + If 'ignore', suppress error and existing labels are dropped. + + Returns + ------- + Index + Will be same type as self, except for RangeIndex. + + Raises + ------ + KeyError + If not all of the labels are found in the selected axis + + See Also + -------- + Index.dropna : Return Index without NA/NaN values. + Index.drop_duplicates : Return Index with duplicate values removed. + + Examples + -------- + >>> idx = pd.Index(["a", "b", "c"]) + >>> idx.drop(["a"]) + Index(['b', 'c'], dtype='str') + """ + if not isinstance(labels, Index): + # avoid materializing e.g. RangeIndex + arr_dtype = "object" if self.dtype == "object" else None + labels = com.index_labels_to_array(labels, dtype=arr_dtype) + + indexer = self.get_indexer_for(labels) + mask = indexer == -1 + if mask.any(): + if errors != "ignore": +> raise KeyError(f"{labels[mask].tolist()} not found in axis") +E KeyError: "['color'] not found in axis" + +../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/indexes/base.py:7268: KeyError +------------------------------ Captured log call ------------------------------- +INFO gget.utils:gget_archs4.py:171 Fetching the tissue expression atlas of PHF14 from mouse ARCHS4 data. +________________________ TestArchs4.test_archs4_tissue _________________________ + +self = + + def assert_equal(self: unittest.TestCase): + test = name + expected_result = td[test]["expected_result"] +> result_to_test = do_call(func, td[test]["args"]) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +tests/from_json.py:68: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +tests/from_json.py:60: in do_call + return func(**args) + ^^^^^^^^^^^^ +gget/gget_archs4.py:204: in archs4 + tissue_exp_df = tissue_exp_df.drop(["color"], axis=1) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/frame.py:6300: in drop + return super().drop( +../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/generic.py:4644: in drop + obj = obj._drop_axis(labels, axis, level=level, errors=errors) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/generic.py:4686: in _drop_axis + new_axis = axis.drop(labels, errors=errors) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = Index(['
'], dtype='str'), labels = array(['color'], dtype=object) +errors = 'raise' + + def drop( + self, + labels: Index | np.ndarray | Iterable[Hashable], + errors: IgnoreRaise = "raise", + ) -> Index: + """ + Make new Index with passed list of labels deleted. + + Parameters + ---------- + labels : array-like or scalar + Array-like object or a scalar value, representing the labels to be removed + from the Index. + errors : {'ignore', 'raise'}, default 'raise' + If 'ignore', suppress error and existing labels are dropped. + + Returns + ------- + Index + Will be same type as self, except for RangeIndex. + + Raises + ------ + KeyError + If not all of the labels are found in the selected axis + + See Also + -------- + Index.dropna : Return Index without NA/NaN values. + Index.drop_duplicates : Return Index with duplicate values removed. + + Examples + -------- + >>> idx = pd.Index(["a", "b", "c"]) + >>> idx.drop(["a"]) + Index(['b', 'c'], dtype='str') + """ + if not isinstance(labels, Index): + # avoid materializing e.g. RangeIndex + arr_dtype = "object" if self.dtype == "object" else None + labels = com.index_labels_to_array(labels, dtype=arr_dtype) + + indexer = self.get_indexer_for(labels) + mask = indexer == -1 + if mask.any(): + if errors != "ignore": +> raise KeyError(f"{labels[mask].tolist()} not found in axis") +E KeyError: "['color'] not found in axis" + +../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/indexes/base.py:7268: KeyError +------------------------------ Captured log call ------------------------------- +INFO gget.utils:gget_archs4.py:171 Fetching the tissue expression atlas of FUNDC1 from human ARCHS4 data. +______________________ TestArchs4.test_archs4_tissue_json ______________________ + +self = + + def assert_equal(self: unittest.TestCase): + test = name + expected_result = td[test]["expected_result"] +> result_to_test = do_call(func, td[test]["args"]) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +tests/from_json.py:68: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +tests/from_json.py:60: in do_call + return func(**args) + ^^^^^^^^^^^^ +gget/gget_archs4.py:204: in archs4 + tissue_exp_df = tissue_exp_df.drop(["color"], axis=1) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/frame.py:6300: in drop + return super().drop( +../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/generic.py:4644: in drop + obj = obj._drop_axis(labels, axis, level=level, errors=errors) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/generic.py:4686: in _drop_axis + new_axis = axis.drop(labels, errors=errors) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = Index(['
'], dtype='str'), labels = array(['color'], dtype=object) +errors = 'raise' + + def drop( + self, + labels: Index | np.ndarray | Iterable[Hashable], + errors: IgnoreRaise = "raise", + ) -> Index: + """ + Make new Index with passed list of labels deleted. + + Parameters + ---------- + labels : array-like or scalar + Array-like object or a scalar value, representing the labels to be removed + from the Index. + errors : {'ignore', 'raise'}, default 'raise' + If 'ignore', suppress error and existing labels are dropped. + + Returns + ------- + Index + Will be same type as self, except for RangeIndex. + + Raises + ------ + KeyError + If not all of the labels are found in the selected axis + + See Also + -------- + Index.dropna : Return Index without NA/NaN values. + Index.drop_duplicates : Return Index with duplicate values removed. + + Examples + -------- + >>> idx = pd.Index(["a", "b", "c"]) + >>> idx.drop(["a"]) + Index(['b', 'c'], dtype='str') + """ + if not isinstance(labels, Index): + # avoid materializing e.g. RangeIndex + arr_dtype = "object" if self.dtype == "object" else None + labels = com.index_labels_to_array(labels, dtype=arr_dtype) + + indexer = self.get_indexer_for(labels) + mask = indexer == -1 + if mask.any(): + if errors != "ignore": +> raise KeyError(f"{labels[mask].tolist()} not found in axis") +E KeyError: "['color'] not found in axis" + +../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/indexes/base.py:7268: KeyError +------------------------------ Captured log call ------------------------------- +INFO gget.utils:gget_archs4.py:171 Fetching the tissue expression atlas of FUNDC1 from human ARCHS4 data. +_____________________ TestArchs4.test_archs4_tissue_mouse ______________________ + +self = + + def assert_equal(self: unittest.TestCase): + test = name + expected_result = td[test]["expected_result"] +> result_to_test = do_call(func, td[test]["args"]) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +tests/from_json.py:68: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +tests/from_json.py:60: in do_call + return func(**args) + ^^^^^^^^^^^^ +gget/gget_archs4.py:204: in archs4 + tissue_exp_df = tissue_exp_df.drop(["color"], axis=1) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/frame.py:6300: in drop + return super().drop( +../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/generic.py:4644: in drop + obj = obj._drop_axis(labels, axis, level=level, errors=errors) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/generic.py:4686: in _drop_axis + new_axis = axis.drop(labels, errors=errors) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +self = Index(['
'], dtype='str'), labels = array(['color'], dtype=object) +errors = 'raise' + + def drop( + self, + labels: Index | np.ndarray | Iterable[Hashable], + errors: IgnoreRaise = "raise", + ) -> Index: + """ + Make new Index with passed list of labels deleted. + + Parameters + ---------- + labels : array-like or scalar + Array-like object or a scalar value, representing the labels to be removed + from the Index. + errors : {'ignore', 'raise'}, default 'raise' + If 'ignore', suppress error and existing labels are dropped. + + Returns + ------- + Index + Will be same type as self, except for RangeIndex. + + Raises + ------ + KeyError + If not all of the labels are found in the selected axis + + See Also + -------- + Index.dropna : Return Index without NA/NaN values. + Index.drop_duplicates : Return Index with duplicate values removed. + + Examples + -------- + >>> idx = pd.Index(["a", "b", "c"]) + >>> idx.drop(["a"]) + Index(['b', 'c'], dtype='str') + """ + if not isinstance(labels, Index): + # avoid materializing e.g. RangeIndex + arr_dtype = "object" if self.dtype == "object" else None + labels = com.index_labels_to_array(labels, dtype=arr_dtype) + + indexer = self.get_indexer_for(labels) + mask = indexer == -1 + if mask.any(): + if errors != "ignore": +> raise KeyError(f"{labels[mask].tolist()} not found in axis") +E KeyError: "['color'] not found in axis" + +../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/indexes/base.py:7268: KeyError +------------------------------ Captured log call ------------------------------- +INFO gget.utils:gget_archs4.py:171 Fetching the tissue expression atlas of FUNDC1 from mouse ARCHS4 data. +____________________ TestArchs4.test_archs4_bad_gene_tissue ____________________ + +self = + + def assert_none(self: unittest.TestCase): + test = name + expected_result = td[test].get("expected_result", None) + msg = td[test].get("msg", None) + expected_log = td[test].get("expected_log", None) + + self.assertIsNone( + expected_result, + "assert_none test must not have a non-null expected_result key.", + ) + + if expected_log is not None: + # Captures logs across all loggers, so the function under test + # cannot silently return None for the wrong reason (e.g. a + # rate-limited HTML response from an upstream API). + with self.assertLogs(level=logging.DEBUG) as captured: + result_to_test = do_call(func, td[test]["args"]) + joined = "\n".join(captured.output) + self.assertIn( + expected_log, + joined, + msg=(f"Expected log substring {expected_log!r} not found. Captured: {joined}"), + ) + else: +> result_to_test = do_call(func, td[test]["args"]) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +tests/from_json.py:126: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +tests/from_json.py:60: in do_call + return func(**args) + ^^^^^^^^^^^^ +gget/gget_archs4.py:204: in archs4 + tissue_exp_df = tissue_exp_df.drop(["color"], axis=1) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/frame.py:6300: in drop + return super().drop( +../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/generic.py:4644: in drop + obj = obj._drop_axis(labels, axis, level=level, errors=errors) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/generic.py:4686: in _drop_axis + new_axis = axis.drop(labels, errors=errors) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = Index(['
'], dtype='str'), labels = array(['color'], dtype=object) +errors = 'raise' + + def drop( + self, + labels: Index | np.ndarray | Iterable[Hashable], + errors: IgnoreRaise = "raise", + ) -> Index: + """ + Make new Index with passed list of labels deleted. + + Parameters + ---------- + labels : array-like or scalar + Array-like object or a scalar value, representing the labels to be removed + from the Index. + errors : {'ignore', 'raise'}, default 'raise' + If 'ignore', suppress error and existing labels are dropped. + + Returns + ------- + Index + Will be same type as self, except for RangeIndex. + + Raises + ------ + KeyError + If not all of the labels are found in the selected axis + + See Also + -------- + Index.dropna : Return Index without NA/NaN values. + Index.drop_duplicates : Return Index with duplicate values removed. + + Examples + -------- + >>> idx = pd.Index(["a", "b", "c"]) + >>> idx.drop(["a"]) + Index(['b', 'c'], dtype='str') + """ + if not isinstance(labels, Index): + # avoid materializing e.g. RangeIndex + arr_dtype = "object" if self.dtype == "object" else None + labels = com.index_labels_to_array(labels, dtype=arr_dtype) + + indexer = self.get_indexer_for(labels) + mask = indexer == -1 + if mask.any(): + if errors != "ignore": +> raise KeyError(f"{labels[mask].tolist()} not found in axis") +E KeyError: "['color'] not found in axis" + +../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/indexes/base.py:7268: KeyError +------------------------------ Captured log call ------------------------------- +INFO gget.utils:gget_archs4.py:171 Fetching the tissue expression atlas of BANANA from mouse ARCHS4 data. +=============================== warnings summary =============================== tests/test_cbio.py::TestCbioSearch::test_cbio_search tests/test_cbio.py::TestCbioSearch::test_cbio_search /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/swagger_spec_validator/validator12.py:18: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. @@ -486,31 +1008,186 @@ tests/test_cbio.py: 16 warnings /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/bravado_core/model.py:888: DeprecationWarning: jsonschema.RefResolver.in_scope is deprecated and will be removed in a future release. with spec.resolver.in_scope(additional_uri): +tests/test_mutate.py: 29 warnings + /home/runner/work/gget/gget/gget/gget_mutate.py:667: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract. + mask = mutations[mut_column].str.contains(combined_pattern) + +tests/test_search.py::TestSearch::test_search_gene_bad_species +tests/test_search.py::TestSearch::test_search_release +tests/test_search.py::TestSearch::test_search_transcript_two_sw_or +tests/test_utils.py::TestUtils::test_search_species_options + /home/runner/work/gget/gget/gget/utils.py:899: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. + for subsoup in soup.body.findAll("a"): + +tests/test_search.py::TestSearch::test_search_gene_bad_species +tests/test_search.py::TestSearch::test_search_gene_bad_species +tests/test_search.py::TestSearch::test_search_gene_bad_species +tests/test_search.py::TestSearch::test_search_gene_bad_species +tests/test_utils.py::TestUtils::test_search_iv_species_options +tests/test_utils.py::TestUtils::test_search_iv_species_options +tests/test_utils.py::TestUtils::test_search_iv_species_options +tests/test_utils.py::TestUtils::test_search_iv_species_options + /home/runner/work/gget/gget/gget/utils.py:883: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. + for subsoup in soup.body.findAll("a"): + tests/test_search.py::TestSearch::test_search_transcript_one_sw -tests/test_search.py::TestSearch::test_search_transcript_two_sw_and tests/test_search.py::TestSearch::test_search_gene_two_sw_limit +tests/test_search.py::TestSearch::test_search_transcript_two_sw_and tests/test_search.py::TestSearch::test_search_transcript_two_sw_or - /home/runner/work/gget/gget/gget/gget_search.py:270: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy. + /home/runner/work/gget/gget/gget/gget_search.py:302: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy. df_temp = pd.read_sql(query, con=db_connection) +tests/test_search.py: 19 warnings +tests/test_ref.py: 7 warnings + /home/runner/work/gget/gget/gget/utils.py:922: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. + for subsoup in soup.body.findAll("a"): + tests/test_search.py: 10 warnings - /home/runner/work/gget/gget/gget/gget_search.py:235: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy. + /home/runner/work/gget/gget/gget/gget_search.py:267: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy. df_temp = pd.read_sql(query, con=db_connection) +tests/test_utils.py: 1 warning +tests/test_ref.py: 11 warnings + /home/runner/work/gget/gget/gget/utils.py:998: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. + for subsoup in soup.body.findAll("a"): + +tests/test_utils.py: 4 warnings +tests/test_ref.py: 24 warnings + /home/runner/work/gget/gget/gget/utils.py:975: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. + for subsoup in soup.body.findAll("a"): + +tests/test_ref.py: 39 warnings + /home/runner/work/gget/gget/gget/gget_ref.py:49: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. + links = [stuff.text.strip() for stuff in soup.findAll("td")] + +tests/test_ref.py::TestRef::test_ref_ftp +tests/test_ref.py::TestRef::test_ref + /home/runner/work/gget/gget/gget/gget_ref.py:325: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. + links = [stuff.text.strip() for stuff in soup.findAll("td")] + -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html ============================= slowest 10 durations ============================= -179.39s call tests/test_virus.py::TestVirus::test_virus_integer_virus_id -138.24s call tests/test_virus.py::TestVirus::test_virus_with_source_database_filter -83.66s call tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter -80.13s call tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter -73.85s call tests/test_blast.py::TestBlast::test_blast_nt -58.81s call tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter -27.41s call tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters -25.96s call tests/test_virus.py::TestVirus::test_virus_with_annotated_filter -22.42s call tests/test_virus.py::TestVirus::test_virus_with_length_filters -21.84s call tests/test_virus.py::TestVirus::test_virus_host_filter_verification +180.57s call tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter +179.35s call tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter +132.16s call tests/test_virus.py::TestVirus::test_virus_integer_virus_id +129.73s call tests/test_virus.py::TestVirus::test_virus_with_source_database_filter +78.87s call tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters +74.43s call tests/test_blast.py::TestBlast::test_blast_nt +66.64s call tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter +37.93s call tests/test_search.py::TestSearch::test_search_gene_two_sw_limit +26.29s call tests/test_virus.py::TestVirus::test_virus_with_annotated_filter +25.79s call tests/test_virus.py::TestVirus::test_virus_host_filter_verification =========================== short test summary info ============================ -SKIPPED [1] tests/test_cellxgene.py:55: cellxgene-census is not installed -SKIPPED [1] tests/test_cellxgene.py:45: cellxgene-census is not installed SKIPPED [1] tests/test_cellxgene.py:65: cellxgene-census is not installed -========== 399 passed, 3 skipped, 185 warnings in 1085.37s (0:18:05) =========== +SKIPPED [1] tests/test_cellxgene.py:45: cellxgene-census is not installed +SKIPPED [1] tests/test_cellxgene.py:55: cellxgene-census is not installed +FAILED tests/test_info.py::TestInfo::test_info_gene - AssertionError: Lists differ: [['En[17 chars]6', 'mus_musculus', 'GRCm39', 'Gnai3', 'G prot[1000 chars]62]]] != [['En[17 chars]6', 'Q9DC51', '14679', 'mus_musculus', 'GRCm39[3072 chars]62]]] + +First differing element 0: +['Ens[16 chars]6', 'mus_musculus', 'GRCm39', 'Gnai3', 'G prot[999 chars]462]] +['Ens[16 chars]6', 'Q9DC51', '14679', 'mus_musculus', 'GRCm39[3071 chars]462]] + + [['EnsMUSG00000000001.6', ++ 'Q9DC51', ++ '14679', + 'mus_musculus', + 'GRCm39', + 'Gnai3', ++ 'Gnai3', ++ ['Galphai3', 'Gnai-3', 'Hg1a'], ++ 'Guanine nucleotide-binding protein G(i) subunit alpha-3', + 'G protein subunit alpha i3 [Source:MGI Symbol;Acc:MGI:95773]', ++ 'Heterotrimeric guanine nucleotide-binding proteins (G proteins) function as ' ++ 'transducers downstream of G protein-coupled receptors (GPCRs) in numerous ' ++ 'signaling cascades. The alpha chain contains the guanine nucleotide binding ' ++ 'site and alternates between an active, GTP-bound state and an inactive, ' ++ 'GDP-bound state. Signaling by an activated GPCR promotes GDP release and ' ++ 'GTP binding. The alpha subunit has a low GTPase activity that converts ' ++ 'bound GTP to GDP, thereby terminating the signal (By similarity). Both GDP ' ++ 'release and GTP hydrolysis are modulated by numerous regulatory proteins ' ++ '(By similarity). Signaling is mediated via effector proteins, such as ' ++ 'adenylate cyclase. Inhibits adenylate cyclase activity, leading to ' ++ 'decreased intracellular cAMP levels (By similarity). Stimulates the ' ++ 'activity of receptor-regulated K(+) channels (By similarity). The active ' ++ 'GTP-bound form prevents the association of RGS14 with centrosomes and is ' ++ 'required for the translocation of RGS14 from the cytoplasm to the plasma ' ++ 'membrane. May play a role in cell division (By similarity). The active ' ++ 'GTP-bound form activates the calcium permeant TRPC5 ion channels (By ' ++ 'similarity)', ++ 'Predicted to enable several functions, including G-protein ' ++ 'beta/gamma-subunit complex binding activity; GDP binding activity; and ' ++ 'GTPase activating protein binding activity. Predicted to be involved in ' ++ 'several processes, including G protein-coupled receptor signaling pathway; ' ++ 'positive regulation of metabolic process; and positive regulation of ' ++ 'vascular associated smooth muscle cell proliferation. Predicted to act ' ++ 'upstream of or within G protein-coupled receptor signaling pathway. Located ' ++ 'in Golgi apparatus. Is expressed in early conceptus; inner ear; and oocyte. ' ++ 'Orthologous to human GNAI3 (G protein subunit alpha i3). [provided by ' ++ 'Alliance of Genome Resources, Apr 2025]', ++ ['Cytoplasm', ++ 'Cell membrane', ++ 'Cytoplasm, cytoskeleton, microtubule organizing center, centrosome'], + 'Gene', + 'protein_coding', + 'ENSMUST00000000001.6', + '3', + -1, + 108014590, + 108053469, + ['ENSMUST00000000001.6', + 'ENSMUST00000535596.1', + 'ENSMUST00000535597.1', + 'ENSMUST00000535598.1', + 'ENSMUST00000535599.1', + 'ENSMUST00000535600.1', + 'ENSMUST00000535601.1', + 'ENSMUST00000535602.1', + 'ENSMUST00000535603.1', + 'ENSMUST00000558104.1'], + ['protein_coding', + 'protein_coding', + 'protein_coding', + 'nonsense_mediated_decay', + 'protein_coding', + 'nonsense_mediated_decay', + 'nonsense_mediated_decay', + 'protein_coding', + 'nonsense_mediated_decay', + 'nonsense_mediated_decay'], + ['Gnai3-201', + 'Gnai3-202', + 'Gnai3-203', + 'Gnai3-204', + 'Gnai3-205', + 'Gnai3-206', + 'Gnai3-207', + 'Gnai3-208', + 'Gnai3-209', + 'Gnai3-210'], + [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1], + [108014596, + 108014596, + 108014597, + 108014597, + 108014592, + 108014597, + 108014590, + 108014613, + 108014611, + 108014596], + [108053469, + 108053469, + 108053469, + 108053453, + 108053469, + 108053443, + 108053435, + 108053469, + 108053426, + 108053462]]] +FAILED tests/test_archs4.py::TestArchs4::test_archs4_tissue_ensembl - KeyError: "['color'] not found in axis" +FAILED tests/test_archs4.py::TestArchs4::test_archs4_tissue - KeyError: "['color'] not found in axis" +FAILED tests/test_archs4.py::TestArchs4::test_archs4_tissue_json - KeyError: "['color'] not found in axis" +FAILED tests/test_archs4.py::TestArchs4::test_archs4_tissue_mouse - KeyError: "['color'] not found in axis" +FAILED tests/test_archs4.py::TestArchs4::test_archs4_bad_gene_tissue - KeyError: "['color'] not found in axis" +===== 6 failed, 393 passed, 3 skipped, 185 warnings in 1405.07s (0:23:25) ====== From 5506537f52e3848045731079d3ea344f3c13df67 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 23 Jun 2026 15:32:25 +0000 Subject: [PATCH 10/34] CI: update pytest results (dev) --- .github/badges/tests.json | 2 +- tests/pytest_results.txt | 1585 +++++++++++-------------------------- 2 files changed, 455 insertions(+), 1132 deletions(-) diff --git a/.github/badges/tests.json b/.github/badges/tests.json index a73d23f37..a7cade404 100644 --- a/.github/badges/tests.json +++ b/.github/badges/tests.json @@ -1 +1 @@ -{"schemaVersion": 1, "label": "tests", "message": "393/402 passing", "color": "yellow"} +{"schemaVersion": 1, "label": "tests", "message": "399/402 passing", "color": "brightgreen"} diff --git a/tests/pytest_results.txt b/tests/pytest_results.txt index eb6f84af5..0097f867c 100644 --- a/tests/pytest_results.txt +++ b/tests/pytest_results.txt @@ -1,1028 +1,430 @@ -Pytest results (Python 3.14) - 2026-06-22T21:02:57Z +Pytest results (Python 3.14) - 2026-06-23T15:11:59Z ============================= test session starts ============================== platform linux -- Python 3.14.6, pytest-9.1.1, pluggy-1.6.0 -- /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/bin/python3 cachedir: .pytest_cache -Using --randomly-seed=680721631 +Using --randomly-seed=3533476696 rootdir: /home/runner/work/gget/gget configfile: pyproject.toml testpaths: tests plugins: randomly-3.16.0, rerunfailures-14.0, mock-3.15.1, cov-7.1.0, xdist-3.8.0 collecting ... collected 402 items -tests/test_gpt.py::TestGpt::test_gpt PASSED [ 0%] -tests/test_elm.py::TestELM::test_elm_uniprot_aminoacidseq PASSED [ 0%] -tests/test_elm.py::TestELM::test_elm_uniprot_id_in_elm PASSED [ 0%] -tests/test_elm.py::TestELM::test_elm_uniprot_id_new PASSED [ 0%] -tests/test_8cube.py::TestGeneExpression::test_gene_expression_basic PASSED [ 1%] -tests/test_8cube.py::TestSpecificity::test_specificity_basic PASSED [ 1%] -tests/test_8cube.py::TestPsiBlock::test_psi_block_basic PASSED [ 1%] -tests/test_cbio.py::TestCbio::test_cbio_download_partially_existing_files PASSED [ 1%] -tests/test_cbio.py::TestCbio::test_error_cbio_download PASSED [ 2%] -tests/test_cbio.py::TestCbio::test_cbio_download PASSED [ 2%] -tests/test_cbio.py::TestCbioSearch::test_cbio_search PASSED [ 2%] -tests/test_mutate.py::TestMutate::test_ambiguous_mutation PASSED [ 2%] -tests/test_mutate.py::TestMutate::test_posttranslational_mutation PASSED [ 3%] -tests/test_mutate.py::TestMutate::test_multi_deletion PASSED [ 3%] -tests/test_mutate.py::TestMutate::test_multi_dup PASSED [ 3%] -tests/test_mutate.py::TestMutate::test_list_of_mutations PASSED [ 3%] -tests/test_mutate.py::TestMutate::test_multi_insertion PASSED [ 4%] -tests/test_mutate.py::TestMutate::test_single_deletion_with_right_repeats PASSED [ 4%] -tests/test_mutate.py::TestMutate::test_multi_delins PASSED [ 4%] -tests/test_mutate.py::TestMutate::test_single_substitution_near_left_end PASSED [ 4%] -tests/test_mutate.py::TestMutate::test_large_k PASSED [ 5%] -tests/test_mutate.py::TestMutate::test_single_insertion PASSED [ 5%] -tests/test_mutate.py::TestMutate::test_multi_insertion_with_left_repeats PASSED [ 5%] -tests/test_mutate.py::TestMutate::test_inversion_with_overlaps PASSED [ 5%] -tests/test_mutate.py::TestMutate::test_intron_mutation_minus PASSED [ 6%] -tests/test_mutate.py::TestMutate::test_single_delins PASSED [ 6%] -tests/test_mutate.py::TestMutate::test_single_substitution_near_right_end PASSED [ 6%] -tests/test_mutate.py::TestMutate::test_multi_delins_with_true_right_repeats PASSED [ 6%] -tests/test_mutate.py::TestMutate::test_intron_mutation_plus PASSED [ 7%] -tests/test_mutate.py::TestMutate::test_multi_delins_with_true_left_repeats PASSED [ 7%] -tests/test_mutate.py::TestMutate::test_single_dup PASSED [ 7%] -tests/test_mutate.py::TestMutate::test_multi_delins_with_psuedo_left_repeats PASSED [ 7%] -tests/test_mutate.py::TestMutate::test_single_deletion PASSED [ 8%] -tests/test_mutate.py::TestMutate::test_single_substitution PASSED [ 8%] -tests/test_mutate.py::TestMutate::test_index_error PASSED [ 8%] -tests/test_mutate.py::TestMutate::test_multi_deletion_with_right_repeats PASSED [ 8%] -tests/test_mutate.py::TestMutate::test_single_deletion_with_left_repeats PASSED [ 9%] -tests/test_mutate.py::TestMutate::test_uncertain_mutation PASSED [ 9%] -tests/test_mutate.py::test_csv_of_mutations PASSED [ 9%] -tests/test_mutate.py::test_mismatch_error PASSED [ 9%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap_filter PASSED [ 10%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_drugs_invalid_filter PASSED [ 10%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_no_limit PASSED [ 10%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_diseases PASSED [ 10%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_diseases_filter PASSED [ 11%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_simple_filter PASSED [ 11%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_expression PASSED [ 11%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_tractability PASSED [ 11%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions PASSED [ 12%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_pharmacogenetics PASSED [ 12%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_limit PASSED [ 12%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_nonexistent_id PASSED [ 12%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_expression_no_limit PASSED [ 13%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap PASSED [ 13%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_drugs PASSED [ 13%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_resource PASSED [ 13%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets PASSED [ 14%] -tests/test_blat.py::TestBlat::test_blat_aa_protein PASSED [ 14%] -tests/test_blat.py::TestBlat::test_blat_nt_DNA PASSED [ 14%] -tests/test_blat.py::TestBlat::test_blat_aa PASSED [ 14%] -tests/test_blat.py::TestBlat::test_blat_aa_RNA PASSED [ 15%] -tests/test_blat.py::TestBlat::test_blat_nt_transDNA PASSED [ 15%] -tests/test_blat.py::TestBlat::test_blat_bad_txt PASSED [ 15%] -tests/test_blat.py::TestBlat::test_blat_nt_RNA PASSED [ 15%] -tests/test_blat.py::TestBlat::test_blat_bad_fileformat PASSED [ 16%] -tests/test_blat.py::TestBlat::test_blat_bad_seqtype PASSED [ 16%] -tests/test_blat.py::TestBlat::test_blat_shortseq PASSED [ 16%] -tests/test_blat.py::TestBlat::test_blat_nt_protein PASSED [ 16%] -tests/test_blat.py::TestBlat::test_blat_nt PASSED [ 17%] -tests/test_blat.py::TestBlat::test_blat_nt_fasta PASSED [ 17%] -tests/test_blat.py::TestBlat::test_blat_bad_fasta PASSED [ 17%] -tests/test_blat.py::TestBlat::test_blat_nt_txt PASSED [ 17%] -tests/test_blat.py::TestBlat::test_blat_nt_json PASSED [ 18%] -tests/test_blat.py::TestBlat::test_blat_bad_assembly PASSED [ 18%] -tests/test_cosmic.py::TestCosmicWorkflow::test_cosmic_defaults PASSED [ 18%] -tests/test_info.py::TestInfo::test_info_WB_transcript PASSED [ 18%] -tests/test_info.py::TestInfo::test_info_ncbifalse_uniprotfalse PASSED [ 19%] -tests/test_info.py::TestInfo::test_info_exon PASSED [ 19%] -tests/test_info.py::TestInfo::test_info_gene_list_non_model PASSED [ 19%] -tests/test_info.py::TestInfo::test_info_transcript PASSED [ 19%] -tests/test_info.py::TestInfo::test_info_gene FAILED [ 20%] -tests/test_info.py::TestInfo::test_info_ncbitrue_uniprotfalse PASSED [ 20%] -tests/test_info.py::TestInfo::test_info_ncbifalse_uniprottrue PASSED [ 20%] -tests/test_info.py::TestInfo::test_info_mix PASSED [ 20%] -tests/test_search.py::TestSearch::test_search_gene_bad_species PASSED [ 21%] -tests/test_search.py::TestSearch::test_search_transcript_one_sw PASSED [ 21%] -tests/test_search.py::TestSearch::test_search_plant PASSED [ 21%] -tests/test_search.py::TestSearch::test_search_gene_one_sw PASSED [ 21%] -tests/test_search.py::TestSearch::test_search_db PASSED [ 22%] -tests/test_search.py::TestSearch::test_search_release PASSED [ 22%] -tests/test_search.py::TestSearch::test_search_transcript_bad_andor PASSED [ 22%] -tests/test_search.py::TestSearch::test_search_gene_one_sw_limit PASSED [ 22%] -tests/test_search.py::TestSearch::test_search_plant_db PASSED [ 23%] -tests/test_search.py::TestSearch::test_search_gene_two_sw_limit PASSED [ 23%] -tests/test_search.py::TestSearch::test_search_gene_two_sw_and PASSED [ 23%] -tests/test_search.py::TestSearch::test_search_transcript_two_sw_and PASSED [ 23%] -tests/test_search.py::TestSearch::test_search_gene_two_sw_or PASSED [ 24%] -tests/test_search.py::TestSearch::test_search_gene_one_sw_json PASSED [ 24%] -tests/test_search.py::TestSearch::test_search_octopus PASSED [ 24%] -tests/test_search.py::TestSearch::test_search_transcript_bad_species PASSED [ 24%] -tests/test_search.py::TestSearch::test_search_transcript_two_sw_or PASSED [ 25%] -tests/test_search.py::TestSearch::test_search_gene_bad_andor PASSED [ 25%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_max PASSED [ 25%] -tests/test_virus.py::TestVirus::test_parse_accession_input_nonexistent_file_raises_error PASSED [ 25%] -tests/test_virus.py::TestVirus::test_save_partial_metadata_empty PASSED [ 26%] -tests/test_virus.py::TestVirus::test_merge_metadata_csvs_missing_standard_file PASSED [ 26%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_geographic_location PASSED [ 26%] -tests/test_virus.py::TestVirus::test_validate_datasets_binary_nonexistent PASSED [ 26%] -tests/test_virus.py::TestVirus::test_check_min_max_invalid_raises PASSED [ 27%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_nuc_completeness_partial PASSED [ 27%] -tests/test_virus.py::TestVirus::test_virus_with_host_filter PASSED [ 27%] -tests/test_virus.py::TestVirus::test_filter_cached_complete_only PASSED [ 27%] -tests/test_virus.py::TestVirus::test_virus_completeness_filter_verification PASSED [ 28%] -tests/test_virus.py::TestVirus::test_parse_accession_input_from_file PASSED [ 28%] -tests/test_virus.py::TestVirus::test_is_sars_cov2_query_negative PASSED [ 28%] -tests/test_virus.py::TestVirus::test_virus_host_filter_verification PASSED [ 28%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_env_source PASSED [ 29%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_no_parentheses_returns_none PASSED [ 29%] -tests/test_virus.py::TestVirus::test_deduplicate_empty_baseline PASSED [ 29%] -tests/test_virus.py::TestVirus::test_virus_relationship_check_counts_match PASSED [ 29%] -tests/test_virus.py::TestVirus::test_retry_helper_exponential_backoff_timing PASSED [ 30%] -tests/test_virus.py::TestVirus::test_retry_helper_success_after_retry PASSED [ 30%] -tests/test_virus.py::TestVirus::test_deduplicate_metadata_against_baseline PASSED [ 30%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_min_seq_length PASSED [ 30%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_name PASSED [ 31%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_empty_returns_none PASSED [ 31%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_true PASSED [ 31%] -tests/test_virus.py::TestVirus::test_retry_helper_non_retryable_exception PASSED [ 31%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_negative PASSED [ 32%] -tests/test_virus.py::TestVirus::test_genbank_xml_to_csv_basic PASSED [ 32%] -tests/test_virus.py::TestVirus::test_virus_multi_accession_space_separated PASSED [ 32%] -tests/test_virus.py::TestVirus::test_parse_accession_input_space_separated PASSED [ 32%] -tests/test_virus.py::TestVirus::test_merge_baseline_with_new_csv PASSED [ 33%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_collection_date_range PASSED [ 33%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_type PASSED [ 33%] -tests/test_virus.py::TestVirus::test_deduplicate_all_existing PASSED [ 33%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_already_correct_returns_none PASSED [ 34%] -tests/test_virus.py::TestVirus::test_parse_genbank_xml_empty_set PASSED [ 34%] -tests/test_virus.py::TestVirus::test_virus_with_collection_date_filters PASSED [ 34%] -tests/test_virus.py::TestVirus::test_local_name_without_namespace PASSED [ 34%] -tests/test_virus.py::TestVirus::test_save_command_summary_with_error PASSED [ 35%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_has_proteins PASSED [ 35%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_institution PASSED [ 35%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_metadata_type PASSED [ 35%] -tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_negative PASSED [ 36%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_empty_raises PASSED [ 36%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_space_before_virus PASSED [ 36%] -tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_basic PASSED [ 36%] -tests/test_virus.py::TestVirus::test_is_sars_cov2_query_accession_mode PASSED [ 37%] -tests/test_virus.py::TestVirus::test_parse_genbank_xml_invalid_raises PASSED [ 37%] -tests/test_virus.py::TestVirus::test_virus_with_multiple_filters PASSED [ 37%] -tests/test_virus.py::TestVirus::test_get_datasets_path_returns_valid_path PASSED [ 37%] -tests/test_virus.py::TestVirus::test_parse_date_various_formats PASSED [ 38%] -tests/test_virus.py::TestVirus::test_virus_integer_virus_id PASSED [ 38%] -tests/test_virus.py::TestVirus::test_parse_date_invalid_raises PASSED [ 38%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_basic PASSED [ 38%] -tests/test_virus.py::TestVirus::test_merge_metadata_csvs_fills_missing PASSED [ 39%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_seq_length PASSED [ 39%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_min PASSED [ 39%] -tests/test_virus.py::TestVirus::test_merge_baseline_with_new_empty_new PASSED [ 39%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_min_comparison PASSED [ 40%] -tests/test_virus.py::TestVirus::test_filter_cached_annotated PASSED [ 40%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_protein_count PASSED [ 40%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_zero PASSED [ 40%] -tests/test_virus.py::TestVirus::test_write_fasta_record_long_sequence_wraps PASSED [ 41%] -tests/test_virus.py::TestVirus::test_parse_accession_input_single PASSED [ 41%] -tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter PASSED [ 41%] -tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters PASSED [ 41%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_host PASSED [ 42%] -tests/test_virus.py::TestVirus::test_check_min_max_equal PASSED [ 42%] -tests/test_virus.py::TestVirus::test_virus_invalid_is_accession_type PASSED [ 42%] -tests/test_virus.py::TestVirus::test_stream_copy_fasta_all_records PASSED [ 42%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_min_gene_count PASSED [ 43%] -tests/test_virus.py::TestVirus::test_merge_metadata_csvs_no_overwrite PASSED [ 43%] -tests/test_virus.py::TestVirus::test_filter_cached_no_filters PASSED [ 43%] -tests/test_virus.py::TestVirus::test_datasets_cli_version_output PASSED [ 43%] -tests/test_virus.py::TestVirus::test_write_fasta_record_with_description PASSED [ 44%] -tests/test_virus.py::TestVirus::test_check_min_max_date_invalid_raises PASSED [ 44%] -tests/test_virus.py::TestVirus::test_virus_invalid_completeness PASSED [ 44%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_nonexistent_raises PASSED [ 44%] -tests/test_virus.py::TestVirus::test_virus_invalid_annotated_type PASSED [ 45%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_false PASSED [ 45%] -tests/test_virus.py::TestVirus::test_retry_helper_successful_operation PASSED [ 45%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_multiple PASSED [ 45%] -tests/test_virus.py::TestVirus::test_virus_specific_accession_file_creation PASSED [ 46%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_no_filters PASSED [ 46%] -tests/test_virus.py::TestVirus::test_unzip_file_nonexistent_raises PASSED [ 46%] -tests/test_virus.py::TestVirus::test_virus_release_date_filter_verification PASSED [ 46%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_false PASSED [ 47%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_gen_mol_type PASSED [ 47%] -tests/test_virus.py::TestVirus::test_force_garbage_collection_runs PASSED [ 47%] -tests/test_virus.py::TestVirus::test_virus_multi_accession_file_input PASSED [ 47%] -tests/test_virus.py::TestVirus::test_save_metadata_to_csv_empty_metadata PASSED [ 48%] -tests/test_virus.py::TestVirus::test_merge_baseline_with_new_deduplicates PASSED [ 48%] -tests/test_virus.py::TestVirus::test_virus_multiple_filters_relationship_check PASSED [ 48%] -tests/test_virus.py::TestVirus::test_virus_with_completeness_filter PASSED [ 48%] -tests/test_virus.py::TestVirus::test_parse_date_full PASSED [ 49%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_empty PASSED [ 49%] -tests/test_virus.py::TestVirus::test_track_failed_operation_creates_key PASSED [ 49%] -tests/test_virus.py::TestVirus::test_calculate_max_accessions_per_batch PASSED [ 49%] -tests/test_virus.py::TestVirus::test_retry_helper_custom_retryable_exceptions PASSED [ 50%] -tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter PASSED [ 50%] -tests/test_virus.py::TestVirus::test_virus_metadata_schema_validation PASSED [ 50%] -tests/test_virus.py::TestVirus::test_check_min_max_none_values PASSED [ 50%] -tests/test_virus.py::TestVirus::test_track_failed_operation_none_dict PASSED [ 50%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_release_date PASSED [ 51%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype PASSED [ 51%] -tests/test_virus.py::TestVirus::test_clean_xml_declarations PASSED [ 51%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_no_filters PASSED [ 51%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_jsonl PASSED [ 52%] -tests/test_virus.py::TestVirus::test_write_fasta_record_without_description PASSED [ 52%] -tests/test_virus.py::TestVirus::test_clean_xml_declarations_no_declarations PASSED [ 52%] -tests/test_virus.py::TestVirus::test_virus_invalid_proteins_complete_type PASSED [ 52%] -tests/test_virus.py::TestVirus::test_check_min_max_date_valid PASSED [ 53%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_missing_accession PASSED [ 53%] -tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter PASSED [ 53%] -tests/test_virus.py::TestVirus::test_retry_helper_failed_commands_tracking PASSED [ 53%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_true PASSED [ 54%] -tests/test_virus.py::TestVirus::test_filter_cached_host_in_strategy_skipped PASSED [ 54%] -tests/test_virus.py::TestVirus::test_save_command_summary_creates_file PASSED [ 54%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_json PASSED [ 54%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_max_comparison PASSED [ 55%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_peptide_count PASSED [ 55%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_source_database PASSED [ 55%] -tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_empty PASSED [ 55%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_gene_count PASSED [ 56%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_true PASSED [ 56%] -tests/test_virus.py::TestVirus::test_get_memory_usage_returns_dict PASSED [ 56%] -tests/test_virus.py::TestVirus::test_virus_with_genbank_metadata_retrieval PASSED [ 56%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_false PASSED [ 57%] -tests/test_virus.py::TestVirus::test_filter_cached_refseq_only PASSED [ 57%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_invalid_attempt_returns_none PASSED [ 57%] -tests/test_virus.py::TestVirus::test_virus_with_length_filters PASSED [ 57%] -tests/test_virus.py::TestVirus::test_virus_empty_virus_name PASSED [ 58%] -tests/test_virus.py::TestVirus::test_virus_invalid_keep_temp_type PASSED [ 58%] -tests/test_virus.py::TestVirus::test_validate_datasets_binary_valid PASSED [ 58%] -tests/test_virus.py::TestVirus::test_parse_accession_input_empty_file_raises_error PASSED [ 58%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_protein_count PASSED [ 59%] -tests/test_virus.py::TestVirus::test_check_min_max_valid PASSED [ 59%] -tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_common_names PASSED [ 59%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_collection_date PASSED [ 59%] -tests/test_virus.py::TestVirus::test_parse_partial_date_full_date PASSED [ 60%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_mature_peptide_count PASSED [ 60%] -tests/test_virus.py::TestVirus::test_filter_cached_host_not_in_strategy PASSED [ 60%] -tests/test_virus.py::TestVirus::test_virus_with_annotated_filter PASSED [ 60%] -tests/test_virus.py::TestVirus::test_virus_none_virus_name PASSED [ 61%] -tests/test_virus.py::TestVirus::test_is_sars_cov2_query_common_names PASSED [ 61%] -tests/test_virus.py::TestVirus::test_filter_sequences_proteins_complete PASSED [ 61%] -tests/test_virus.py::TestVirus::test_batch_accessions_for_url PASSED [ 61%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_isolate PASSED [ 62%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_false PASSED [ 62%] -tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_accession_mode PASSED [ 62%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_country PASSED [ 62%] -tests/test_virus.py::TestVirus::test_virus_with_geographic_location_filter PASSED [ 63%] -tests/test_virus.py::TestVirus::test_get_datasets_version_returns_string_or_none PASSED [ 63%] -tests/test_virus.py::TestVirus::test_filter_cached_geographic_location PASSED [ 63%] -tests/test_virus.py::TestVirus::test_local_name_with_namespace PASSED [ 63%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_text PASSED [ 64%] -tests/test_virus.py::TestVirus::test_filter_cached_min_release_date PASSED [ 64%] -tests/test_virus.py::TestVirus::test_validate_datasets_binary_empty_path PASSED [ 64%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_none_raises PASSED [ 64%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_csv PASSED [ 65%] -tests/test_virus.py::TestVirus::test_parse_partial_date_empty_raises PASSED [ 65%] -tests/test_virus.py::TestVirus::test_save_metadata_to_csv_basic PASSED [ 65%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_empty PASSED [ 65%] -tests/test_virus.py::TestVirus::test_get_datasets_path_uses_bundled_binary PASSED [ 66%] -tests/test_virus.py::TestVirus::test_virus_invalid_lab_passaged_type PASSED [ 66%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_true PASSED [ 66%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_remove_parentheses PASSED [ 66%] -tests/test_virus.py::TestVirus::test_virus_with_source_database_filter PASSED [ 67%] -tests/test_virus.py::TestVirus::test_parse_genbank_xml_basic PASSED [ 67%] -tests/test_virus.py::TestVirus::test_unzip_file_valid PASSED [ 67%] -tests/test_virus.py::TestVirus::test_save_partial_metadata PASSED [ 67%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_segment PASSED [ 68%] -tests/test_virus.py::TestVirus::test_track_failed_operation_appends PASSED [ 68%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype_list PASSED [ 68%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_max_seq_length PASSED [ 68%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_max_release_date PASSED [ 69%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_combined PASSED [ 69%] -tests/test_virus.py::TestVirus::test_filter_sequences_no_filters PASSED [ 69%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_max_gene_count PASSED [ 69%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_virus_suffix PASSED [ 70%] -tests/test_virus.py::TestVirus::test_filter_sequences_max_ambiguous_chars PASSED [ 70%] -tests/test_virus.py::TestVirus::test_unzip_file_bad_zip_raises PASSED [ 70%] -tests/test_virus.py::TestVirus::test_get_gget_version_returns_string PASSED [ 70%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_combined_filters PASSED [ 71%] -tests/test_virus.py::TestVirus::test_stream_copy_fasta_with_accession_filter PASSED [ 71%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_isolation_source PASSED [ 71%] -tests/test_utils.py::TestUtils::test_ref_species_options PASSED [ 71%] -tests/test_utils.py::TestUtils::test_n_colors PASSED [ 72%] -tests/test_utils.py::TestUtils::test_search_species_options PASSED [ 72%] -tests/test_utils.py::TestUtils::test_search_species_options_bad_type PASSED [ 72%] -tests/test_utils.py::TestUtils::test_get_uniprot_info_gene PASSED [ 72%] -tests/test_utils.py::TestUtils::test_read_fasta PASSED [ 73%] -tests/test_utils.py::TestUtils::test_rest_query_bad_type PASSED [ 73%] -tests/test_utils.py::TestUtils::test_find_latest_ens_rel PASSED [ 73%] -tests/test_utils.py::TestUtils::test_ref_species_options_bad_type PASSED [ 73%] -tests/test_utils.py::TestUtils::test_aa_colors PASSED [ 74%] -tests/test_utils.py::TestUtils::test_get_uniprot_info_transcript PASSED [ 74%] -tests/test_utils.py::TestUtils::test_ref_iv_species_options PASSED [ 74%] -tests/test_utils.py::TestUtils::test_search_iv_species_options PASSED [ 74%] -tests/test_utils.py::TestUtils::test_rest_query PASSED [ 75%] -tests/test_utils.py::TestUtils::test_get_uniprot_seqs PASSED [ 75%] -tests/test_pdb.py::TestPDB::test_pdb_mmcif PASSED [ 75%] -tests/test_pdb.py::TestPDB::test_pdb_pdb PASSED [ 75%] -tests/test_pdb.py::TestPDB::test_pdb_assembly PASSED [ 76%] -tests/test_pdb.py::TestPDB::test_pdb_legacy_fallback_to_mmcif PASSED [ 76%] -tests/test_bgee.py::TestBgee::test_bgee_orthologs PASSED [ 76%] -tests/test_bgee.py::TestBgee::test_error_bgee_expression_no_exist PASSED [ 76%] -tests/test_bgee.py::TestBgee::test_error_bgee_orthologs_no_exist PASSED [ 77%] -tests/test_bgee.py::TestBgee::test_error_bgee_unknown_type PASSED [ 77%] -tests/test_bgee.py::TestBgee::test_bgee_expression PASSED [ 77%] -tests/test_bgee.py::TestBgee::test_bgee_expression_multiple PASSED [ 77%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_transcription PASSED [ 78%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_json PASSED [ 78%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_ontology PASSED [ 78%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background PASSED [ 78%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_plot PASSED [ 79%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_background PASSED [ 79%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_background_ensembl PASSED [ 79%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_database_shortcut PASSED [ 79%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_fly PASSED [ 80%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_pathway PASSED [ 80%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_worm PASSED [ 80%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_diseases_drugs PASSED [ 80%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_none PASSED [ 81%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_species PASSED [ 81%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background_list PASSED [ 81%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_ensembl_ids PASSED [ 81%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_fish PASSED [ 82%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_celltypes PASSED [ 82%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_kinase_interactions PASSED [ 82%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_yeast PASSED [ 82%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_mouse_is_human PASSED [ 83%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_gene PASSED [ 83%] -tests/test_archs4.py::TestArchs4::test_archs4_defaults PASSED [ 83%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue_ensembl FAILED [ 83%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_gene PASSED [ 84%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_species PASSED [ 84%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_ensembl PASSED [ 84%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue FAILED [ 84%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue_json FAILED [ 85%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue_mouse FAILED [ 85%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_which PASSED [ 85%] -tests/test_archs4.py::TestArchs4::test_archs4_mouse_json_ensembl PASSED [ 85%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_gene_tissue FAILED [ 86%] -tests/test_cellxgene.py::TestCellxgeneValidation::test_invalid_species_raises_valueerror PASSED [ 86%] -tests/test_cellxgene.py::TestCellxgeneValidation::test_typo_species_raises_valueerror PASSED [ 86%] -tests/test_cellxgene.py::TestCellxgeneValidation::test_supported_species_includes_new_primates PASSED [ 86%] -tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata_macaca_mulatta SKIPPED [ 87%] -tests/test_cellxgene.py::TestCellxgene::test_cellxgene_adata SKIPPED [ 87%] -tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata SKIPPED [ 87%] -tests/test_muscle.py::TestMuscle::test_muscle_nt PASSED [ 87%] -tests/test_muscle.py::TestMuscle::test_muscle_nt_txt PASSED [ 88%] -tests/test_muscle.py::TestMuscleAASuper::test_muscle_aa_super5 PASSED [ 88%] -tests/test_muscle.py::TestMuscleAA::test_muscle_aa PASSED [ 88%] -tests/test_muscle.py::TestMuscleSeqsInput::test_muscle_seqs_as_input PASSED [ 88%] -tests/test_muscle.py::TestMuscleSuper::test_muscle_nt_super5 PASSED [ 89%] -tests/test_muscle.py::TestMusclePrints::test_muscle_print_nt PASSED [ 89%] -tests/test_diamond.py::TestDiamond::test_diamond_seqs_single PASSED [ 89%] -tests/test_diamond.py::TestDiamond::test_diamond_seqs_multiple PASSED [ 89%] -tests/test_diamond.py::TestDiamond::test_diamond_JSON_out PASSED [ 90%] -tests/test_diamond.py::TestDiamond::test_diamond_query_file PASSED [ 90%] -tests/test_diamond.py::TestDiamond::test_diamond_both_files PASSED [ 90%] -tests/test_diamond.py::TestDiamond::test_diamond_ref_file PASSED [ 90%] -tests/test_compile.py::TestCompilerWindows::test_compiler_windows PASSED [ 91%] -tests/test_ref.py::TestRef::test_ref_ftp PASSED [ 91%] -tests/test_ref.py::TestRef::test_ref_plant PASSED [ 91%] -tests/test_ref.py::TestRef::test_ref_bad_species PASSED [ 91%] -tests/test_ref.py::TestRef::test_ref PASSED [ 92%] -tests/test_ref.py::TestRef::test_ref_rel_protist PASSED [ 92%] -tests/test_ref.py::TestRef::test_ref_which_plant PASSED [ 92%] -tests/test_ref.py::TestRef::test_ref_bad_which PASSED [ 92%] -tests/test_ref.py::TestRef::test_ref_rel PASSED [ 93%] -tests/test_ref.py::TestRef::test_ref_bad_rel PASSED [ 93%] -tests/test_ref.py::TestRef::test_ref_rel_ftp_octopus PASSED [ 93%] -tests/test_ref.py::TestRef::test_ref_which PASSED [ 93%] -tests/test_ref.py::TestRef::test_ref_list PASSED [ 94%] -tests/test_ref.py::TestRef::test_ref_rel_ftp PASSED [ 94%] -tests/test_seq.py::TestSeq::test_seq_missing_uniprot_gene_name PASSED [ 94%] -tests/test_seq.py::TestSeq::test_seq_transcript_transcript_iso PASSED [ 94%] -tests/test_seq.py::TestSeq::test_seq_gene_iso PASSED [ 95%] -tests/test_seq.py::TestSeq::test_seq_transcript_gene PASSED [ 95%] -tests/test_seq.py::TestSeq::test_seq_transcript_gene_WB PASSED [ 95%] -tests/test_seq.py::TestSeq::test_seq_gene PASSED [ 95%] -tests/test_seq.py::TestSeq::test_seq_transcript_gene_iso PASSED [ 96%] -tests/test_seq.py::TestSeq::test_seq_transcript PASSED [ 96%] -tests/test_seq.py::TestSeq::test_seq_transcript_transcript_WB PASSED [ 96%] -tests/test_seq.py::TestSeq::test_seq_gene_transcript_iso PASSED [ 96%] -tests/test_blast.py::TestBlast::test_blast_bad_fasta PASSED [ 97%] -tests/test_blast.py::TestBlast::test_blast_bad_db2 PASSED [ 97%] -tests/test_blast.py::TestBlast::test_blast_db_missing PASSED [ 97%] -tests/test_blast.py::TestBlast::test_blast_bad_db1 PASSED [ 97%] -tests/test_blast.py::TestBlast::test_blast_bad_seq PASSED [ 98%] -tests/test_blast.py::TestBlast::test_blast_bad_program PASSED [ 98%] -tests/test_blast.py::TestBlast::test_blast_nt PASSED [ 98%] -tests/test_g2p.py::TestG2P::test_g2p_map PASSED [ 98%] -tests/test_g2p.py::TestG2P::test_g2p_alignment PASSED [ 99%] -tests/test_g2p.py::TestG2P::test_g2p_features PASSED [ 99%] -tests/test_g2p.py::TestG2PValidation::test_missing_uniprot_raises PASSED [ 99%] -tests/test_g2p.py::TestG2PValidation::test_invalid_resource_raises PASSED [ 99%] -tests/test_g2p.py::TestG2PValidation::test_alignment_requires_isoform PASSED [100%] +tests/test_search.py::TestSearch::test_search_transcript_two_sw_or PASSED [ 0%] +tests/test_search.py::TestSearch::test_search_transcript_two_sw_and PASSED [ 0%] +tests/test_search.py::TestSearch::test_search_transcript_bad_species PASSED [ 0%] +tests/test_search.py::TestSearch::test_search_gene_two_sw_limit PASSED [ 0%] +tests/test_search.py::TestSearch::test_search_gene_bad_species PASSED [ 1%] +tests/test_search.py::TestSearch::test_search_transcript_one_sw PASSED [ 1%] +tests/test_search.py::TestSearch::test_search_octopus PASSED [ 1%] +tests/test_search.py::TestSearch::test_search_gene_bad_andor PASSED [ 1%] +tests/test_search.py::TestSearch::test_search_release PASSED [ 2%] +tests/test_search.py::TestSearch::test_search_db PASSED [ 2%] +tests/test_search.py::TestSearch::test_search_gene_one_sw_json PASSED [ 2%] +tests/test_search.py::TestSearch::test_search_gene_one_sw PASSED [ 2%] +tests/test_search.py::TestSearch::test_search_gene_one_sw_limit PASSED [ 3%] +tests/test_search.py::TestSearch::test_search_gene_two_sw_or PASSED [ 3%] +tests/test_search.py::TestSearch::test_search_plant PASSED [ 3%] +tests/test_search.py::TestSearch::test_search_transcript_bad_andor PASSED [ 3%] +tests/test_search.py::TestSearch::test_search_plant_db PASSED [ 4%] +tests/test_search.py::TestSearch::test_search_gene_two_sw_and PASSED [ 4%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_fly PASSED [ 4%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_json PASSED [ 4%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_none PASSED [ 5%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_transcription PASSED [ 5%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_background PASSED [ 5%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_species PASSED [ 5%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_pathway PASSED [ 6%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_ontology PASSED [ 6%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_background_ensembl PASSED [ 6%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_gene PASSED [ 6%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_diseases_drugs PASSED [ 7%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_mouse_is_human PASSED [ 7%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_kinase_interactions PASSED [ 7%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background PASSED [ 7%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_celltypes PASSED [ 8%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_yeast PASSED [ 8%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_ensembl_ids PASSED [ 8%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_database_shortcut PASSED [ 8%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_worm PASSED [ 9%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background_list PASSED [ 9%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_plot PASSED [ 9%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_fish PASSED [ 9%] +tests/test_blat.py::TestBlat::test_blat_nt_transDNA PASSED [ 10%] +tests/test_blat.py::TestBlat::test_blat_nt_protein PASSED [ 10%] +tests/test_blat.py::TestBlat::test_blat_aa PASSED [ 10%] +tests/test_blat.py::TestBlat::test_blat_bad_seqtype PASSED [ 10%] +tests/test_blat.py::TestBlat::test_blat_bad_txt PASSED [ 11%] +tests/test_blat.py::TestBlat::test_blat_nt_fasta PASSED [ 11%] +tests/test_blat.py::TestBlat::test_blat_nt_RNA PASSED [ 11%] +tests/test_blat.py::TestBlat::test_blat_nt_DNA PASSED [ 11%] +tests/test_blat.py::TestBlat::test_blat_aa_protein PASSED [ 12%] +tests/test_blat.py::TestBlat::test_blat_nt_txt PASSED [ 12%] +tests/test_blat.py::TestBlat::test_blat_bad_fileformat PASSED [ 12%] +tests/test_blat.py::TestBlat::test_blat_shortseq PASSED [ 12%] +tests/test_blat.py::TestBlat::test_blat_bad_assembly PASSED [ 13%] +tests/test_blat.py::TestBlat::test_blat_bad_fasta PASSED [ 13%] +tests/test_blat.py::TestBlat::test_blat_aa_RNA PASSED [ 13%] +tests/test_blat.py::TestBlat::test_blat_nt PASSED [ 13%] +tests/test_blat.py::TestBlat::test_blat_nt_json PASSED [ 14%] +tests/test_bgee.py::TestBgee::test_error_bgee_orthologs_no_exist PASSED [ 14%] +tests/test_bgee.py::TestBgee::test_bgee_orthologs PASSED [ 14%] +tests/test_bgee.py::TestBgee::test_error_bgee_unknown_type PASSED [ 14%] +tests/test_bgee.py::TestBgee::test_bgee_expression PASSED [ 15%] +tests/test_bgee.py::TestBgee::test_error_bgee_expression_no_exist PASSED [ 15%] +tests/test_bgee.py::TestBgee::test_bgee_expression_multiple PASSED [ 15%] +tests/test_utils.py::TestUtils::test_n_colors PASSED [ 15%] +tests/test_utils.py::TestUtils::test_ref_species_options PASSED [ 16%] +tests/test_utils.py::TestUtils::test_rest_query PASSED [ 16%] +tests/test_utils.py::TestUtils::test_search_species_options_bad_type PASSED [ 16%] +tests/test_utils.py::TestUtils::test_get_uniprot_seqs PASSED [ 16%] +tests/test_utils.py::TestUtils::test_read_fasta PASSED [ 17%] +tests/test_utils.py::TestUtils::test_ref_species_options_bad_type PASSED [ 17%] +tests/test_utils.py::TestUtils::test_get_uniprot_info_transcript PASSED [ 17%] +tests/test_utils.py::TestUtils::test_search_species_options PASSED [ 17%] +tests/test_utils.py::TestUtils::test_aa_colors PASSED [ 18%] +tests/test_utils.py::TestUtils::test_ref_iv_species_options PASSED [ 18%] +tests/test_utils.py::TestUtils::test_get_uniprot_info_gene PASSED [ 18%] +tests/test_utils.py::TestUtils::test_rest_query_bad_type PASSED [ 18%] +tests/test_utils.py::TestUtils::test_search_iv_species_options PASSED [ 19%] +tests/test_utils.py::TestUtils::test_find_latest_ens_rel PASSED [ 19%] +tests/test_gpt.py::TestGpt::test_gpt PASSED [ 19%] +tests/test_cosmic.py::TestCosmicWorkflow::test_cosmic_defaults PASSED [ 19%] +tests/test_cbio.py::TestCbioSearch::test_cbio_search PASSED [ 20%] +tests/test_cbio.py::TestCbio::test_error_cbio_download PASSED [ 20%] +tests/test_cbio.py::TestCbio::test_cbio_download PASSED [ 20%] +tests/test_cbio.py::TestCbio::test_cbio_download_partially_existing_files PASSED [ 20%] +tests/test_info.py::TestInfo::test_info_WB_transcript PASSED [ 21%] +tests/test_info.py::TestInfo::test_info_ncbitrue_uniprotfalse PASSED [ 21%] +tests/test_info.py::TestInfo::test_info_transcript PASSED [ 21%] +tests/test_info.py::TestInfo::test_info_gene PASSED [ 21%] +tests/test_info.py::TestInfo::test_info_ncbifalse_uniprotfalse PASSED [ 22%] +tests/test_info.py::TestInfo::test_info_mix PASSED [ 22%] +tests/test_info.py::TestInfo::test_info_exon PASSED [ 22%] +tests/test_info.py::TestInfo::test_info_gene_list_non_model PASSED [ 22%] +tests/test_info.py::TestInfo::test_info_ncbifalse_uniprottrue PASSED [ 23%] +tests/test_cellxgene.py::TestCellxgeneValidation::test_invalid_species_raises_valueerror PASSED [ 23%] +tests/test_cellxgene.py::TestCellxgeneValidation::test_supported_species_includes_new_primates PASSED [ 23%] +tests/test_cellxgene.py::TestCellxgeneValidation::test_typo_species_raises_valueerror PASSED [ 23%] +tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata_macaca_mulatta SKIPPED [ 24%] +tests/test_cellxgene.py::TestCellxgene::test_cellxgene_adata SKIPPED [ 24%] +tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata SKIPPED [ 24%] +tests/test_ref.py::TestRef::test_ref_bad_which PASSED [ 24%] +tests/test_ref.py::TestRef::test_ref_bad_species PASSED [ 25%] +tests/test_ref.py::TestRef::test_ref_rel_ftp_octopus PASSED [ 25%] +tests/test_ref.py::TestRef::test_ref_bad_rel PASSED [ 25%] +tests/test_ref.py::TestRef::test_ref_which PASSED [ 25%] +tests/test_ref.py::TestRef::test_ref_rel_ftp PASSED [ 26%] +tests/test_ref.py::TestRef::test_ref_rel PASSED [ 26%] +tests/test_ref.py::TestRef::test_ref_plant PASSED [ 26%] +tests/test_ref.py::TestRef::test_ref_ftp PASSED [ 26%] +tests/test_ref.py::TestRef::test_ref_rel_protist PASSED [ 27%] +tests/test_ref.py::TestRef::test_ref PASSED [ 27%] +tests/test_ref.py::TestRef::test_ref_which_plant PASSED [ 27%] +tests/test_ref.py::TestRef::test_ref_list PASSED [ 27%] +tests/test_compile.py::TestCompilerWindows::test_compiler_windows PASSED [ 28%] +tests/test_archs4.py::TestArchs4::test_archs4_mouse_json_ensembl PASSED [ 28%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_gene PASSED [ 28%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue PASSED [ 28%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_gene_tissue PASSED [ 29%] +tests/test_archs4.py::TestArchs4::test_archs4_defaults PASSED [ 29%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue_mouse PASSED [ 29%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_which PASSED [ 29%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_species PASSED [ 30%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_ensembl PASSED [ 30%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue_json PASSED [ 30%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue_ensembl PASSED [ 30%] +tests/test_blast.py::TestBlast::test_blast_bad_program PASSED [ 31%] +tests/test_blast.py::TestBlast::test_blast_bad_db2 PASSED [ 31%] +tests/test_blast.py::TestBlast::test_blast_bad_db1 PASSED [ 31%] +tests/test_blast.py::TestBlast::test_blast_bad_seq PASSED [ 31%] +tests/test_blast.py::TestBlast::test_blast_nt PASSED [ 32%] +tests/test_blast.py::TestBlast::test_blast_db_missing PASSED [ 32%] +tests/test_blast.py::TestBlast::test_blast_bad_fasta PASSED [ 32%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_jsonl PASSED [ 32%] +tests/test_virus.py::TestVirus::test_retry_helper_failed_commands_tracking PASSED [ 33%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_max PASSED [ 33%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_release_date PASSED [ 33%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_false PASSED [ 33%] +tests/test_virus.py::TestVirus::test_virus_with_host_filter PASSED [ 34%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_multiple PASSED [ 34%] +tests/test_virus.py::TestVirus::test_filter_cached_no_filters PASSED [ 34%] +tests/test_virus.py::TestVirus::test_merge_metadata_csvs_fills_missing PASSED [ 34%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_false PASSED [ 35%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_basic PASSED [ 35%] +tests/test_virus.py::TestVirus::test_virus_with_completeness_filter PASSED [ 35%] +tests/test_virus.py::TestVirus::test_deduplicate_metadata_against_baseline PASSED [ 35%] +tests/test_virus.py::TestVirus::test_parse_accession_input_single PASSED [ 36%] +tests/test_virus.py::TestVirus::test_parse_genbank_xml_empty_set PASSED [ 36%] +tests/test_virus.py::TestVirus::test_validate_datasets_binary_nonexistent PASSED [ 36%] +tests/test_virus.py::TestVirus::test_get_memory_usage_returns_dict PASSED [ 36%] +tests/test_virus.py::TestVirus::test_merge_metadata_csvs_missing_standard_file PASSED [ 37%] +tests/test_virus.py::TestVirus::test_get_datasets_version_returns_string_or_none PASSED [ 37%] +tests/test_virus.py::TestVirus::test_filter_cached_host_in_strategy_skipped PASSED [ 37%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_true PASSED [ 37%] +tests/test_virus.py::TestVirus::test_virus_none_virus_name PASSED [ 38%] +tests/test_virus.py::TestVirus::test_virus_invalid_is_accession_type PASSED [ 38%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_min_seq_length PASSED [ 38%] +tests/test_virus.py::TestVirus::test_merge_baseline_with_new_empty_new PASSED [ 38%] +tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters PASSED [ 39%] +tests/test_virus.py::TestVirus::test_save_metadata_to_csv_empty_metadata PASSED [ 39%] +tests/test_virus.py::TestVirus::test_datasets_cli_version_output PASSED [ 39%] +tests/test_virus.py::TestVirus::test_filter_cached_refseq_only PASSED [ 39%] +tests/test_virus.py::TestVirus::test_virus_invalid_completeness PASSED [ 40%] +tests/test_virus.py::TestVirus::test_parse_date_various_formats PASSED [ 40%] +tests/test_virus.py::TestVirus::test_virus_invalid_keep_temp_type PASSED [ 40%] +tests/test_virus.py::TestVirus::test_virus_empty_virus_name PASSED [ 40%] +tests/test_virus.py::TestVirus::test_force_garbage_collection_runs PASSED [ 41%] +tests/test_virus.py::TestVirus::test_virus_integer_virus_id PASSED [ 41%] +tests/test_virus.py::TestVirus::test_virus_with_length_filters PASSED [ 41%] +tests/test_virus.py::TestVirus::test_track_failed_operation_none_dict PASSED [ 41%] +tests/test_virus.py::TestVirus::test_save_metadata_to_csv_basic PASSED [ 42%] +tests/test_virus.py::TestVirus::test_parse_date_invalid_raises PASSED [ 42%] +tests/test_virus.py::TestVirus::test_parse_accession_input_from_file PASSED [ 42%] +tests/test_virus.py::TestVirus::test_is_sars_cov2_query_negative PASSED [ 42%] +tests/test_virus.py::TestVirus::test_virus_multi_accession_file_input PASSED [ 43%] +tests/test_virus.py::TestVirus::test_save_partial_metadata_empty PASSED [ 43%] +tests/test_virus.py::TestVirus::test_retry_helper_successful_operation PASSED [ 43%] +tests/test_virus.py::TestVirus::test_get_datasets_path_uses_bundled_binary PASSED [ 43%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_isolate PASSED [ 44%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_empty PASSED [ 44%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_max_comparison PASSED [ 44%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_host PASSED [ 44%] +tests/test_virus.py::TestVirus::test_filter_cached_annotated PASSED [ 45%] +tests/test_virus.py::TestVirus::test_check_min_max_equal PASSED [ 45%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_false PASSED [ 45%] +tests/test_virus.py::TestVirus::test_local_name_with_namespace PASSED [ 45%] +tests/test_virus.py::TestVirus::test_filter_cached_complete_only PASSED [ 46%] +tests/test_virus.py::TestVirus::test_check_min_max_date_valid PASSED [ 46%] +tests/test_virus.py::TestVirus::test_check_min_max_valid PASSED [ 46%] +tests/test_virus.py::TestVirus::test_unzip_file_valid PASSED [ 46%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_geographic_location PASSED [ 47%] +tests/test_virus.py::TestVirus::test_deduplicate_empty_baseline PASSED [ 47%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_protein_count PASSED [ 47%] +tests/test_virus.py::TestVirus::test_batch_accessions_for_url PASSED [ 47%] +tests/test_virus.py::TestVirus::test_retry_helper_non_retryable_exception PASSED [ 48%] +tests/test_virus.py::TestVirus::test_check_min_max_date_invalid_raises PASSED [ 48%] +tests/test_virus.py::TestVirus::test_stream_copy_fasta_all_records PASSED [ 48%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_segment PASSED [ 48%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_seq_length PASSED [ 49%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_has_proteins PASSED [ 49%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_combined PASSED [ 49%] +tests/test_virus.py::TestVirus::test_merge_baseline_with_new_csv PASSED [ 49%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_missing_accession PASSED [ 50%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_min PASSED [ 50%] +tests/test_virus.py::TestVirus::test_deduplicate_all_existing PASSED [ 50%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_type PASSED [ 50%] +tests/test_virus.py::TestVirus::test_genbank_xml_to_csv_basic PASSED [ 50%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_remove_parentheses PASSED [ 51%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_country PASSED [ 51%] +tests/test_virus.py::TestVirus::test_parse_accession_input_space_separated PASSED [ 51%] +tests/test_virus.py::TestVirus::test_virus_with_source_database_filter PASSED [ 51%] +tests/test_virus.py::TestVirus::test_virus_completeness_filter_verification PASSED [ 52%] +tests/test_virus.py::TestVirus::test_virus_with_multiple_filters PASSED [ 52%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_already_correct_returns_none PASSED [ 52%] +tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_accession_mode PASSED [ 52%] +tests/test_virus.py::TestVirus::test_track_failed_operation_creates_key PASSED [ 53%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype PASSED [ 53%] +tests/test_virus.py::TestVirus::test_virus_invalid_proteins_complete_type PASSED [ 53%] +tests/test_virus.py::TestVirus::test_retry_helper_exponential_backoff_timing PASSED [ 53%] +tests/test_virus.py::TestVirus::test_virus_release_date_filter_verification PASSED [ 54%] +tests/test_virus.py::TestVirus::test_is_sars_cov2_query_common_names PASSED [ 54%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_collection_date_range PASSED [ 54%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_peptide_count PASSED [ 54%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_isolation_source PASSED [ 55%] +tests/test_virus.py::TestVirus::test_check_min_max_none_values PASSED [ 55%] +tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter PASSED [ 55%] +tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter PASSED [ 55%] +tests/test_virus.py::TestVirus::test_local_name_without_namespace PASSED [ 56%] +tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_common_names PASSED [ 56%] +tests/test_virus.py::TestVirus::test_virus_multi_accession_space_separated PASSED [ 56%] +tests/test_virus.py::TestVirus::test_parse_genbank_xml_basic PASSED [ 56%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_metadata_type PASSED [ 57%] +tests/test_virus.py::TestVirus::test_stream_copy_fasta_with_accession_filter PASSED [ 57%] +tests/test_virus.py::TestVirus::test_merge_metadata_csvs_no_overwrite PASSED [ 57%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_zero PASSED [ 57%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_mature_peptide_count PASSED [ 58%] +tests/test_virus.py::TestVirus::test_save_command_summary_creates_file PASSED [ 58%] +tests/test_virus.py::TestVirus::test_virus_invalid_lab_passaged_type PASSED [ 58%] +tests/test_virus.py::TestVirus::test_virus_with_annotated_filter PASSED [ 58%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_none_raises PASSED [ 59%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_no_filters PASSED [ 59%] +tests/test_virus.py::TestVirus::test_virus_with_geographic_location_filter PASSED [ 59%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_false PASSED [ 59%] +tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_basic PASSED [ 60%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_source_database PASSED [ 60%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_true PASSED [ 60%] +tests/test_virus.py::TestVirus::test_clean_xml_declarations_no_declarations PASSED [ 60%] +tests/test_virus.py::TestVirus::test_parse_accession_input_empty_file_raises_error PASSED [ 61%] +tests/test_virus.py::TestVirus::test_retry_helper_success_after_retry PASSED [ 61%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_json PASSED [ 61%] +tests/test_virus.py::TestVirus::test_validate_datasets_binary_empty_path PASSED [ 61%] +tests/test_virus.py::TestVirus::test_virus_multiple_filters_relationship_check PASSED [ 62%] +tests/test_virus.py::TestVirus::test_virus_with_genbank_metadata_retrieval PASSED [ 62%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_invalid_attempt_returns_none PASSED [ 62%] +tests/test_virus.py::TestVirus::test_virus_invalid_annotated_type PASSED [ 62%] +tests/test_virus.py::TestVirus::test_virus_specific_accession_file_creation PASSED [ 63%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_nonexistent_raises PASSED [ 63%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_gen_mol_type PASSED [ 63%] +tests/test_virus.py::TestVirus::test_unzip_file_nonexistent_raises PASSED [ 63%] +tests/test_virus.py::TestVirus::test_virus_relationship_check_counts_match PASSED [ 64%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_min_gene_count PASSED [ 64%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_empty_raises PASSED [ 64%] +tests/test_virus.py::TestVirus::test_retry_helper_custom_retryable_exceptions PASSED [ 64%] +tests/test_virus.py::TestVirus::test_parse_partial_date_full_date PASSED [ 65%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_true PASSED [ 65%] +tests/test_virus.py::TestVirus::test_virus_host_filter_verification PASSED [ 65%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_no_filters PASSED [ 65%] +tests/test_virus.py::TestVirus::test_filter_cached_host_not_in_strategy PASSED [ 66%] +tests/test_virus.py::TestVirus::test_write_fasta_record_with_description PASSED [ 66%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_true PASSED [ 66%] +tests/test_virus.py::TestVirus::test_get_gget_version_returns_string PASSED [ 66%] +tests/test_virus.py::TestVirus::test_merge_baseline_with_new_deduplicates PASSED [ 67%] +tests/test_virus.py::TestVirus::test_filter_sequences_proteins_complete PASSED [ 67%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_csv PASSED [ 67%] +tests/test_virus.py::TestVirus::test_filter_sequences_no_filters PASSED [ 67%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_max_gene_count PASSED [ 68%] +tests/test_virus.py::TestVirus::test_virus_metadata_schema_validation PASSED [ 68%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_empty PASSED [ 68%] +tests/test_virus.py::TestVirus::test_parse_date_full PASSED [ 68%] +tests/test_virus.py::TestVirus::test_virus_with_collection_date_filters PASSED [ 69%] +tests/test_virus.py::TestVirus::test_parse_accession_input_nonexistent_file_raises_error PASSED [ 69%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_empty_returns_none PASSED [ 69%] +tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_negative PASSED [ 69%] +tests/test_virus.py::TestVirus::test_validate_datasets_binary_valid PASSED [ 70%] +tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_empty PASSED [ 70%] +tests/test_virus.py::TestVirus::test_parse_genbank_xml_invalid_raises PASSED [ 70%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_negative PASSED [ 70%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_env_source PASSED [ 71%] +tests/test_virus.py::TestVirus::test_get_datasets_path_returns_valid_path PASSED [ 71%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_max_release_date PASSED [ 71%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_name PASSED [ 71%] +tests/test_virus.py::TestVirus::test_write_fasta_record_without_description PASSED [ 72%] +tests/test_virus.py::TestVirus::test_filter_cached_min_release_date PASSED [ 72%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_gene_count PASSED [ 72%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_no_parentheses_returns_none PASSED [ 72%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_collection_date PASSED [ 73%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_max_seq_length PASSED [ 73%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_virus_suffix PASSED [ 73%] +tests/test_virus.py::TestVirus::test_clean_xml_declarations PASSED [ 73%] +tests/test_virus.py::TestVirus::test_unzip_file_bad_zip_raises PASSED [ 74%] +tests/test_virus.py::TestVirus::test_save_command_summary_with_error PASSED [ 74%] +tests/test_virus.py::TestVirus::test_is_sars_cov2_query_accession_mode PASSED [ 74%] +tests/test_virus.py::TestVirus::test_filter_sequences_max_ambiguous_chars PASSED [ 74%] +tests/test_virus.py::TestVirus::test_track_failed_operation_appends PASSED [ 75%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype_list PASSED [ 75%] +tests/test_virus.py::TestVirus::test_parse_partial_date_empty_raises PASSED [ 75%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_text PASSED [ 75%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_protein_count PASSED [ 76%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_combined_filters PASSED [ 76%] +tests/test_virus.py::TestVirus::test_filter_cached_geographic_location PASSED [ 76%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_min_comparison PASSED [ 76%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_space_before_virus PASSED [ 77%] +tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter PASSED [ 77%] +tests/test_virus.py::TestVirus::test_check_min_max_invalid_raises PASSED [ 77%] +tests/test_virus.py::TestVirus::test_write_fasta_record_long_sequence_wraps PASSED [ 77%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_institution PASSED [ 78%] +tests/test_virus.py::TestVirus::test_calculate_max_accessions_per_batch PASSED [ 78%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_nuc_completeness_partial PASSED [ 78%] +tests/test_virus.py::TestVirus::test_save_partial_metadata PASSED [ 78%] +tests/test_pdb.py::TestPDB::test_pdb_legacy_fallback_to_mmcif PASSED [ 79%] +tests/test_pdb.py::TestPDB::test_pdb_mmcif PASSED [ 79%] +tests/test_pdb.py::TestPDB::test_pdb_assembly PASSED [ 79%] +tests/test_pdb.py::TestPDB::test_pdb_pdb PASSED [ 79%] +tests/test_muscle.py::TestMusclePrints::test_muscle_print_nt PASSED [ 80%] +tests/test_muscle.py::TestMuscleAASuper::test_muscle_aa_super5 PASSED [ 80%] +tests/test_muscle.py::TestMuscleSeqsInput::test_muscle_seqs_as_input PASSED [ 80%] +tests/test_muscle.py::TestMuscle::test_muscle_nt PASSED [ 80%] +tests/test_muscle.py::TestMuscle::test_muscle_nt_txt PASSED [ 81%] +tests/test_muscle.py::TestMuscleSuper::test_muscle_nt_super5 PASSED [ 81%] +tests/test_muscle.py::TestMuscleAA::test_muscle_aa PASSED [ 81%] +tests/test_8cube.py::TestSpecificity::test_specificity_basic PASSED [ 81%] +tests/test_8cube.py::TestPsiBlock::test_psi_block_basic PASSED [ 82%] +tests/test_8cube.py::TestGeneExpression::test_gene_expression_basic PASSED [ 82%] +tests/test_elm.py::TestELM::test_elm_uniprot_id_in_elm PASSED [ 82%] +tests/test_elm.py::TestELM::test_elm_uniprot_id_new PASSED [ 82%] +tests/test_elm.py::TestELM::test_elm_uniprot_aminoacidseq PASSED [ 83%] +tests/test_g2p.py::TestG2P::test_g2p_alignment PASSED [ 83%] +tests/test_g2p.py::TestG2P::test_g2p_features PASSED [ 83%] +tests/test_g2p.py::TestG2P::test_g2p_map PASSED [ 83%] +tests/test_g2p.py::TestG2PValidation::test_invalid_resource_raises PASSED [ 84%] +tests/test_g2p.py::TestG2PValidation::test_alignment_requires_isoform PASSED [ 84%] +tests/test_g2p.py::TestG2PValidation::test_missing_uniprot_raises PASSED [ 84%] +tests/test_diamond.py::TestDiamond::test_diamond_seqs_single PASSED [ 84%] +tests/test_diamond.py::TestDiamond::test_diamond_JSON_out PASSED [ 85%] +tests/test_diamond.py::TestDiamond::test_diamond_both_files PASSED [ 85%] +tests/test_diamond.py::TestDiamond::test_diamond_query_file PASSED [ 85%] +tests/test_diamond.py::TestDiamond::test_diamond_seqs_multiple PASSED [ 85%] +tests/test_diamond.py::TestDiamond::test_diamond_ref_file PASSED [ 86%] +tests/test_mutate.py::TestMutate::test_uncertain_mutation PASSED [ 86%] +tests/test_mutate.py::TestMutate::test_multi_insertion_with_left_repeats PASSED [ 86%] +tests/test_mutate.py::TestMutate::test_multi_deletion_with_right_repeats PASSED [ 86%] +tests/test_mutate.py::TestMutate::test_single_deletion_with_left_repeats PASSED [ 87%] +tests/test_mutate.py::TestMutate::test_single_dup PASSED [ 87%] +tests/test_mutate.py::TestMutate::test_single_insertion PASSED [ 87%] +tests/test_mutate.py::TestMutate::test_multi_insertion PASSED [ 87%] +tests/test_mutate.py::TestMutate::test_single_substitution_near_left_end PASSED [ 88%] +tests/test_mutate.py::TestMutate::test_multi_delins_with_true_right_repeats PASSED [ 88%] +tests/test_mutate.py::TestMutate::test_list_of_mutations PASSED [ 88%] +tests/test_mutate.py::TestMutate::test_multi_delins_with_psuedo_left_repeats PASSED [ 88%] +tests/test_mutate.py::TestMutate::test_large_k PASSED [ 89%] +tests/test_mutate.py::TestMutate::test_multi_delins PASSED [ 89%] +tests/test_mutate.py::TestMutate::test_single_delins PASSED [ 89%] +tests/test_mutate.py::TestMutate::test_multi_delins_with_true_left_repeats PASSED [ 89%] +tests/test_mutate.py::TestMutate::test_multi_dup PASSED [ 90%] +tests/test_mutate.py::TestMutate::test_single_substitution PASSED [ 90%] +tests/test_mutate.py::TestMutate::test_inversion_with_overlaps PASSED [ 90%] +tests/test_mutate.py::TestMutate::test_multi_deletion PASSED [ 90%] +tests/test_mutate.py::TestMutate::test_intron_mutation_minus PASSED [ 91%] +tests/test_mutate.py::TestMutate::test_posttranslational_mutation PASSED [ 91%] +tests/test_mutate.py::TestMutate::test_single_deletion PASSED [ 91%] +tests/test_mutate.py::TestMutate::test_intron_mutation_plus PASSED [ 91%] +tests/test_mutate.py::TestMutate::test_ambiguous_mutation PASSED [ 92%] +tests/test_mutate.py::TestMutate::test_index_error PASSED [ 92%] +tests/test_mutate.py::TestMutate::test_single_substitution_near_right_end PASSED [ 92%] +tests/test_mutate.py::TestMutate::test_single_deletion_with_right_repeats PASSED [ 92%] +tests/test_mutate.py::test_mismatch_error PASSED [ 93%] +tests/test_mutate.py::test_csv_of_mutations PASSED [ 93%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_resource PASSED [ 93%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions PASSED [ 93%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_no_limit PASSED [ 94%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_simple_filter PASSED [ 94%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_expression_no_limit PASSED [ 94%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_diseases PASSED [ 94%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap PASSED [ 95%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_nonexistent_id PASSED [ 95%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets PASSED [ 95%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_expression PASSED [ 95%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_diseases_filter PASSED [ 96%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap_filter PASSED [ 96%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_drugs_invalid_filter PASSED [ 96%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_tractability PASSED [ 96%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_pharmacogenetics PASSED [ 97%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_limit PASSED [ 97%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_drugs PASSED [ 97%] +tests/test_seq.py::TestSeq::test_seq_gene PASSED [ 97%] +tests/test_seq.py::TestSeq::test_seq_transcript_transcript_WB PASSED [ 98%] +tests/test_seq.py::TestSeq::test_seq_transcript_gene_iso PASSED [ 98%] +tests/test_seq.py::TestSeq::test_seq_missing_uniprot_gene_name PASSED [ 98%] +tests/test_seq.py::TestSeq::test_seq_transcript_gene_WB PASSED [ 98%] +tests/test_seq.py::TestSeq::test_seq_transcript_transcript_iso PASSED [ 99%] +tests/test_seq.py::TestSeq::test_seq_gene_iso PASSED [ 99%] +tests/test_seq.py::TestSeq::test_seq_gene_transcript_iso PASSED [ 99%] +tests/test_seq.py::TestSeq::test_seq_transcript_gene PASSED [ 99%] +tests/test_seq.py::TestSeq::test_seq_transcript PASSED [100%] -=================================== FAILURES =================================== -___________________________ TestInfo.test_info_gene ____________________________ - -self = - - def assert_equal(self: unittest.TestCase): - test = name - expected_result = td[test]["expected_result"] - result_to_test = do_call(func, td[test]["args"]) - if test == "test_cosmic_defaults": # special case for cosmic - import numpy as np - - expected_result = pd.DataFrame(expected_result[0]) - expected_result = expected_result.replace({None: np.nan}) - # result_to_test.equals(expected_result) - pd.testing.assert_frame_equal(result_to_test, expected_result, check_dtype=False) - return - - # If result is a DataFrame, convert to list - if isinstance(result_to_test, pd.DataFrame): - result_to_test = result_to_test.dropna(axis=1).values.tolist() - -> self.assertEqual(result_to_test, expected_result) -E AssertionError: Lists differ: [['En[17 chars]6', 'mus_musculus', 'GRCm39', 'Gnai3', 'G prot[1000 chars]62]]] != [['En[17 chars]6', 'Q9DC51', '14679', 'mus_musculus', 'GRCm39[3072 chars]62]]] -E -E First differing element 0: -E ['Ens[16 chars]6', 'mus_musculus', 'GRCm39', 'Gnai3', 'G prot[999 chars]462]] -E ['Ens[16 chars]6', 'Q9DC51', '14679', 'mus_musculus', 'GRCm39[3071 chars]462]] -E -E [['EnsMUSG00000000001.6', -E + 'Q9DC51', -E + '14679', -E 'mus_musculus', -E 'GRCm39', -E 'Gnai3', -E + 'Gnai3', -E + ['Galphai3', 'Gnai-3', 'Hg1a'], -E + 'Guanine nucleotide-binding protein G(i) subunit alpha-3', -E 'G protein subunit alpha i3 [Source:MGI Symbol;Acc:MGI:95773]', -E + 'Heterotrimeric guanine nucleotide-binding proteins (G proteins) function as ' -E + 'transducers downstream of G protein-coupled receptors (GPCRs) in numerous ' -E + 'signaling cascades. The alpha chain contains the guanine nucleotide binding ' -E + 'site and alternates between an active, GTP-bound state and an inactive, ' -E + 'GDP-bound state. Signaling by an activated GPCR promotes GDP release and ' -E + 'GTP binding. The alpha subunit has a low GTPase activity that converts ' -E + 'bound GTP to GDP, thereby terminating the signal (By similarity). Both GDP ' -E + 'release and GTP hydrolysis are modulated by numerous regulatory proteins ' -E + '(By similarity). Signaling is mediated via effector proteins, such as ' -E + 'adenylate cyclase. Inhibits adenylate cyclase activity, leading to ' -E + 'decreased intracellular cAMP levels (By similarity). Stimulates the ' -E + 'activity of receptor-regulated K(+) channels (By similarity). The active ' -E + 'GTP-bound form prevents the association of RGS14 with centrosomes and is ' -E + 'required for the translocation of RGS14 from the cytoplasm to the plasma ' -E + 'membrane. May play a role in cell division (By similarity). The active ' -E + 'GTP-bound form activates the calcium permeant TRPC5 ion channels (By ' -E + 'similarity)', -E + 'Predicted to enable several functions, including G-protein ' -E + 'beta/gamma-subunit complex binding activity; GDP binding activity; and ' -E + 'GTPase activating protein binding activity. Predicted to be involved in ' -E + 'several processes, including G protein-coupled receptor signaling pathway; ' -E + 'positive regulation of metabolic process; and positive regulation of ' -E + 'vascular associated smooth muscle cell proliferation. Predicted to act ' -E + 'upstream of or within G protein-coupled receptor signaling pathway. Located ' -E + 'in Golgi apparatus. Is expressed in early conceptus; inner ear; and oocyte. ' -E + 'Orthologous to human GNAI3 (G protein subunit alpha i3). [provided by ' -E + 'Alliance of Genome Resources, Apr 2025]', -E + ['Cytoplasm', -E + 'Cell membrane', -E + 'Cytoplasm, cytoskeleton, microtubule organizing center, centrosome'], -E 'Gene', -E 'protein_coding', -E 'ENSMUST00000000001.6', -E '3', -E -1, -E 108014590, -E 108053469, -E ['ENSMUST00000000001.6', -E 'ENSMUST00000535596.1', -E 'ENSMUST00000535597.1', -E 'ENSMUST00000535598.1', -E 'ENSMUST00000535599.1', -E 'ENSMUST00000535600.1', -E 'ENSMUST00000535601.1', -E 'ENSMUST00000535602.1', -E 'ENSMUST00000535603.1', -E 'ENSMUST00000558104.1'], -E ['protein_coding', -E 'protein_coding', -E 'protein_coding', -E 'nonsense_mediated_decay', -E 'protein_coding', -E 'nonsense_mediated_decay', -E 'nonsense_mediated_decay', -E 'protein_coding', -E 'nonsense_mediated_decay', -E 'nonsense_mediated_decay'], -E ['Gnai3-201', -E 'Gnai3-202', -E 'Gnai3-203', -E 'Gnai3-204', -E 'Gnai3-205', -E 'Gnai3-206', -E 'Gnai3-207', -E 'Gnai3-208', -E 'Gnai3-209', -E 'Gnai3-210'], -E [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1], -E [108014596, -E 108014596, -E 108014597, -E 108014597, -E 108014592, -E 108014597, -E 108014590, -E 108014613, -E 108014611, -E 108014596], -E [108053469, -E 108053469, -E 108053469, -E 108053453, -E 108053469, -E 108053443, -E 108053435, -E 108053469, -E 108053426, -E 108053462]]] - -tests/from_json.py:82: AssertionError ------------------------------- Captured log call ------------------------------- -WARNING gget.utils:gget_info.py:226 UniProt server request for ID 'EnsMUSG00000000001' returned the following error: -('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer')) -____________________ TestArchs4.test_archs4_tissue_ensembl _____________________ - -self = - - def assert_equal(self: unittest.TestCase): - test = name - expected_result = td[test]["expected_result"] -> result_to_test = do_call(func, td[test]["args"]) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -tests/from_json.py:68: -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ -tests/from_json.py:60: in do_call - return func(**args) - ^^^^^^^^^^^^ -gget/gget_archs4.py:204: in archs4 - tissue_exp_df = tissue_exp_df.drop(["color"], axis=1) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/frame.py:6300: in drop - return super().drop( -../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/generic.py:4644: in drop - obj = obj._drop_axis(labels, axis, level=level, errors=errors) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/generic.py:4686: in _drop_axis - new_axis = axis.drop(labels, errors=errors) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - -self = Index(['
'], dtype='str'), labels = array(['color'], dtype=object) -errors = 'raise' - - def drop( - self, - labels: Index | np.ndarray | Iterable[Hashable], - errors: IgnoreRaise = "raise", - ) -> Index: - """ - Make new Index with passed list of labels deleted. - - Parameters - ---------- - labels : array-like or scalar - Array-like object or a scalar value, representing the labels to be removed - from the Index. - errors : {'ignore', 'raise'}, default 'raise' - If 'ignore', suppress error and existing labels are dropped. - - Returns - ------- - Index - Will be same type as self, except for RangeIndex. - - Raises - ------ - KeyError - If not all of the labels are found in the selected axis - - See Also - -------- - Index.dropna : Return Index without NA/NaN values. - Index.drop_duplicates : Return Index with duplicate values removed. - - Examples - -------- - >>> idx = pd.Index(["a", "b", "c"]) - >>> idx.drop(["a"]) - Index(['b', 'c'], dtype='str') - """ - if not isinstance(labels, Index): - # avoid materializing e.g. RangeIndex - arr_dtype = "object" if self.dtype == "object" else None - labels = com.index_labels_to_array(labels, dtype=arr_dtype) - - indexer = self.get_indexer_for(labels) - mask = indexer == -1 - if mask.any(): - if errors != "ignore": -> raise KeyError(f"{labels[mask].tolist()} not found in axis") -E KeyError: "['color'] not found in axis" - -../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/indexes/base.py:7268: KeyError ------------------------------- Captured log call ------------------------------- -INFO gget.utils:gget_archs4.py:171 Fetching the tissue expression atlas of PHF14 from mouse ARCHS4 data. -________________________ TestArchs4.test_archs4_tissue _________________________ - -self = - - def assert_equal(self: unittest.TestCase): - test = name - expected_result = td[test]["expected_result"] -> result_to_test = do_call(func, td[test]["args"]) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -tests/from_json.py:68: -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ -tests/from_json.py:60: in do_call - return func(**args) - ^^^^^^^^^^^^ -gget/gget_archs4.py:204: in archs4 - tissue_exp_df = tissue_exp_df.drop(["color"], axis=1) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/frame.py:6300: in drop - return super().drop( -../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/generic.py:4644: in drop - obj = obj._drop_axis(labels, axis, level=level, errors=errors) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/generic.py:4686: in _drop_axis - new_axis = axis.drop(labels, errors=errors) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - -self = Index(['
'], dtype='str'), labels = array(['color'], dtype=object) -errors = 'raise' - - def drop( - self, - labels: Index | np.ndarray | Iterable[Hashable], - errors: IgnoreRaise = "raise", - ) -> Index: - """ - Make new Index with passed list of labels deleted. - - Parameters - ---------- - labels : array-like or scalar - Array-like object or a scalar value, representing the labels to be removed - from the Index. - errors : {'ignore', 'raise'}, default 'raise' - If 'ignore', suppress error and existing labels are dropped. - - Returns - ------- - Index - Will be same type as self, except for RangeIndex. - - Raises - ------ - KeyError - If not all of the labels are found in the selected axis - - See Also - -------- - Index.dropna : Return Index without NA/NaN values. - Index.drop_duplicates : Return Index with duplicate values removed. - - Examples - -------- - >>> idx = pd.Index(["a", "b", "c"]) - >>> idx.drop(["a"]) - Index(['b', 'c'], dtype='str') - """ - if not isinstance(labels, Index): - # avoid materializing e.g. RangeIndex - arr_dtype = "object" if self.dtype == "object" else None - labels = com.index_labels_to_array(labels, dtype=arr_dtype) - - indexer = self.get_indexer_for(labels) - mask = indexer == -1 - if mask.any(): - if errors != "ignore": -> raise KeyError(f"{labels[mask].tolist()} not found in axis") -E KeyError: "['color'] not found in axis" - -../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/indexes/base.py:7268: KeyError ------------------------------- Captured log call ------------------------------- -INFO gget.utils:gget_archs4.py:171 Fetching the tissue expression atlas of FUNDC1 from human ARCHS4 data. -______________________ TestArchs4.test_archs4_tissue_json ______________________ - -self = - - def assert_equal(self: unittest.TestCase): - test = name - expected_result = td[test]["expected_result"] -> result_to_test = do_call(func, td[test]["args"]) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -tests/from_json.py:68: -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ -tests/from_json.py:60: in do_call - return func(**args) - ^^^^^^^^^^^^ -gget/gget_archs4.py:204: in archs4 - tissue_exp_df = tissue_exp_df.drop(["color"], axis=1) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/frame.py:6300: in drop - return super().drop( -../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/generic.py:4644: in drop - obj = obj._drop_axis(labels, axis, level=level, errors=errors) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/generic.py:4686: in _drop_axis - new_axis = axis.drop(labels, errors=errors) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - -self = Index(['
'], dtype='str'), labels = array(['color'], dtype=object) -errors = 'raise' - - def drop( - self, - labels: Index | np.ndarray | Iterable[Hashable], - errors: IgnoreRaise = "raise", - ) -> Index: - """ - Make new Index with passed list of labels deleted. - - Parameters - ---------- - labels : array-like or scalar - Array-like object or a scalar value, representing the labels to be removed - from the Index. - errors : {'ignore', 'raise'}, default 'raise' - If 'ignore', suppress error and existing labels are dropped. - - Returns - ------- - Index - Will be same type as self, except for RangeIndex. - - Raises - ------ - KeyError - If not all of the labels are found in the selected axis - - See Also - -------- - Index.dropna : Return Index without NA/NaN values. - Index.drop_duplicates : Return Index with duplicate values removed. - - Examples - -------- - >>> idx = pd.Index(["a", "b", "c"]) - >>> idx.drop(["a"]) - Index(['b', 'c'], dtype='str') - """ - if not isinstance(labels, Index): - # avoid materializing e.g. RangeIndex - arr_dtype = "object" if self.dtype == "object" else None - labels = com.index_labels_to_array(labels, dtype=arr_dtype) - - indexer = self.get_indexer_for(labels) - mask = indexer == -1 - if mask.any(): - if errors != "ignore": -> raise KeyError(f"{labels[mask].tolist()} not found in axis") -E KeyError: "['color'] not found in axis" - -../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/indexes/base.py:7268: KeyError ------------------------------- Captured log call ------------------------------- -INFO gget.utils:gget_archs4.py:171 Fetching the tissue expression atlas of FUNDC1 from human ARCHS4 data. -_____________________ TestArchs4.test_archs4_tissue_mouse ______________________ - -self = - - def assert_equal(self: unittest.TestCase): - test = name - expected_result = td[test]["expected_result"] -> result_to_test = do_call(func, td[test]["args"]) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -tests/from_json.py:68: -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ -tests/from_json.py:60: in do_call - return func(**args) - ^^^^^^^^^^^^ -gget/gget_archs4.py:204: in archs4 - tissue_exp_df = tissue_exp_df.drop(["color"], axis=1) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/frame.py:6300: in drop - return super().drop( -../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/generic.py:4644: in drop - obj = obj._drop_axis(labels, axis, level=level, errors=errors) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/generic.py:4686: in _drop_axis - new_axis = axis.drop(labels, errors=errors) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - -self = Index(['
'], dtype='str'), labels = array(['color'], dtype=object) -errors = 'raise' - - def drop( - self, - labels: Index | np.ndarray | Iterable[Hashable], - errors: IgnoreRaise = "raise", - ) -> Index: - """ - Make new Index with passed list of labels deleted. - - Parameters - ---------- - labels : array-like or scalar - Array-like object or a scalar value, representing the labels to be removed - from the Index. - errors : {'ignore', 'raise'}, default 'raise' - If 'ignore', suppress error and existing labels are dropped. - - Returns - ------- - Index - Will be same type as self, except for RangeIndex. - - Raises - ------ - KeyError - If not all of the labels are found in the selected axis - - See Also - -------- - Index.dropna : Return Index without NA/NaN values. - Index.drop_duplicates : Return Index with duplicate values removed. - - Examples - -------- - >>> idx = pd.Index(["a", "b", "c"]) - >>> idx.drop(["a"]) - Index(['b', 'c'], dtype='str') - """ - if not isinstance(labels, Index): - # avoid materializing e.g. RangeIndex - arr_dtype = "object" if self.dtype == "object" else None - labels = com.index_labels_to_array(labels, dtype=arr_dtype) - - indexer = self.get_indexer_for(labels) - mask = indexer == -1 - if mask.any(): - if errors != "ignore": -> raise KeyError(f"{labels[mask].tolist()} not found in axis") -E KeyError: "['color'] not found in axis" - -../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/indexes/base.py:7268: KeyError ------------------------------- Captured log call ------------------------------- -INFO gget.utils:gget_archs4.py:171 Fetching the tissue expression atlas of FUNDC1 from mouse ARCHS4 data. -____________________ TestArchs4.test_archs4_bad_gene_tissue ____________________ - -self = - - def assert_none(self: unittest.TestCase): - test = name - expected_result = td[test].get("expected_result", None) - msg = td[test].get("msg", None) - expected_log = td[test].get("expected_log", None) - - self.assertIsNone( - expected_result, - "assert_none test must not have a non-null expected_result key.", - ) - - if expected_log is not None: - # Captures logs across all loggers, so the function under test - # cannot silently return None for the wrong reason (e.g. a - # rate-limited HTML response from an upstream API). - with self.assertLogs(level=logging.DEBUG) as captured: - result_to_test = do_call(func, td[test]["args"]) - joined = "\n".join(captured.output) - self.assertIn( - expected_log, - joined, - msg=(f"Expected log substring {expected_log!r} not found. Captured: {joined}"), - ) - else: -> result_to_test = do_call(func, td[test]["args"]) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -tests/from_json.py:126: -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ -tests/from_json.py:60: in do_call - return func(**args) - ^^^^^^^^^^^^ -gget/gget_archs4.py:204: in archs4 - tissue_exp_df = tissue_exp_df.drop(["color"], axis=1) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/frame.py:6300: in drop - return super().drop( -../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/generic.py:4644: in drop - obj = obj._drop_axis(labels, axis, level=level, errors=errors) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/generic.py:4686: in _drop_axis - new_axis = axis.drop(labels, errors=errors) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - -self = Index(['
'], dtype='str'), labels = array(['color'], dtype=object) -errors = 'raise' - - def drop( - self, - labels: Index | np.ndarray | Iterable[Hashable], - errors: IgnoreRaise = "raise", - ) -> Index: - """ - Make new Index with passed list of labels deleted. - - Parameters - ---------- - labels : array-like or scalar - Array-like object or a scalar value, representing the labels to be removed - from the Index. - errors : {'ignore', 'raise'}, default 'raise' - If 'ignore', suppress error and existing labels are dropped. - - Returns - ------- - Index - Will be same type as self, except for RangeIndex. - - Raises - ------ - KeyError - If not all of the labels are found in the selected axis - - See Also - -------- - Index.dropna : Return Index without NA/NaN values. - Index.drop_duplicates : Return Index with duplicate values removed. - - Examples - -------- - >>> idx = pd.Index(["a", "b", "c"]) - >>> idx.drop(["a"]) - Index(['b', 'c'], dtype='str') - """ - if not isinstance(labels, Index): - # avoid materializing e.g. RangeIndex - arr_dtype = "object" if self.dtype == "object" else None - labels = com.index_labels_to_array(labels, dtype=arr_dtype) - - indexer = self.get_indexer_for(labels) - mask = indexer == -1 - if mask.any(): - if errors != "ignore": -> raise KeyError(f"{labels[mask].tolist()} not found in axis") -E KeyError: "['color'] not found in axis" - -../../../.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/pandas/core/indexes/base.py:7268: KeyError ------------------------------- Captured log call ------------------------------- -INFO gget.utils:gget_archs4.py:171 Fetching the tissue expression atlas of BANANA from mouse ARCHS4 data. =============================== warnings summary =============================== -tests/test_cbio.py::TestCbioSearch::test_cbio_search -tests/test_cbio.py::TestCbioSearch::test_cbio_search - /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/swagger_spec_validator/validator12.py:18: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. - from jsonschema import RefResolver - -tests/test_cbio.py::TestCbioSearch::test_cbio_search - /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/swagger_spec_validator/ref_validators.py:14: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. - from jsonschema.validators import RefResolver - -tests/test_cbio.py::TestCbioSearch::test_cbio_search - /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/swagger_spec_validator/validator20.py:18: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. - from jsonschema.validators import RefResolver - -tests/test_cbio.py::TestCbioSearch::test_cbio_search -tests/test_cbio.py::TestCbioSearch::test_cbio_search - /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/bravado_core/swagger20_validator.py:6: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. - from jsonschema import RefResolver - -tests/test_cbio.py::TestCbioSearch::test_cbio_search - /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/bravado_core/spec.py:14: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. - from jsonschema.validators import RefResolver - -tests/test_cbio.py: 16 warnings - /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/bravado_core/model.py:888: DeprecationWarning: jsonschema.RefResolver.in_scope is deprecated and will be removed in a future release. - with spec.resolver.in_scope(additional_uri): - -tests/test_mutate.py: 29 warnings - /home/runner/work/gget/gget/gget/gget_mutate.py:667: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract. - mask = mutations[mut_column].str.contains(combined_pattern) - -tests/test_search.py::TestSearch::test_search_gene_bad_species -tests/test_search.py::TestSearch::test_search_release tests/test_search.py::TestSearch::test_search_transcript_two_sw_or +tests/test_search.py::TestSearch::test_search_transcript_two_sw_and +tests/test_search.py::TestSearch::test_search_release tests/test_utils.py::TestUtils::test_search_species_options /home/runner/work/gget/gget/gget/utils.py:899: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. for subsoup in soup.body.findAll("a"): -tests/test_search.py::TestSearch::test_search_gene_bad_species -tests/test_search.py::TestSearch::test_search_gene_bad_species -tests/test_search.py::TestSearch::test_search_gene_bad_species -tests/test_search.py::TestSearch::test_search_gene_bad_species +tests/test_search.py::TestSearch::test_search_transcript_two_sw_or +tests/test_search.py::TestSearch::test_search_transcript_two_sw_or +tests/test_search.py::TestSearch::test_search_transcript_two_sw_or +tests/test_search.py::TestSearch::test_search_transcript_two_sw_or tests/test_utils.py::TestUtils::test_search_iv_species_options tests/test_utils.py::TestUtils::test_search_iv_species_options tests/test_utils.py::TestUtils::test_search_iv_species_options @@ -1030,10 +432,10 @@ tests/test_utils.py::TestUtils::test_search_iv_species_options /home/runner/work/gget/gget/gget/utils.py:883: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. for subsoup in soup.body.findAll("a"): -tests/test_search.py::TestSearch::test_search_transcript_one_sw -tests/test_search.py::TestSearch::test_search_gene_two_sw_limit -tests/test_search.py::TestSearch::test_search_transcript_two_sw_and tests/test_search.py::TestSearch::test_search_transcript_two_sw_or +tests/test_search.py::TestSearch::test_search_transcript_two_sw_and +tests/test_search.py::TestSearch::test_search_gene_two_sw_limit +tests/test_search.py::TestSearch::test_search_transcript_one_sw /home/runner/work/gget/gget/gget/gget_search.py:302: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy. df_temp = pd.read_sql(query, con=db_connection) @@ -1056,6 +458,32 @@ tests/test_ref.py: 24 warnings /home/runner/work/gget/gget/gget/utils.py:975: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. for subsoup in soup.body.findAll("a"): +tests/test_cbio.py::TestCbioSearch::test_cbio_search +tests/test_cbio.py::TestCbioSearch::test_cbio_search + /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/swagger_spec_validator/validator12.py:18: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. + from jsonschema import RefResolver + +tests/test_cbio.py::TestCbioSearch::test_cbio_search + /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/swagger_spec_validator/ref_validators.py:14: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. + from jsonschema.validators import RefResolver + +tests/test_cbio.py::TestCbioSearch::test_cbio_search + /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/swagger_spec_validator/validator20.py:18: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. + from jsonschema.validators import RefResolver + +tests/test_cbio.py::TestCbioSearch::test_cbio_search +tests/test_cbio.py::TestCbioSearch::test_cbio_search + /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/bravado_core/swagger20_validator.py:6: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. + from jsonschema import RefResolver + +tests/test_cbio.py::TestCbioSearch::test_cbio_search + /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/bravado_core/spec.py:14: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. + from jsonschema.validators import RefResolver + +tests/test_cbio.py: 16 warnings + /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/bravado_core/model.py:888: DeprecationWarning: jsonschema.RefResolver.in_scope is deprecated and will be removed in a future release. + with spec.resolver.in_scope(additional_uri): + tests/test_ref.py: 39 warnings /home/runner/work/gget/gget/gget/gget_ref.py:49: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. links = [stuff.text.strip() for stuff in soup.findAll("td")] @@ -1065,129 +493,24 @@ tests/test_ref.py::TestRef::test_ref /home/runner/work/gget/gget/gget/gget_ref.py:325: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. links = [stuff.text.strip() for stuff in soup.findAll("td")] +tests/test_mutate.py: 29 warnings + /home/runner/work/gget/gget/gget/gget_mutate.py:667: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract. + mask = mutations[mut_column].str.contains(combined_pattern) + -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html ============================= slowest 10 durations ============================= -180.57s call tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter -179.35s call tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter -132.16s call tests/test_virus.py::TestVirus::test_virus_integer_virus_id -129.73s call tests/test_virus.py::TestVirus::test_virus_with_source_database_filter -78.87s call tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters -74.43s call tests/test_blast.py::TestBlast::test_blast_nt -66.64s call tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter -37.93s call tests/test_search.py::TestSearch::test_search_gene_two_sw_limit -26.29s call tests/test_virus.py::TestVirus::test_virus_with_annotated_filter -25.79s call tests/test_virus.py::TestVirus::test_virus_host_filter_verification +183.60s call tests/test_virus.py::TestVirus::test_virus_integer_virus_id +179.05s call tests/test_virus.py::TestVirus::test_virus_with_source_database_filter +129.99s call tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter +89.52s call tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter +76.10s call tests/test_blast.py::TestBlast::test_blast_nt +66.60s call tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter +38.50s call tests/test_search.py::TestSearch::test_search_gene_two_sw_limit +26.95s call tests/test_virus.py::TestVirus::test_virus_with_annotated_filter +26.94s call tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters +22.12s call tests/test_virus.py::TestVirus::test_virus_with_host_filter =========================== short test summary info ============================ SKIPPED [1] tests/test_cellxgene.py:65: cellxgene-census is not installed SKIPPED [1] tests/test_cellxgene.py:45: cellxgene-census is not installed SKIPPED [1] tests/test_cellxgene.py:55: cellxgene-census is not installed -FAILED tests/test_info.py::TestInfo::test_info_gene - AssertionError: Lists differ: [['En[17 chars]6', 'mus_musculus', 'GRCm39', 'Gnai3', 'G prot[1000 chars]62]]] != [['En[17 chars]6', 'Q9DC51', '14679', 'mus_musculus', 'GRCm39[3072 chars]62]]] - -First differing element 0: -['Ens[16 chars]6', 'mus_musculus', 'GRCm39', 'Gnai3', 'G prot[999 chars]462]] -['Ens[16 chars]6', 'Q9DC51', '14679', 'mus_musculus', 'GRCm39[3071 chars]462]] - - [['EnsMUSG00000000001.6', -+ 'Q9DC51', -+ '14679', - 'mus_musculus', - 'GRCm39', - 'Gnai3', -+ 'Gnai3', -+ ['Galphai3', 'Gnai-3', 'Hg1a'], -+ 'Guanine nucleotide-binding protein G(i) subunit alpha-3', - 'G protein subunit alpha i3 [Source:MGI Symbol;Acc:MGI:95773]', -+ 'Heterotrimeric guanine nucleotide-binding proteins (G proteins) function as ' -+ 'transducers downstream of G protein-coupled receptors (GPCRs) in numerous ' -+ 'signaling cascades. The alpha chain contains the guanine nucleotide binding ' -+ 'site and alternates between an active, GTP-bound state and an inactive, ' -+ 'GDP-bound state. Signaling by an activated GPCR promotes GDP release and ' -+ 'GTP binding. The alpha subunit has a low GTPase activity that converts ' -+ 'bound GTP to GDP, thereby terminating the signal (By similarity). Both GDP ' -+ 'release and GTP hydrolysis are modulated by numerous regulatory proteins ' -+ '(By similarity). Signaling is mediated via effector proteins, such as ' -+ 'adenylate cyclase. Inhibits adenylate cyclase activity, leading to ' -+ 'decreased intracellular cAMP levels (By similarity). Stimulates the ' -+ 'activity of receptor-regulated K(+) channels (By similarity). The active ' -+ 'GTP-bound form prevents the association of RGS14 with centrosomes and is ' -+ 'required for the translocation of RGS14 from the cytoplasm to the plasma ' -+ 'membrane. May play a role in cell division (By similarity). The active ' -+ 'GTP-bound form activates the calcium permeant TRPC5 ion channels (By ' -+ 'similarity)', -+ 'Predicted to enable several functions, including G-protein ' -+ 'beta/gamma-subunit complex binding activity; GDP binding activity; and ' -+ 'GTPase activating protein binding activity. Predicted to be involved in ' -+ 'several processes, including G protein-coupled receptor signaling pathway; ' -+ 'positive regulation of metabolic process; and positive regulation of ' -+ 'vascular associated smooth muscle cell proliferation. Predicted to act ' -+ 'upstream of or within G protein-coupled receptor signaling pathway. Located ' -+ 'in Golgi apparatus. Is expressed in early conceptus; inner ear; and oocyte. ' -+ 'Orthologous to human GNAI3 (G protein subunit alpha i3). [provided by ' -+ 'Alliance of Genome Resources, Apr 2025]', -+ ['Cytoplasm', -+ 'Cell membrane', -+ 'Cytoplasm, cytoskeleton, microtubule organizing center, centrosome'], - 'Gene', - 'protein_coding', - 'ENSMUST00000000001.6', - '3', - -1, - 108014590, - 108053469, - ['ENSMUST00000000001.6', - 'ENSMUST00000535596.1', - 'ENSMUST00000535597.1', - 'ENSMUST00000535598.1', - 'ENSMUST00000535599.1', - 'ENSMUST00000535600.1', - 'ENSMUST00000535601.1', - 'ENSMUST00000535602.1', - 'ENSMUST00000535603.1', - 'ENSMUST00000558104.1'], - ['protein_coding', - 'protein_coding', - 'protein_coding', - 'nonsense_mediated_decay', - 'protein_coding', - 'nonsense_mediated_decay', - 'nonsense_mediated_decay', - 'protein_coding', - 'nonsense_mediated_decay', - 'nonsense_mediated_decay'], - ['Gnai3-201', - 'Gnai3-202', - 'Gnai3-203', - 'Gnai3-204', - 'Gnai3-205', - 'Gnai3-206', - 'Gnai3-207', - 'Gnai3-208', - 'Gnai3-209', - 'Gnai3-210'], - [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1], - [108014596, - 108014596, - 108014597, - 108014597, - 108014592, - 108014597, - 108014590, - 108014613, - 108014611, - 108014596], - [108053469, - 108053469, - 108053469, - 108053453, - 108053469, - 108053443, - 108053435, - 108053469, - 108053426, - 108053462]]] -FAILED tests/test_archs4.py::TestArchs4::test_archs4_tissue_ensembl - KeyError: "['color'] not found in axis" -FAILED tests/test_archs4.py::TestArchs4::test_archs4_tissue - KeyError: "['color'] not found in axis" -FAILED tests/test_archs4.py::TestArchs4::test_archs4_tissue_json - KeyError: "['color'] not found in axis" -FAILED tests/test_archs4.py::TestArchs4::test_archs4_tissue_mouse - KeyError: "['color'] not found in axis" -FAILED tests/test_archs4.py::TestArchs4::test_archs4_bad_gene_tissue - KeyError: "['color'] not found in axis" -===== 6 failed, 393 passed, 3 skipped, 185 warnings in 1405.07s (0:23:25) ====== +========== 399 passed, 3 skipped, 185 warnings in 1219.47s (0:20:19) =========== From 7aefef923a62c3751e95ee306510278cb5644b59 Mon Sep 17 00:00:00 2001 From: Qiaoli Li <67373873+Qiaoli-Li-Res@users.noreply.github.com> Date: Fri, 26 Jun 2026 19:05:58 +0200 Subject: [PATCH 11/34] fix(types): allow tuple request timeouts in http_json (#253) --- gget/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gget/utils.py b/gget/utils.py index dfa4a2011..040730e39 100644 --- a/gget/utils.py +++ b/gget/utils.py @@ -103,7 +103,7 @@ def http_json( url: str, *, context: str = "", - timeout: float = DEFAULT_REQUESTS_TIMEOUT, + timeout: float | tuple[float, float] = DEFAULT_REQUESTS_TIMEOUT, retries: int = 3, backoff: float = 1.0, **kwargs: Any, From 682d7c6275ba149d1472f6e18302e75a2ca98022 Mon Sep 17 00:00:00 2001 From: Qiaoli Li <67373873+Qiaoli-Li-Res@users.noreply.github.com> Date: Fri, 26 Jun 2026 19:06:14 +0200 Subject: [PATCH 12/34] fix(types): annotate pdb URL fallback list (#255) --- gget/gget_pdb.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gget/gget_pdb.py b/gget/gget_pdb.py index 3d4b7b6c7..ddb8df91a 100644 --- a/gget/gget_pdb.py +++ b/gget/gget_pdb.py @@ -85,6 +85,8 @@ def pdb(pdb_id: str, resource: str = "pdb", identifier: str | int | None = None, # Define URLs for HTTP request. # Each entry is (url, fetched_format) so we can track which structure format # was actually returned ("pdb"/"mmcif"/None for JSON resources). + urls: list[tuple[str, str | None]] + if resource not in structure_resources: # URLs to request resources other than a structure file if identifier is not None: From 3ffd5ab84db1be6ca0ccfd605194df17a1537d5b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 26 Jun 2026 17:18:16 +0000 Subject: [PATCH 13/34] CI: update pytest results (dev) --- .github/badges/tests.json | 2 +- tests/pytest_results.txt | 544 +++----------------------------------- 2 files changed, 38 insertions(+), 508 deletions(-) diff --git a/.github/badges/tests.json b/.github/badges/tests.json index a7cade404..5b6cc3b11 100644 --- a/.github/badges/tests.json +++ b/.github/badges/tests.json @@ -1 +1 @@ -{"schemaVersion": 1, "label": "tests", "message": "399/402 passing", "color": "brightgreen"} +{"schemaVersion": 1, "label": "tests", "message": "0/1 passing", "color": "red"} diff --git a/tests/pytest_results.txt b/tests/pytest_results.txt index 0097f867c..bc40fd3c7 100644 --- a/tests/pytest_results.txt +++ b/tests/pytest_results.txt @@ -1,516 +1,46 @@ -Pytest results (Python 3.14) - 2026-06-23T15:11:59Z +Pytest results (Python 3.14) - 2026-06-26T17:07:06Z ============================= test session starts ============================== platform linux -- Python 3.14.6, pytest-9.1.1, pluggy-1.6.0 -- /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/bin/python3 cachedir: .pytest_cache -Using --randomly-seed=3533476696 +Using --randomly-seed=3800391218 rootdir: /home/runner/work/gget/gget configfile: pyproject.toml testpaths: tests plugins: randomly-3.16.0, rerunfailures-14.0, mock-3.15.1, cov-7.1.0, xdist-3.8.0 -collecting ... collected 402 items - -tests/test_search.py::TestSearch::test_search_transcript_two_sw_or PASSED [ 0%] -tests/test_search.py::TestSearch::test_search_transcript_two_sw_and PASSED [ 0%] -tests/test_search.py::TestSearch::test_search_transcript_bad_species PASSED [ 0%] -tests/test_search.py::TestSearch::test_search_gene_two_sw_limit PASSED [ 0%] -tests/test_search.py::TestSearch::test_search_gene_bad_species PASSED [ 1%] -tests/test_search.py::TestSearch::test_search_transcript_one_sw PASSED [ 1%] -tests/test_search.py::TestSearch::test_search_octopus PASSED [ 1%] -tests/test_search.py::TestSearch::test_search_gene_bad_andor PASSED [ 1%] -tests/test_search.py::TestSearch::test_search_release PASSED [ 2%] -tests/test_search.py::TestSearch::test_search_db PASSED [ 2%] -tests/test_search.py::TestSearch::test_search_gene_one_sw_json PASSED [ 2%] -tests/test_search.py::TestSearch::test_search_gene_one_sw PASSED [ 2%] -tests/test_search.py::TestSearch::test_search_gene_one_sw_limit PASSED [ 3%] -tests/test_search.py::TestSearch::test_search_gene_two_sw_or PASSED [ 3%] -tests/test_search.py::TestSearch::test_search_plant PASSED [ 3%] -tests/test_search.py::TestSearch::test_search_transcript_bad_andor PASSED [ 3%] -tests/test_search.py::TestSearch::test_search_plant_db PASSED [ 4%] -tests/test_search.py::TestSearch::test_search_gene_two_sw_and PASSED [ 4%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_fly PASSED [ 4%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_json PASSED [ 4%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_none PASSED [ 5%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_transcription PASSED [ 5%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_background PASSED [ 5%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_species PASSED [ 5%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_pathway PASSED [ 6%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_ontology PASSED [ 6%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_background_ensembl PASSED [ 6%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_gene PASSED [ 6%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_diseases_drugs PASSED [ 7%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_mouse_is_human PASSED [ 7%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_kinase_interactions PASSED [ 7%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background PASSED [ 7%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_celltypes PASSED [ 8%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_yeast PASSED [ 8%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_ensembl_ids PASSED [ 8%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_database_shortcut PASSED [ 8%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_worm PASSED [ 9%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background_list PASSED [ 9%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_plot PASSED [ 9%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_fish PASSED [ 9%] -tests/test_blat.py::TestBlat::test_blat_nt_transDNA PASSED [ 10%] -tests/test_blat.py::TestBlat::test_blat_nt_protein PASSED [ 10%] -tests/test_blat.py::TestBlat::test_blat_aa PASSED [ 10%] -tests/test_blat.py::TestBlat::test_blat_bad_seqtype PASSED [ 10%] -tests/test_blat.py::TestBlat::test_blat_bad_txt PASSED [ 11%] -tests/test_blat.py::TestBlat::test_blat_nt_fasta PASSED [ 11%] -tests/test_blat.py::TestBlat::test_blat_nt_RNA PASSED [ 11%] -tests/test_blat.py::TestBlat::test_blat_nt_DNA PASSED [ 11%] -tests/test_blat.py::TestBlat::test_blat_aa_protein PASSED [ 12%] -tests/test_blat.py::TestBlat::test_blat_nt_txt PASSED [ 12%] -tests/test_blat.py::TestBlat::test_blat_bad_fileformat PASSED [ 12%] -tests/test_blat.py::TestBlat::test_blat_shortseq PASSED [ 12%] -tests/test_blat.py::TestBlat::test_blat_bad_assembly PASSED [ 13%] -tests/test_blat.py::TestBlat::test_blat_bad_fasta PASSED [ 13%] -tests/test_blat.py::TestBlat::test_blat_aa_RNA PASSED [ 13%] -tests/test_blat.py::TestBlat::test_blat_nt PASSED [ 13%] -tests/test_blat.py::TestBlat::test_blat_nt_json PASSED [ 14%] -tests/test_bgee.py::TestBgee::test_error_bgee_orthologs_no_exist PASSED [ 14%] -tests/test_bgee.py::TestBgee::test_bgee_orthologs PASSED [ 14%] -tests/test_bgee.py::TestBgee::test_error_bgee_unknown_type PASSED [ 14%] -tests/test_bgee.py::TestBgee::test_bgee_expression PASSED [ 15%] -tests/test_bgee.py::TestBgee::test_error_bgee_expression_no_exist PASSED [ 15%] -tests/test_bgee.py::TestBgee::test_bgee_expression_multiple PASSED [ 15%] -tests/test_utils.py::TestUtils::test_n_colors PASSED [ 15%] -tests/test_utils.py::TestUtils::test_ref_species_options PASSED [ 16%] -tests/test_utils.py::TestUtils::test_rest_query PASSED [ 16%] -tests/test_utils.py::TestUtils::test_search_species_options_bad_type PASSED [ 16%] -tests/test_utils.py::TestUtils::test_get_uniprot_seqs PASSED [ 16%] -tests/test_utils.py::TestUtils::test_read_fasta PASSED [ 17%] -tests/test_utils.py::TestUtils::test_ref_species_options_bad_type PASSED [ 17%] -tests/test_utils.py::TestUtils::test_get_uniprot_info_transcript PASSED [ 17%] -tests/test_utils.py::TestUtils::test_search_species_options PASSED [ 17%] -tests/test_utils.py::TestUtils::test_aa_colors PASSED [ 18%] -tests/test_utils.py::TestUtils::test_ref_iv_species_options PASSED [ 18%] -tests/test_utils.py::TestUtils::test_get_uniprot_info_gene PASSED [ 18%] -tests/test_utils.py::TestUtils::test_rest_query_bad_type PASSED [ 18%] -tests/test_utils.py::TestUtils::test_search_iv_species_options PASSED [ 19%] -tests/test_utils.py::TestUtils::test_find_latest_ens_rel PASSED [ 19%] -tests/test_gpt.py::TestGpt::test_gpt PASSED [ 19%] -tests/test_cosmic.py::TestCosmicWorkflow::test_cosmic_defaults PASSED [ 19%] -tests/test_cbio.py::TestCbioSearch::test_cbio_search PASSED [ 20%] -tests/test_cbio.py::TestCbio::test_error_cbio_download PASSED [ 20%] -tests/test_cbio.py::TestCbio::test_cbio_download PASSED [ 20%] -tests/test_cbio.py::TestCbio::test_cbio_download_partially_existing_files PASSED [ 20%] -tests/test_info.py::TestInfo::test_info_WB_transcript PASSED [ 21%] -tests/test_info.py::TestInfo::test_info_ncbitrue_uniprotfalse PASSED [ 21%] -tests/test_info.py::TestInfo::test_info_transcript PASSED [ 21%] -tests/test_info.py::TestInfo::test_info_gene PASSED [ 21%] -tests/test_info.py::TestInfo::test_info_ncbifalse_uniprotfalse PASSED [ 22%] -tests/test_info.py::TestInfo::test_info_mix PASSED [ 22%] -tests/test_info.py::TestInfo::test_info_exon PASSED [ 22%] -tests/test_info.py::TestInfo::test_info_gene_list_non_model PASSED [ 22%] -tests/test_info.py::TestInfo::test_info_ncbifalse_uniprottrue PASSED [ 23%] -tests/test_cellxgene.py::TestCellxgeneValidation::test_invalid_species_raises_valueerror PASSED [ 23%] -tests/test_cellxgene.py::TestCellxgeneValidation::test_supported_species_includes_new_primates PASSED [ 23%] -tests/test_cellxgene.py::TestCellxgeneValidation::test_typo_species_raises_valueerror PASSED [ 23%] -tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata_macaca_mulatta SKIPPED [ 24%] -tests/test_cellxgene.py::TestCellxgene::test_cellxgene_adata SKIPPED [ 24%] -tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata SKIPPED [ 24%] -tests/test_ref.py::TestRef::test_ref_bad_which PASSED [ 24%] -tests/test_ref.py::TestRef::test_ref_bad_species PASSED [ 25%] -tests/test_ref.py::TestRef::test_ref_rel_ftp_octopus PASSED [ 25%] -tests/test_ref.py::TestRef::test_ref_bad_rel PASSED [ 25%] -tests/test_ref.py::TestRef::test_ref_which PASSED [ 25%] -tests/test_ref.py::TestRef::test_ref_rel_ftp PASSED [ 26%] -tests/test_ref.py::TestRef::test_ref_rel PASSED [ 26%] -tests/test_ref.py::TestRef::test_ref_plant PASSED [ 26%] -tests/test_ref.py::TestRef::test_ref_ftp PASSED [ 26%] -tests/test_ref.py::TestRef::test_ref_rel_protist PASSED [ 27%] -tests/test_ref.py::TestRef::test_ref PASSED [ 27%] -tests/test_ref.py::TestRef::test_ref_which_plant PASSED [ 27%] -tests/test_ref.py::TestRef::test_ref_list PASSED [ 27%] -tests/test_compile.py::TestCompilerWindows::test_compiler_windows PASSED [ 28%] -tests/test_archs4.py::TestArchs4::test_archs4_mouse_json_ensembl PASSED [ 28%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_gene PASSED [ 28%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue PASSED [ 28%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_gene_tissue PASSED [ 29%] -tests/test_archs4.py::TestArchs4::test_archs4_defaults PASSED [ 29%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue_mouse PASSED [ 29%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_which PASSED [ 29%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_species PASSED [ 30%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_ensembl PASSED [ 30%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue_json PASSED [ 30%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue_ensembl PASSED [ 30%] -tests/test_blast.py::TestBlast::test_blast_bad_program PASSED [ 31%] -tests/test_blast.py::TestBlast::test_blast_bad_db2 PASSED [ 31%] -tests/test_blast.py::TestBlast::test_blast_bad_db1 PASSED [ 31%] -tests/test_blast.py::TestBlast::test_blast_bad_seq PASSED [ 31%] -tests/test_blast.py::TestBlast::test_blast_nt PASSED [ 32%] -tests/test_blast.py::TestBlast::test_blast_db_missing PASSED [ 32%] -tests/test_blast.py::TestBlast::test_blast_bad_fasta PASSED [ 32%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_jsonl PASSED [ 32%] -tests/test_virus.py::TestVirus::test_retry_helper_failed_commands_tracking PASSED [ 33%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_max PASSED [ 33%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_release_date PASSED [ 33%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_false PASSED [ 33%] -tests/test_virus.py::TestVirus::test_virus_with_host_filter PASSED [ 34%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_multiple PASSED [ 34%] -tests/test_virus.py::TestVirus::test_filter_cached_no_filters PASSED [ 34%] -tests/test_virus.py::TestVirus::test_merge_metadata_csvs_fills_missing PASSED [ 34%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_false PASSED [ 35%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_basic PASSED [ 35%] -tests/test_virus.py::TestVirus::test_virus_with_completeness_filter PASSED [ 35%] -tests/test_virus.py::TestVirus::test_deduplicate_metadata_against_baseline PASSED [ 35%] -tests/test_virus.py::TestVirus::test_parse_accession_input_single PASSED [ 36%] -tests/test_virus.py::TestVirus::test_parse_genbank_xml_empty_set PASSED [ 36%] -tests/test_virus.py::TestVirus::test_validate_datasets_binary_nonexistent PASSED [ 36%] -tests/test_virus.py::TestVirus::test_get_memory_usage_returns_dict PASSED [ 36%] -tests/test_virus.py::TestVirus::test_merge_metadata_csvs_missing_standard_file PASSED [ 37%] -tests/test_virus.py::TestVirus::test_get_datasets_version_returns_string_or_none PASSED [ 37%] -tests/test_virus.py::TestVirus::test_filter_cached_host_in_strategy_skipped PASSED [ 37%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_true PASSED [ 37%] -tests/test_virus.py::TestVirus::test_virus_none_virus_name PASSED [ 38%] -tests/test_virus.py::TestVirus::test_virus_invalid_is_accession_type PASSED [ 38%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_min_seq_length PASSED [ 38%] -tests/test_virus.py::TestVirus::test_merge_baseline_with_new_empty_new PASSED [ 38%] -tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters PASSED [ 39%] -tests/test_virus.py::TestVirus::test_save_metadata_to_csv_empty_metadata PASSED [ 39%] -tests/test_virus.py::TestVirus::test_datasets_cli_version_output PASSED [ 39%] -tests/test_virus.py::TestVirus::test_filter_cached_refseq_only PASSED [ 39%] -tests/test_virus.py::TestVirus::test_virus_invalid_completeness PASSED [ 40%] -tests/test_virus.py::TestVirus::test_parse_date_various_formats PASSED [ 40%] -tests/test_virus.py::TestVirus::test_virus_invalid_keep_temp_type PASSED [ 40%] -tests/test_virus.py::TestVirus::test_virus_empty_virus_name PASSED [ 40%] -tests/test_virus.py::TestVirus::test_force_garbage_collection_runs PASSED [ 41%] -tests/test_virus.py::TestVirus::test_virus_integer_virus_id PASSED [ 41%] -tests/test_virus.py::TestVirus::test_virus_with_length_filters PASSED [ 41%] -tests/test_virus.py::TestVirus::test_track_failed_operation_none_dict PASSED [ 41%] -tests/test_virus.py::TestVirus::test_save_metadata_to_csv_basic PASSED [ 42%] -tests/test_virus.py::TestVirus::test_parse_date_invalid_raises PASSED [ 42%] -tests/test_virus.py::TestVirus::test_parse_accession_input_from_file PASSED [ 42%] -tests/test_virus.py::TestVirus::test_is_sars_cov2_query_negative PASSED [ 42%] -tests/test_virus.py::TestVirus::test_virus_multi_accession_file_input PASSED [ 43%] -tests/test_virus.py::TestVirus::test_save_partial_metadata_empty PASSED [ 43%] -tests/test_virus.py::TestVirus::test_retry_helper_successful_operation PASSED [ 43%] -tests/test_virus.py::TestVirus::test_get_datasets_path_uses_bundled_binary PASSED [ 43%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_isolate PASSED [ 44%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_empty PASSED [ 44%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_max_comparison PASSED [ 44%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_host PASSED [ 44%] -tests/test_virus.py::TestVirus::test_filter_cached_annotated PASSED [ 45%] -tests/test_virus.py::TestVirus::test_check_min_max_equal PASSED [ 45%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_false PASSED [ 45%] -tests/test_virus.py::TestVirus::test_local_name_with_namespace PASSED [ 45%] -tests/test_virus.py::TestVirus::test_filter_cached_complete_only PASSED [ 46%] -tests/test_virus.py::TestVirus::test_check_min_max_date_valid PASSED [ 46%] -tests/test_virus.py::TestVirus::test_check_min_max_valid PASSED [ 46%] -tests/test_virus.py::TestVirus::test_unzip_file_valid PASSED [ 46%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_geographic_location PASSED [ 47%] -tests/test_virus.py::TestVirus::test_deduplicate_empty_baseline PASSED [ 47%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_protein_count PASSED [ 47%] -tests/test_virus.py::TestVirus::test_batch_accessions_for_url PASSED [ 47%] -tests/test_virus.py::TestVirus::test_retry_helper_non_retryable_exception PASSED [ 48%] -tests/test_virus.py::TestVirus::test_check_min_max_date_invalid_raises PASSED [ 48%] -tests/test_virus.py::TestVirus::test_stream_copy_fasta_all_records PASSED [ 48%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_segment PASSED [ 48%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_seq_length PASSED [ 49%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_has_proteins PASSED [ 49%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_combined PASSED [ 49%] -tests/test_virus.py::TestVirus::test_merge_baseline_with_new_csv PASSED [ 49%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_missing_accession PASSED [ 50%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_min PASSED [ 50%] -tests/test_virus.py::TestVirus::test_deduplicate_all_existing PASSED [ 50%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_type PASSED [ 50%] -tests/test_virus.py::TestVirus::test_genbank_xml_to_csv_basic PASSED [ 50%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_remove_parentheses PASSED [ 51%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_country PASSED [ 51%] -tests/test_virus.py::TestVirus::test_parse_accession_input_space_separated PASSED [ 51%] -tests/test_virus.py::TestVirus::test_virus_with_source_database_filter PASSED [ 51%] -tests/test_virus.py::TestVirus::test_virus_completeness_filter_verification PASSED [ 52%] -tests/test_virus.py::TestVirus::test_virus_with_multiple_filters PASSED [ 52%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_already_correct_returns_none PASSED [ 52%] -tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_accession_mode PASSED [ 52%] -tests/test_virus.py::TestVirus::test_track_failed_operation_creates_key PASSED [ 53%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype PASSED [ 53%] -tests/test_virus.py::TestVirus::test_virus_invalid_proteins_complete_type PASSED [ 53%] -tests/test_virus.py::TestVirus::test_retry_helper_exponential_backoff_timing PASSED [ 53%] -tests/test_virus.py::TestVirus::test_virus_release_date_filter_verification PASSED [ 54%] -tests/test_virus.py::TestVirus::test_is_sars_cov2_query_common_names PASSED [ 54%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_collection_date_range PASSED [ 54%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_peptide_count PASSED [ 54%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_isolation_source PASSED [ 55%] -tests/test_virus.py::TestVirus::test_check_min_max_none_values PASSED [ 55%] -tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter PASSED [ 55%] -tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter PASSED [ 55%] -tests/test_virus.py::TestVirus::test_local_name_without_namespace PASSED [ 56%] -tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_common_names PASSED [ 56%] -tests/test_virus.py::TestVirus::test_virus_multi_accession_space_separated PASSED [ 56%] -tests/test_virus.py::TestVirus::test_parse_genbank_xml_basic PASSED [ 56%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_metadata_type PASSED [ 57%] -tests/test_virus.py::TestVirus::test_stream_copy_fasta_with_accession_filter PASSED [ 57%] -tests/test_virus.py::TestVirus::test_merge_metadata_csvs_no_overwrite PASSED [ 57%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_zero PASSED [ 57%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_mature_peptide_count PASSED [ 58%] -tests/test_virus.py::TestVirus::test_save_command_summary_creates_file PASSED [ 58%] -tests/test_virus.py::TestVirus::test_virus_invalid_lab_passaged_type PASSED [ 58%] -tests/test_virus.py::TestVirus::test_virus_with_annotated_filter PASSED [ 58%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_none_raises PASSED [ 59%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_no_filters PASSED [ 59%] -tests/test_virus.py::TestVirus::test_virus_with_geographic_location_filter PASSED [ 59%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_false PASSED [ 59%] -tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_basic PASSED [ 60%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_source_database PASSED [ 60%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_true PASSED [ 60%] -tests/test_virus.py::TestVirus::test_clean_xml_declarations_no_declarations PASSED [ 60%] -tests/test_virus.py::TestVirus::test_parse_accession_input_empty_file_raises_error PASSED [ 61%] -tests/test_virus.py::TestVirus::test_retry_helper_success_after_retry PASSED [ 61%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_json PASSED [ 61%] -tests/test_virus.py::TestVirus::test_validate_datasets_binary_empty_path PASSED [ 61%] -tests/test_virus.py::TestVirus::test_virus_multiple_filters_relationship_check PASSED [ 62%] -tests/test_virus.py::TestVirus::test_virus_with_genbank_metadata_retrieval PASSED [ 62%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_invalid_attempt_returns_none PASSED [ 62%] -tests/test_virus.py::TestVirus::test_virus_invalid_annotated_type PASSED [ 62%] -tests/test_virus.py::TestVirus::test_virus_specific_accession_file_creation PASSED [ 63%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_nonexistent_raises PASSED [ 63%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_gen_mol_type PASSED [ 63%] -tests/test_virus.py::TestVirus::test_unzip_file_nonexistent_raises PASSED [ 63%] -tests/test_virus.py::TestVirus::test_virus_relationship_check_counts_match PASSED [ 64%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_min_gene_count PASSED [ 64%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_empty_raises PASSED [ 64%] -tests/test_virus.py::TestVirus::test_retry_helper_custom_retryable_exceptions PASSED [ 64%] -tests/test_virus.py::TestVirus::test_parse_partial_date_full_date PASSED [ 65%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_true PASSED [ 65%] -tests/test_virus.py::TestVirus::test_virus_host_filter_verification PASSED [ 65%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_no_filters PASSED [ 65%] -tests/test_virus.py::TestVirus::test_filter_cached_host_not_in_strategy PASSED [ 66%] -tests/test_virus.py::TestVirus::test_write_fasta_record_with_description PASSED [ 66%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_true PASSED [ 66%] -tests/test_virus.py::TestVirus::test_get_gget_version_returns_string PASSED [ 66%] -tests/test_virus.py::TestVirus::test_merge_baseline_with_new_deduplicates PASSED [ 67%] -tests/test_virus.py::TestVirus::test_filter_sequences_proteins_complete PASSED [ 67%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_csv PASSED [ 67%] -tests/test_virus.py::TestVirus::test_filter_sequences_no_filters PASSED [ 67%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_max_gene_count PASSED [ 68%] -tests/test_virus.py::TestVirus::test_virus_metadata_schema_validation PASSED [ 68%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_empty PASSED [ 68%] -tests/test_virus.py::TestVirus::test_parse_date_full PASSED [ 68%] -tests/test_virus.py::TestVirus::test_virus_with_collection_date_filters PASSED [ 69%] -tests/test_virus.py::TestVirus::test_parse_accession_input_nonexistent_file_raises_error PASSED [ 69%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_empty_returns_none PASSED [ 69%] -tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_negative PASSED [ 69%] -tests/test_virus.py::TestVirus::test_validate_datasets_binary_valid PASSED [ 70%] -tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_empty PASSED [ 70%] -tests/test_virus.py::TestVirus::test_parse_genbank_xml_invalid_raises PASSED [ 70%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_negative PASSED [ 70%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_env_source PASSED [ 71%] -tests/test_virus.py::TestVirus::test_get_datasets_path_returns_valid_path PASSED [ 71%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_max_release_date PASSED [ 71%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_name PASSED [ 71%] -tests/test_virus.py::TestVirus::test_write_fasta_record_without_description PASSED [ 72%] -tests/test_virus.py::TestVirus::test_filter_cached_min_release_date PASSED [ 72%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_gene_count PASSED [ 72%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_no_parentheses_returns_none PASSED [ 72%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_collection_date PASSED [ 73%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_max_seq_length PASSED [ 73%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_virus_suffix PASSED [ 73%] -tests/test_virus.py::TestVirus::test_clean_xml_declarations PASSED [ 73%] -tests/test_virus.py::TestVirus::test_unzip_file_bad_zip_raises PASSED [ 74%] -tests/test_virus.py::TestVirus::test_save_command_summary_with_error PASSED [ 74%] -tests/test_virus.py::TestVirus::test_is_sars_cov2_query_accession_mode PASSED [ 74%] -tests/test_virus.py::TestVirus::test_filter_sequences_max_ambiguous_chars PASSED [ 74%] -tests/test_virus.py::TestVirus::test_track_failed_operation_appends PASSED [ 75%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype_list PASSED [ 75%] -tests/test_virus.py::TestVirus::test_parse_partial_date_empty_raises PASSED [ 75%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_text PASSED [ 75%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_protein_count PASSED [ 76%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_combined_filters PASSED [ 76%] -tests/test_virus.py::TestVirus::test_filter_cached_geographic_location PASSED [ 76%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_min_comparison PASSED [ 76%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_space_before_virus PASSED [ 77%] -tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter PASSED [ 77%] -tests/test_virus.py::TestVirus::test_check_min_max_invalid_raises PASSED [ 77%] -tests/test_virus.py::TestVirus::test_write_fasta_record_long_sequence_wraps PASSED [ 77%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_institution PASSED [ 78%] -tests/test_virus.py::TestVirus::test_calculate_max_accessions_per_batch PASSED [ 78%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_nuc_completeness_partial PASSED [ 78%] -tests/test_virus.py::TestVirus::test_save_partial_metadata PASSED [ 78%] -tests/test_pdb.py::TestPDB::test_pdb_legacy_fallback_to_mmcif PASSED [ 79%] -tests/test_pdb.py::TestPDB::test_pdb_mmcif PASSED [ 79%] -tests/test_pdb.py::TestPDB::test_pdb_assembly PASSED [ 79%] -tests/test_pdb.py::TestPDB::test_pdb_pdb PASSED [ 79%] -tests/test_muscle.py::TestMusclePrints::test_muscle_print_nt PASSED [ 80%] -tests/test_muscle.py::TestMuscleAASuper::test_muscle_aa_super5 PASSED [ 80%] -tests/test_muscle.py::TestMuscleSeqsInput::test_muscle_seqs_as_input PASSED [ 80%] -tests/test_muscle.py::TestMuscle::test_muscle_nt PASSED [ 80%] -tests/test_muscle.py::TestMuscle::test_muscle_nt_txt PASSED [ 81%] -tests/test_muscle.py::TestMuscleSuper::test_muscle_nt_super5 PASSED [ 81%] -tests/test_muscle.py::TestMuscleAA::test_muscle_aa PASSED [ 81%] -tests/test_8cube.py::TestSpecificity::test_specificity_basic PASSED [ 81%] -tests/test_8cube.py::TestPsiBlock::test_psi_block_basic PASSED [ 82%] -tests/test_8cube.py::TestGeneExpression::test_gene_expression_basic PASSED [ 82%] -tests/test_elm.py::TestELM::test_elm_uniprot_id_in_elm PASSED [ 82%] -tests/test_elm.py::TestELM::test_elm_uniprot_id_new PASSED [ 82%] -tests/test_elm.py::TestELM::test_elm_uniprot_aminoacidseq PASSED [ 83%] -tests/test_g2p.py::TestG2P::test_g2p_alignment PASSED [ 83%] -tests/test_g2p.py::TestG2P::test_g2p_features PASSED [ 83%] -tests/test_g2p.py::TestG2P::test_g2p_map PASSED [ 83%] -tests/test_g2p.py::TestG2PValidation::test_invalid_resource_raises PASSED [ 84%] -tests/test_g2p.py::TestG2PValidation::test_alignment_requires_isoform PASSED [ 84%] -tests/test_g2p.py::TestG2PValidation::test_missing_uniprot_raises PASSED [ 84%] -tests/test_diamond.py::TestDiamond::test_diamond_seqs_single PASSED [ 84%] -tests/test_diamond.py::TestDiamond::test_diamond_JSON_out PASSED [ 85%] -tests/test_diamond.py::TestDiamond::test_diamond_both_files PASSED [ 85%] -tests/test_diamond.py::TestDiamond::test_diamond_query_file PASSED [ 85%] -tests/test_diamond.py::TestDiamond::test_diamond_seqs_multiple PASSED [ 85%] -tests/test_diamond.py::TestDiamond::test_diamond_ref_file PASSED [ 86%] -tests/test_mutate.py::TestMutate::test_uncertain_mutation PASSED [ 86%] -tests/test_mutate.py::TestMutate::test_multi_insertion_with_left_repeats PASSED [ 86%] -tests/test_mutate.py::TestMutate::test_multi_deletion_with_right_repeats PASSED [ 86%] -tests/test_mutate.py::TestMutate::test_single_deletion_with_left_repeats PASSED [ 87%] -tests/test_mutate.py::TestMutate::test_single_dup PASSED [ 87%] -tests/test_mutate.py::TestMutate::test_single_insertion PASSED [ 87%] -tests/test_mutate.py::TestMutate::test_multi_insertion PASSED [ 87%] -tests/test_mutate.py::TestMutate::test_single_substitution_near_left_end PASSED [ 88%] -tests/test_mutate.py::TestMutate::test_multi_delins_with_true_right_repeats PASSED [ 88%] -tests/test_mutate.py::TestMutate::test_list_of_mutations PASSED [ 88%] -tests/test_mutate.py::TestMutate::test_multi_delins_with_psuedo_left_repeats PASSED [ 88%] -tests/test_mutate.py::TestMutate::test_large_k PASSED [ 89%] -tests/test_mutate.py::TestMutate::test_multi_delins PASSED [ 89%] -tests/test_mutate.py::TestMutate::test_single_delins PASSED [ 89%] -tests/test_mutate.py::TestMutate::test_multi_delins_with_true_left_repeats PASSED [ 89%] -tests/test_mutate.py::TestMutate::test_multi_dup PASSED [ 90%] -tests/test_mutate.py::TestMutate::test_single_substitution PASSED [ 90%] -tests/test_mutate.py::TestMutate::test_inversion_with_overlaps PASSED [ 90%] -tests/test_mutate.py::TestMutate::test_multi_deletion PASSED [ 90%] -tests/test_mutate.py::TestMutate::test_intron_mutation_minus PASSED [ 91%] -tests/test_mutate.py::TestMutate::test_posttranslational_mutation PASSED [ 91%] -tests/test_mutate.py::TestMutate::test_single_deletion PASSED [ 91%] -tests/test_mutate.py::TestMutate::test_intron_mutation_plus PASSED [ 91%] -tests/test_mutate.py::TestMutate::test_ambiguous_mutation PASSED [ 92%] -tests/test_mutate.py::TestMutate::test_index_error PASSED [ 92%] -tests/test_mutate.py::TestMutate::test_single_substitution_near_right_end PASSED [ 92%] -tests/test_mutate.py::TestMutate::test_single_deletion_with_right_repeats PASSED [ 92%] -tests/test_mutate.py::test_mismatch_error PASSED [ 93%] -tests/test_mutate.py::test_csv_of_mutations PASSED [ 93%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_resource PASSED [ 93%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions PASSED [ 93%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_no_limit PASSED [ 94%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_simple_filter PASSED [ 94%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_expression_no_limit PASSED [ 94%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_diseases PASSED [ 94%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap PASSED [ 95%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_nonexistent_id PASSED [ 95%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets PASSED [ 95%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_expression PASSED [ 95%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_diseases_filter PASSED [ 96%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap_filter PASSED [ 96%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_drugs_invalid_filter PASSED [ 96%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_tractability PASSED [ 96%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_pharmacogenetics PASSED [ 97%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_limit PASSED [ 97%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_drugs PASSED [ 97%] -tests/test_seq.py::TestSeq::test_seq_gene PASSED [ 97%] -tests/test_seq.py::TestSeq::test_seq_transcript_transcript_WB PASSED [ 98%] -tests/test_seq.py::TestSeq::test_seq_transcript_gene_iso PASSED [ 98%] -tests/test_seq.py::TestSeq::test_seq_missing_uniprot_gene_name PASSED [ 98%] -tests/test_seq.py::TestSeq::test_seq_transcript_gene_WB PASSED [ 98%] -tests/test_seq.py::TestSeq::test_seq_transcript_transcript_iso PASSED [ 99%] -tests/test_seq.py::TestSeq::test_seq_gene_iso PASSED [ 99%] -tests/test_seq.py::TestSeq::test_seq_gene_transcript_iso PASSED [ 99%] -tests/test_seq.py::TestSeq::test_seq_transcript_gene PASSED [ 99%] -tests/test_seq.py::TestSeq::test_seq_transcript PASSED [100%] - -=============================== warnings summary =============================== -tests/test_search.py::TestSearch::test_search_transcript_two_sw_or -tests/test_search.py::TestSearch::test_search_transcript_two_sw_and -tests/test_search.py::TestSearch::test_search_release -tests/test_utils.py::TestUtils::test_search_species_options - /home/runner/work/gget/gget/gget/utils.py:899: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. - for subsoup in soup.body.findAll("a"): - -tests/test_search.py::TestSearch::test_search_transcript_two_sw_or -tests/test_search.py::TestSearch::test_search_transcript_two_sw_or -tests/test_search.py::TestSearch::test_search_transcript_two_sw_or -tests/test_search.py::TestSearch::test_search_transcript_two_sw_or -tests/test_utils.py::TestUtils::test_search_iv_species_options -tests/test_utils.py::TestUtils::test_search_iv_species_options -tests/test_utils.py::TestUtils::test_search_iv_species_options -tests/test_utils.py::TestUtils::test_search_iv_species_options - /home/runner/work/gget/gget/gget/utils.py:883: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. - for subsoup in soup.body.findAll("a"): - -tests/test_search.py::TestSearch::test_search_transcript_two_sw_or -tests/test_search.py::TestSearch::test_search_transcript_two_sw_and -tests/test_search.py::TestSearch::test_search_gene_two_sw_limit -tests/test_search.py::TestSearch::test_search_transcript_one_sw - /home/runner/work/gget/gget/gget/gget_search.py:302: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy. - df_temp = pd.read_sql(query, con=db_connection) - -tests/test_search.py: 19 warnings -tests/test_ref.py: 7 warnings - /home/runner/work/gget/gget/gget/utils.py:922: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. - for subsoup in soup.body.findAll("a"): - -tests/test_search.py: 10 warnings - /home/runner/work/gget/gget/gget/gget_search.py:267: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy. - df_temp = pd.read_sql(query, con=db_connection) - -tests/test_utils.py: 1 warning -tests/test_ref.py: 11 warnings - /home/runner/work/gget/gget/gget/utils.py:998: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. - for subsoup in soup.body.findAll("a"): - -tests/test_utils.py: 4 warnings -tests/test_ref.py: 24 warnings - /home/runner/work/gget/gget/gget/utils.py:975: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. - for subsoup in soup.body.findAll("a"): - -tests/test_cbio.py::TestCbioSearch::test_cbio_search -tests/test_cbio.py::TestCbioSearch::test_cbio_search - /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/swagger_spec_validator/validator12.py:18: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. - from jsonschema import RefResolver - -tests/test_cbio.py::TestCbioSearch::test_cbio_search - /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/swagger_spec_validator/ref_validators.py:14: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. - from jsonschema.validators import RefResolver - -tests/test_cbio.py::TestCbioSearch::test_cbio_search - /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/swagger_spec_validator/validator20.py:18: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. - from jsonschema.validators import RefResolver - -tests/test_cbio.py::TestCbioSearch::test_cbio_search -tests/test_cbio.py::TestCbioSearch::test_cbio_search - /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/bravado_core/swagger20_validator.py:6: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. - from jsonschema import RefResolver - -tests/test_cbio.py::TestCbioSearch::test_cbio_search - /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/bravado_core/spec.py:14: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. - from jsonschema.validators import RefResolver - -tests/test_cbio.py: 16 warnings - /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/bravado_core/model.py:888: DeprecationWarning: jsonschema.RefResolver.in_scope is deprecated and will be removed in a future release. - with spec.resolver.in_scope(additional_uri): - -tests/test_ref.py: 39 warnings - /home/runner/work/gget/gget/gget/gget_ref.py:49: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. - links = [stuff.text.strip() for stuff in soup.findAll("td")] - -tests/test_ref.py::TestRef::test_ref_ftp -tests/test_ref.py::TestRef::test_ref - /home/runner/work/gget/gget/gget/gget_ref.py:325: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. - links = [stuff.text.strip() for stuff in soup.findAll("td")] - -tests/test_mutate.py: 29 warnings - /home/runner/work/gget/gget/gget/gget_mutate.py:667: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract. - mask = mutations[mut_column].str.contains(combined_pattern) - --- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html -============================= slowest 10 durations ============================= -183.60s call tests/test_virus.py::TestVirus::test_virus_integer_virus_id -179.05s call tests/test_virus.py::TestVirus::test_virus_with_source_database_filter -129.99s call tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter -89.52s call tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter -76.10s call tests/test_blast.py::TestBlast::test_blast_nt -66.60s call tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter -38.50s call tests/test_search.py::TestSearch::test_search_gene_two_sw_limit -26.95s call tests/test_virus.py::TestVirus::test_virus_with_annotated_filter -26.94s call tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters -22.12s call tests/test_virus.py::TestVirus::test_virus_with_host_filter +collecting ... collected 399 items / 1 error + +==================================== ERRORS ==================================== +______________________ ERROR collecting tests/test_elm.py ______________________ +tests/test_elm.py:11: in + gget_setup(module="elm") +gget/gget_setup.py:204: in setup + raise RuntimeError("ELM database files download failed; missing files: " + ", ".join(missing)) +E RuntimeError: ELM database files download failed; missing files: ELM instances fasta file +------------------------------- Captured stderr -------------------------------- + %% TT oo%tt aaTllo t a l %% RR ee%cc eeRiievvceeeddi v%%e dXX ff%ee rrXddf e rAAdvv ee rrAaavggeeer aSSgppeee eeSddp e e dTT ii mm eeT i m e TT ii mm eeT i m e T Ti im meTe i m CeCu ur rrCreeunnrttr + +e n t + DD ll oo aaDddl o aUUdpp ll ooUaapdld o a d T Too tt aaTllo t a lSS pp ee nnSttp e n t L Le ef ftLt e f StSp pe eeSedpd +e +ed + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0-- -:-:----:-:-:----:- - ---- -:-:----:-:-:----:- - ---- -:-:----:-:-:----:- - - 0 0 0 0 0 0 0 0 0 000 00 0 0 00 0 0 0 0 0 0 - -0 : - - : 00 -- --:- ----:--:--::--- -- -:---:--:-- --:---::--- -- :------::- --- :: --- - 0 00 100 38626 100 38626 0 0 39993 0 --:--:-- --:--:-- --:--:-- 39985 + 100 88298 100 88298 0 0 83475 0 0:00:01 0:00:01 --:--:-- 83536 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 1 922k 1 13889 0 0 23270 0 0:00:40 --:--:-- 0:00:40 23264 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 71 922k 71 663k 0 0 410k 0 0:00:02 0:00:01 0:00:01 410k 100 922k 100 922k 0 0 539k 0 0:00:01 0:00:01 --:--:-- 539k + 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 419 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 +curl: (22) The requested URL returned error: 503 +Warning: Problem : HTTP error. Will retry in 5 seconds. 3 retries left. + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:00 --:--:-- 0 +curl: (28) Operation timed out after 180000 milliseconds with 0 bytes received +Warning: Problem : timeout. Will retry in 5 seconds. 2 retries left. + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:00 --:--:-- 0 +curl: (28) Operation timed out after 180001 milliseconds with 0 bytes received +Warning: Problem : timeout. Will retry in 5 seconds. 1 retries left. + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:00 --:--:-- 0 +curl: (28) Operation timed out after 180001 milliseconds with 0 bytes received =========================== short test summary info ============================ -SKIPPED [1] tests/test_cellxgene.py:65: cellxgene-census is not installed -SKIPPED [1] tests/test_cellxgene.py:45: cellxgene-census is not installed -SKIPPED [1] tests/test_cellxgene.py:55: cellxgene-census is not installed -========== 399 passed, 3 skipped, 185 warnings in 1219.47s (0:20:19) =========== +ERROR tests/test_elm.py - RuntimeError: ELM database files download failed; missing files: ELM instances fasta file +!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! +========================= 1 error in 663.80s (0:11:03) ========================= From 919dab8a200b5636536afc943b08135bdb17134b Mon Sep 17 00:00:00 2001 From: Elarwei <168552401+Elarwei001@users.noreply.github.com> Date: Sat, 27 Jun 2026 02:59:15 +0800 Subject: [PATCH 14/34] fix(ci): repair archs4 + ELM live-data test failures (#252) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(opentargets): give drug synonyms a GraphQL sub-selection (HTTP 400 fix) OpenTargets changed the Drug 'synonyms' and 'tradeNames' fields from [String!]! to the object type [DrugLabelAndSource!]!, which now requires a sub-selection. The bare-scalar selection caused every drug query to fail with HTTP 400. Request '{ label }' for both fields and flatten the response objects back to a list of label strings so downstream output stays backward-compatible (a list of strings). Co-Authored-By: Claude Opus 4.8 (1M context) * fix(archs4): tolerate missing 'color' column in tissue expression (#dev-drift) ARCHS4's tissue-expression CSV intermittently omits the 'color' column, which made `gget archs4 --which tissue` crash with `KeyError: "['color'] not found in axis"`. The 'color' column is only used for plotting upstream and is dropped (never used) by gget, so a missing column should not be fatal. Use `drop(columns=["color"], errors="ignore")` so the request degrades gracefully when the column is absent. Adds network-free regression tests covering both the present-color and missing-color responses. Co-Authored-By: Claude Opus 4.8 (1M context) * fix(opentargets): use baselineExpression for the expression resource OpenTargets retired the `target.expressions` field (it now returns an empty list for every gene), so `gget opentargets -r expression` returned nothing. Baseline expression data moved to the paginated `target.baselineExpression` field with a new per-biosample data model. - Repoint the expression query to `baselineExpression(page:{index:0,size:250}) { rows {...} }` and update rows_path to ["baselineExpression","rows"]. - Output columns change accordingly (per-biosample summary stats: median/min/ q1/q3/max/unit + tissueBiosample/celltypeBiosample ids + datasource/datatype), because the upstream data model changed and the old shape no longer exists. - Remove the two now-invalid live exact-match fixtures and replace them with network-free mocked tests; update docs (example, resource table, updates.md). Verified live: http_json with the new query returns 1409 rows in ~0.6s and the parsing pipeline yields the documented columns. Co-Authored-By: Claude Opus 4.8 (1M context) * test(opentargets): loosen live-data assertions to structural/invariant (data drifts across releases) OpenTargets is a live database re-released regularly; several opentargets tests pinned exact current values (disease ids/scores, result hashes, interaction partner ids, genotypes) that legitimately change every release, so they failed on unrelated PRs even though gget returns correct current data. Replace the exact-value/hash assertions for test_opentargets, _diseases, _depmap, _depmap_filter, _interactions, _interactions_no_limit and _pharmacogenetics with structural/invariant assertions (expected columns present, numeric dtypes, value-format patterns — ontology-curie disease/tissue ids, ENSG interaction partners, ACH DepMap ids, score in [0,1], nucleotide genotypes — and the depmap filter invariant). The fixture entries are marked `code_defined`; the structural methods live in tests/test_opentargets.py. These stay meaningful (they break on wrong columns, malformed ids, non-numeric scores, broken filtering, or empty-where-guaranteed) without pinning drifting data. Verified live against current OpenTargets data. Co-Authored-By: Claude Opus 4.8 (1M context) * test: assert live-data contracts for CI repair * test: retry ELM live setup downloads * test: keep OpenTargets expression semantics out of CI repair * test(opentargets): add semantic anchors + score tolerance to live-data tests (#249) Co-Authored-By: Claude Opus 4.8 (1M context) * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * test(opentargets): rewrite live-data tests as explicit IL13 assertions (#249) Co-Authored-By: Claude Opus 4.8 (1M context) * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * test(opentargets): read gene from fixture + guard to IL13; drop duplicate test_opentargets (#249) Co-Authored-By: Claude Opus 4.8 (1M context) * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * test(archs4): rewrite live tissue tests as concrete fixture-driven checks (#249) Co-Authored-By: Claude Opus 4.8 (1M context) * fix(archs4): deterministic tissue sort via id tiebreaker; restore exact-snapshot tests (#249) Sort tissue rows by [median desc, id asc] so output is reproducible when medians tie (ARCHS4 returns tied rows in varying order). Revert the live tissue tests to exact assert_equal snapshots (re-sorted to the deterministic order); keep the network-free color regression tests. Co-Authored-By: Claude Opus 4.8 (1M context) * Drop opentargets fixes from this PR (now covered by #256) Strip back the opentargets-related changes so this PR is focused on the archs4 + ELM CI-stability fixes only. The opentargets work (synonyms HTTP 400 fix, fixture refresh, expression skip) is being handled in a separate PR (#256), per maintainer preference for one-module-per-PR review. Reverted to origin/dev: - gget/gget_opentargets.py - tests/test_opentargets.py - tests/fixtures/test_opentargets.json Trimmed updates.md: - Removed the opentargets bullet (lives in #256) - Added an archs4 bullet explaining the color-column + deterministic- sort fix (user-visible behavior change, was missing here) Remaining scope: - gget_archs4.py: graceful handling of missing color column, deterministic median-then-id sort - tests/test_archs4.py: TestArchs4MissingColor regression test - tests/fixtures/test_archs4.json: refreshed for the deterministic sort - tests/test_elm.py: retry ELM setup on transient download failure Co-Authored-By: Claude Opus 4.7 (1M context) * test(archs4): drop the redundant with-color companion test test_tissue_with_color_still_dropped tested the "happy path" that both the old and the new code already handle the same way (column present → column dropped from output). It can't catch any plausible regression of the actual fix (which is the errors="ignore" kwarg, exercised by the sibling test_tissue_missing_color_does_not_crash). Removing it tightens the test suite without weakening the regression guard around the actual bug. _CSV_WITH_COLOR class attribute removed along with it (no other references). --------- Co-authored-by: Claude Opus 4.8 (1M context) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Laura Luebbert --- docs/src/en/updates.md | 1 + gget/gget_archs4.py | 14 ++- tests/fixtures/test_archs4.json | 162 ++++++++++++++++---------------- tests/test_archs4.py | 23 +++++ tests/test_elm.py | 10 +- 5 files changed, 123 insertions(+), 87 deletions(-) diff --git a/docs/src/en/updates.md b/docs/src/en/updates.md index f2c52c13b..002baed61 100644 --- a/docs/src/en/updates.md +++ b/docs/src/en/updates.md @@ -8,6 +8,7 @@ - [`gget pdb`](pdb.md): Added support for the PDBx/mmCIF structure format (fixes [issue 178](https://github.com/scverse/gget/issues/178) and [issue 177](https://github.com/scverse/gget/issues/177)). - New `resource="mmcif"` option downloads the structure in PDBx/mmCIF format (`.cif`). - The default `resource="pdb"` now automatically falls back to PDBx/mmCIF when the legacy PDB file is unavailable (e.g. for large structures), since the legacy PDB format is being phased out by RCSB. A warning is logged and saved files use the correct extension (`.cif`). +- [`gget archs4`](archs4.md) (tissue mode): No longer crashes with `KeyError: ['color'] not found in axis` when ARCHS4 intermittently omits the optional `color` column from its CSV response. The column is now dropped only if present. Output also has a deterministic row order (sorted by `median` descending, with `id` as tiebreaker) so equal-median tissues no longer flip order between requests. **Version ≥ 0.30.7** (Jun 21, 2026): diff --git a/gget/gget_archs4.py b/gget/gget_archs4.py index e582dfaf5..e49a274bb 100644 --- a/gget/gget_archs4.py +++ b/gget/gget_archs4.py @@ -200,11 +200,15 @@ def archs4( # Drop NaN rows tissue_exp_df = tissue_exp_df.dropna() - # Drop color columns - tissue_exp_df = tissue_exp_df.drop(["color"], axis=1) - - # Sort data frame by median expression - tissue_exp_df = tissue_exp_df.sort_values("median", ascending=False) + # Drop the "color" column if present (only used for plotting upstream, not by gget). + # ARCHS4 intermittently omits this column; use errors="ignore" so a missing + # "color" column does not raise a KeyError and crash the request. + tissue_exp_df = tissue_exp_df.drop(columns=["color"], errors="ignore") + + # Sort data frame by median expression. Use "id" as a stable tiebreaker so the row + # order is deterministic when several tissues share the same median (ARCHS4 returns + # tied rows in a varying order between requests otherwise). + tissue_exp_df = tissue_exp_df.sort_values(["median", "id"], ascending=[False, True]) tissue_exp_df = tissue_exp_df.reset_index(drop=True) if json: diff --git a/tests/fixtures/test_archs4.json b/tests/fixtures/test_archs4.json index 5b060b564..73b24a471 100644 --- a/tests/fixtures/test_archs4.json +++ b/tests/fixtures/test_archs4.json @@ -598,14 +598,6 @@ 7.62057, 8.60009 ], - [ - "System.Nervous System.CNS.THALAMUS", - 3.29066, - 5.995, - 7.14836, - 7.83426, - 8.71165 - ], [ "System.Nervous System.CNS.HYPOTHALAMUS", 3.44188, @@ -614,6 +606,14 @@ 7.99022, 8.81727 ], + [ + "System.Nervous System.CNS.THALAMUS", + 3.29066, + 5.995, + 7.14836, + 7.83426, + 8.71165 + ], [ "System.Immune System.Lymphoid.BLYMPHOCYTE", 5.57377, @@ -678,14 +678,6 @@ 7.42671, 8.89625 ], - [ - "System.Immune System.Lymphoid.TLYMPHOCYTE", - 5.60813, - 6.60849, - 6.9754, - 7.26685, - 7.85409 - ], [ "System.Connective Tissue.Bone marrow.CHONDROCYTE", 5.93985, @@ -694,6 +686,14 @@ 7.44552, 8.78176 ], + [ + "System.Immune System.Lymphoid.TLYMPHOCYTE", + 5.60813, + 6.60849, + 6.9754, + 7.26685, + 7.85409 + ], [ "System.Immune System.Myeloid.MACROPHAGE", 0.113644, @@ -702,14 +702,6 @@ 7.38198, 8.46912 ], - [ - "System.Respiratory System.Lung.LUNG", - 0.113644, - 5.88569, - 6.95675, - 7.7752, - 9.18212 - ], [ "System.Nervous System.CNS.ASTROCYTE", 1.20968, @@ -718,6 +710,14 @@ 7.42671, 8.33012 ], + [ + "System.Respiratory System.Lung.LUNG", + 0.113644, + 5.88569, + 6.95675, + 7.7752, + 9.18212 + ], [ "System.Connective Tissue.Adipose tissue.ADIPOSE", 4.26947, @@ -766,14 +766,6 @@ 7.98803, 9.42561 ], - [ - "System.Immune System.Myeloid.DENDRITIC CELL", - 4.2942, - 6.48802, - 6.88087, - 7.39734, - 8.09957 - ], [ "System.Connective Tissue.Adipose tissue.ADIPOCYTE", 4.86561, @@ -782,6 +774,14 @@ 7.13293, 7.71929 ], + [ + "System.Immune System.Myeloid.DENDRITIC CELL", + 4.2942, + 6.48802, + 6.88087, + 7.39734, + 8.09957 + ], [ "System.Immune System.Myeloid.MICROGLIA", 0.113644, @@ -798,14 +798,6 @@ 7.10033, 7.57266 ], - [ - "System.Integumentary System.Skin.FIBROBLAST", - 0.113644, - 6.35023, - 6.8453, - 7.43403, - 9.31767 - ], [ "System.Digestive System.Esophagus.ESOPHAGUS", 0.113644, @@ -814,6 +806,14 @@ 8.1174, 9.13015 ], + [ + "System.Integumentary System.Skin.FIBROBLAST", + 0.113644, + 6.35023, + 6.8453, + 7.43403, + 9.31767 + ], [ "System.Immune System.Myeloid.KUPFFER CELL", 6.16327, @@ -1184,14 +1184,6 @@ "q3": 7.62057, "max": 8.60009 }, - { - "id": "System.Nervous System.CNS.THALAMUS", - "min": 3.29066, - "q1": 5.995, - "median": 7.14836, - "q3": 7.83426, - "max": 8.71165 - }, { "id": "System.Nervous System.CNS.HYPOTHALAMUS", "min": 3.44188, @@ -1200,6 +1192,14 @@ "q3": 7.99022, "max": 8.81727 }, + { + "id": "System.Nervous System.CNS.THALAMUS", + "min": 3.29066, + "q1": 5.995, + "median": 7.14836, + "q3": 7.83426, + "max": 8.71165 + }, { "id": "System.Immune System.Lymphoid.BLYMPHOCYTE", "min": 5.57377, @@ -1264,14 +1264,6 @@ "q3": 7.42671, "max": 8.89625 }, - { - "id": "System.Immune System.Lymphoid.TLYMPHOCYTE", - "min": 5.60813, - "q1": 6.60849, - "median": 6.9754, - "q3": 7.26685, - "max": 7.85409 - }, { "id": "System.Connective Tissue.Bone marrow.CHONDROCYTE", "min": 5.93985, @@ -1280,6 +1272,14 @@ "q3": 7.44552, "max": 8.78176 }, + { + "id": "System.Immune System.Lymphoid.TLYMPHOCYTE", + "min": 5.60813, + "q1": 6.60849, + "median": 6.9754, + "q3": 7.26685, + "max": 7.85409 + }, { "id": "System.Immune System.Myeloid.MACROPHAGE", "min": 0.113644, @@ -1288,14 +1288,6 @@ "q3": 7.38198, "max": 8.46912 }, - { - "id": "System.Respiratory System.Lung.LUNG", - "min": 0.113644, - "q1": 5.88569, - "median": 6.95675, - "q3": 7.7752, - "max": 9.18212 - }, { "id": "System.Nervous System.CNS.ASTROCYTE", "min": 1.20968, @@ -1304,6 +1296,14 @@ "q3": 7.42671, "max": 8.33012 }, + { + "id": "System.Respiratory System.Lung.LUNG", + "min": 0.113644, + "q1": 5.88569, + "median": 6.95675, + "q3": 7.7752, + "max": 9.18212 + }, { "id": "System.Connective Tissue.Adipose tissue.ADIPOSE", "min": 4.26947, @@ -1352,14 +1352,6 @@ "q3": 7.98803, "max": 9.42561 }, - { - "id": "System.Immune System.Myeloid.DENDRITIC CELL", - "min": 4.2942, - "q1": 6.48802, - "median": 6.88087, - "q3": 7.39734, - "max": 8.09957 - }, { "id": "System.Connective Tissue.Adipose tissue.ADIPOCYTE", "min": 4.86561, @@ -1368,6 +1360,14 @@ "q3": 7.13293, "max": 7.71929 }, + { + "id": "System.Immune System.Myeloid.DENDRITIC CELL", + "min": 4.2942, + "q1": 6.48802, + "median": 6.88087, + "q3": 7.39734, + "max": 8.09957 + }, { "id": "System.Immune System.Myeloid.MICROGLIA", "min": 0.113644, @@ -1384,14 +1384,6 @@ "q3": 7.10033, "max": 7.57266 }, - { - "id": "System.Integumentary System.Skin.FIBROBLAST", - "min": 0.113644, - "q1": 6.35023, - "median": 6.8453, - "q3": 7.43403, - "max": 9.31767 - }, { "id": "System.Digestive System.Esophagus.ESOPHAGUS", "min": 0.113644, @@ -1400,6 +1392,14 @@ "q3": 8.1174, "max": 9.13015 }, + { + "id": "System.Integumentary System.Skin.FIBROBLAST", + "min": 0.113644, + "q1": 6.35023, + "median": 6.8453, + "q3": 7.43403, + "max": 9.31767 + }, { "id": "System.Immune System.Myeloid.KUPFFER CELL", "min": 6.16327, @@ -2614,4 +2614,4 @@ }, "expected_result": "ValueError" } -} \ No newline at end of file +} diff --git a/tests/test_archs4.py b/tests/test_archs4.py index c6336bc91..99440b054 100644 --- a/tests/test_archs4.py +++ b/tests/test_archs4.py @@ -1,5 +1,6 @@ import json import unittest +from unittest.mock import patch from gget.gget_archs4 import archs4 @@ -12,3 +13,25 @@ class TestArchs4(unittest.TestCase, metaclass=from_json(archs4_dict, archs4)): pass # all tests are loaded from json + + +class _FakeResponse: + def __init__(self, text): + self.ok = True + self.content = text.encode("utf-8") + + +class TestArchs4MissingColor(unittest.TestCase): + """Network-free regression tests: ARCHS4 intermittently omits the 'color' column from + the tissue-expression CSV. gget must not crash with a KeyError when it is absent + (the 'color' column is dropped and never used).""" + + _CSV_NO_COLOR = "id,min,q1,median,q3,max\nTissueA,0,1,5,9,10\nTissueB,0,2,8,12,15\n" + + def test_tissue_missing_color_does_not_crash(self): + with patch("gget.gget_archs4.requests.post", return_value=_FakeResponse(self._CSV_NO_COLOR)): + df = archs4("STAT4", which="tissue", verbose=False) + # Returns a valid, sorted data frame without a 'color' column (no KeyError). + self.assertEqual(len(df), 2) + self.assertNotIn("color", df.columns) + self.assertEqual(df.iloc[0]["id"], "TissueB") # sorted by median descending diff --git a/tests/test_elm.py b/tests/test_elm.py index de8f67c35..099cd0bec 100644 --- a/tests/test_elm.py +++ b/tests/test_elm.py @@ -1,4 +1,5 @@ import json +import time import unittest from gget.gget_elm import elm @@ -8,7 +9,14 @@ with open("./tests/fixtures/test_elm.json") as json_file: elm_dict = json.load(json_file) -gget_setup(module="elm") +for attempt in range(3): + try: + gget_setup(module="elm") + break + except RuntimeError as exc: + if "ELM database files download failed" not in str(exc) or attempt == 2: + raise + time.sleep(30) class TestELM(unittest.TestCase): From 82a47bc6664ca9715d7a86905fbbbb2761a64f58 Mon Sep 17 00:00:00 2001 From: "Laura Luebbert, Ph.D." <56094636+lauraluebbert@users.noreply.github.com> Date: Fri, 26 Jun 2026 14:59:45 -0400 Subject: [PATCH 15/34] fix(opentargets): adapt to upstream API drift + skip deprecated expressions field (#256) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(opentargets): adapt to upstream API drift + skip deprecated expressions field 11 opentargets tests were failing across all Python versions due to three distinct upstream changes: 1. GraphQL schema change (real bug) The Drug type's `synonyms` and `tradeNames` fields are now `[DrugLabelAndSource!]!` (was scalar list[str]). Querying without a sub-selection returns HTTP 400. Updated QUERY_STRING_DRUGS to query `synonyms { label }` and `tradeNames { label }`. The existing _collapse_singletons() post-processor flattens each {label: "X"} back to "X" automatically, so the public DataFrame shape is preserved. 2. Data drift (8 tests, fixtures refreshed) Open Targets re-indexed disease ontology IDs (EFO → MONDO), gene protein IDs, allele frequencies, depmap entries, and interaction data. Per the project convention (refresh fixtures, don't normalize) the expected_result blocks for test_opentargets, *_diseases, *_drugs, *_interactions, *_pharmacogenetics, *_depmap, *_depmap_filter, and *_interactions_no_limit were re-captured from the current upstream output via a one-shot helper script. 3. expressions field deprecated (2 tests, skipped) The Target.expressions field now returns [] for all queries; Open Targets replaced it with Target.baselineExpression which has a completely different schema (tissueBiosample, q1/q3/median/min/max instead of tissue/rna sub-objects). Migrating gget_opentargets to the new field is a user-facing API change and out of scope for this PR; the two affected tests are now marked as skipped with a reason field. Also adds a `skip` test type to tests/from_json.py so JSON-defined tests can be marked as known-skipped (with a reason message) without needing a separate Python test file or fixture deletion. Verified locally: 15 passed, 2 skipped, 0 failed. * docs: add 0.30.8 entries for opentargets fixes - Drugs resource: HTTP 400 fix (synonyms/tradeNames sub-selection). Surfaces both the upstream cause and reassures users that the DataFrame column shape is unchanged. - Expression resource: known limitation pointing at the baselineExpression migration as the next step. Flags that the tests for this path are skipped in the meantime. * opentargets(expression): warn user about upstream deprecation Without this, gget opentargets resource="expression" silently returns an empty DataFrame, which looks identical to "your gene has no expression data" and gives the user no signal that the upstream field is actually retired. Now emits a logger.warning naming the deprecated field, the planned baselineExpression replacement, and the tracking issue (#247) so users can subscribe / contribute. Updated the 0.30.8 entry in updates.md to mention the warning. --- docs/src/en/updates.md | 3 + gget/gget_opentargets.py | 25 ++++++- tests/fixtures/test_opentargets.json | 104 +++++++++++++-------------- tests/from_json.py | 11 +++ 4 files changed, 85 insertions(+), 58 deletions(-) diff --git a/docs/src/en/updates.md b/docs/src/en/updates.md index 002baed61..312495e21 100644 --- a/docs/src/en/updates.md +++ b/docs/src/en/updates.md @@ -8,6 +8,9 @@ - [`gget pdb`](pdb.md): Added support for the PDBx/mmCIF structure format (fixes [issue 178](https://github.com/scverse/gget/issues/178) and [issue 177](https://github.com/scverse/gget/issues/177)). - New `resource="mmcif"` option downloads the structure in PDBx/mmCIF format (`.cif`). - The default `resource="pdb"` now automatically falls back to PDBx/mmCIF when the legacy PDB file is unavailable (e.g. for large structures), since the legacy PDB format is being phased out by RCSB. A warning is logged and saved files use the correct extension (`.cif`). +- [`gget opentargets`](opentargets.md): Adapted to several upstream Open Targets GraphQL API changes: + - **Fixed**: `gget opentargets resource="drugs"` was failing with `HTTP 400 — Field 'synonyms' of type '[DrugLabelAndSource!]!' must have a sub selection.` Open Targets changed `Drug.synonyms` and `Drug.tradeNames` from scalar lists to lists of structured `DrugLabelAndSource` objects. The internal GraphQL query was updated to request the `label` sub-field; the `drug.synonyms` / `drug.tradeNames` columns in the returned DataFrame remain `list[str]`, so existing user code is unaffected. + - **Known limitation**: `gget opentargets resource="expression"` now returns an empty DataFrame because Open Targets deprecated the `Target.expressions` field. A `logger.warning` is now emitted when this resource is invoked so users see *why* the result is empty (rather than silently getting `[]`). The replacement `Target.baselineExpression` field has a different schema (`tissueBiosample`, `q1`/`q3`/`median`/`min`/`max` instead of `tissue`/`rna` sub-objects) and will be wired up in a future release (tracked in [issue 247](https://github.com/scverse/gget/issues/247)). The corresponding tests are marked as skipped until then. - [`gget archs4`](archs4.md) (tissue mode): No longer crashes with `KeyError: ['color'] not found in axis` when ARCHS4 intermittently omits the optional `color` column from its CSV response. The column is now dropped only if present. Output also has a deterministic row order (sorted by `median` descending, with `id` as tiebreaker) so equal-median tissues no longer flip order between requests. diff --git a/gget/gget_opentargets.py b/gget/gget_opentargets.py index 8037fb342..fd53216fb 100644 --- a/gget/gget_opentargets.py +++ b/gget/gget_opentargets.py @@ -43,8 +43,16 @@ } } description - synonyms - tradeNames + # synonyms and tradeNames are now [DrugLabelAndSource!]! (were scalar + # lists); query the `label` sub-field so _collapse_singletons flattens + # each {label: "X"} back to "X", preserving the list[str] shape users + # see in the resulting DataFrame. + synonyms { + label + } + tradeNames { + label + } maximumClinicalStage indications { rows { @@ -324,6 +332,19 @@ def opentargets( query_string = QUERY_STRING_PHARMACOGENETICS rows_path = ["pharmacogenomics"] elif resource == "expression": + # Open Targets deprecated `Target.expressions` upstream (returns [] + # for all targets as of mid-2026). The replacement field + # `Target.baselineExpression` has a different schema (tissueBiosample, + # q1/q3/median/min/max instead of tissue/rna sub-objects); migrating + # gget's output is a user-facing change tracked in + # https://github.com/scverse/gget/issues/247. + logger.warning( + "gget opentargets resource='expression' is currently broken upstream: " + "Open Targets retired the `Target.expressions` GraphQL field (returns []). " + "A future gget release will migrate to the replacement `Target.baselineExpression` " + "field, which has a different output schema. Track at " + "https://github.com/scverse/gget/issues/247." + ) query_string = QUERY_STRING_EXPRESSION rows_path = ["expressions"] elif resource == "depmap": diff --git a/tests/fixtures/test_opentargets.json b/tests/fixtures/test_opentargets.json index 34841d715..721f8bbdc 100644 --- a/tests/fixtures/test_opentargets.json +++ b/tests/fixtures/test_opentargets.json @@ -8,13 +8,13 @@ }, "expected_result": [ [ - 0.7297489019498119, - "EFO_0000274", + 0.7279798021712002, + "MONDO_0004980", "atopic eczema", "A common chronic pruritic inflammatory skin disease with a strong genetic component. Onset typically occurs during the first 2 years of life." ], [ - 0.6642728577751653, + 0.6952093612226559, "MONDO_0004979", "asthma", "A bronchial disease that is characterized by chronic inflammation and narrowing of the airways, which is caused by a combination of environmental and genetic factors resulting in recurring periods of wheezing (a whistling sound while breathing), chest tightness, shortness of breath, mucus production and coughing. The symptoms appear due to a variety of triggers such as allergens, irritants, respiratory infections, weather changes, exercise, stress, reflux disease, medications, foods and emotional anxiety." @@ -22,12 +22,13 @@ ] }, "test_opentargets_expression_no_limit": { - "type": "assert_equal_json_hash", + "type": "skip", "args": { "ensembl_id": "ENSG00000169194", "resource": "expression" }, - "expected_result": "7d32780ec48250553246c816d80b93ee" + "expected_result": "7d32780ec48250553246c816d80b93ee", + "reason": "Open Targets deprecated the `expressions` GraphQL field (returns []) in favor of `baselineExpression`, which has a different schema (tissueBiosample, q1/q3/median/min/max instead of tissue/rna sub-objects). Migration is a user-facing API change; tracked separately." }, "test_opentargets_depmap": { "type": "assert_equal_json_hash", @@ -35,7 +36,7 @@ "ensembl_id": "ENSG00000169194", "resource": "depmap" }, - "expected_result": "c335cc9c9b3167e8c5b3084e339c88a7" + "expected_result": "e81a60ff47c06bfecb3b421d28047718" }, "test_opentargets_depmap_filter": { "type": "assert_equal", @@ -47,26 +48,7 @@ }, "limit": 2 }, - "expected_result": [ - [ - "UBERON_0002367", - "prostate gland", - "DU 145", - 0.034343916922807693, - "Prostate Adenocarcinoma", - "ACH-000979", - -0.14336788654327393 - ], - [ - "UBERON_0002367", - "prostate gland", - "WPE1-NA22", - 0.0291899424046278, - "Non-Cancerous", - "ACH-001422", - 0.06934770196676254 - ] - ] + "expected_result": [] }, "test_opentargets_interactions_no_limit": { "type": "assert_equal_json_hash", @@ -74,7 +56,7 @@ "ensembl_id": "ENSG00000169194", "resource": "interactions" }, - "expected_result": "fa95d278c2d31ded3731e154d65fcda5" + "expected_result": "8ed7f7380590628acdbaa5f9501365a6" }, "test_opentargets_interactions_simple_filter": { "type": "assert_equal", @@ -163,13 +145,13 @@ }, "expected_result": [ { - "score": 0.7297489019, - "disease.id": "EFO_0000274", + "score": 0.7279798022, + "disease.id": "MONDO_0004980", "disease.name": "atopic eczema", "disease.description": "A common chronic pruritic inflammatory skin disease with a strong genetic component. Onset typically occurs during the first 2 years of life." }, { - "score": 0.6642728578, + "score": 0.6952093612, "disease.id": "MONDO_0004979", "disease.name": "asthma", "disease.description": "A bronchial disease that is characterized by chronic inflammation and narrowing of the airways, which is caused by a combination of environmental and genetic factors resulting in recurring periods of wheezing (a whistling sound while breathing), chest tightness, shortness of breath, mucus production and coughing. The symptoms appear due to a variety of triggers such as allergens, irritants, respiratory infections, weather changes, exercise, stress, reflux disease, medications, foods and emotional anxiety." @@ -190,7 +172,7 @@ "drug.name": "LEBRIKIZUMAB", "drug.drugType": "Antibody", "drug.mechanismsOfAction.rows": "Interleukin-13 inhibitor", - "drug.description": "Antibody drug with a maximum clinical stage of Approval (across all indications), with an approval for atopic eczema and eczematoid dermatitis and 5 investigational indications.", + "drug.description": "Antibody drug with a maximum clinical stage of Approval (across all indications), with 3 approved and 7 investigational indications.", "drug.synonyms": [ "Lebrikizumab", "Lebrikizumab-lbkz", @@ -200,19 +182,20 @@ "PRO-301444 RG-3637", "PRO301444", "RO-5490255", - "Tnx-650" + "Tnx-650", + "ly3650150" ], "drug.tradeNames": "Ebglyss", "drug.maximumClinicalStage": "APPROVAL", "drug.indications.rows": [ - { - "id": "EFO_0000274", - "name": "atopic eczema" - }, { "id": "EFO_0000768", "name": "idiopathic pulmonary fibrosis" }, + { + "id": "EFO_1002029", + "name": "chronic rhinosinusitis with nasal polyps" + }, { "id": "MONDO_0004979", "name": "asthma" @@ -222,16 +205,24 @@ "name": "Eczematoid dermatitis" }, { - "id": "EFO_0000341", + "id": "MONDO_0005002", "name": "chronic obstructive pulmonary disease" }, { - "id": "EFO_0000183", + "id": "MONDO_0005083", + "name": "psoriasis" + }, + { + "id": "MONDO_0004952", "name": "Hodgkins lymphoma" }, { - "id": "MONDO_0004784", - "name": "allergic asthma" + "id": "MONDO_0004980", + "name": "atopic eczema" + }, + { + "id": "MONDO_0024332", + "name": "perennial allergic rhinitis" } ] }, @@ -249,12 +240,12 @@ "drug.maximumClinicalStage": "PHASE_2", "drug.indications.rows": [ { - "id": "MONDO_0004979", - "name": "asthma" + "id": "MONDO_0005101", + "name": "ulcerative colitis" }, { - "id": "EFO_0000729", - "name": "ulcerative colitis" + "id": "MONDO_0004979", + "name": "asthma" } ] } @@ -262,7 +253,7 @@ }, "test_opentargets_expression": { "function_call_to_reproduce": "output = opentargets(ensembl_id='ENSG00000169194', resource='expression', limit=2, json=True, verbose=False); print(json.dumps(output, indent=2))", - "type": "assert_equal_json_with_keys", + "type": "skip", "args": { "ensembl_id": "ENSG00000169194", "resource": "expression", @@ -297,7 +288,8 @@ "rna.unit": "", "rna.level": -1 } - ] + ], + "reason": "Open Targets deprecated the `expressions` GraphQL field (returns []) in favor of `baselineExpression`, which has a different schema (tissueBiosample, q1/q3/median/min/max instead of tissue/rna sub-objects). Migration is a user-facing API change; tracked separately." }, "test_opentargets_interactions": { "function_call_to_reproduce": "output = opentargets(ensembl_id='ENSG00000169194', resource='interactions', limit=2, json=True, verbose=False); print(json.dumps(output, indent=2))", @@ -314,13 +306,13 @@ "sourceDatabase": "string", "intA": "ENSP00000304915", "intABiologicalRole": "unspecified role", - "intB": "ENSP00000361004", + "intB": "ENSP00000360730", "intBBiologicalRole": "unspecified role", "targetA.id": "ENSG00000169194", "targetA.approvedSymbol": "IL13", "speciesA.taxonId": 134, - "targetB.id": "ENSG00000123496", - "targetB.approvedSymbol": "IL13RA2", + "targetB.id": "ENSG00000131724", + "targetB.approvedSymbol": "IL13RA1", "speciesB.taxonId": 134 }, { @@ -329,13 +321,13 @@ "sourceDatabase": "string", "intA": "ENSP00000304915", "intABiologicalRole": "unspecified role", - "intB": "ENSP00000360730", + "intB": "ENSP00000361004", "intBBiologicalRole": "unspecified role", "targetA.id": "ENSG00000169194", "targetA.approvedSymbol": "IL13", "speciesA.taxonId": 134, - "targetB.id": "ENSG00000131724", - "targetB.approvedSymbol": "IL13RA1", + "targetB.id": "ENSG00000123496", + "targetB.approvedSymbol": "IL13RA2", "speciesB.taxonId": 134 } ] @@ -369,11 +361,11 @@ }, { "variantId": "5_132660151_T_C", - "genotypeId": "5_132660151_T_C,C", - "genotype": "CC", + "genotypeId": "5_132660151_T_C,T", + "genotype": "CT", "drugs": null, - "phenotypeText": "decreased risk for non-immune response", - "genotypeAnnotationText": "Patients with the CC genotype may be at decreased risk for non-immune response to the hepatitis B vaccine, as compared to patients with the TT genotype. Other genetic and clinical factors may also influence risk of non-immune response in patients receiving the hepatitis B vaccine.", + "phenotypeText": "decreased risk for non-immune response to the hepatitis B vaccine", + "genotypeAnnotationText": "Patients with the CT genotype may be at decreased risk for non-immune response to the hepatitis B vaccine, as compared to patients with the TT genotype, or at increased risk as compared to patients with the CC genotype. Other genetic and clinical factors may also influence risk of non-immune response in patients receiving the hepatitis B vaccine.", "pgxCategory": "efficacy", "isDirectTarget": false, "evidenceLevel": "3", diff --git a/tests/from_json.py b/tests/from_json.py index 1b41cbcf6..82fcd68bf 100644 --- a/tests/from_json.py +++ b/tests/from_json.py @@ -279,6 +279,16 @@ def error(self: unittest.TestCase): # _test_constructor = Callable[[str, dict[str, dict[str, ...]], Callable], Callable] +def _skip(name, td, _func): + """Mark a JSON-defined test as skipped, with the `reason` from the fixture.""" + reason = td[name].get("reason", "skipped") + + def skip(self: unittest.TestCase): + self.skipTest(reason) + + return skip + + _TYPES = { "assert_equal": _assert_equal, "assert_equal_na": _assert_equal_na, @@ -288,6 +298,7 @@ def error(self: unittest.TestCase): "assert_equal_json_hash_nested": _assert_equal_json_hash_nested, "assert_equal_json_with_keys": _assert_equal_json_with_keys, "error": _error, + "skip": _skip, } From c7cba0c3f45584ae728ed1fe04fe1a768067bbe2 Mon Sep 17 00:00:00 2001 From: "Laura Luebbert, Ph.D." <56094636+lauraluebbert@users.noreply.github.com> Date: Fri, 26 Jun 2026 15:00:08 -0400 Subject: [PATCH 16/34] docs(contributing): add PR-scope and upstream-flake guidance (#257) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * docs(contributing): add PR-scope and upstream-flake guidance Two new subsections under "Contribute through pull requests": - "Keep PRs small and focused" — explicitly states the one-module-per-PR preference. Codifies what's been a verbal/case-by-case practice into written guidance so contributors don't ship multi-module PRs and then have to re-split them on reviewer request. - "Failing tests for modules you didn't touch" — explains that gget's test suite hits real upstream databases and those services drift, so a CI red in a module your PR doesn't touch is almost certainly not your bug and shouldn't block you. Avoids the common new-contributor trap of assuming they have to fix unrelated failures to merge. CONTRIBUTING.md is the single source of truth (docs/src/en/contributing.md is an mdbook include of this file), so the gget docs site picks up the change automatically. The Spanish translation will follow on the next auto-translate workflow run after this merges. * Revise CONTRIBUTING.md for clarity and completeness Updated self-review checklist for PRs to include biological relevance and clarified testing instructions. Adjusted language for consistency and improved clarity. --- CONTRIBUTING.md | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d193210b5..40c8c30f8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -38,23 +38,33 @@ Commit the changes once you are happy with them. ### ‼️ Self-review the following before creating a Pull Request ‼️ -1. Review the content for technical accuracy. +1. Review the content for technical accuracy and biological relevance (who are your target users and is this useful to them?). 2. Copy-edit the changes/comments for grammar, spelling, and adherence to the general style of existing gget code. -3. Format and lint your code with [pre-commit](https://pre-commit.com/) (powered by [ruff](https://docs.astral.sh/ruff/)). Install the hooks once with `prek install` (or `pre-commit install`) so they run automatically on every commit, or run them on demand with `prek run --all-files` (or `pre-commit run --all-files`). -4. Make sure the unit tests pass: +3. **Testing new code:** Make sure the unit tests pass: - The tested environments are defined in `pyproject.toml` under `[tool.hatch.envs.hatch-test]` (the single source of truth used by CI). Run the full matrix with `uvx hatch test`. - For a quick single-environment run, install the test dependencies with `uv sync --group test` and run `uv run pytest -ra -v --cov=gget --cov-report=term-missing tests`. To also exercise the `gget cellxgene` module, install its extra (`uv sync --group test --extra cellxgene`) on Python 3.12/3.13 — its dependency has no wheels for newer Python versions yet, and that test skips itself when the dependency is absent. -5. Add new unit tests if applicable: +4. **Unit tests:** Add new unit tests if applicable: - Arguments and expected results are stored in json files in ./tests/fixtures/ - Unit tests can be added to ./tests/test_*.py and will be automatically detected -6. Make sure the edits are compatible with both the Python and the command line interface +5. **Command line interface:** Make sure edits keep the Python function and the command-line interface in sync. Any change to a function's arguments must be reflected in both the Python signature and the CLI argument parser. - The command line interface and arguments are defined in ./gget/main.py -8. Add new modules/arguments to the documentation if applicable: +6. **Documentation:** Add new modules/arguments to the documentation if applicable: - The manual for each module can be added/edited in `./docs/src/en/*.md` (the Spanish version of the docs in `./docs/src/es/*.md` is automatically generated/updated, and does not need to be edited manually) - - List all edits in `./docs/src/en/updates.md` + - **Document all edits in `./docs/src/en/updates.md`** If you have any questions, feel free to start a [discussion](https://github.com/scverse/gget/discussions) or create an issue as described above. +### Keep PRs small and focused + +Reviewers move faster on small, focused PRs. Whenever possible: + +- **Scope each PR to a single `gget` module or issue**. If you find yourself changing more than one module to address several distinct concerns, please open them as separate PRs — one per module. Bug fixes and small refactors inside one module can be combined; cross-module work should be split. +- **Don't bundle unrelated changes** (e.g. a bug fix plus a new feature plus a refactor) in the same PR. + +### Failing tests for modules you didn't touch + +The `gget` test suite hits real upstream databases (Ensembl, UniProt, NCBI, ARCHS4, Open Targets, ELM, etc.). When those services change their data or schemas — which they do regularly — tests for the affected modules can start failing without anyone changing `gget` itself. **If automated CI tests fail in your PR for a module you did not touch, you can safely ignore those failures** when judging whether your PR is ready to merge. The maintainers track upstream-drift failures separately and do not expect contributors to fix unrelated breakages as a condition of merging. + ### Pull Request When you're finished with the changes, [create a pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request), also known as a PR. @@ -65,10 +75,10 @@ When you're finished with the changes, [create a pull request](https://docs.gith - Enable the checkbox to [allow maintainer edits](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/allowing-changes-to-a-pull-request-branch-created-from-a-fork) so the branch can be updated for a merge. - If you run into any merge issues, checkout this [git tutorial](https://github.com/skills/resolve-merge-conflicts) to help you resolve merge conflicts and other issues. -Once you submit your PR, a gget team member will review your proposal. We may ask questions or request additional information. +Once you submit your PR, a `gget` team member will review your proposal. We may ask questions or request additional information. ### Your PR is merged! -Congratulations! 🎉 The gget team thanks you. ✨ +Congratulations! 🎉 The `gget` team thanks you. ✨ Once your PR is merged, your contributions will be publicly visible on the [gget repo](https://github.com/scverse/gget). From 30190cfd0844d1d4e8cff4d9c02e080bfee7f92a Mon Sep 17 00:00:00 2001 From: "Laura Luebbert, Ph.D." <56094636+lauraluebbert@users.noreply.github.com> Date: Fri, 26 Jun 2026 15:12:15 -0400 Subject: [PATCH 17/34] Update CONTRIBUTING.md --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 40c8c30f8..cb33096a9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -50,7 +50,7 @@ Commit the changes once you are happy with them. - The command line interface and arguments are defined in ./gget/main.py 6. **Documentation:** Add new modules/arguments to the documentation if applicable: - The manual for each module can be added/edited in `./docs/src/en/*.md` (the Spanish version of the docs in `./docs/src/es/*.md` is automatically generated/updated, and does not need to be edited manually) - - **Document all edits in `./docs/src/en/updates.md`** + - **Document all edits in `./docs/src/en/updates.md`.** Keep this brief and succinct. If you have any questions, feel free to start a [discussion](https://github.com/scverse/gget/discussions) or create an issue as described above. From 5800e49a32b78779edfb048cbf530b697971e891 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 26 Jun 2026 19:43:12 +0000 Subject: [PATCH 18/34] CI: update pytest results (dev) --- tests/pytest_results.txt | 80 +++++++++++++++++++++++++++++++--------- 1 file changed, 62 insertions(+), 18 deletions(-) diff --git a/tests/pytest_results.txt b/tests/pytest_results.txt index bc40fd3c7..0079e4542 100644 --- a/tests/pytest_results.txt +++ b/tests/pytest_results.txt @@ -1,46 +1,90 @@ -Pytest results (Python 3.14) - 2026-06-26T17:07:06Z +Pytest results (Python 3.14) - 2026-06-26T19:05:15Z ============================= test session starts ============================== platform linux -- Python 3.14.6, pytest-9.1.1, pluggy-1.6.0 -- /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/bin/python3 cachedir: .pytest_cache -Using --randomly-seed=3800391218 +Using --randomly-seed=1934304412 rootdir: /home/runner/work/gget/gget configfile: pyproject.toml testpaths: tests plugins: randomly-3.16.0, rerunfailures-14.0, mock-3.15.1, cov-7.1.0, xdist-3.8.0 -collecting ... collected 399 items / 1 error +collecting ... collected 400 items / 1 error ==================================== ERRORS ==================================== ______________________ ERROR collecting tests/test_elm.py ______________________ -tests/test_elm.py:11: in +tests/test_elm.py:14: in gget_setup(module="elm") gget/gget_setup.py:204: in setup raise RuntimeError("ELM database files download failed; missing files: " + ", ".join(missing)) E RuntimeError: ELM database files download failed; missing files: ELM instances fasta file ------------------------------- Captured stderr -------------------------------- - %% TT oo%tt aaTllo t a l %% RR ee%cc eeRiievvceeeddi v%%e dXX ff%ee rrXddf e rAAdvv ee rrAaavggeeer aSSgppeee eeSddp e e dTT ii mm eeT i m e TT ii mm eeT i m e T Ti im meTe i m CeCu ur rrCreeunnrttr - -e n t - DD ll oo aaDddl o aUUdpp ll ooUaapdld o a d T Too tt aaTllo t a lSS pp ee nnSttp e n t L Le ef ftLt e f StSp pe eeSedpd -e -ed - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0-- -:-:----:-:-:----:- - ---- -:-:----:-:-:----:- - ---- -:-:----:-:-:----:- - - 0 0 0 0 0 0 0 0 0 000 00 0 0 00 0 0 0 0 0 0 - -0 : - - : 00 -- --:- ----:--:--::--- -- -:---:--:-- --:---::--- -- :------::- --- :: --- - 0 00 100 38626 100 38626 0 0 39993 0 --:--:-- --:--:-- --:--:-- 39985 - 100 88298 100 88298 0 0 83475 0 0:00:01 0:00:01 --:--:-- 83536 + %% TToottaall % T% o %tR aeRlec ce ei iv ve%ed d R% e %c XXeffieevrreddd AA%vv eerXrafageger edS pS epeAedve ed r aT gi mTeei mSe p e eT di m Te i m Te i m e T i m e T i mTCeui rm reCeun rt r + e n t T + i m e C u r r e n t + D l o a d U p l o Da ld o a d T o Ut pa ll o a dS pD eln otTa od t a lUL pe lf otSa p edSn pt e e dT +o Lteaf lt 0 SS pp ee en dt +0 L 0e0 f t S 0p0 e e d + 00 0 0 0 0 0 0 0 0 0- - : - -0: - -0 - - : -0-0 : --- -: - -- -::0-- -- : -- -- : - 0- : -0- - - :0- --:--:-- - : - - 0--:--:-- --:--:-- 0 00 00 0 0 0 0 0 0 0 0 0 0 0 0 000 0 0 - 0-- - ::- -- -: :-- --0 - -- :-- :- :-- -- :0-- --- :----:-:-:----:-- : -- - 0 - -0:--:-- --:--:-- 0 100 38626 100 38626 0 0 39025 0 --:--:-- --:--:-- --:--:-- 39016 + 100 88298 100 88298 0 0 74712 0 0:00:01 0:00:01 --:--:-- 74765 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed - 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 1 922k 1 13889 0 0 23270 0 0:00:40 --:--:-- 0:00:40 23264 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 71 922k 71 663k 0 0 410k 0 0:00:02 0:00:01 0:00:01 410k 100 922k 100 922k 0 0 539k 0 0:00:01 0:00:01 --:--:-- 539k - 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 419 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 -curl: (22) The requested URL returned error: 503 -Warning: Problem : HTTP error. Will retry in 5 seconds. 3 retries left. - 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:00 --:--:-- 0 + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 54 922k 54 503k 0 0 398k 0 0:00:02 0:00:01 0:00:01 397k 100 922k 100 922k 0 0 631k 0 0:00:01 0:00:01 --:--:-- 631k + 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:00 --:--:-- 0 +curl: (28) Operation timed out after 180002 milliseconds with 0 bytes received +Warning: Problem : timeout. Will retry in 5 seconds. 3 retries left. + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:00 --:--:-- 0 curl: (28) Operation timed out after 180000 milliseconds with 0 bytes received Warning: Problem : timeout. Will retry in 5 seconds. 2 retries left. + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:00 --:--:-- 0 +curl: (28) Operation timed out after 180002 milliseconds with 0 bytes received +Warning: Problem : timeout. Will retry in 5 seconds. 1 retries left. 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:00 --:--:-- 0 +curl: (28) Operation timed out after 180000 milliseconds with 0 bytes received + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 % Total % Received % Xferd Average Speed % TTiomte a l T i %m eR e c e i vTeidm e% CXufrerrde n tA +v e r ag e S p e e d T i m e T i m e DTliomaed CuUrprloeandt + T o t al S p e n t Le f t S p e ed + D l o0a d U p0l o a d 0 To t0a l 0 S p e nt 0 L e f0t S p e e0d + -- : - 0- :- - - -0: - - : 0-- - - :0- -: - -0 00 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 38626 100 38626 0 0 45979 0 --:--:-- --:--:-- --:--:-- 45983 + 100 88298 100 88298 0 0 93815 0 --:--:-- --:--:-- --:--:-- 93834 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 38 922k 38 352k 0 0 234k 0 0:00:03 0:00:01 0:00:02 234k 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 100 922k 100 922k 0 0 488k 0 0:00:01 0:00:01 --:--:-- 488k + 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:00 --:--:-- 0 +curl: (28) Operation timed out after 180001 milliseconds with 0 bytes received +Warning: Problem : timeout. Will retry in 5 seconds. 3 retries left. + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:00 --:--:-- 0 curl: (28) Operation timed out after 180001 milliseconds with 0 bytes received +Warning: Problem : timeout. Will retry in 5 seconds. 2 retries left. + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:00 --:--:-- 0 +curl: (28) Operation timed out after 180000 milliseconds with 0 bytes received Warning: Problem : timeout. Will retry in 5 seconds. 1 retries left. 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:00 --:--:-- 0 +curl: (28) Operation timed out after 180001 milliseconds with 0 bytes received + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- % Tot a l% T o t%a lR e c e i%v eRde c%e iXvfeedr d% Xferd--:- Average Spe-:-ed Time Time Time Current + - 0 Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 00 0 0 -- : -0- : - - 0- - : - - :0- - - - : -0- : - - 0 -0-:--:-- --:--:-- --:--:-- 0 100 38626 100 38626 0 0 44317 0 --:--:-- --:--:-- --:--:-- 44295 + 100 88298 100 88298 0 0 89420 0 --:--:-- --:--:-- --:--:-- 89370 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 38 922k 38 358k 0 0 263k 0 0:00:03 0:00:01 0:00:02 263k 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 100 922k 100 922k 0 0 486k 0 0:00:01 0:00:01 --:--:-- 486k + 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:00 --:--:-- 0 +curl: (28) Operation timed out after 180000 milliseconds with 0 bytes received +Warning: Problem : timeout. Will retry in 5 seconds. 3 retries left. + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:00 --:--:-- 0 +curl: (28) Operation timed out after 180001 milliseconds with 0 bytes received +Warning: Problem : timeout. Will retry in 5 seconds. 2 retries left. + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:00 --:--:-- 0 +curl: (28) Operation timed out after 180000 milliseconds with 0 bytes received +Warning: Problem : timeout. Will retry in 5 seconds. 1 retries left. + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:00 --:--:-- 0 curl: (28) Operation timed out after 180001 milliseconds with 0 bytes received =========================== short test summary info ============================ ERROR tests/test_elm.py - RuntimeError: ELM database files download failed; missing files: ELM instances fasta file !!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! -========================= 1 error in 663.80s (0:11:03) ========================= +======================== 1 error in 2270.28s (0:37:50) ========================= From 9d118f75c072e73ebad8548db26b9d99137ae144 Mon Sep 17 00:00:00 2001 From: Elarwei <168552401+Elarwei001@users.noreply.github.com> Date: Sat, 27 Jun 2026 03:48:55 +0800 Subject: [PATCH 19/34] feat(alphafold): add custom jackhmmer save directory option (#49) (#234) * feat(alphafold): add custom jackhmmer save directory option (#49) Add a jackhmmer_savedir parameter (Python) / -jhd, --jackhmmer_savedir flag (CLI) to gget alphafold so users can choose where the temporary jackhmmer files (~2 GB) are stored instead of the hardcoded ~/tmp/jackhmmer/ folder in the home directory. The new get_jackhmmer_dir() helper centralizes the path resolution and clean_up() now operates on the resolved directory. Default behavior is unchanged (backward compatible). Resolves #49. Co-Authored-By: Claude Opus 4.8 (1M context) * test(alphafold): cover clean_up default dir (#49) Add a network-free test for the clean_up(None) default-directory branch: it patches get_jackhmmer_dir so the None default resolves to a temporary folder (never the real ~/tmp) and asserts clean_up() resolves and removes it. Covers the previously-uncovered default-resolution line. Co-Authored-By: Claude Opus 4.8 (1M context) --------- Co-authored-by: Claude Opus 4.8 (1M context) --- docs/src/en/alphafold.md | 3 ++ docs/src/en/updates.md | 1 + gget/gget_alphafold.py | 49 +++++++++++++++++++++---- gget/main.py | 13 +++++++ tests/test_alphafold.py | 79 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 138 insertions(+), 7 deletions(-) create mode 100644 tests/test_alphafold.py diff --git a/docs/src/en/alphafold.md b/docs/src/en/alphafold.md index c9d150f69..c161c361a 100644 --- a/docs/src/en/alphafold.md +++ b/docs/src/en/alphafold.md @@ -33,6 +33,9 @@ For higher accuracy, at the potential cost of longer inference times, set this t `-o` `--out` Path to folder to save prediction results in (str). Default: "./[date_time]_gget_alphafold_prediction". +`-jhd` `--jackhmmer_savedir` +Path to a parent directory in which to store the temporary jackhmmer files (str). By default, `gget alphafold` creates a "tmp" folder in your home directory (`~/tmp/jackhmmer/`), which can take up to ~2 GB of disk space. Use this argument to place these temporary files elsewhere, e.g. on a disk with more free space. Default: None. + **Flags** `-mfm` `--multimer_for_monomer` Use multimer model for a monomer. diff --git a/docs/src/en/updates.md b/docs/src/en/updates.md index 312495e21..cf5ac9e45 100644 --- a/docs/src/en/updates.md +++ b/docs/src/en/updates.md @@ -5,6 +5,7 @@ #### *gget* officially became part of [*scverse*](https://scverse.org/) on June 9, 2026. 🥳🥳🥳 **Version ≥ 0.30.8** (XXX XX, 2026): +- [`gget alphafold`](alphafold.md): Added a new `jackhmmer_savedir` argument (`-jhd`/`--jackhmmer_savedir` on the command line) that lets you choose where the temporary jackhmmer files are stored. By default, `gget alphafold` still creates a `~/tmp/jackhmmer/` folder in your home directory (which can take up to ~2 GB of disk space); the new argument lets you redirect these files elsewhere, e.g. to a disk with more free space. Resolves [issue 49](https://github.com/scverse/gget/issues/49). - [`gget pdb`](pdb.md): Added support for the PDBx/mmCIF structure format (fixes [issue 178](https://github.com/scverse/gget/issues/178) and [issue 177](https://github.com/scverse/gget/issues/177)). - New `resource="mmcif"` option downloads the structure in PDBx/mmCIF format (`.cif`). - The default `resource="pdb"` now automatically falls back to PDBx/mmCIF when the legacy PDB file is unavailable (e.g. for large structures), since the legacy PDB format is being phased out by RCSB. A warning is logged and saved files use the correct extension (`.cif`). diff --git a/gget/gget_alphafold.py b/gget/gget_alphafold.py index db0ec7e64..9e578ed3b 100644 --- a/gget/gget_alphafold.py +++ b/gget/gget_alphafold.py @@ -140,8 +140,34 @@ def jackhmmer_chunk_callback(i: int) -> None: return raw_msa_results -def clean_up() -> None: - """Function to clean up temporary files after running gget alphafold.""" +def get_jackhmmer_dir(jackhmmer_savedir: str | None = None) -> str: + """Return the directory used for jackhmmer's temporary FASTA and working files. + + By default gget creates a "tmp" folder in the user's home directory + ("~/tmp/jackhmmer/"). These temporary files can take up to ~2 GB of disk space. + Passing a custom ``jackhmmer_savedir`` lets the user place this folder elsewhere + (e.g. on a disk with more free space), see https://github.com/scverse/gget/issues/49. + + Args: + - jackhmmer_savedir Custom parent directory for the temporary jackhmmer folder (str). + If None (default), "~/tmp" is used. + + Returns the absolute path to the temporary jackhmmer folder. + """ + if jackhmmer_savedir is not None: + return os.path.abspath(os.path.join(jackhmmer_savedir, "jackhmmer", UUID)) + return os.path.expanduser(os.path.join("~", "tmp", "jackhmmer", UUID)) + + +def clean_up(jackhmmer_dir: str | None = None) -> None: + """Function to clean up temporary files after running gget alphafold. + + Args: + - jackhmmer_dir Path to the temporary jackhmmer folder to clean up (str). + If None (default), the default "~/tmp/jackhmmer/" is used. + """ + if jackhmmer_dir is None: + jackhmmer_dir = get_jackhmmer_dir() # # Remove fasta files with input sequences # files = glob.glob("target_*.fasta") # for f in files: @@ -167,12 +193,13 @@ def clean_up() -> None: # sys.stderr.write(stderr) # Delete any fasta files left in temporary jackhmmer folder - for file in glob.glob(os.path.expanduser(f"~/tmp/jackhmmer/{UUID}/*.fasta")): + for file in glob.glob(os.path.join(jackhmmer_dir, "*.fasta")): if os.path.exists(file): os.remove(file) # Delete empty parent folders - os.removedirs(os.path.expanduser(f"~/tmp/jackhmmer/{UUID}")) + if os.path.isdir(jackhmmer_dir): + os.removedirs(jackhmmer_dir) def alphafold( @@ -184,6 +211,7 @@ def alphafold( plot: bool = True, show_sidechains: bool = True, verbose: bool = True, + jackhmmer_savedir: str | None = None, ) -> None: """Predicts the structure of a protein using a slightly simplified version of AlphaFold v2.3.0 (https://doi.org/10.1038/s41586-021-03819-2). @@ -200,6 +228,10 @@ def alphafold( - plot True/False whether to provide a graphical overview of the prediction (default: True). - show_sidechains True/False whether to show side chains in the plot (default: True). - verbose True/False whether to print progress information. Default True. + - jackhmmer_savedir Path to a parent directory in which to store the temporary jackhmmer + files (str). By default, gget creates a "tmp" folder in the home + directory ("~/tmp/jackhmmer/"), which can take up to ~2 GB of disk space. + Use this argument to place these temporary files elsewhere. Default: None. Saves the predicted aligned error (json) and the prediction (PDB) in the defined 'out' folder. @@ -500,16 +532,19 @@ class ModelType(enum.Enum): TOTAL_JACKHMMER_CHUNKS = sum([cfg["num_streamed_chunks"] for cfg in MSA_DATABASES]) ### Search against existing databases + # Resolve the temporary jackhmmer folder (optionally user-defined via jackhmmer_savedir) + jackhmmer_dir = get_jackhmmer_dir(jackhmmer_savedir) + # Get absolute path to output file and create output directory if out is not None: os.makedirs(out, exist_ok=True) abs_out_path = os.path.abspath(out) else: # Use temporary jackhmmer folder which will later be deleted - abs_out_path = os.path.expanduser(f"~/tmp/jackhmmer/{UUID}") + abs_out_path = jackhmmer_dir # Create folder to save temporary jackhmmer database chunks in - os.makedirs(os.path.expanduser(f"~/tmp/jackhmmer/{UUID}"), exist_ok=True) + os.makedirs(jackhmmer_dir, exist_ok=True) features_for_chain = {} raw_msa_results_for_sequence = {} @@ -815,4 +850,4 @@ class ModelType(enum.Enum): ) ## Run clean_up function - clean_up() + clean_up(jackhmmer_dir) diff --git a/gget/main.py b/gget/main.py index 36bdb3da8..73a33a422 100644 --- a/gget/main.py +++ b/gget/main.py @@ -1329,6 +1329,18 @@ def main() -> None: "Default: ./[date_time]_gget_alphafold_prediction" ), ) + parser_alphafold.add_argument( + "-jhd", + "--jackhmmer_savedir", + type=str, + default=None, + required=False, + help=( + "Path to a parent directory in which to store the temporary jackhmmer files.\n" + "By default, gget creates a 'tmp' folder in the home directory ('~/tmp/jackhmmer/'),\n" + "which can take up to ~2 GB of disk space. Use this argument to place them elsewhere." + ), + ) parser_alphafold.add_argument( "-q", "--quiet", @@ -3680,6 +3692,7 @@ def main() -> None: plot=False, show_sidechains=False, verbose=args.quiet, + jackhmmer_savedir=args.jackhmmer_savedir, ) ## pdb return diff --git a/tests/test_alphafold.py b/tests/test_alphafold.py new file mode 100644 index 000000000..2c05786ed --- /dev/null +++ b/tests/test_alphafold.py @@ -0,0 +1,79 @@ +import os +import subprocess +import sys +import unittest +from unittest.mock import patch + +import gget.gget_alphafold as gget_alphafold +from gget.gget_alphafold import clean_up, get_jackhmmer_dir +from gget.gget_setup import UUID + +# AlphaFold requires heavy third-party dependencies (alphafold, openmm, jackhmmer, model +# parameters) that are not available in the CI/test environment, so a full prediction run +# cannot be exercised here. These tests validate the user-facing jackhmmer save-directory +# option (https://github.com/scverse/gget/issues/49) at the argument/path-handling level. + + +class TestAlphafoldJackhmmerSavedir(unittest.TestCase): + def test_default_dir(self): + """Without a custom save directory, the default ~/tmp/jackhmmer/ is used.""" + expected = os.path.expanduser(os.path.join("~", "tmp", "jackhmmer", UUID)) + self.assertEqual(get_jackhmmer_dir(), expected) + self.assertEqual(get_jackhmmer_dir(None), expected) + + def test_custom_dir(self): + """A custom save directory is honored and returned as an absolute path.""" + custom = os.path.join("some", "custom", "place") + result = get_jackhmmer_dir(custom) + expected = os.path.abspath(os.path.join(custom, "jackhmmer", UUID)) + self.assertEqual(result, expected) + self.assertTrue(os.path.isabs(result)) + + def test_clean_up_removes_custom_dir(self): + """clean_up() deletes leftover FASTA files and the temporary folder it is given.""" + import tempfile + + with tempfile.TemporaryDirectory() as parent: + jackhmmer_dir = get_jackhmmer_dir(parent) + os.makedirs(jackhmmer_dir, exist_ok=True) + fasta_path = os.path.join(jackhmmer_dir, "target_1.fasta") + with open(fasta_path, "w") as f: + f.write(">query\nMKV") + + clean_up(jackhmmer_dir) + + self.assertFalse(os.path.exists(fasta_path)) + self.assertFalse(os.path.isdir(jackhmmer_dir)) + + def test_clean_up_missing_dir_is_safe(self): + """clean_up() does not raise if the target directory does not exist.""" + missing = get_jackhmmer_dir(os.path.join("definitely", "not", "there")) + # Should be a no-op rather than raising. + clean_up(missing) + + def test_clean_up_default_dir_when_none(self): + """clean_up(None) resolves the default directory via get_jackhmmer_dir().""" + import tempfile + + with tempfile.TemporaryDirectory() as parent: + default_dir = os.path.join(parent, "jackhmmer", "default") + os.makedirs(default_dir, exist_ok=True) + # Patch get_jackhmmer_dir so the None default resolves to a temp folder + # (never the real ~/tmp) for the duration of the call. + with patch.object(gget_alphafold, "get_jackhmmer_dir", return_value=default_dir) as mock_dir: + clean_up() + mock_dir.assert_called_once() + self.assertFalse(os.path.isdir(default_dir)) + + def test_cli_exposes_jackhmmer_savedir_flag(self): + """The command-line interface exposes the --jackhmmer_savedir option.""" + result = subprocess.run( + [sys.executable, "-m", "gget", "alphafold", "--help"], + capture_output=True, + text=True, + ) + self.assertIn("--jackhmmer_savedir", result.stdout) + + +if __name__ == "__main__": + unittest.main() From 7941ce87d42d64b1936627ecb7a9b9f37031c963 Mon Sep 17 00:00:00 2001 From: "Laura Luebbert, Ph.D." <56094636+lauraluebbert@users.noreply.github.com> Date: Fri, 26 Jun 2026 16:01:47 -0400 Subject: [PATCH 20/34] Update CONTRIBUTING.md --- CONTRIBUTING.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cb33096a9..44f968809 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -69,6 +69,8 @@ The `gget` test suite hits real upstream databases (Ensembl, UniProt, NCBI, ARCH When you're finished with the changes, [create a pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request), also known as a PR. +‼️ Please DO NOT commit AI-generated code without careful review. + ‼️ Please make all PRs against the `dev` branch of the gget repository. - Don't forget to [link PR to issue](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue) if you are solving one. From cb64a8e034bb18ce2c6f718da9471f4e88195b73 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 26 Jun 2026 20:24:22 +0000 Subject: [PATCH 21/34] CI: update pytest results (dev) --- .github/badges/tests.json | 2 +- tests/pytest_results.txt | 596 ++++++++++++++++++++++++++++++++------ 2 files changed, 516 insertions(+), 82 deletions(-) diff --git a/.github/badges/tests.json b/.github/badges/tests.json index 5b6cc3b11..78717eb72 100644 --- a/.github/badges/tests.json +++ b/.github/badges/tests.json @@ -1 +1 @@ -{"schemaVersion": 1, "label": "tests", "message": "0/1 passing", "color": "red"} +{"schemaVersion": 1, "label": "tests", "message": "404/409 passing", "color": "brightgreen"} diff --git a/tests/pytest_results.txt b/tests/pytest_results.txt index 0079e4542..5d24daba4 100644 --- a/tests/pytest_results.txt +++ b/tests/pytest_results.txt @@ -1,90 +1,524 @@ -Pytest results (Python 3.14) - 2026-06-26T19:05:15Z +Pytest results (Python 3.14) - 2026-06-26T19:49:44Z ============================= test session starts ============================== platform linux -- Python 3.14.6, pytest-9.1.1, pluggy-1.6.0 -- /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/bin/python3 cachedir: .pytest_cache -Using --randomly-seed=1934304412 +Using --randomly-seed=3168638919 rootdir: /home/runner/work/gget/gget configfile: pyproject.toml testpaths: tests plugins: randomly-3.16.0, rerunfailures-14.0, mock-3.15.1, cov-7.1.0, xdist-3.8.0 -collecting ... collected 400 items / 1 error - -==================================== ERRORS ==================================== -______________________ ERROR collecting tests/test_elm.py ______________________ -tests/test_elm.py:14: in - gget_setup(module="elm") -gget/gget_setup.py:204: in setup - raise RuntimeError("ELM database files download failed; missing files: " + ", ".join(missing)) -E RuntimeError: ELM database files download failed; missing files: ELM instances fasta file -------------------------------- Captured stderr -------------------------------- - %% TToottaall % T% o %tR aeRlec ce ei iv ve%ed d R% e %c XXeffieevrreddd AA%vv eerXrafageger edS pS epeAedve ed r aT gi mTeei mSe p e eT di m Te i m Te i m e T i m e T i mTCeui rm reCeun rt r - e n t T - i m e C u r r e n t - D l o a d U p l o Da ld o a d T o Ut pa ll o a dS pD eln otTa od t a lUL pe lf otSa p edSn pt e e dT -o Lteaf lt 0 SS pp ee en dt -0 L 0e0 f t S 0p0 e e d - 00 0 0 0 0 0 0 0 0 0- - : - -0: - -0 - - : -0-0 : --- -: - -- -::0-- -- : -- -- : - 0- : -0- - - :0- --:--:-- - : - - 0--:--:-- --:--:-- 0 00 00 0 0 0 0 0 0 0 0 0 0 0 0 000 0 0 - 0-- - ::- -- -: :-- --0 - -- :-- :- :-- -- :0-- --- :----:-:-:----:-- : -- - 0 - -0:--:-- --:--:-- 0 100 38626 100 38626 0 0 39025 0 --:--:-- --:--:-- --:--:-- 39016 - 100 88298 100 88298 0 0 74712 0 0:00:01 0:00:01 --:--:-- 74765 - % Total % Received % Xferd Average Speed Time Time Time Current - Dload Upload Total Spent Left Speed - 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 54 922k 54 503k 0 0 398k 0 0:00:02 0:00:01 0:00:01 397k 100 922k 100 922k 0 0 631k 0 0:00:01 0:00:01 --:--:-- 631k - 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:00 --:--:-- 0 -curl: (28) Operation timed out after 180002 milliseconds with 0 bytes received -Warning: Problem : timeout. Will retry in 5 seconds. 3 retries left. - 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:00 --:--:-- 0 -curl: (28) Operation timed out after 180000 milliseconds with 0 bytes received -Warning: Problem : timeout. Will retry in 5 seconds. 2 retries left. - 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:00 --:--:-- 0 -curl: (28) Operation timed out after 180002 milliseconds with 0 bytes received -Warning: Problem : timeout. Will retry in 5 seconds. 1 retries left. - 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:00 --:--:-- 0 -curl: (28) Operation timed out after 180000 milliseconds with 0 bytes received - % Total % Received % Xferd Average Speed Time Time Time Current - Dload Upload Total Spent Left Speed - 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 % Total % Received % Xferd Average Speed % TTiomte a l T i %m eR e c e i vTeidm e% CXufrerrde n tA -v e r ag e S p e e d T i m e T i m e DTliomaed CuUrprloeandt - T o t al S p e n t Le f t S p e ed - D l o0a d U p0l o a d 0 To t0a l 0 S p e nt 0 L e f0t S p e e0d - -- : - 0- :- - - -0: - - : 0-- - - :0- -: - -0 00 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 38626 100 38626 0 0 45979 0 --:--:-- --:--:-- --:--:-- 45983 - 100 88298 100 88298 0 0 93815 0 --:--:-- --:--:-- --:--:-- 93834 - % Total % Received % Xferd Average Speed Time Time Time Current - Dload Upload Total Spent Left Speed - 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 38 922k 38 352k 0 0 234k 0 0:00:03 0:00:01 0:00:02 234k 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 100 922k 100 922k 0 0 488k 0 0:00:01 0:00:01 --:--:-- 488k - 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:00 --:--:-- 0 -curl: (28) Operation timed out after 180001 milliseconds with 0 bytes received -Warning: Problem : timeout. Will retry in 5 seconds. 3 retries left. - 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:00 --:--:-- 0 -curl: (28) Operation timed out after 180001 milliseconds with 0 bytes received -Warning: Problem : timeout. Will retry in 5 seconds. 2 retries left. - 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:00 --:--:-- 0 -curl: (28) Operation timed out after 180000 milliseconds with 0 bytes received -Warning: Problem : timeout. Will retry in 5 seconds. 1 retries left. - 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:00 --:--:-- 0 -curl: (28) Operation timed out after 180001 milliseconds with 0 bytes received - % Total % Received % Xferd Average Speed Time Time Time Current - Dload Upload Total Spent Left Speed - 0 0 0 0 0 0 0 0 --:--:-- --:--:-- % Tot a l% T o t%a lR e c e i%v eRde c%e iXvfeedr d% Xferd--:- Average Spe-:-ed Time Time Time Current - - 0 Dload Upload Total Spent Left Speed - 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0Average Speed Time Time Time Current - Dload Upload Total Spent Left Speed - 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 00 0 0 -- : -0- : - - 0- - : - - :0- - - - : -0- : - - 0 -0-:--:-- --:--:-- --:--:-- 0 100 38626 100 38626 0 0 44317 0 --:--:-- --:--:-- --:--:-- 44295 - 100 88298 100 88298 0 0 89420 0 --:--:-- --:--:-- --:--:-- 89370 - % Total % Received % Xferd Average Speed Time Time Time Current - Dload Upload Total Spent Left Speed - 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 38 922k 38 358k 0 0 263k 0 0:00:03 0:00:01 0:00:02 263k 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 100 922k 100 922k 0 0 486k 0 0:00:01 0:00:01 --:--:-- 486k - 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:00 --:--:-- 0 -curl: (28) Operation timed out after 180000 milliseconds with 0 bytes received -Warning: Problem : timeout. Will retry in 5 seconds. 3 retries left. - 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:00 --:--:-- 0 -curl: (28) Operation timed out after 180001 milliseconds with 0 bytes received -Warning: Problem : timeout. Will retry in 5 seconds. 2 retries left. - 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:00 --:--:-- 0 -curl: (28) Operation timed out after 180000 milliseconds with 0 bytes received -Warning: Problem : timeout. Will retry in 5 seconds. 1 retries left. - 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:00 --:--:-- 0 -curl: (28) Operation timed out after 180001 milliseconds with 0 bytes received +collecting ... collected 409 items + +tests/test_seq.py::TestSeq::test_seq_transcript_gene_WB PASSED [ 0%] +tests/test_seq.py::TestSeq::test_seq_transcript PASSED [ 0%] +tests/test_seq.py::TestSeq::test_seq_gene_iso PASSED [ 0%] +tests/test_seq.py::TestSeq::test_seq_transcript_transcript_WB PASSED [ 0%] +tests/test_seq.py::TestSeq::test_seq_transcript_transcript_iso PASSED [ 1%] +tests/test_seq.py::TestSeq::test_seq_gene_transcript_iso PASSED [ 1%] +tests/test_seq.py::TestSeq::test_seq_transcript_gene_iso PASSED [ 1%] +tests/test_seq.py::TestSeq::test_seq_missing_uniprot_gene_name PASSED [ 1%] +tests/test_seq.py::TestSeq::test_seq_transcript_gene PASSED [ 2%] +tests/test_seq.py::TestSeq::test_seq_gene PASSED [ 2%] +tests/test_blat.py::TestBlat::test_blat_aa_RNA PASSED [ 2%] +tests/test_blat.py::TestBlat::test_blat_nt_DNA PASSED [ 2%] +tests/test_blat.py::TestBlat::test_blat_nt_json PASSED [ 3%] +tests/test_blat.py::TestBlat::test_blat_aa_protein PASSED [ 3%] +tests/test_blat.py::TestBlat::test_blat_bad_fasta PASSED [ 3%] +tests/test_blat.py::TestBlat::test_blat_bad_assembly PASSED [ 3%] +tests/test_blat.py::TestBlat::test_blat_bad_fileformat PASSED [ 4%] +tests/test_blat.py::TestBlat::test_blat_nt PASSED [ 4%] +tests/test_blat.py::TestBlat::test_blat_shortseq PASSED [ 4%] +tests/test_blat.py::TestBlat::test_blat_nt_RNA PASSED [ 4%] +tests/test_blat.py::TestBlat::test_blat_bad_seqtype PASSED [ 5%] +tests/test_blat.py::TestBlat::test_blat_nt_fasta PASSED [ 5%] +tests/test_blat.py::TestBlat::test_blat_nt_txt PASSED [ 5%] +tests/test_blat.py::TestBlat::test_blat_bad_txt PASSED [ 5%] +tests/test_blat.py::TestBlat::test_blat_nt_transDNA PASSED [ 6%] +tests/test_blat.py::TestBlat::test_blat_nt_protein PASSED [ 6%] +tests/test_blat.py::TestBlat::test_blat_aa PASSED [ 6%] +tests/test_g2p.py::TestG2P::test_g2p_map PASSED [ 6%] +tests/test_g2p.py::TestG2P::test_g2p_alignment PASSED [ 7%] +tests/test_g2p.py::TestG2P::test_g2p_features PASSED [ 7%] +tests/test_g2p.py::TestG2PValidation::test_invalid_resource_raises PASSED [ 7%] +tests/test_g2p.py::TestG2PValidation::test_alignment_requires_isoform PASSED [ 7%] +tests/test_g2p.py::TestG2PValidation::test_missing_uniprot_raises PASSED [ 8%] +tests/test_gpt.py::TestGpt::test_gpt PASSED [ 8%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_gene PASSED [ 8%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_species PASSED [ 8%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_yeast PASSED [ 9%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_transcription PASSED [ 9%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_ensembl_ids PASSED [ 9%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_database_shortcut PASSED [ 9%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_background PASSED [ 10%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_pathway PASSED [ 10%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_plot PASSED [ 10%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_worm PASSED [ 10%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_mouse_is_human PASSED [ 11%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_background_ensembl PASSED [ 11%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background PASSED [ 11%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_json PASSED [ 11%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_fly PASSED [ 11%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_kinase_interactions PASSED [ 12%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_celltypes PASSED [ 12%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_fish PASSED [ 12%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_ontology PASSED [ 12%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_none PASSED [ 13%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_diseases_drugs PASSED [ 13%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background_list PASSED [ 13%] +tests/test_search.py::TestSearch::test_search_plant PASSED [ 13%] +tests/test_search.py::TestSearch::test_search_transcript_two_sw_and PASSED [ 14%] +tests/test_search.py::TestSearch::test_search_gene_two_sw_and PASSED [ 14%] +tests/test_search.py::TestSearch::test_search_transcript_two_sw_or PASSED [ 14%] +tests/test_search.py::TestSearch::test_search_gene_bad_species PASSED [ 14%] +tests/test_search.py::TestSearch::test_search_plant_db PASSED [ 15%] +tests/test_search.py::TestSearch::test_search_gene_two_sw_limit PASSED [ 15%] +tests/test_search.py::TestSearch::test_search_transcript_bad_andor PASSED [ 15%] +tests/test_search.py::TestSearch::test_search_transcript_bad_species PASSED [ 15%] +tests/test_search.py::TestSearch::test_search_gene_one_sw_json PASSED [ 16%] +tests/test_search.py::TestSearch::test_search_transcript_one_sw PASSED [ 16%] +tests/test_search.py::TestSearch::test_search_octopus PASSED [ 16%] +tests/test_search.py::TestSearch::test_search_gene_two_sw_or PASSED [ 16%] +tests/test_search.py::TestSearch::test_search_db PASSED [ 17%] +tests/test_search.py::TestSearch::test_search_release PASSED [ 17%] +tests/test_search.py::TestSearch::test_search_gene_one_sw_limit PASSED [ 17%] +tests/test_search.py::TestSearch::test_search_gene_bad_andor PASSED [ 17%] +tests/test_search.py::TestSearch::test_search_gene_one_sw PASSED [ 18%] +tests/test_utils.py::TestUtils::test_rest_query PASSED [ 18%] +tests/test_utils.py::TestUtils::test_ref_iv_species_options PASSED [ 18%] +tests/test_utils.py::TestUtils::test_search_species_options_bad_type PASSED [ 18%] +tests/test_utils.py::TestUtils::test_get_uniprot_seqs PASSED [ 19%] +tests/test_utils.py::TestUtils::test_n_colors PASSED [ 19%] +tests/test_utils.py::TestUtils::test_get_uniprot_info_transcript PASSED [ 19%] +tests/test_utils.py::TestUtils::test_find_latest_ens_rel PASSED [ 19%] +tests/test_utils.py::TestUtils::test_read_fasta PASSED [ 20%] +tests/test_utils.py::TestUtils::test_search_species_options PASSED [ 20%] +tests/test_utils.py::TestUtils::test_rest_query_bad_type PASSED [ 20%] +tests/test_utils.py::TestUtils::test_aa_colors PASSED [ 20%] +tests/test_utils.py::TestUtils::test_ref_species_options PASSED [ 21%] +tests/test_utils.py::TestUtils::test_ref_species_options_bad_type PASSED [ 21%] +tests/test_utils.py::TestUtils::test_search_iv_species_options PASSED [ 21%] +tests/test_utils.py::TestUtils::test_get_uniprot_info_gene PASSED [ 21%] +tests/test_diamond.py::TestDiamond::test_diamond_JSON_out PASSED [ 22%] +tests/test_diamond.py::TestDiamond::test_diamond_ref_file PASSED [ 22%] +tests/test_diamond.py::TestDiamond::test_diamond_seqs_multiple PASSED [ 22%] +tests/test_diamond.py::TestDiamond::test_diamond_seqs_single PASSED [ 22%] +tests/test_diamond.py::TestDiamond::test_diamond_both_files PASSED [ 22%] +tests/test_diamond.py::TestDiamond::test_diamond_query_file PASSED [ 23%] +tests/test_cosmic.py::TestCosmicWorkflow::test_cosmic_defaults PASSED [ 23%] +tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_clean_up_default_dir_when_none PASSED [ 23%] +tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_custom_dir PASSED [ 23%] +tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_cli_exposes_jackhmmer_savedir_flag PASSED [ 24%] +tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_clean_up_removes_custom_dir PASSED [ 24%] +tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_clean_up_missing_dir_is_safe PASSED [ 24%] +tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_default_dir PASSED [ 24%] +tests/test_archs4.py::TestArchs4MissingColor::test_tissue_missing_color_does_not_crash PASSED [ 25%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue_json PASSED [ 25%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue PASSED [ 25%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue_ensembl PASSED [ 25%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_gene_tissue PASSED [ 26%] +tests/test_archs4.py::TestArchs4::test_archs4_defaults PASSED [ 26%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_which PASSED [ 26%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_ensembl PASSED [ 26%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue_mouse PASSED [ 27%] +tests/test_archs4.py::TestArchs4::test_archs4_mouse_json_ensembl PASSED [ 27%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_species PASSED [ 27%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_gene PASSED [ 27%] +tests/test_elm.py::TestELM::test_elm_uniprot_id_in_elm PASSED [ 28%] +tests/test_elm.py::TestELM::test_elm_uniprot_id_new PASSED [ 28%] +tests/test_elm.py::TestELM::test_elm_uniprot_aminoacidseq PASSED [ 28%] +tests/test_pdb.py::TestPDB::test_pdb_pdb PASSED [ 28%] +tests/test_pdb.py::TestPDB::test_pdb_legacy_fallback_to_mmcif PASSED [ 29%] +tests/test_pdb.py::TestPDB::test_pdb_mmcif PASSED [ 29%] +tests/test_pdb.py::TestPDB::test_pdb_assembly PASSED [ 29%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_release_date PASSED [ 29%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_combined_filters PASSED [ 30%] +tests/test_virus.py::TestVirus::test_check_min_max_date_valid PASSED [ 30%] +tests/test_virus.py::TestVirus::test_check_min_max_equal PASSED [ 30%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_gene_count PASSED [ 30%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_remove_parentheses PASSED [ 31%] +tests/test_virus.py::TestVirus::test_virus_invalid_keep_temp_type PASSED [ 31%] +tests/test_virus.py::TestVirus::test_batch_accessions_for_url PASSED [ 31%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_empty_raises PASSED [ 31%] +tests/test_virus.py::TestVirus::test_track_failed_operation_appends PASSED [ 32%] +tests/test_virus.py::TestVirus::test_force_garbage_collection_runs PASSED [ 32%] +tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter PASSED [ 32%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_gen_mol_type PASSED [ 32%] +tests/test_virus.py::TestVirus::test_is_sars_cov2_query_negative PASSED [ 33%] +tests/test_virus.py::TestVirus::test_virus_completeness_filter_verification PASSED [ 33%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_no_filters PASSED [ 33%] +tests/test_virus.py::TestVirus::test_validate_datasets_binary_valid PASSED [ 33%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_geographic_location PASSED [ 33%] +tests/test_virus.py::TestVirus::test_virus_with_genbank_metadata_retrieval PASSED [ 34%] +tests/test_virus.py::TestVirus::test_datasets_cli_version_output PASSED [ 34%] +tests/test_virus.py::TestVirus::test_local_name_without_namespace PASSED [ 34%] +tests/test_virus.py::TestVirus::test_virus_empty_virus_name PASSED [ 34%] +tests/test_virus.py::TestVirus::test_virus_invalid_is_accession_type PASSED [ 35%] +tests/test_virus.py::TestVirus::test_deduplicate_all_existing PASSED [ 35%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_country PASSED [ 35%] +tests/test_virus.py::TestVirus::test_retry_helper_success_after_retry PASSED [ 35%] +tests/test_virus.py::TestVirus::test_stream_copy_fasta_with_accession_filter PASSED [ 36%] +tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_empty PASSED [ 36%] +tests/test_virus.py::TestVirus::test_local_name_with_namespace PASSED [ 36%] +tests/test_virus.py::TestVirus::test_parse_accession_input_space_separated PASSED [ 36%] +tests/test_virus.py::TestVirus::test_deduplicate_metadata_against_baseline PASSED [ 37%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_max_release_date PASSED [ 37%] +tests/test_virus.py::TestVirus::test_merge_metadata_csvs_no_overwrite PASSED [ 37%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_negative PASSED [ 37%] +tests/test_virus.py::TestVirus::test_parse_partial_date_empty_raises PASSED [ 38%] +tests/test_virus.py::TestVirus::test_parse_date_full PASSED [ 38%] +tests/test_virus.py::TestVirus::test_virus_with_annotated_filter PASSED [ 38%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype_list PASSED [ 38%] +tests/test_virus.py::TestVirus::test_save_partial_metadata_empty PASSED [ 39%] +tests/test_virus.py::TestVirus::test_parse_genbank_xml_empty_set PASSED [ 39%] +tests/test_virus.py::TestVirus::test_virus_relationship_check_counts_match PASSED [ 39%] +tests/test_virus.py::TestVirus::test_is_sars_cov2_query_accession_mode PASSED [ 39%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_nonexistent_raises PASSED [ 40%] +tests/test_virus.py::TestVirus::test_retry_helper_exponential_backoff_timing PASSED [ 40%] +tests/test_virus.py::TestVirus::test_virus_invalid_lab_passaged_type PASSED [ 40%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_min_seq_length PASSED [ 40%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_no_filters PASSED [ 41%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_already_correct_returns_none PASSED [ 41%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_false PASSED [ 41%] +tests/test_virus.py::TestVirus::test_save_partial_metadata PASSED [ 41%] +tests/test_virus.py::TestVirus::test_track_failed_operation_creates_key PASSED [ 42%] +tests/test_virus.py::TestVirus::test_merge_baseline_with_new_csv PASSED [ 42%] +tests/test_virus.py::TestVirus::test_virus_specific_accession_file_creation PASSED [ 42%] +tests/test_virus.py::TestVirus::test_virus_with_completeness_filter PASSED [ 42%] +tests/test_virus.py::TestVirus::test_virus_with_collection_date_filters PASSED [ 43%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_multiple PASSED [ 43%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_virus_suffix PASSED [ 43%] +tests/test_virus.py::TestVirus::test_filter_sequences_no_filters PASSED [ 43%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_false PASSED [ 44%] +tests/test_virus.py::TestVirus::test_parse_genbank_xml_basic PASSED [ 44%] +tests/test_virus.py::TestVirus::test_get_datasets_version_returns_string_or_none PASSED [ 44%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_mature_peptide_count PASSED [ 44%] +tests/test_virus.py::TestVirus::test_filter_cached_refseq_only PASSED [ 44%] +tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_negative PASSED [ 45%] +tests/test_virus.py::TestVirus::test_retry_helper_non_retryable_exception PASSED [ 45%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_protein_count PASSED [ 45%] +tests/test_virus.py::TestVirus::test_calculate_max_accessions_per_batch PASSED [ 45%] +tests/test_virus.py::TestVirus::test_validate_datasets_binary_nonexistent PASSED [ 46%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_metadata_type PASSED [ 46%] +tests/test_virus.py::TestVirus::test_parse_partial_date_full_date PASSED [ 46%] +tests/test_virus.py::TestVirus::test_unzip_file_nonexistent_raises PASSED [ 46%] +tests/test_virus.py::TestVirus::test_virus_invalid_annotated_type PASSED [ 47%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_zero PASSED [ 47%] +tests/test_virus.py::TestVirus::test_virus_with_host_filter PASSED [ 47%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_source_database PASSED [ 47%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_invalid_attempt_returns_none PASSED [ 48%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_max_seq_length PASSED [ 48%] +tests/test_virus.py::TestVirus::test_parse_accession_input_from_file PASSED [ 48%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_json PASSED [ 48%] +tests/test_virus.py::TestVirus::test_virus_integer_virus_id PASSED [ 49%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_true PASSED [ 49%] +tests/test_virus.py::TestVirus::test_unzip_file_bad_zip_raises PASSED [ 49%] +tests/test_virus.py::TestVirus::test_parse_genbank_xml_invalid_raises PASSED [ 49%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_true PASSED [ 50%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_jsonl PASSED [ 50%] +tests/test_virus.py::TestVirus::test_check_min_max_none_values PASSED [ 50%] +tests/test_virus.py::TestVirus::test_save_command_summary_creates_file PASSED [ 50%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_type PASSED [ 51%] +tests/test_virus.py::TestVirus::test_get_datasets_path_uses_bundled_binary PASSED [ 51%] +tests/test_virus.py::TestVirus::test_is_sars_cov2_query_common_names PASSED [ 51%] +tests/test_virus.py::TestVirus::test_filter_cached_min_release_date PASSED [ 51%] +tests/test_virus.py::TestVirus::test_unzip_file_valid PASSED [ 52%] +tests/test_virus.py::TestVirus::test_filter_sequences_proteins_complete PASSED [ 52%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_false PASSED [ 52%] +tests/test_virus.py::TestVirus::test_merge_baseline_with_new_empty_new PASSED [ 52%] +tests/test_virus.py::TestVirus::test_filter_cached_complete_only PASSED [ 53%] +tests/test_virus.py::TestVirus::test_filter_cached_no_filters PASSED [ 53%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_space_before_virus PASSED [ 53%] +tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_basic PASSED [ 53%] +tests/test_virus.py::TestVirus::test_parse_date_invalid_raises PASSED [ 54%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_seq_length PASSED [ 54%] +tests/test_virus.py::TestVirus::test_parse_accession_input_single PASSED [ 54%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_institution PASSED [ 54%] +tests/test_virus.py::TestVirus::test_clean_xml_declarations PASSED [ 55%] +tests/test_virus.py::TestVirus::test_merge_baseline_with_new_deduplicates PASSED [ 55%] +tests/test_virus.py::TestVirus::test_get_memory_usage_returns_dict PASSED [ 55%] +tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_accession_mode PASSED [ 55%] +tests/test_virus.py::TestVirus::test_parse_accession_input_empty_file_raises_error PASSED [ 55%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_true PASSED [ 56%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_empty_returns_none PASSED [ 56%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype PASSED [ 56%] +tests/test_virus.py::TestVirus::test_merge_metadata_csvs_fills_missing PASSED [ 56%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_empty PASSED [ 57%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_min_gene_count PASSED [ 57%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_csv PASSED [ 57%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_env_source PASSED [ 57%] +tests/test_virus.py::TestVirus::test_virus_metadata_schema_validation PASSED [ 58%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_collection_date PASSED [ 58%] +tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter PASSED [ 58%] +tests/test_virus.py::TestVirus::test_check_min_max_invalid_raises PASSED [ 58%] +tests/test_virus.py::TestVirus::test_check_min_max_valid PASSED [ 59%] +tests/test_virus.py::TestVirus::test_stream_copy_fasta_all_records PASSED [ 59%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_peptide_count PASSED [ 59%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_has_proteins PASSED [ 59%] +tests/test_virus.py::TestVirus::test_parse_accession_input_nonexistent_file_raises_error PASSED [ 60%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_true PASSED [ 60%] +tests/test_virus.py::TestVirus::test_save_command_summary_with_error PASSED [ 60%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_combined PASSED [ 60%] +tests/test_virus.py::TestVirus::test_save_metadata_to_csv_basic PASSED [ 61%] +tests/test_virus.py::TestVirus::test_retry_helper_custom_retryable_exceptions PASSED [ 61%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_host PASSED [ 61%] +tests/test_virus.py::TestVirus::test_save_metadata_to_csv_empty_metadata PASSED [ 61%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_no_parentheses_returns_none PASSED [ 62%] +tests/test_virus.py::TestVirus::test_filter_cached_host_not_in_strategy PASSED [ 62%] +tests/test_virus.py::TestVirus::test_retry_helper_successful_operation PASSED [ 62%] +tests/test_virus.py::TestVirus::test_virus_with_multiple_filters PASSED [ 62%] +tests/test_virus.py::TestVirus::test_clean_xml_declarations_no_declarations PASSED [ 63%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_isolate PASSED [ 63%] +tests/test_virus.py::TestVirus::test_track_failed_operation_none_dict PASSED [ 63%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_min PASSED [ 63%] +tests/test_virus.py::TestVirus::test_get_datasets_path_returns_valid_path PASSED [ 64%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_max_comparison PASSED [ 64%] +tests/test_virus.py::TestVirus::test_genbank_xml_to_csv_basic PASSED [ 64%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_max_gene_count PASSED [ 64%] +tests/test_virus.py::TestVirus::test_check_min_max_date_invalid_raises PASSED [ 65%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_empty PASSED [ 65%] +tests/test_virus.py::TestVirus::test_virus_invalid_completeness PASSED [ 65%] +tests/test_virus.py::TestVirus::test_filter_cached_annotated PASSED [ 65%] +tests/test_virus.py::TestVirus::test_virus_invalid_proteins_complete_type PASSED [ 66%] +tests/test_virus.py::TestVirus::test_write_fasta_record_long_sequence_wraps PASSED [ 66%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_protein_count PASSED [ 66%] +tests/test_virus.py::TestVirus::test_validate_datasets_binary_empty_path PASSED [ 66%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_min_comparison PASSED [ 66%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_missing_accession PASSED [ 67%] +tests/test_virus.py::TestVirus::test_virus_none_virus_name PASSED [ 67%] +tests/test_virus.py::TestVirus::test_merge_metadata_csvs_missing_standard_file PASSED [ 67%] +tests/test_virus.py::TestVirus::test_get_gget_version_returns_string PASSED [ 67%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_collection_date_range PASSED [ 68%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_segment PASSED [ 68%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_none_raises PASSED [ 68%] +tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_common_names PASSED [ 68%] +tests/test_virus.py::TestVirus::test_filter_sequences_max_ambiguous_chars PASSED [ 69%] +tests/test_virus.py::TestVirus::test_virus_with_length_filters PASSED [ 69%] +tests/test_virus.py::TestVirus::test_virus_with_geographic_location_filter PASSED [ 69%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_basic PASSED [ 69%] +tests/test_virus.py::TestVirus::test_virus_multi_accession_file_input PASSED [ 70%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_max PASSED [ 70%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_name PASSED [ 70%] +tests/test_virus.py::TestVirus::test_virus_multi_accession_space_separated PASSED [ 70%] +tests/test_virus.py::TestVirus::test_virus_with_source_database_filter PASSED [ 71%] +tests/test_virus.py::TestVirus::test_filter_cached_geographic_location PASSED [ 71%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_nuc_completeness_partial PASSED [ 71%] +tests/test_virus.py::TestVirus::test_parse_date_various_formats PASSED [ 71%] +tests/test_virus.py::TestVirus::test_retry_helper_failed_commands_tracking PASSED [ 72%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_false PASSED [ 72%] +tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter PASSED [ 72%] +tests/test_virus.py::TestVirus::test_write_fasta_record_without_description PASSED [ 72%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_text PASSED [ 73%] +tests/test_virus.py::TestVirus::test_virus_multiple_filters_relationship_check PASSED [ 73%] +tests/test_virus.py::TestVirus::test_filter_cached_host_in_strategy_skipped PASSED [ 73%] +tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters PASSED [ 73%] +tests/test_virus.py::TestVirus::test_deduplicate_empty_baseline PASSED [ 74%] +tests/test_virus.py::TestVirus::test_write_fasta_record_with_description PASSED [ 74%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_isolation_source PASSED [ 74%] +tests/test_virus.py::TestVirus::test_virus_host_filter_verification PASSED [ 74%] +tests/test_virus.py::TestVirus::test_virus_release_date_filter_verification PASSED [ 75%] +tests/test_muscle.py::TestMuscleAA::test_muscle_aa PASSED [ 75%] +tests/test_muscle.py::TestMuscleAASuper::test_muscle_aa_super5 PASSED [ 75%] +tests/test_muscle.py::TestMusclePrints::test_muscle_print_nt PASSED [ 75%] +tests/test_muscle.py::TestMuscleSeqsInput::test_muscle_seqs_as_input PASSED [ 76%] +tests/test_muscle.py::TestMuscleSuper::test_muscle_nt_super5 PASSED [ 76%] +tests/test_muscle.py::TestMuscle::test_muscle_nt PASSED [ 76%] +tests/test_muscle.py::TestMuscle::test_muscle_nt_txt PASSED [ 76%] +tests/test_8cube.py::TestGeneExpression::test_gene_expression_basic PASSED [ 77%] +tests/test_8cube.py::TestSpecificity::test_specificity_basic PASSED [ 77%] +tests/test_8cube.py::TestPsiBlock::test_psi_block_basic PASSED [ 77%] +tests/test_bgee.py::TestBgee::test_bgee_orthologs PASSED [ 77%] +tests/test_bgee.py::TestBgee::test_error_bgee_orthologs_no_exist PASSED [ 77%] +tests/test_bgee.py::TestBgee::test_bgee_expression_multiple PASSED [ 78%] +tests/test_bgee.py::TestBgee::test_error_bgee_unknown_type PASSED [ 78%] +tests/test_bgee.py::TestBgee::test_bgee_expression PASSED [ 78%] +tests/test_bgee.py::TestBgee::test_error_bgee_expression_no_exist PASSED [ 78%] +tests/test_compile.py::TestCompilerWindows::test_compiler_windows PASSED [ 79%] +tests/test_blast.py::TestBlast::test_blast_bad_db1 PASSED [ 79%] +tests/test_blast.py::TestBlast::test_blast_bad_db2 PASSED [ 79%] +tests/test_blast.py::TestBlast::test_blast_bad_fasta PASSED [ 79%] +tests/test_blast.py::TestBlast::test_blast_bad_seq PASSED [ 80%] +tests/test_blast.py::TestBlast::test_blast_bad_program PASSED [ 80%] +tests/test_blast.py::TestBlast::test_blast_db_missing PASSED [ 80%] +tests/test_blast.py::TestBlast::test_blast_nt PASSED [ 80%] +tests/test_mutate.py::test_mismatch_error PASSED [ 81%] +tests/test_mutate.py::test_csv_of_mutations PASSED [ 81%] +tests/test_mutate.py::TestMutate::test_inversion_with_overlaps PASSED [ 81%] +tests/test_mutate.py::TestMutate::test_index_error PASSED [ 81%] +tests/test_mutate.py::TestMutate::test_intron_mutation_plus PASSED [ 82%] +tests/test_mutate.py::TestMutate::test_list_of_mutations PASSED [ 82%] +tests/test_mutate.py::TestMutate::test_intron_mutation_minus PASSED [ 82%] +tests/test_mutate.py::TestMutate::test_single_substitution_near_left_end PASSED [ 82%] +tests/test_mutate.py::TestMutate::test_multi_insertion PASSED [ 83%] +tests/test_mutate.py::TestMutate::test_multi_deletion_with_right_repeats PASSED [ 83%] +tests/test_mutate.py::TestMutate::test_uncertain_mutation PASSED [ 83%] +tests/test_mutate.py::TestMutate::test_single_deletion PASSED [ 83%] +tests/test_mutate.py::TestMutate::test_single_substitution_near_right_end PASSED [ 84%] +tests/test_mutate.py::TestMutate::test_multi_delins PASSED [ 84%] +tests/test_mutate.py::TestMutate::test_multi_insertion_with_left_repeats PASSED [ 84%] +tests/test_mutate.py::TestMutate::test_single_deletion_with_left_repeats PASSED [ 84%] +tests/test_mutate.py::TestMutate::test_multi_delins_with_psuedo_left_repeats PASSED [ 85%] +tests/test_mutate.py::TestMutate::test_multi_deletion PASSED [ 85%] +tests/test_mutate.py::TestMutate::test_single_substitution PASSED [ 85%] +tests/test_mutate.py::TestMutate::test_single_deletion_with_right_repeats PASSED [ 85%] +tests/test_mutate.py::TestMutate::test_large_k PASSED [ 86%] +tests/test_mutate.py::TestMutate::test_multi_delins_with_true_right_repeats PASSED [ 86%] +tests/test_mutate.py::TestMutate::test_single_delins PASSED [ 86%] +tests/test_mutate.py::TestMutate::test_single_dup PASSED [ 86%] +tests/test_mutate.py::TestMutate::test_multi_dup PASSED [ 87%] +tests/test_mutate.py::TestMutate::test_ambiguous_mutation PASSED [ 87%] +tests/test_mutate.py::TestMutate::test_posttranslational_mutation PASSED [ 87%] +tests/test_mutate.py::TestMutate::test_single_insertion PASSED [ 87%] +tests/test_mutate.py::TestMutate::test_multi_delins_with_true_left_repeats PASSED [ 88%] +tests/test_cbio.py::TestCbio::test_cbio_download_partially_existing_files PASSED [ 88%] +tests/test_cbio.py::TestCbio::test_error_cbio_download PASSED [ 88%] +tests/test_cbio.py::TestCbio::test_cbio_download PASSED [ 88%] +tests/test_cbio.py::TestCbioSearch::test_cbio_search PASSED [ 88%] +tests/test_info.py::TestInfo::test_info_ncbitrue_uniprotfalse PASSED [ 89%] +tests/test_info.py::TestInfo::test_info_exon PASSED [ 89%] +tests/test_info.py::TestInfo::test_info_gene PASSED [ 89%] +tests/test_info.py::TestInfo::test_info_gene_list_non_model PASSED [ 89%] +tests/test_info.py::TestInfo::test_info_ncbifalse_uniprottrue PASSED [ 90%] +tests/test_info.py::TestInfo::test_info_ncbifalse_uniprotfalse PASSED [ 90%] +tests/test_info.py::TestInfo::test_info_mix PASSED [ 90%] +tests/test_info.py::TestInfo::test_info_WB_transcript PASSED [ 90%] +tests/test_info.py::TestInfo::test_info_transcript PASSED [ 91%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions PASSED [ 91%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap_filter PASSED [ 91%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_pharmacogenetics PASSED [ 91%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets PASSED [ 92%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_diseases_filter PASSED [ 92%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap PASSED [ 92%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_simple_filter PASSED [ 92%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_diseases PASSED [ 93%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_expression_no_limit SKIPPED [ 93%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_drugs_invalid_filter PASSED [ 93%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_expression SKIPPED [ 93%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_drugs PASSED [ 94%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_resource PASSED [ 94%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_nonexistent_id PASSED [ 94%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_tractability PASSED [ 94%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_limit PASSED [ 95%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_no_limit PASSED [ 95%] +tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata SKIPPED [ 95%] +tests/test_cellxgene.py::TestCellxgene::test_cellxgene_adata SKIPPED [ 95%] +tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata_macaca_mulatta SKIPPED [ 96%] +tests/test_cellxgene.py::TestCellxgeneValidation::test_invalid_species_raises_valueerror PASSED [ 96%] +tests/test_cellxgene.py::TestCellxgeneValidation::test_typo_species_raises_valueerror PASSED [ 96%] +tests/test_cellxgene.py::TestCellxgeneValidation::test_supported_species_includes_new_primates PASSED [ 96%] +tests/test_ref.py::TestRef::test_ref_list PASSED [ 97%] +tests/test_ref.py::TestRef::test_ref_rel_protist PASSED [ 97%] +tests/test_ref.py::TestRef::test_ref_bad_species PASSED [ 97%] +tests/test_ref.py::TestRef::test_ref_bad_which PASSED [ 97%] +tests/test_ref.py::TestRef::test_ref_which PASSED [ 98%] +tests/test_ref.py::TestRef::test_ref_plant PASSED [ 98%] +tests/test_ref.py::TestRef::test_ref_which_plant PASSED [ 98%] +tests/test_ref.py::TestRef::test_ref_rel_ftp PASSED [ 98%] +tests/test_ref.py::TestRef::test_ref_rel PASSED [ 99%] +tests/test_ref.py::TestRef::test_ref_ftp PASSED [ 99%] +tests/test_ref.py::TestRef::test_ref_rel_ftp_octopus PASSED [ 99%] +tests/test_ref.py::TestRef::test_ref_bad_rel PASSED [ 99%] +tests/test_ref.py::TestRef::test_ref PASSED [100%] + +=============================== warnings summary =============================== +tests/test_search.py::TestSearch::test_search_plant +tests/test_search.py::TestSearch::test_search_transcript_two_sw_or +tests/test_search.py::TestSearch::test_search_release +tests/test_utils.py::TestUtils::test_search_species_options + /home/runner/work/gget/gget/gget/utils.py:899: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. + for subsoup in soup.body.findAll("a"): + +tests/test_search.py::TestSearch::test_search_plant +tests/test_search.py::TestSearch::test_search_plant +tests/test_search.py::TestSearch::test_search_plant +tests/test_search.py::TestSearch::test_search_plant +tests/test_utils.py::TestUtils::test_search_iv_species_options +tests/test_utils.py::TestUtils::test_search_iv_species_options +tests/test_utils.py::TestUtils::test_search_iv_species_options +tests/test_utils.py::TestUtils::test_search_iv_species_options + /home/runner/work/gget/gget/gget/utils.py:883: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. + for subsoup in soup.body.findAll("a"): + +tests/test_search.py: 10 warnings + /home/runner/work/gget/gget/gget/gget_search.py:267: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy. + df_temp = pd.read_sql(query, con=db_connection) + +tests/test_search.py: 19 warnings +tests/test_ref.py: 7 warnings + /home/runner/work/gget/gget/gget/utils.py:922: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. + for subsoup in soup.body.findAll("a"): + +tests/test_search.py::TestSearch::test_search_transcript_two_sw_and +tests/test_search.py::TestSearch::test_search_transcript_two_sw_or +tests/test_search.py::TestSearch::test_search_gene_two_sw_limit +tests/test_search.py::TestSearch::test_search_transcript_one_sw + /home/runner/work/gget/gget/gget/gget_search.py:302: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy. + df_temp = pd.read_sql(query, con=db_connection) + +tests/test_utils.py: 4 warnings +tests/test_ref.py: 24 warnings + /home/runner/work/gget/gget/gget/utils.py:975: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. + for subsoup in soup.body.findAll("a"): + +tests/test_utils.py: 1 warning +tests/test_ref.py: 11 warnings + /home/runner/work/gget/gget/gget/utils.py:998: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. + for subsoup in soup.body.findAll("a"): + +tests/test_mutate.py: 29 warnings + /home/runner/work/gget/gget/gget/gget_mutate.py:667: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract. + mask = mutations[mut_column].str.contains(combined_pattern) + +tests/test_cbio.py::TestCbioSearch::test_cbio_search +tests/test_cbio.py::TestCbioSearch::test_cbio_search + /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/swagger_spec_validator/validator12.py:18: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. + from jsonschema import RefResolver + +tests/test_cbio.py::TestCbioSearch::test_cbio_search + /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/swagger_spec_validator/ref_validators.py:14: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. + from jsonschema.validators import RefResolver + +tests/test_cbio.py::TestCbioSearch::test_cbio_search + /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/swagger_spec_validator/validator20.py:18: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. + from jsonschema.validators import RefResolver + +tests/test_cbio.py::TestCbioSearch::test_cbio_search +tests/test_cbio.py::TestCbioSearch::test_cbio_search + /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/bravado_core/swagger20_validator.py:6: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. + from jsonschema import RefResolver + +tests/test_cbio.py::TestCbioSearch::test_cbio_search + /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/bravado_core/spec.py:14: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. + from jsonschema.validators import RefResolver + +tests/test_cbio.py: 16 warnings + /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/bravado_core/model.py:888: DeprecationWarning: jsonschema.RefResolver.in_scope is deprecated and will be removed in a future release. + with spec.resolver.in_scope(additional_uri): + +tests/test_ref.py: 39 warnings + /home/runner/work/gget/gget/gget/gget_ref.py:49: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. + links = [stuff.text.strip() for stuff in soup.findAll("td")] + +tests/test_ref.py::TestRef::test_ref_ftp +tests/test_ref.py::TestRef::test_ref + /home/runner/work/gget/gget/gget/gget_ref.py:325: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. + links = [stuff.text.strip() for stuff in soup.findAll("td")] + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +============================= slowest 10 durations ============================= +184.25s call tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter +177.79s call tests/test_virus.py::TestVirus::test_virus_with_source_database_filter +134.37s call tests/test_virus.py::TestVirus::test_virus_integer_virus_id +131.12s call tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter +82.32s call tests/test_blast.py::TestBlast::test_blast_nt +73.55s call tests/test_virus.py::TestVirus::test_virus_with_annotated_filter +73.25s call tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters +71.92s call tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter +68.64s call tests/test_search.py::TestSearch::test_search_gene_two_sw_limit +22.03s call tests/test_virus.py::TestVirus::test_virus_host_filter_verification =========================== short test summary info ============================ -ERROR tests/test_elm.py - RuntimeError: ELM database files download failed; missing files: ELM instances fasta file -!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! -======================== 1 error in 2270.28s (0:37:50) ========================= +SKIPPED [2] tests/from_json.py:286: Open Targets deprecated the `expressions` GraphQL field (returns []) in favor of `baselineExpression`, which has a different schema (tissueBiosample, q1/q3/median/min/max instead of tissue/rna sub-objects). Migration is a user-facing API change; tracked separately. +SKIPPED [1] tests/test_cellxgene.py:55: cellxgene-census is not installed +SKIPPED [1] tests/test_cellxgene.py:45: cellxgene-census is not installed +SKIPPED [1] tests/test_cellxgene.py:65: cellxgene-census is not installed +========== 404 passed, 5 skipped, 185 warnings in 2070.38s (0:34:30) =========== From 7ea5996dfe52293012f457f12e3c27ff1c88928b Mon Sep 17 00:00:00 2001 From: "Laura Luebbert, Ph.D." <56094636+lauraluebbert@users.noreply.github.com> Date: Sat, 27 Jun 2026 14:24:41 -0400 Subject: [PATCH 22/34] feat(g2p): make g2p useful for variant-interpretation workflows + bug fixes (#258) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(g2p): make gene optional, fix silent failure on JSON error bodies - gene is now optional and resolved from uniprot_id via the UniProt REST entry endpoint (cached with lru_cache). A UniProt accession alone is sufficient identification; the old API required both. - Fix silent failure where G2P returns HTTP 200 with a JSON {"status":"failure",...} body on unknown gene/UniProt pairs. The response was being parsed as a single TSV column header and a 0-row DataFrame returned with no error. Now detected, logged, and returns None. - All failure modes return None (previously a mix of None and empty DataFrame). - Retry transient failures (5xx, connection errors, timeouts) with exponential backoff. - URL-encode gene/uniprot_id/isoform path segments. - New `out=` Python argument to write to an explicit CSV path (takes precedence over `save`). - Docs: list g2p in SUMMARY.md (was hidden from the published site); advertise PFES, MaveDB, pocket and interaction columns; note that variant overlays (gnomAD/ClinVar/HGMD) are portal-only. Backward-compatible: existing CLI (`gget g2p BRCA1 -u P38398`) and Python (`gget.g2p("BRCA1", uniprot_id="P38398")`) call sites continue to work unchanged. Co-Authored-By: Claude Opus 4.7 (1M context) * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * feat(g2p): residues filter, symmetric resolution, parsed PDB list - Symmetric resolution: `--uniprot_id` is now optional too, resolved from `gene` via UniProt (canonical reviewed human Swiss-Prot entry) when omitted. Limitations are spelled out in a prominent log message (synonyms, paralogues, non-human, unreviewed, isoforms — pass uniprot_id to override). The resolved pair travels with the data both as df.attrs["gene"]/["uniprot_id"] and as leading `Resolved Gene` / `Resolved UniProt` columns whenever resolution happened — so CSV/JSON saved files also record what was queried. - `residues=` argument filters `features`/`alignment` results to specific positions (int / list / tuple / range / set in Python; comma-separated list and/or inclusive ranges on the CLI: `--residues 100-200,300,400`). - `map` results gain a parsed `PDB Ids List` column (list[str]) alongside the comma-joined `PDB Ids` string, ready to feed into `gget pdb`. - `alignment` now requires `uniprot_id` explicitly (gene→UniProt returns the base accession and cannot disambiguate isoforms). Backward-compatible. Co-Authored-By: Claude Opus 4.7 (1M context) * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update g2p.md * refactor(g2p): invariant schema with gene_name/uniprot_id columns The previous behavior added "Resolved Gene" / "Resolved UniProt" columns only when one of the identifiers was looked up. That meant the output schema differed depending on input mode, which is awkward for downstream code that should not care whether the caller supplied gene, uniprot_id, or both. Now the canonical pair is *always* prepended as `gene_name` and `uniprot_id` columns, populated with whichever values were used for the query. The same keys are also set on `df.attrs`. Output schema is now identical across all three input modes. Co-Authored-By: Claude Opus 4.7 (1M context) * Update g2p.md --------- Co-authored-by: Claude Opus 4.7 (1M context) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- docs/src/SUMMARY.md | 2 + docs/src/en/g2p.md | 79 +++++++-- docs/src/en/updates.md | 8 + gget/gget_g2p.py | 362 ++++++++++++++++++++++++++++++++++++----- gget/main.py | 54 +++++- tests/test_g2p.py | 113 ++++++++++++- 6 files changed, 551 insertions(+), 67 deletions(-) diff --git a/docs/src/SUMMARY.md b/docs/src/SUMMARY.md index ca34b5f9c..b112fd0f2 100644 --- a/docs/src/SUMMARY.md +++ b/docs/src/SUMMARY.md @@ -21,6 +21,7 @@ * [gget diamond](en/diamond.md) * [gget elm](en/elm.md) * [gget enrichr](en/enrichr.md) +* [gget g2p](en/g2p.md) * [gget gpt](en/gpt.md) * [gget info](en/info.md) * [gget muscle](en/muscle.md) @@ -63,6 +64,7 @@ * [gget diamond](es/diamond.md) * [gget elm](es/elm.md) * [gget enrichr](es/enrichr.md) +* [gget g2p](es/g2p.md) * [gget gpt](es/gpt.md) * [gget info](es/info.md) * [gget muscle](es/muscle.md) diff --git a/docs/src/en/g2p.md b/docs/src/en/g2p.md index d2896e4e0..e3466b0fb 100644 --- a/docs/src/en/g2p.md +++ b/docs/src/en/g2p.md @@ -2,34 +2,43 @@ > Python arguments are equivalent to long-option arguments (`--arg`), unless otherwise specified. Flags are True/False arguments in Python. The manual for any gget tool can be called from the command-line using the `-h` `--help` flag. # gget g2p 🧬➜🧪 -Query the [Genomics 2 Proteins (G2P) portal](https://g2p.broadinstitute.org/) to link genes/proteins to residue-level structural and functional annotations (e.g. AlphaFold pLDDT, UniProt sites, predicted pockets, PTMs), the gene–transcript–protein–isoform–structure map, and isoform alignments. +Query the [Genomics 2 Proteins (G2P) portal](https://g2p.broadinstitute.org/) to link genes/proteins to residue-level structural and functional annotations, the gene–transcript–protein–isoform–structure map, and isoform alignments. -Returns: A data frame with the requested G2P information. +The per-residue feature table is rich (~140 columns), including AlphaFold pLDDT, DSSP secondary structure, accessible surface area, UniProt sites (active/binding/domain/...), PhosphoSitePlus PTMs, fpocket / af2bind / p2rank pocket predictions, intra- and inter-chain hydrogen bonds, non-bonded interactions, disulfide bonds and salt bridges (from PDB and AlphaFold), the PFES (Protein Feature Enrichment Score) sub-scores used by G2P for missense variant interpretation, and per-residue MaveDB experimental functional scores. See the [`g2p-bis` documentation](https://github.com/broadinstitute/g2p-bis) for column descriptions. + +> Note: this module wraps the *public* G2P REST API. The variant overlays shown in the portal's web UI (gnomAD, ClinVar, HGMD) are not exposed by the public API and are therefore not available via `gget g2p` — use the portal directly for those. + +Returns: A data frame with the requested G2P information, or `None` if the query failed (network error, invalid arguments, or unknown gene/UniProt pair). This module was written by [Elarwei](https://github.com/Elarwei001). -**Positional argument** -`gene` +At least one of `gene` or `--uniprot_id` is required — the other is resolved automatically via the UniProt REST API and cached. + +**Arguments (at least one of `gene` / `--uniprot_id` required)** +`gene` (positional) Gene symbol, e.g. BRCA1. +If omitted, resolved from `--uniprot_id`. In this case, note that gene → UniProt accession lookup is approximate (it picks the canonical reviewed human Swiss-Prot entry only); for non-human organisms, unreviewed entries, or a specific isoform, pass `--uniprot_id` explicitly. -**Other required arguments** `-u` `--uniprot_id` -UniProt accession, e.g. P38398. For `--resource alignment` this is the canonical isoform (e.g. P01130-1). -Tip: find a gene's UniProt ID with [`gget info`](info.md). +UniProt accession, e.g. P38398. If omitted, resolved from `gene`. For `--resource alignment` this is the canonical isoform (e.g. P01130-1) and is **required** (gene→UniProt lookup returns the base accession and cannot disambiguate isoforms). +Tip: find a gene's UniProt ID with [`gget search`](search.md) (to get a gene's Ensembl ID) and [`gget info`](info.md). **Optional arguments** `-r` `--resource` Defines the type of information to return (default: 'features'): -`features`: Per-residue protein feature table (AlphaFold pLDDT, UniProt sites, secondary structure, predicted pockets, PTMs, etc.). -`map`: Gene → transcript → protein isoform → structure map (UniProt/Ensembl/RefSeq/PDB identifiers). +`features`: Per-residue protein feature table (~140 columns: AlphaFold pLDDT, UniProt sites, secondary structure, predicted pockets, PTMs, PFES, MaveDB scores, ...). +`map`: Gene → transcript → protein isoform → structure map (UniProt/Ensembl/RefSeq/PDB identifiers). The comma-joined `PDB Ids` column is augmented with a parsed `PDB Ids List` column (`list[str]`) for direct consumption (e.g. with [`gget pdb`](pdb.md)). `alignment`: Residue-level sequence alignment between two isoforms (requires `--isoform`; `--uniprot_id` is the canonical isoform). `-i` `--isoform` Alternative isoform UniProt accession (e.g. P01130-2). Required when `--resource alignment`. Default: None. +`--residues` +Restrict the result to specific residue positions (applies to `--resource features` / `alignment` only). Command line: comma-separated list and/or inclusive ranges, e.g. `185,1775,1812` or `100-200` or `1-50,185`. Python: `int`, `list[int]`, `range`, or `set[int]`. Default: None (return all residues). + `-o` `--out` Path to the file the results will be saved in, e.g. path/to/directory/results.json. Default: Standard out. -Python: `save=True` will save the output in the current working directory. +Python: `save=True` will save the output as a CSV in the current working directory; `out="path/to/file.csv"` writes to an explicit path and takes precedence over `save`. **Flags** `-csv` `--csv` @@ -42,24 +51,62 @@ Python: Use `verbose=False` to prevent progress information from being displayed ### Examples ```bash -# Per-residue protein features for BRCA1 (AlphaFold pLDDT, UniProt sites, ...) +# Per-residue protein features for BRCA1 (AlphaFold pLDDT, UniProt sites, ...). +# The gene symbol is optional — it can be resolved from the UniProt accession. +gget g2p -u P38398 +``` +```python +# Python +gget.g2p(uniprot_id="P38398", resource="features") +``` +→ Returns a data frame with one row per residue of the BRCA1 protein (UniProt P38398) and its structural/functional annotations. + +

+ +```bash +# Same query, with the gene symbol passed explicitly gget g2p BRCA1 -u P38398 ``` ```python # Python gget.g2p("BRCA1", uniprot_id="P38398", resource="features") ``` -→ Returns a data frame with one row per residue of the BRCA1 protein (UniProt P38398) and its structural/functional annotations. + +

+ +```bash +# Symmetric: only the gene symbol — UniProt accession is resolved automatically +# (canonical reviewed human Swiss-Prot entry). +gget g2p BRCA1 +``` +```python +# Python +gget.g2p("BRCA1") +``` +→ Same as above. The resolved `P38398` is logged and is visible in the leading `uniprot_id` column. + +

+ +```bash +# Score only specific residue positions +gget g2p BRCA1 -u P38398 --residues 185,1775,1812 +``` +```python +# Python +gget.g2p("BRCA1", uniprot_id="P38398", residues=[185, 1775, 1812]) +gget.g2p("BRCA1", uniprot_id="P38398", residues=range(100, 200)) +``` +→ Returns only the requested residues from the per-residue feature table.

```bash # Gene -> transcript -> isoform -> structure map (CSV) -gget g2p BRCA1 -u P38398 -r map --csv +gget g2p -u P38398 -r map --csv ``` ```python # Python -gget.g2p("BRCA1", uniprot_id="P38398", resource="map") +gget.g2p(uniprot_id="P38398", resource="map") ``` → Returns the mapping of BRCA1 to its UniProt isoforms, Ensembl/RefSeq identifiers, and PDB structures. @@ -67,11 +114,11 @@ gget.g2p("BRCA1", uniprot_id="P38398", resource="map") ```bash # Residue-level alignment between two LDLR isoforms -gget g2p LDLR -u P01130-1 -r alignment -i P01130-2 +gget g2p -u P01130-1 -r alignment -i P01130-2 ``` ```python # Python -gget.g2p("LDLR", uniprot_id="P01130-1", resource="alignment", isoform="P01130-2") +gget.g2p(uniprot_id="P01130-1", resource="alignment", isoform="P01130-2") ``` → Returns the residue-level alignment between LDLR isoforms P01130-1 and P01130-2. diff --git a/docs/src/en/updates.md b/docs/src/en/updates.md index cf5ac9e45..db284d45a 100644 --- a/docs/src/en/updates.md +++ b/docs/src/en/updates.md @@ -5,6 +5,14 @@ #### *gget* officially became part of [*scverse*](https://scverse.org/) on June 9, 2026. 🥳🥳🥳 **Version ≥ 0.30.8** (XXX XX, 2026): +- [`gget g2p`](g2p.md): Either `gene` or `--uniprot_id` is now sufficient — whichever is missing is resolved via UniProt and cached. Gene→UniProt picks the canonical reviewed human Swiss-Prot entry; the resolution and its limitations are logged. The canonical pair is **always** prepended to the result as `gene_name` / `uniprot_id` columns (and stored on `df.attrs`), so the output schema is invariant regardless of input mode. Existing call sites continue to work. + - New `residues=` filter (Python: int / list / range / set; CLI `--residues 100,200,300` or `100-200`) restricts `features` / `alignment` to specific positions client-side. + - `map` results gain a parsed `PDB Ids List` column (`list[str]`) alongside the comma-joined `PDB Ids` string, for direct chaining into [`gget pdb`](pdb.md). + - Fixed silent failure when the gene/UniProt pair was unknown: G2P returns HTTP 200 with a JSON `{"status":"failure",...}` body that was being parsed as a single TSV column. Now logged as an error and returns `None`. + - All failure modes now return `None` (was a mix of `None` and empty `DataFrame`). + - Added retries with exponential backoff on transient failures (5xx, connection errors, timeouts). + - URL-encoded path segments. + - New `out=` Python argument writes the result to an explicit CSV path (takes precedence over `save`). - [`gget alphafold`](alphafold.md): Added a new `jackhmmer_savedir` argument (`-jhd`/`--jackhmmer_savedir` on the command line) that lets you choose where the temporary jackhmmer files are stored. By default, `gget alphafold` still creates a `~/tmp/jackhmmer/` folder in your home directory (which can take up to ~2 GB of disk space); the new argument lets you redirect these files elsewhere, e.g. to a disk with more free space. Resolves [issue 49](https://github.com/scverse/gget/issues/49). - [`gget pdb`](pdb.md): Added support for the PDBx/mmCIF structure format (fixes [issue 178](https://github.com/scverse/gget/issues/178) and [issue 177](https://github.com/scverse/gget/issues/177)). - New `resource="mmcif"` option downloads the structure in PDBx/mmCIF format (`.cif`). diff --git a/gget/gget_g2p.py b/gget/gget_g2p.py index cc7bd77ea..179c51aea 100644 --- a/gget/gget_g2p.py +++ b/gget/gget_g2p.py @@ -1,6 +1,10 @@ from __future__ import annotations import io +import json +import time +from functools import lru_cache +from urllib.parse import quote import pandas as pd import requests @@ -10,46 +14,258 @@ logger = set_up_logger() +UNIPROT_ENTRY_URL = "https://rest.uniprot.org/uniprotkb/{accession}.json" +UNIPROT_SEARCH_URL = "https://rest.uniprot.org/uniprotkb/search" + + +@lru_cache(maxsize=256) +def _resolve_gene_from_uniprot(uniprot_id: str) -> str | None: + """Look up the primary gene symbol for a UniProt accession via the UniProt REST entry endpoint. + + Returns the gene symbol, or None if the accession is unknown or has no gene name. + Cached so repeated `gget g2p` calls for the same protein don't re-query UniProt. + """ + url = UNIPROT_ENTRY_URL.format(accession=quote(uniprot_id, safe="")) + try: + r = requests.get(url, timeout=DEFAULT_REQUESTS_TIMEOUT) + except requests.exceptions.RequestException as e: + logger.error(f"UniProt lookup for '{uniprot_id}' failed: {e}") + return None + if not r.ok: + logger.error( + f"UniProt lookup for '{uniprot_id}' returned HTTP {r.status_code}. " + "Please check that this is a valid UniProt accession (e.g. 'P38398' or 'P01130-1')." + ) + return None + try: + payload = r.json() + gene = payload["genes"][0]["geneName"]["value"] + except (json.JSONDecodeError, KeyError, IndexError, TypeError): + logger.error(f"UniProt returned an entry for '{uniprot_id}' but no primary gene symbol could be extracted.") + return None + return gene if isinstance(gene, str) and gene else None + + +@lru_cache(maxsize=256) +def _resolve_uniprot_from_gene(gene: str) -> tuple[str, int] | None: + """Look up the canonical reviewed human Swiss-Prot accession for a gene symbol. + + Queries the UniProt REST search endpoint with + `gene_exact:{gene} AND organism_id:9606 AND reviewed:true` and returns + `(primary_accession, n_candidates)`. The candidate count lets the caller warn + when more than one reviewed entry matched. Returns None if no reviewed entry + was found. + """ + params = { + "query": f"gene_exact:{gene} AND organism_id:9606 AND reviewed:true", + "format": "json", + "fields": "accession", + "size": 5, + } + try: + r = requests.get(UNIPROT_SEARCH_URL, params=params, timeout=DEFAULT_REQUESTS_TIMEOUT) + except requests.exceptions.RequestException as e: + logger.error(f"UniProt lookup for gene '{gene}' failed: {e}") + return None + if not r.ok: + logger.error(f"UniProt lookup for gene '{gene}' returned HTTP {r.status_code}.") + return None + try: + results = r.json().get("results", []) + except (json.JSONDecodeError, AttributeError): + logger.error(f"UniProt lookup for gene '{gene}' returned invalid JSON.") + return None + if not results: + return None + first = results[0] if isinstance(results[0], dict) else {} + accession = first.get("primaryAccession") + if not isinstance(accession, str) or not accession: + return None + return accession, len(results) + + +def _normalize_residues(residues: object) -> set[int]: + """Coerce a `residues` argument (int / iterable of ints / range) to a set of ints.""" + if isinstance(residues, bool): + raise ValueError("'residues' must be an int or an iterable of ints, not a bool.") + if isinstance(residues, int): + return {residues} + if isinstance(residues, (list, tuple, range, set, frozenset)): + try: + return {int(r) for r in residues} + except (TypeError, ValueError) as e: + raise ValueError( + "'residues' must be an int or an iterable of ints " + f"(e.g. [100, 200, 300] or range(100, 200)). Got: {residues!r}" + ) from e + raise ValueError( + f"'residues' must be an int or an iterable of ints (e.g. [100, 200, 300] or range(100, 200)). Got: {residues!r}" + ) + + +def _g2p_get_tsv( + url: str, + label: str, + retries: int = 3, + backoff: float = 1.0, +) -> pd.DataFrame | None: + """GET a G2P endpoint expected to return TSV. Returns a parsed DataFrame or None on any failure. + + Retries on transient failures (connection errors, timeouts, HTTP 5xx) with exponential + backoff. Detects JSON-shaped error bodies that the G2P portal sometimes returns over + the TSV channel with HTTP 200 (e.g. {"status":"failure","message":"No data for this gene."}) + and surfaces them as logged errors instead of letting pandas parse them as a single column. + """ + attempts = retries + 1 + last_status: int | None = None + last_exc: Exception | None = None + for attempt in range(attempts): + try: + r = requests.get(url, timeout=DEFAULT_REQUESTS_TIMEOUT) + except (requests.exceptions.ConnectionError, requests.exceptions.Timeout) as e: + last_exc = e + last_status = None + else: + if r.ok: + stripped = r.text.lstrip() + if not stripped: + logger.warning(f"{label}: the Genomics 2 Proteins portal returned an empty response.") + return None + if stripped[:1] in ("{", "["): + # JSON error body delivered over the TSV channel. + msg: str | None = None + try: + body = json.loads(stripped) + except json.JSONDecodeError: + body = None + if isinstance(body, dict): + m = body.get("message") + if isinstance(m, str): + msg = m + logger.error( + f"{label}: the Genomics 2 Proteins portal could not satisfy the request" + + (f": {msg}" if msg else ".") + + " Double-check that the gene symbol and UniProt accession match." + ) + return None + return pd.read_csv(io.StringIO(r.text), sep="\t") + if r.status_code < 500: + logger.error( + f"{label}: the Genomics 2 Proteins portal returned HTTP {r.status_code}. " + "Double-check that the gene symbol and UniProt accession match." + ) + return None + last_status = r.status_code + last_exc = None + + if attempt < attempts - 1: + delay = backoff * (2**attempt) + reason = str(last_exc) if last_exc is not None else f"HTTP {last_status}" + logger.warning( + f"{label}: transient failure ({reason}); retrying in {delay:.1f}s (attempt {attempt + 2}/{attempts})." + ) + time.sleep(delay) + + if last_exc is not None: + logger.error(f"{label}: request failed after {attempts} attempts: {last_exc}") + else: + logger.error(f"{label}: returned HTTP {last_status} after {attempts} attempts.") + return None + def g2p( - gene: str, - uniprot_id: str, + gene: str | None = None, + uniprot_id: str | None = None, resource: str = "features", isoform: str | None = None, + residues: int | list[int] | tuple[int, ...] | range | set[int] | None = None, save: bool = False, + out: str | None = None, verbose: bool = True, ) -> pd.DataFrame | None: - """Query the Genomics 2 Proteins (G2P) portal to link genes/proteins to per-residue structural and functional annotations. + """Query the Genomics 2 Proteins (G2P) portal to link genes/proteins to per-residue + structural and functional annotations. Portal: https://g2p.broadinstitute.org/ + This module wraps the *public* G2P REST API (three endpoints: residue-level features, + isoform/structure mapping, and isoform alignment). The variant overlays the portal + shows in its web UI (gnomAD, ClinVar, HGMD) are not exposed by the public API and + therefore not available here — query the portal directly for those. + + At least one of `gene` or `uniprot_id` is required. The other is resolved + automatically via the UniProt REST API and cached; when resolution happens it is + logged with the limitations. + + The canonical pair used for the query is always prepended to the returned + DataFrame as `gene_name` and `uniprot_id` columns and stored as + `df.attrs["gene_name"]` / `df.attrs["uniprot_id"]`, so the output schema is + identical regardless of input mode and the chosen identifiers survive in saved + files. + Args: - - gene Gene symbol, e.g. "BRCA1" (str). - - uniprot_id UniProt accession, e.g. "P38398" (str). For resource="alignment" this is the - canonical isoform accession (e.g. "P01130-1"). + - gene Optional gene symbol, e.g. "BRCA1". If omitted, resolved from + `uniprot_id`. NOTE: gene-symbol → accession lookup is approximate + (gene symbols have synonyms and paralogues; the lookup picks the + *canonical reviewed human Swiss-Prot* entry — pass `uniprot_id` + explicitly for non-human organisms, unreviewed entries, or a + specific isoform). + - uniprot_id UniProt accession, e.g. "P38398". If omitted, resolved from `gene`. + For resource="alignment" this must be supplied explicitly as the + canonical isoform accession (e.g. "P01130-1"), because the + gene→UniProt path returns the base accession and cannot disambiguate + isoforms. Tip: find a gene's UniProt ID with 'gget info'. - resource Type of information to return (default: "features"): - "features": per-residue feature table (AlphaFold pLDDT, UniProt sites, - secondary structure, predicted pockets, PTMs, etc.). + "features": per-residue feature table (~140 columns). Includes: + AlphaFold pLDDT, DSSP secondary structure, accessible + surface area, UniProt sites (active/binding/domain/...), + PhosphoSitePlus PTMs, fpocket / af2bind / p2rank pocket + predictions, intra/inter-chain hydrogen bonds, non-bonded + interactions, disulfide bonds and salt bridges (from PDB + and AlphaFold), PFES (Protein Feature Enrichment Score) + and its sub-scores, and per-residue MaveDB experimental + functional scores. See https://github.com/broadinstitute/g2p-bis + for descriptions of each column. "map": gene -> transcript -> protein isoform -> structure map - (UniProt/Ensembl/RefSeq/PDB identifiers). - "alignment": residue-level alignment between two isoforms (requires 'isoform'; - 'uniprot_id' is the canonical isoform). + (UniProt/Ensembl/RefSeq/PDB identifiers). The + comma-joined `PDB Ids` column is augmented with a + parsed `PDB Ids List` column (list[str]) for direct + consumption (e.g. with `gget pdb`). + "alignment": residue-level alignment between two isoforms (requires + 'isoform'; 'uniprot_id' is the canonical isoform). - isoform Alternative isoform UniProt accession (e.g. "P01130-2"). Required when resource="alignment" (default: None). - - save If True, save the result as a CSV in the current working directory (default: False). + - residues Optional filter restricting the result to specific residue positions + (only applies to "features" and "alignment", which carry a + `residueId` column). Accepts an int, a list/tuple/set of ints, or a + range — e.g. `185`, `[185, 1775, 1812]`, `range(100, 200)`. Filtering + is performed client-side after fetching the full table. + - save If True, save the result as a CSV named + 'gget_g2p_{gene}_{uniprot_id}_{resource}.csv' in the current working + directory (default: False). + - out Optional explicit path to write the result as CSV. Takes precedence + over `save` (default: None). - verbose True/False whether to print progress information (default: True). - Returns a pandas DataFrame with the requested G2P information. + Returns a pandas DataFrame with the requested G2P information, or None if the query + failed (network error, invalid arguments, unknown gene/UniProt pair, or empty response). """ resources = ["features", "map", "alignment"] if resource not in resources: - raise ValueError(f"'resource' argument specified as {resource}. Expected one of: {', '.join(resources)}") + raise ValueError(f"'resource' argument specified as '{resource}'. Expected one of: {', '.join(resources)}") - if not uniprot_id: + if not gene and not uniprot_id: raise ValueError( - "Please provide a UniProt accession as 'uniprot_id' (e.g. 'P38398'). " - "You can find the UniProt ID for a gene using 'gget info'." + "Please provide at least one of 'gene' (e.g. 'BRCA1') or 'uniprot_id' " + "(e.g. 'P38398'). You can find both with 'gget info'." + ) + + if resource == "alignment" and not uniprot_id: + raise ValueError( + "resource='alignment' requires 'uniprot_id' to be specified explicitly as the " + "canonical isoform accession (e.g. 'P01130-1'). Gene→UniProt resolution returns " + "the base accession and cannot disambiguate isoforms." ) if resource == "alignment" and not isoform: @@ -58,46 +274,102 @@ def g2p( "(e.g. 'P01130-2'). 'uniprot_id' is the canonical isoform (e.g. 'P01130-1')." ) - # The G2P REST API returns tab-separated values - base = f"{G2P_API}/gene/{gene}/protein/{uniprot_id}" + # Validate `residues` up-front (cheap, fails fast). + residue_set: set[int] | None = _normalize_residues(residues) if residues is not None else None + if residue_set is not None and resource == "map": + raise ValueError( + "The 'residues' filter does not apply to resource='map' (no per-residue table). " + "Use it with 'features' or 'alignment'." + ) + + if not uniprot_id: + if verbose: + logger.info(f"Resolving UniProt accession for gene '{gene}' via UniProt...") + lookup = _resolve_uniprot_from_gene(gene) # type: ignore[arg-type] + if not lookup: + raise ValueError( + f"No canonical reviewed human UniProt entry was found for gene '{gene}'. " + "Please pass the UniProt accession explicitly via 'uniprot_id' (find it with 'gget info')." + ) + uniprot_id, n_candidates = lookup + if verbose: + extra = f" ({n_candidates} reviewed candidates matched; the first was chosen)" if n_candidates > 1 else "" + logger.info( + f"Resolved gene '{gene}' → UniProt '{uniprot_id}' " + f"(canonical reviewed human Swiss-Prot entry{extra}). " + "Gene-symbol lookup is approximate — it picks the canonical human " + "reviewed entry only. For non-human organisms, unreviewed entries, or " + "a specific isoform, pass 'uniprot_id' explicitly." + ) + + if not gene: + if verbose: + logger.info(f"Resolving gene symbol for UniProt accession '{uniprot_id}' via UniProt...") + gene = _resolve_gene_from_uniprot(uniprot_id) + if not gene: + raise ValueError( + f"Could not resolve a gene symbol for UniProt accession '{uniprot_id}'. " + "Please pass the gene symbol explicitly via the 'gene' argument." + ) + if verbose: + logger.info(f"Resolved UniProt '{uniprot_id}' → gene '{gene}'.") + + # G2P REST API path templates: + # /api/gene/{gene}/protein/{uniprotId}/protein-features + # /api/gene/{gene}/protein/{uniprotId}/gene-transcript-protein-isoform-structure-map + # /api/gene/{gene}/protein/{canonicalIsoform}/{alignmentIsoform}/alignment + gene_q = quote(gene, safe="") + uniprot_q = quote(uniprot_id, safe="") + base = f"{G2P_API}/gene/{gene_q}/protein/{uniprot_q}" if resource == "features": url = f"{base}/protein-features" elif resource == "map": url = f"{base}/gene-transcript-protein-isoform-structure-map" else: # alignment - url = f"{base}/{isoform}/alignment" + assert isoform is not None # validated above + url = f"{base}/{quote(isoform, safe='')}/alignment" + label = f"G2P {resource} ({gene} / {uniprot_id})" if verbose: - logger.info(f"Querying the Genomics 2 Proteins portal ('{resource}') for {gene} / {uniprot_id}...") + logger.info(f"Querying the Genomics 2 Proteins portal: {label}...") - try: - r = requests.get( - url, - timeout=DEFAULT_REQUESTS_TIMEOUT, - headers={"Accept": "text/tab-separated-values"}, - ) - except requests.exceptions.RequestException as e: - logger.error(f"Request to the Genomics 2 Proteins portal failed: {e}") - return + df = _g2p_get_tsv(url, label=label) + if df is None: + return None - if not r.ok: - logger.error( - f"G2P query (gene='{gene}', uniprot_id='{uniprot_id}', resource='{resource}') " - f"returned status code {r.status_code}. Please double-check that the gene symbol " - f"and UniProt accession match, then try again." - ) - return + # Augment the `map` resource with a parsed list of PDB IDs alongside the + # comma-joined string column (so callers can pipe straight into `gget pdb`). + if resource == "map" and "PDB Ids" in df.columns: + pdb_lists = df["PDB Ids"].fillna("").map(lambda s: [p for p in str(s).split(",") if p]) + df.insert(df.columns.get_loc("PDB Ids") + 1, "PDB Ids List", pdb_lists) - if not r.text.strip(): - logger.warning("The Genomics 2 Proteins portal returned an empty result for this query.") - return pd.DataFrame() + # Apply the residues filter (validated above; resource is features or alignment). + if residue_set is not None: + if "residueId" not in df.columns: + logger.warning( + f"{label}: 'residues' filter requested but the response has no 'residueId' " + "column; returning unfiltered result." + ) + else: + df = df[df["residueId"].isin(residue_set)].reset_index(drop=True) + missing = sorted(residue_set - set(df["residueId"].tolist())) + if missing and verbose: + logger.warning( + f"{label}: {len(missing)} requested residue(s) not present in the response: " + f"{missing[:10]}{'...' if len(missing) > 10 else ''}" + ) - df = pd.read_csv(io.StringIO(r.text), sep="\t") + # Always prepend the canonical pair so the output schema is invariant across + # input modes (gene-only / uniprot-only / both) and survives `to_csv` / `to_json`. + df.attrs["gene_name"] = gene + df.attrs["uniprot_id"] = uniprot_id + df.insert(0, "uniprot_id", uniprot_id) + df.insert(0, "gene_name", gene) - if save: - out_name = f"gget_g2p_{gene}_{uniprot_id}_{resource}.csv" - df.to_csv(out_name, index=False) + out_path: str | None = out if out else (f"gget_g2p_{gene}_{uniprot_id}_{resource}.csv" if save else None) + if out_path: + df.to_csv(out_path, index=False) if verbose: - logger.info(f"Results saved as {out_name}.") + logger.info(f"Results saved as {out_path}.") return df diff --git a/gget/main.py b/gget/main.py index 73a33a422..7a2944b09 100644 --- a/gget/main.py +++ b/gget/main.py @@ -2355,14 +2355,26 @@ def main() -> None: parser_g2p.add_argument( "gene", type=str, - help="Gene symbol, e.g. BRCA1.", + nargs="?", + default=None, + help=( + "Optional gene symbol, e.g. BRCA1. If omitted, the gene is resolved " + "automatically from --uniprot_id via the UniProt REST API." + ), ) parser_g2p.add_argument( "-u", "--uniprot_id", type=str, - required=True, - help="UniProt accession, e.g. P38398. For '--resource alignment' this is the canonical isoform (e.g. P01130-1). Find it with `gget info`.", + required=False, + default=None, + help=( + "UniProt accession, e.g. P38398. Optional — if omitted, it is resolved from the " + "gene symbol via UniProt (canonical reviewed human Swiss-Prot entry only; pass " + "explicitly for non-human, unreviewed, or specific-isoform queries). " + "For '--resource alignment' this is the canonical isoform (e.g. P01130-1) and is " + "required. Find it with `gget info`." + ), ) parser_g2p.add_argument( "-r", @@ -2386,6 +2398,17 @@ def main() -> None: required=False, help="Alternative isoform UniProt accession (e.g. P01130-2). Required for '--resource alignment'.", ) + parser_g2p.add_argument( + "--residues", + type=str, + default=None, + required=False, + help=( + "Restrict the result to specific residue positions (only applies to --resource " + "features / alignment). Comma-separated list and/or inclusive ranges, " + "e.g. '185,1775,1812' or '100-200' or '1-50,185,300-310'." + ), + ) parser_g2p.add_argument( "-o", "--out", @@ -3810,11 +3833,36 @@ def main() -> None: ## g2p return if args.command == "g2p": + residues: list[int] | None = None + if args.residues: + residues = [] + for part in args.residues.split(","): + part = part.strip() + if not part: + continue + if "-" in part: + try: + start_s, end_s = part.split("-", 1) + start, end = int(start_s), int(end_s) + except ValueError as e: + raise ValueError( + f"Could not parse '{part}' as a residue range. Expected 'start-end' (e.g. '100-200')." + ) from e + residues.extend(range(start, end + 1)) + else: + try: + residues.append(int(part)) + except ValueError as e: + raise ValueError( + f"Could not parse '{part}' as a residue position. Expected an int (e.g. '185')." + ) from e + g2p_results: pd.DataFrame = g2p( args.gene, uniprot_id=args.uniprot_id, resource=args.resource, isoform=args.isoform, + residues=residues, verbose=args.quiet, ) diff --git a/tests/test_g2p.py b/tests/test_g2p.py index e3ecbc18b..3c20335fd 100644 --- a/tests/test_g2p.py +++ b/tests/test_g2p.py @@ -1,6 +1,8 @@ +import os +import tempfile import unittest -from gget.gget_g2p import g2p +from gget.gget_g2p import _resolve_gene_from_uniprot, _resolve_uniprot_from_gene, g2p class TestG2P(unittest.TestCase): @@ -17,6 +19,8 @@ def test_g2p_map(self): self.assertListEqual( list(df.columns), [ + "gene_name", + "uniprot_id", "UniProtKB", "UniProt Isoform", "Ensembl Gene Id", @@ -24,9 +28,13 @@ def test_g2p_map(self): "Ensembl Transcript Id", "RefSeq mRNA Id", "PDB Ids", + "PDB Ids List", ], ) self.assertGreater(len(df), 0) + # Identifier columns are populated with the query pair on every row. + self.assertTrue((df["gene_name"] == "BRCA1").all()) + self.assertTrue((df["uniprot_id"] == "P38398").all()) # BRCA1's stable Ensembl gene ID should be present self.assertTrue((df["Ensembl Gene Id"] == "ENSG00000012048").any()) @@ -48,6 +56,92 @@ def test_g2p_alignment(self): self.assertIn("residueId", df.columns) self.assertIn("AA", df.columns) + def test_g2p_gene_auto_resolved(self): + """When `gene` is omitted, it must be resolved from `uniprot_id` via UniProt.""" + _resolve_gene_from_uniprot.cache_clear() + df = g2p(uniprot_id="P38398", resource="map", verbose=False) + self.assertIsNotNone(df) + self.assertGreater(len(df), 0) + self.assertTrue((df["Ensembl Gene Id"] == "ENSG00000012048").any()) + + def test_g2p_invalid_pair_returns_none(self): + """Regression: the G2P portal returns HTTP 200 with a JSON failure body when the + gene/UniProt pair is unknown. Previously this leaked through as a 0-row DataFrame + whose only column name was the JSON error string; now it must return None. + """ + df = g2p("BRCA1", uniprot_id="P01130", resource="features", verbose=False) + self.assertIsNone(df) + + def test_g2p_out_writes_to_explicit_path(self): + with tempfile.TemporaryDirectory() as tmp: + out_path = os.path.join(tmp, "g2p_map.csv") + df = g2p( + "BRCA1", + uniprot_id="P38398", + resource="map", + out=out_path, + verbose=False, + ) + self.assertIsNotNone(df) + self.assertTrue(os.path.exists(out_path)) + self.assertGreater(os.path.getsize(out_path), 0) + + def test_g2p_uniprot_auto_resolved(self): + """When only `gene` is supplied, UniProt accession must be resolved via UniProt.""" + _resolve_uniprot_from_gene.cache_clear() + df = g2p("BRCA1", resource="map", verbose=False) + self.assertIsNotNone(df) + # The canonical pair travels with the data both as leading columns and df.attrs + self.assertIn("gene_name", df.columns) + self.assertIn("uniprot_id", df.columns) + self.assertTrue((df["gene_name"] == "BRCA1").all()) + self.assertTrue((df["uniprot_id"] == "P38398").all()) + self.assertEqual(df.attrs.get("gene_name"), "BRCA1") + self.assertEqual(df.attrs.get("uniprot_id"), "P38398") + + def test_g2p_schema_invariant_across_input_modes(self): + """Output schema must be identical whether the user passes gene-only, + uniprot-only, or both — including the leading gene_name / uniprot_id columns.""" + df_both = g2p("BRCA1", uniprot_id="P38398", resource="map", verbose=False) + df_gene_only = g2p("BRCA1", resource="map", verbose=False) + df_uniprot_only = g2p(uniprot_id="P38398", resource="map", verbose=False) + self.assertEqual(list(df_both.columns), list(df_gene_only.columns)) + self.assertEqual(list(df_both.columns), list(df_uniprot_only.columns)) + self.assertEqual(list(df_both.columns[:2]), ["gene_name", "uniprot_id"]) + + def test_g2p_residues_filter(self): + """`residues=` restricts the features table to the requested positions.""" + df = g2p( + "BRCA1", + uniprot_id="P38398", + resource="features", + residues=[1, 100, 1000], + verbose=False, + ) + self.assertIsNotNone(df) + self.assertEqual(sorted(df["residueId"].tolist()), [1, 100, 1000]) + + def test_g2p_residues_single_int(self): + df = g2p( + "BRCA1", + uniprot_id="P38398", + resource="features", + residues=42, + verbose=False, + ) + self.assertIsNotNone(df) + self.assertEqual(df["residueId"].tolist(), [42]) + + def test_g2p_map_has_pdb_list_column(self): + """The `map` resource gets a parsed `PDB Ids List` column for direct consumption.""" + df = g2p("BRCA1", uniprot_id="P38398", resource="map", verbose=False) + self.assertIn("PDB Ids List", df.columns) + # Each non-null entry should be a list of strings + for entry in df["PDB Ids List"].head(3): + self.assertIsInstance(entry, list) + for item in entry: + self.assertIsInstance(item, str) + class TestG2PValidation(unittest.TestCase): """Fast, network-free tests for argument validation.""" @@ -56,10 +150,23 @@ def test_invalid_resource_raises(self): with self.assertRaises(ValueError): g2p("BRCA1", uniprot_id="P38398", resource="not_a_resource") - def test_missing_uniprot_raises(self): + def test_missing_both_raises(self): with self.assertRaises(ValueError): - g2p("BRCA1", uniprot_id=None) + g2p() def test_alignment_requires_isoform(self): with self.assertRaises(ValueError): g2p("LDLR", uniprot_id="P01130-1", resource="alignment") + + def test_alignment_requires_explicit_uniprot(self): + """Alignment cannot rely on gene→UniProt resolution (returns base accession, no isoform).""" + with self.assertRaises(ValueError): + g2p("LDLR", resource="alignment", isoform="P01130-2") + + def test_residues_on_map_raises(self): + with self.assertRaises(ValueError): + g2p("BRCA1", uniprot_id="P38398", resource="map", residues=[1, 2, 3]) + + def test_residues_wrong_type_raises(self): + with self.assertRaises(ValueError): + g2p("BRCA1", uniprot_id="P38398", residues="not-ints") # type: ignore[arg-type] From 46a3f1e42b645d1c38996579d508f660e56cc9a4 Mon Sep 17 00:00:00 2001 From: Elarwei <168552401+Elarwei001@users.noreply.github.com> Date: Sun, 28 Jun 2026 02:46:34 +0800 Subject: [PATCH 23/34] fix(opentargets): repoint expression to baselineExpression (upstream retired target.expressions) (#248) * fix(opentargets): use baselineExpression for the expression resource OpenTargets retired the `target.expressions` field (it now returns an empty list for every gene), so `gget opentargets -r expression` returned nothing. Baseline expression data moved to the paginated `target.baselineExpression` field with a new per-biosample data model. - Repoint the expression query to `baselineExpression(page:{index:0,size:250}) { rows {...} }` and update rows_path to ["baselineExpression","rows"]. - Output columns change accordingly (per-biosample summary stats: median/min/ q1/q3/max/unit + tissueBiosample/celltypeBiosample ids + datasource/datatype), because the upstream data model changed and the old shape no longer exists. - Remove the two now-invalid live exact-match fixtures and replace them with network-free mocked tests; update docs (example, resource table, updates.md). Verified live: http_json with the new query returns 1409 rows in ~0.6s and the parsing pipeline yields the documented columns. Co-Authored-By: Claude Opus 4.8 (1M context) * fix(opentargets): drive expression page size by limit; warn on truncation Review follow-up to the baselineExpression migration. Two issues: 1. Silent truncation. The query hard-capped at size:250, but a gene can have far more biosamples (IL13 has 1409: 51 GTEx + 1343 Tabula Sapiens + 15 DICE). Users got 250 of 1409 with no signal, and an explicit limit>250 was also silently capped (limit was only applied post-hoc via df.head). Now the page size is a GraphQL variable driven by limit: min(limit, 3000) when limit is set, else 3000 (the API max). IL13 with no limit now returns all 1409 rows. If a gene exceeds the 3000-per-page API max and no limit is set, a warning is logged pointing the user to --filters. 2. Stale docstring. The Python docstring still described the old model ("by tissues, organs, and anatomical systems"); updated to the per-biosample summary-statistics model. Docs note updated to drop the "up to 250" wording. Verified live: no limit -> 1409 rows; limit=5 -> 5; datasourceId=gtex filter -> 51. Mocked tests pass, ruff clean. Co-Authored-By: Claude Opus 4.7 (1M context) * docs(opentargets): add prominent top-of-page note for expression output change resource="expression" returns a different output shape as of v0.30.8 (baselineExpression per-biosample summary stats, replacing the retired per-tissue z-score columns). This is a meaningful breaking change for anyone parsing the expression output, so surface it at the top of the module docs rather than only in the example section. Co-Authored-By: Claude Opus 4.7 (1M context) --------- Co-authored-by: Claude Opus 4.8 (1M context) Co-authored-by: Laura Luebbert --- docs/src/en/opentargets.md | 17 +++--- docs/src/en/updates.md | 2 +- gget/gget_opentargets.py | 80 ++++++++++++++++--------- tests/fixtures/test_opentargets.json | 49 ---------------- tests/test_opentargets.py | 87 ++++++++++++++++++++++++++++ 5 files changed, 151 insertions(+), 84 deletions(-) diff --git a/docs/src/en/opentargets.md b/docs/src/en/opentargets.md index 7d74d56fd..9b2cc2122 100644 --- a/docs/src/en/opentargets.md +++ b/docs/src/en/opentargets.md @@ -7,6 +7,8 @@ Return format: JSON/CSV (command-line) or data frame (Python). This module was written by [Sam Wagenaar](https://github.com/techno-sam). +> ⚠️ **Change as of gget v0.30.8 — `resource="expression"` output is different.** OpenTargets retired the old `target.expressions` field, so `gget opentargets -r expression` now returns OpenTargets' `baselineExpression` data instead. **The output columns changed**: results are now per-biosample (tissue *and/or* cell type) summary statistics (`median`, `min`, `q1`, `q3`, `max`, `unit`) with `tissueBiosample.*` / `celltypeBiosample.*` identifiers and `datasourceId` / `datatypeId` — replacing the old per-tissue `tissue.*` / `rna.*` (z-score) columns, which no longer exist upstream. A gene can have thousands of biosamples; use `--filters` (e.g. `datasourceId`, `datatypeId`) or `--limit` to narrow the result. See the baseline expression example below. + **Positional argument** `ens_id` Ensembl gene ID, e.g ENSG00000169194. @@ -22,7 +24,7 @@ Possible resources are: | `drugs` | Associated drugs | `disease_id` | [ChEMBL](https://www.ebi.ac.uk/chembl/) | | `tractability` | Tractability data | None | [Open Targets](https://platform-docs.opentargets.org/target/tractability) | | `pharmacogenetics` | Pharmacogenetic responses | `drug_id` | [PharmGKB](https://www.pharmgkb.org/) | -| `expression` | Gene expression data (by tissues, organs, and anatomical systems) | `tissue_id`
`anatomical_system`
`organ` |
  • [ExpressionAtlas](https://www.ebi.ac.uk/gxa/home)
  • [HPA](https://www.proteinatlas.org/)
  • [GTEx](https://www.gtexportal.org/home/)
| +| `expression` | Baseline expression per biosample (tissue/cell type) with summary statistics | `tissueBiosample.biosampleId`
`datasourceId`
`datatypeId` |
  • [GTEx](https://www.gtexportal.org/home/)
  • [ExpressionAtlas](https://www.ebi.ac.uk/gxa/home)
  • single-cell datasets
| | `depmap` | DepMap gene→disease-effect data. | `tissue_id` | [DepMap Portal](https://depmap.org/portal/) | | `interactions` | Protein⇄protein interactions | `protein_a_id`
`protein_b_id`
`gene_b_id` |
  • [Open Targets](https://platform-docs.opentargets.org/target/molecular-interactions)
  • [IntAct](https://platform-docs.opentargets.org/target/molecular-interactions#intact)
  • [Signor](https://platform-docs.opentargets.org/target/molecular-interactions#signor)
  • [Reactome](https://platform-docs.opentargets.org/target/molecular-interactions#reactome)
  • [String](https://platform-docs.opentargets.org/target/molecular-interactions#string)
| @@ -135,7 +137,7 @@ gget.opentargets('ENSG00000169194', resource='pharmacogenetics', limit=1)

-**Get tissues where a gene is most expressed:** +**Get baseline expression of a gene across biosamples (tissues / cell types):** ```bash gget opentargets ENSG00000169194 -r expression -l 2 ``` @@ -145,12 +147,13 @@ import gget gget.opentargets('ENSG00000169194', resource='expression', limit=2) ``` -→ Returns the top 2 tissues where the gene ENSG00000169194 is most expressed. +→ Returns baseline expression summary statistics for the gene ENSG00000169194 per biosample. + +| tissueBiosample.biosampleId | tissueBiosample.biosampleName | median | min | q1 | q3 | max | unit | datasourceId | datatypeId | +|-----------------------------|-------------------------------|----------|-----|----------|----------|---------|------|--------------|--------------| +| UBERON_0000007 | pituitary gland | 0.066891 | 0 | 0.028268 | 0.142208 | 1.69407 | TPM | gtex | bulk rna-seq | -| tissue_id | tissue_name | rna_zscore | rna_value | rna_unit | rna_level | anatomical_systems | organs | -|----------------|---------------------------------------|------------|-----------|----------|-----------|----------------------------------------------------------------------|--------------------------------------------------------| -| UBERON_0000473 | testis | 5 | 1026 | | 3 | [reproductive system] | [reproductive organ, reproductive structure] | -| CL_0000542 | EBV‑transformed lymphocyte | 1 | 54 | | 2 | [hemolymphoid system, immune system, lymphoid system] | [immune organ] | +> **Note (OpenTargets API change):** OpenTargets retired the per-tissue `target.expressions` field (it now returns nothing) and moved baseline expression to the paginated `target.baselineExpression` field. `gget opentargets -r expression` now returns per-biosample expression summary statistics (`median`, `min`, `q1`, `q3`, `max`) from the current sources (e.g. GTEx bulk RNA-seq and single-cell datasets), with `tissueBiosample`/`celltypeBiosample` identifiers and `datasourceId`/`datatypeId` so results can be filtered. The returned columns therefore differ from earlier gget versions. A gene can have thousands of biosamples; OpenTargets returns at most 3000 per request, so for genes that exceed this a warning is logged and you should narrow the query with `--filters` (e.g. `datasourceId` or `datatypeId`). Use `--limit` to fetch fewer rows.

diff --git a/docs/src/en/updates.md b/docs/src/en/updates.md index db284d45a..06e135aec 100644 --- a/docs/src/en/updates.md +++ b/docs/src/en/updates.md @@ -19,7 +19,7 @@ - The default `resource="pdb"` now automatically falls back to PDBx/mmCIF when the legacy PDB file is unavailable (e.g. for large structures), since the legacy PDB format is being phased out by RCSB. A warning is logged and saved files use the correct extension (`.cif`). - [`gget opentargets`](opentargets.md): Adapted to several upstream Open Targets GraphQL API changes: - **Fixed**: `gget opentargets resource="drugs"` was failing with `HTTP 400 — Field 'synonyms' of type '[DrugLabelAndSource!]!' must have a sub selection.` Open Targets changed `Drug.synonyms` and `Drug.tradeNames` from scalar lists to lists of structured `DrugLabelAndSource` objects. The internal GraphQL query was updated to request the `label` sub-field; the `drug.synonyms` / `drug.tradeNames` columns in the returned DataFrame remain `list[str]`, so existing user code is unaffected. - - **Known limitation**: `gget opentargets resource="expression"` now returns an empty DataFrame because Open Targets deprecated the `Target.expressions` field. A `logger.warning` is now emitted when this resource is invoked so users see *why* the result is empty (rather than silently getting `[]`). The replacement `Target.baselineExpression` field has a different schema (`tissueBiosample`, `q1`/`q3`/`median`/`min`/`max` instead of `tissue`/`rna` sub-objects) and will be wired up in a future release (tracked in [issue 247](https://github.com/scverse/gget/issues/247)). The corresponding tests are marked as skipped until then. + - **Fixed**: `gget opentargets resource="expression"` had started returning an empty DataFrame because Open Targets retired the `Target.expressions` field. The query now uses the current `Target.baselineExpression` field. **The returned columns have changed** because the upstream data model changed: results are now per-biosample (tissue/cell type) baseline expression summary statistics (`median`, `min`, `q1`, `q3`, `max`, `unit`) with `tissueBiosample`/`celltypeBiosample` identifiers and `datasourceId`/`datatypeId`, instead of the old per-tissue RNA `zscore`/`value`/`level` fields. Resolves [issue 247](https://github.com/scverse/gget/issues/247). - [`gget archs4`](archs4.md) (tissue mode): No longer crashes with `KeyError: ['color'] not found in axis` when ARCHS4 intermittently omits the optional `color` column from its CSV response. The column is now dropped only if present. Output also has a deterministic row order (sorted by `median` descending, with `id` as tiebreaker) so equal-median tissues no longer flip order between requests. diff --git a/gget/gget_opentargets.py b/gget/gget_opentargets.py index fd53216fb..8e75bed42 100644 --- a/gget/gget_opentargets.py +++ b/gget/gget_opentargets.py @@ -110,27 +110,44 @@ } """ +# OpenTargets retired the per-tissue `target.expressions` field (it now returns an +# empty list for every gene). Baseline expression data moved to the paginated +# `target.baselineExpression { count rows { ... } }` field, which provides per-biosample +# (tissue and/or cell type) expression summary statistics. The page `size` is supplied +# as a GraphQL variable so it can be driven by the caller's `limit` (and capped at the +# API's documented max page size). `count` is the true total number of biosamples +# upstream, used to warn the user when the result is truncated. QUERY_STRING_EXPRESSION = """ -query target($ensemblId: String!) { +query target($ensemblId: String!, $size: Int!) { target(ensemblId: $ensemblId) { - expressions { - tissue { - id - label - anatomicalSystems - organs - } - rna { - zscore - value + baselineExpression(page: { index: 0, size: $size }) { + count + rows { + tissueBiosample { + biosampleId + biosampleName + } + celltypeBiosample { + biosampleId + biosampleName + } + median + min + q1 + q3 + max unit - level + datasourceId + datatypeId } } } } """ +# OpenTargets caps a single GraphQL page at 3000 rows. +MAX_EXPRESSION_PAGE_SIZE = 3000 + QUERY_STRING_DEPMAP = """ query target($ensemblId: String!) { target(ensemblId: $ensemblId) { @@ -306,7 +323,9 @@ def opentargets( "drugs": Returns drugs associated with the gene. "tractability": Returns tractability data for the gene. "pharmacogenetics": Returns pharmacogenetics data for the gene. - "expression": Returns gene expression data (by tissues, organs, and anatomical systems). + "expression": Returns baseline expression per biosample (tissue and/or cell type) as + summary statistics (median, min, q1, q3, max, unit) with tissueBiosample/ + celltypeBiosample identifiers and datasourceId/datatypeId. "depmap": Returns DepMap gene-disease effect data for the gene. "interactions": Returns protein-protein interactions for the gene. - limit Limit the number of results returned (default: No limit). @@ -332,21 +351,12 @@ def opentargets( query_string = QUERY_STRING_PHARMACOGENETICS rows_path = ["pharmacogenomics"] elif resource == "expression": - # Open Targets deprecated `Target.expressions` upstream (returns [] - # for all targets as of mid-2026). The replacement field - # `Target.baselineExpression` has a different schema (tissueBiosample, - # q1/q3/median/min/max instead of tissue/rna sub-objects); migrating - # gget's output is a user-facing change tracked in - # https://github.com/scverse/gget/issues/247. - logger.warning( - "gget opentargets resource='expression' is currently broken upstream: " - "Open Targets retired the `Target.expressions` GraphQL field (returns []). " - "A future gget release will migrate to the replacement `Target.baselineExpression` " - "field, which has a different output schema. Track at " - "https://github.com/scverse/gget/issues/247." - ) query_string = QUERY_STRING_EXPRESSION - rows_path = ["expressions"] + rows_path = ["baselineExpression", "rows"] + # Drive the page size from `limit` so a small limit fetches only what's needed + # and (crucially) a large/absent limit fetches everything up to the API max, + # rather than silently capping at a fixed page size. + expression_page_size = min(limit, MAX_EXPRESSION_PAGE_SIZE) if limit is not None else MAX_EXPRESSION_PAGE_SIZE elif resource == "depmap": query_string = QUERY_STRING_DEPMAP rows_path = [ @@ -362,6 +372,8 @@ def opentargets( ) variables = {"ensemblId": ensembl_id} + if resource == "expression": + variables["size"] = expression_page_size if verbose: logger.info(f"Querying OpenTargets for {resource} associated with {ensembl_id}...") @@ -386,6 +398,20 @@ def opentargets( api_target = dig(api_response, "data", "target", context="OpenTargets GraphQL") + # Warn when the gene has more baseline-expression biosamples upstream than a single + # API page can return (only possible when the user did not set an explicit limit; + # an explicit limit is treated as intentional). Without this, the result would be a + # silent partial slice of the data. + if resource == "expression" and limit is None: + total = (api_target.get("baselineExpression") or {}).get("count") + if isinstance(total, int) and total > MAX_EXPRESSION_PAGE_SIZE: + logger.warning( + f"{ensembl_id} has {total} baseline-expression biosamples, but the OpenTargets API " + f"returns at most {MAX_EXPRESSION_PAGE_SIZE} per request; the result is truncated to " + f"{MAX_EXPRESSION_PAGE_SIZE}. Use the 'filters' argument (e.g. datasourceId or datatypeId) " + "to narrow the query to the biosamples you need." + ) + rows = api_target for row_key in rows_path: if not row_key.startswith("_FLATTEN_"): diff --git a/tests/fixtures/test_opentargets.json b/tests/fixtures/test_opentargets.json index 721f8bbdc..6ab3085a4 100644 --- a/tests/fixtures/test_opentargets.json +++ b/tests/fixtures/test_opentargets.json @@ -21,15 +21,6 @@ ] ] }, - "test_opentargets_expression_no_limit": { - "type": "skip", - "args": { - "ensembl_id": "ENSG00000169194", - "resource": "expression" - }, - "expected_result": "7d32780ec48250553246c816d80b93ee", - "reason": "Open Targets deprecated the `expressions` GraphQL field (returns []) in favor of `baselineExpression`, which has a different schema (tissueBiosample, q1/q3/median/min/max instead of tissue/rna sub-objects). Migration is a user-facing API change; tracked separately." - }, "test_opentargets_depmap": { "type": "assert_equal_json_hash", "args": { @@ -251,46 +242,6 @@ } ] }, - "test_opentargets_expression": { - "function_call_to_reproduce": "output = opentargets(ensembl_id='ENSG00000169194', resource='expression', limit=2, json=True, verbose=False); print(json.dumps(output, indent=2))", - "type": "skip", - "args": { - "ensembl_id": "ENSG00000169194", - "resource": "expression", - "limit": 2 - }, - "expected_result": [ - { - "tissue.id": "UBERON_0002367", - "tissue.label": "prostate gland", - "tissue.anatomicalSystems": [ - "reproductive system" - ], - "tissue.organs": [ - "reproductive structure" - ], - "rna.zscore": -1, - "rna.value": 4.0, - "rna.unit": "", - "rna.level": -1 - }, - { - "tissue.id": "UBERON_0002113", - "tissue.label": "kidney", - "tissue.anatomicalSystems": [ - "renal system" - ], - "tissue.organs": [ - "kidney" - ], - "rna.zscore": -1, - "rna.value": 0.0, - "rna.unit": "", - "rna.level": -1 - } - ], - "reason": "Open Targets deprecated the `expressions` GraphQL field (returns []) in favor of `baselineExpression`, which has a different schema (tissueBiosample, q1/q3/median/min/max instead of tissue/rna sub-objects). Migration is a user-facing API change; tracked separately." - }, "test_opentargets_interactions": { "function_call_to_reproduce": "output = opentargets(ensembl_id='ENSG00000169194', resource='interactions', limit=2, json=True, verbose=False); print(json.dumps(output, indent=2))", "type": "assert_equal_json_with_keys", diff --git a/tests/test_opentargets.py b/tests/test_opentargets.py index e73ced1cc..f5908531b 100644 --- a/tests/test_opentargets.py +++ b/tests/test_opentargets.py @@ -1,6 +1,8 @@ import json import unittest +from unittest.mock import patch +import pandas as pd from gget.gget_opentargets import opentargets from .from_json import from_json @@ -12,3 +14,88 @@ class TestOpenTargets(unittest.TestCase, metaclass=from_json(ot_dict, opentargets)): pass # all tests are loaded from json + + +# Sample of the current OpenTargets `baselineExpression.rows` response shape. +_BASELINE_EXPRESSION_ROWS = [ + { + "tissueBiosample": {"biosampleId": "UBERON_0000007", "biosampleName": "pituitary gland"}, + "celltypeBiosample": None, + "median": 0.066891, + "min": 0.0, + "q1": 0.028268, + "q3": 0.142208, + "max": 1.69407, + "unit": "TPM", + "datasourceId": "gtex", + "datatypeId": "bulk rna-seq", + }, + { + "tissueBiosample": {"biosampleId": "UBERON_0002107", "biosampleName": "liver"}, + "celltypeBiosample": None, + "median": 2.5, + "min": 0.1, + "q1": 1.0, + "q3": 3.0, + "max": 8.0, + "unit": "TPM", + "datasourceId": "gtex", + "datatypeId": "bulk rna-seq", + }, +] + + +def _baseline_expression_response(rows): + return {"data": {"target": {"baselineExpression": {"rows": rows}}}} + + +class TestOpenTargetsExpressionMocked(unittest.TestCase): + """Network-free tests for the expression resource after OpenTargets moved baseline + expression from the (now-empty) `expressions` field to `baselineExpression.rows`. + + The previous live, exact-match fixtures `test_opentargets_expression` and + `test_opentargets_expression_no_limit` asserted the old per-tissue RNA shape + (`tissue.id`, `rna.zscore`, ...) which no longer exists upstream; they were + removed from tests/fixtures/test_opentargets.json and replaced by these + deterministic mocked tests.""" + + def test_expression_parses_baseline_rows(self): + with patch( + "gget.gget_opentargets.http_json", + return_value=_baseline_expression_response(_BASELINE_EXPRESSION_ROWS), + ): + df = opentargets("ENSG00000169194", resource="expression", verbose=False) + + self.assertIsInstance(df, pd.DataFrame) + self.assertEqual(len(df), 2) + # Flattened biosample + summary-statistic columns are present + self.assertIn("tissueBiosample.biosampleId", df.columns) + self.assertIn("median", df.columns) + self.assertIn("unit", df.columns) + self.assertEqual(df.iloc[0]["tissueBiosample.biosampleId"], "UBERON_0000007") + + def test_expression_limit(self): + with patch( + "gget.gget_opentargets.http_json", + return_value=_baseline_expression_response(_BASELINE_EXPRESSION_ROWS), + ): + df = opentargets("ENSG00000169194", resource="expression", limit=1, verbose=False) + self.assertEqual(len(df), 1) + + def test_expression_json(self): + with patch( + "gget.gget_opentargets.http_json", + return_value=_baseline_expression_response(_BASELINE_EXPRESSION_ROWS), + ): + result = opentargets("ENSG00000169194", resource="expression", json=True, verbose=False) + self.assertIsInstance(result, list) + self.assertEqual(len(result), 2) + + def test_expression_empty_is_graceful(self): + with patch( + "gget.gget_opentargets.http_json", + return_value=_baseline_expression_response([]), + ): + df = opentargets("ENSG00000169194", resource="expression", verbose=False) + self.assertIsInstance(df, pd.DataFrame) + self.assertEqual(len(df), 0) From aa470531405fa0e325da68d7a8191707a8454805 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 27 Jun 2026 18:46:54 +0000 Subject: [PATCH 24/34] CI: update pytest results (dev) --- .github/badges/tests.json | 2 +- tests/pytest_results.txt | 909 +++++++++++++++++--------------------- 2 files changed, 400 insertions(+), 511 deletions(-) diff --git a/.github/badges/tests.json b/.github/badges/tests.json index 78717eb72..6c55dc113 100644 --- a/.github/badges/tests.json +++ b/.github/badges/tests.json @@ -1 +1 @@ -{"schemaVersion": 1, "label": "tests", "message": "404/409 passing", "color": "brightgreen"} +{"schemaVersion": 1, "label": "tests", "message": "no results", "color": "lightgrey"} diff --git a/tests/pytest_results.txt b/tests/pytest_results.txt index 5d24daba4..fcfe1f184 100644 --- a/tests/pytest_results.txt +++ b/tests/pytest_results.txt @@ -1,524 +1,413 @@ -Pytest results (Python 3.14) - 2026-06-26T19:49:44Z +Pytest results (Python 3.14) - 2026-06-27T18:25:23Z ============================= test session starts ============================== platform linux -- Python 3.14.6, pytest-9.1.1, pluggy-1.6.0 -- /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/bin/python3 cachedir: .pytest_cache -Using --randomly-seed=3168638919 +Using --randomly-seed=1280788875 rootdir: /home/runner/work/gget/gget configfile: pyproject.toml testpaths: tests plugins: randomly-3.16.0, rerunfailures-14.0, mock-3.15.1, cov-7.1.0, xdist-3.8.0 -collecting ... collected 409 items +collecting ... collected 420 items -tests/test_seq.py::TestSeq::test_seq_transcript_gene_WB PASSED [ 0%] -tests/test_seq.py::TestSeq::test_seq_transcript PASSED [ 0%] -tests/test_seq.py::TestSeq::test_seq_gene_iso PASSED [ 0%] -tests/test_seq.py::TestSeq::test_seq_transcript_transcript_WB PASSED [ 0%] -tests/test_seq.py::TestSeq::test_seq_transcript_transcript_iso PASSED [ 1%] -tests/test_seq.py::TestSeq::test_seq_gene_transcript_iso PASSED [ 1%] -tests/test_seq.py::TestSeq::test_seq_transcript_gene_iso PASSED [ 1%] -tests/test_seq.py::TestSeq::test_seq_missing_uniprot_gene_name PASSED [ 1%] -tests/test_seq.py::TestSeq::test_seq_transcript_gene PASSED [ 2%] -tests/test_seq.py::TestSeq::test_seq_gene PASSED [ 2%] -tests/test_blat.py::TestBlat::test_blat_aa_RNA PASSED [ 2%] -tests/test_blat.py::TestBlat::test_blat_nt_DNA PASSED [ 2%] -tests/test_blat.py::TestBlat::test_blat_nt_json PASSED [ 3%] -tests/test_blat.py::TestBlat::test_blat_aa_protein PASSED [ 3%] -tests/test_blat.py::TestBlat::test_blat_bad_fasta PASSED [ 3%] -tests/test_blat.py::TestBlat::test_blat_bad_assembly PASSED [ 3%] -tests/test_blat.py::TestBlat::test_blat_bad_fileformat PASSED [ 4%] -tests/test_blat.py::TestBlat::test_blat_nt PASSED [ 4%] -tests/test_blat.py::TestBlat::test_blat_shortseq PASSED [ 4%] -tests/test_blat.py::TestBlat::test_blat_nt_RNA PASSED [ 4%] -tests/test_blat.py::TestBlat::test_blat_bad_seqtype PASSED [ 5%] -tests/test_blat.py::TestBlat::test_blat_nt_fasta PASSED [ 5%] -tests/test_blat.py::TestBlat::test_blat_nt_txt PASSED [ 5%] -tests/test_blat.py::TestBlat::test_blat_bad_txt PASSED [ 5%] -tests/test_blat.py::TestBlat::test_blat_nt_transDNA PASSED [ 6%] -tests/test_blat.py::TestBlat::test_blat_nt_protein PASSED [ 6%] -tests/test_blat.py::TestBlat::test_blat_aa PASSED [ 6%] -tests/test_g2p.py::TestG2P::test_g2p_map PASSED [ 6%] -tests/test_g2p.py::TestG2P::test_g2p_alignment PASSED [ 7%] -tests/test_g2p.py::TestG2P::test_g2p_features PASSED [ 7%] -tests/test_g2p.py::TestG2PValidation::test_invalid_resource_raises PASSED [ 7%] -tests/test_g2p.py::TestG2PValidation::test_alignment_requires_isoform PASSED [ 7%] -tests/test_g2p.py::TestG2PValidation::test_missing_uniprot_raises PASSED [ 8%] -tests/test_gpt.py::TestGpt::test_gpt PASSED [ 8%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_gene PASSED [ 8%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_species PASSED [ 8%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_yeast PASSED [ 9%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_transcription PASSED [ 9%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_ensembl_ids PASSED [ 9%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_database_shortcut PASSED [ 9%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_background PASSED [ 10%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_pathway PASSED [ 10%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_plot PASSED [ 10%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_worm PASSED [ 10%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_mouse_is_human PASSED [ 11%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_background_ensembl PASSED [ 11%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background PASSED [ 11%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_json PASSED [ 11%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_fly PASSED [ 11%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_kinase_interactions PASSED [ 12%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_celltypes PASSED [ 12%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_fish PASSED [ 12%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_ontology PASSED [ 12%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_none PASSED [ 13%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_diseases_drugs PASSED [ 13%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background_list PASSED [ 13%] -tests/test_search.py::TestSearch::test_search_plant PASSED [ 13%] -tests/test_search.py::TestSearch::test_search_transcript_two_sw_and PASSED [ 14%] -tests/test_search.py::TestSearch::test_search_gene_two_sw_and PASSED [ 14%] -tests/test_search.py::TestSearch::test_search_transcript_two_sw_or PASSED [ 14%] -tests/test_search.py::TestSearch::test_search_gene_bad_species PASSED [ 14%] -tests/test_search.py::TestSearch::test_search_plant_db PASSED [ 15%] -tests/test_search.py::TestSearch::test_search_gene_two_sw_limit PASSED [ 15%] -tests/test_search.py::TestSearch::test_search_transcript_bad_andor PASSED [ 15%] -tests/test_search.py::TestSearch::test_search_transcript_bad_species PASSED [ 15%] -tests/test_search.py::TestSearch::test_search_gene_one_sw_json PASSED [ 16%] -tests/test_search.py::TestSearch::test_search_transcript_one_sw PASSED [ 16%] -tests/test_search.py::TestSearch::test_search_octopus PASSED [ 16%] -tests/test_search.py::TestSearch::test_search_gene_two_sw_or PASSED [ 16%] -tests/test_search.py::TestSearch::test_search_db PASSED [ 17%] -tests/test_search.py::TestSearch::test_search_release PASSED [ 17%] -tests/test_search.py::TestSearch::test_search_gene_one_sw_limit PASSED [ 17%] -tests/test_search.py::TestSearch::test_search_gene_bad_andor PASSED [ 17%] -tests/test_search.py::TestSearch::test_search_gene_one_sw PASSED [ 18%] -tests/test_utils.py::TestUtils::test_rest_query PASSED [ 18%] -tests/test_utils.py::TestUtils::test_ref_iv_species_options PASSED [ 18%] -tests/test_utils.py::TestUtils::test_search_species_options_bad_type PASSED [ 18%] -tests/test_utils.py::TestUtils::test_get_uniprot_seqs PASSED [ 19%] -tests/test_utils.py::TestUtils::test_n_colors PASSED [ 19%] -tests/test_utils.py::TestUtils::test_get_uniprot_info_transcript PASSED [ 19%] -tests/test_utils.py::TestUtils::test_find_latest_ens_rel PASSED [ 19%] -tests/test_utils.py::TestUtils::test_read_fasta PASSED [ 20%] -tests/test_utils.py::TestUtils::test_search_species_options PASSED [ 20%] -tests/test_utils.py::TestUtils::test_rest_query_bad_type PASSED [ 20%] -tests/test_utils.py::TestUtils::test_aa_colors PASSED [ 20%] -tests/test_utils.py::TestUtils::test_ref_species_options PASSED [ 21%] -tests/test_utils.py::TestUtils::test_ref_species_options_bad_type PASSED [ 21%] -tests/test_utils.py::TestUtils::test_search_iv_species_options PASSED [ 21%] -tests/test_utils.py::TestUtils::test_get_uniprot_info_gene PASSED [ 21%] -tests/test_diamond.py::TestDiamond::test_diamond_JSON_out PASSED [ 22%] -tests/test_diamond.py::TestDiamond::test_diamond_ref_file PASSED [ 22%] -tests/test_diamond.py::TestDiamond::test_diamond_seqs_multiple PASSED [ 22%] -tests/test_diamond.py::TestDiamond::test_diamond_seqs_single PASSED [ 22%] -tests/test_diamond.py::TestDiamond::test_diamond_both_files PASSED [ 22%] +tests/test_cellxgene.py::TestCellxgeneValidation::test_typo_species_raises_valueerror PASSED [ 0%] +tests/test_cellxgene.py::TestCellxgeneValidation::test_invalid_species_raises_valueerror PASSED [ 0%] +tests/test_cellxgene.py::TestCellxgeneValidation::test_supported_species_includes_new_primates PASSED [ 0%] +tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata SKIPPED [ 0%] +tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata_macaca_mulatta SKIPPED [ 1%] +tests/test_cellxgene.py::TestCellxgene::test_cellxgene_adata SKIPPED [ 1%] +tests/test_utils.py::TestUtils::test_ref_species_options PASSED [ 1%] +tests/test_utils.py::TestUtils::test_get_uniprot_info_transcript PASSED [ 1%] +tests/test_utils.py::TestUtils::test_rest_query PASSED [ 2%] +tests/test_utils.py::TestUtils::test_get_uniprot_info_gene PASSED [ 2%] +tests/test_utils.py::TestUtils::test_ref_iv_species_options PASSED [ 2%] +tests/test_utils.py::TestUtils::test_rest_query_bad_type PASSED [ 2%] +tests/test_utils.py::TestUtils::test_search_species_options PASSED [ 3%] +tests/test_utils.py::TestUtils::test_read_fasta PASSED [ 3%] +tests/test_utils.py::TestUtils::test_n_colors PASSED [ 3%] +tests/test_utils.py::TestUtils::test_aa_colors PASSED [ 3%] +tests/test_utils.py::TestUtils::test_get_uniprot_seqs PASSED [ 4%] +tests/test_utils.py::TestUtils::test_search_iv_species_options PASSED [ 4%] +tests/test_utils.py::TestUtils::test_search_species_options_bad_type PASSED [ 4%] +tests/test_utils.py::TestUtils::test_find_latest_ens_rel PASSED [ 4%] +tests/test_utils.py::TestUtils::test_ref_species_options_bad_type PASSED [ 5%] +tests/test_elm.py::TestELM::test_elm_uniprot_id_in_elm PASSED [ 5%] +tests/test_elm.py::TestELM::test_elm_uniprot_aminoacidseq PASSED [ 5%] +tests/test_elm.py::TestELM::test_elm_uniprot_id_new PASSED [ 5%] +tests/test_mutate.py::TestMutate::test_single_deletion PASSED [ 5%] +tests/test_mutate.py::TestMutate::test_large_k PASSED [ 6%] +tests/test_mutate.py::TestMutate::test_intron_mutation_minus PASSED [ 6%] +tests/test_mutate.py::TestMutate::test_ambiguous_mutation PASSED [ 6%] +tests/test_mutate.py::TestMutate::test_single_deletion_with_right_repeats PASSED [ 6%] +tests/test_mutate.py::TestMutate::test_inversion_with_overlaps PASSED [ 7%] +tests/test_mutate.py::TestMutate::test_multi_delins_with_psuedo_left_repeats PASSED [ 7%] +tests/test_mutate.py::TestMutate::test_multi_delins_with_true_right_repeats PASSED [ 7%] +tests/test_mutate.py::TestMutate::test_multi_insertion PASSED [ 7%] +tests/test_mutate.py::TestMutate::test_index_error PASSED [ 8%] +tests/test_mutate.py::TestMutate::test_multi_deletion PASSED [ 8%] +tests/test_mutate.py::TestMutate::test_single_substitution_near_right_end PASSED [ 8%] +tests/test_mutate.py::TestMutate::test_multi_delins_with_true_left_repeats PASSED [ 8%] +tests/test_mutate.py::TestMutate::test_multi_deletion_with_right_repeats PASSED [ 9%] +tests/test_mutate.py::TestMutate::test_single_dup PASSED [ 9%] +tests/test_mutate.py::TestMutate::test_list_of_mutations PASSED [ 9%] +tests/test_mutate.py::TestMutate::test_single_substitution_near_left_end PASSED [ 9%] +tests/test_mutate.py::TestMutate::test_uncertain_mutation PASSED [ 10%] +tests/test_mutate.py::TestMutate::test_single_insertion PASSED [ 10%] +tests/test_mutate.py::TestMutate::test_single_deletion_with_left_repeats PASSED [ 10%] +tests/test_mutate.py::TestMutate::test_multi_dup PASSED [ 10%] +tests/test_mutate.py::TestMutate::test_single_substitution PASSED [ 10%] +tests/test_mutate.py::TestMutate::test_multi_delins PASSED [ 11%] +tests/test_mutate.py::TestMutate::test_single_delins PASSED [ 11%] +tests/test_mutate.py::TestMutate::test_multi_insertion_with_left_repeats PASSED [ 11%] +tests/test_mutate.py::TestMutate::test_intron_mutation_plus PASSED [ 11%] +tests/test_mutate.py::TestMutate::test_posttranslational_mutation PASSED [ 12%] +tests/test_mutate.py::test_csv_of_mutations PASSED [ 12%] +tests/test_mutate.py::test_mismatch_error PASSED [ 12%] +tests/test_seq.py::TestSeq::test_seq_transcript_transcript_WB PASSED [ 12%] +tests/test_seq.py::TestSeq::test_seq_transcript_gene PASSED [ 13%] +tests/test_seq.py::TestSeq::test_seq_transcript_gene_iso PASSED [ 13%] +tests/test_seq.py::TestSeq::test_seq_transcript_gene_WB PASSED [ 13%] +tests/test_seq.py::TestSeq::test_seq_transcript_transcript_iso PASSED [ 13%] +tests/test_seq.py::TestSeq::test_seq_gene_iso PASSED [ 14%] +tests/test_seq.py::TestSeq::test_seq_gene PASSED [ 14%] +tests/test_seq.py::TestSeq::test_seq_gene_transcript_iso PASSED [ 14%] +tests/test_seq.py::TestSeq::test_seq_transcript PASSED [ 14%] +tests/test_seq.py::TestSeq::test_seq_missing_uniprot_gene_name PASSED [ 15%] +tests/test_cosmic.py::TestCosmicWorkflow::test_cosmic_defaults PASSED [ 15%] +tests/test_info.py::TestInfo::test_info_ncbitrue_uniprotfalse PASSED [ 15%] +tests/test_info.py::TestInfo::test_info_ncbifalse_uniprottrue PASSED [ 15%] +tests/test_info.py::TestInfo::test_info_mix PASSED [ 15%] +tests/test_info.py::TestInfo::test_info_gene_list_non_model PASSED [ 16%] +tests/test_info.py::TestInfo::test_info_transcript PASSED [ 16%] +tests/test_info.py::TestInfo::test_info_exon PASSED [ 16%] +tests/test_info.py::TestInfo::test_info_WB_transcript PASSED [ 16%] +tests/test_info.py::TestInfo::test_info_ncbifalse_uniprotfalse PASSED [ 17%] +tests/test_info.py::TestInfo::test_info_gene PASSED [ 17%] +tests/test_gpt.py::TestGpt::test_gpt PASSED [ 17%] +tests/test_cbio.py::TestCbioSearch::test_cbio_search PASSED [ 17%] +tests/test_cbio.py::TestCbio::test_cbio_download PASSED [ 18%] +tests/test_cbio.py::TestCbio::test_error_cbio_download PASSED [ 18%] +tests/test_cbio.py::TestCbio::test_cbio_download_partially_existing_files PASSED [ 18%] +tests/test_search.py::TestSearch::test_search_gene_one_sw_json PASSED [ 18%] +tests/test_search.py::TestSearch::test_search_release PASSED [ 19%] +tests/test_search.py::TestSearch::test_search_db PASSED [ 19%] +tests/test_search.py::TestSearch::test_search_gene_two_sw_and PASSED [ 19%] +tests/test_search.py::TestSearch::test_search_gene_two_sw_or PASSED [ 19%] +tests/test_search.py::TestSearch::test_search_gene_bad_andor PASSED [ 20%] +tests/test_search.py::TestSearch::test_search_gene_one_sw_limit PASSED [ 20%] +tests/test_search.py::TestSearch::test_search_transcript_bad_andor PASSED [ 20%] +tests/test_search.py::TestSearch::test_search_gene_bad_species PASSED [ 20%] +tests/test_search.py::TestSearch::test_search_octopus PASSED [ 20%] +tests/test_search.py::TestSearch::test_search_gene_one_sw PASSED [ 21%] +tests/test_search.py::TestSearch::test_search_transcript_two_sw_or PASSED [ 21%] +tests/test_search.py::TestSearch::test_search_gene_two_sw_limit PASSED [ 21%] +tests/test_search.py::TestSearch::test_search_transcript_one_sw PASSED [ 21%] +tests/test_search.py::TestSearch::test_search_plant PASSED [ 22%] +tests/test_search.py::TestSearch::test_search_plant_db PASSED [ 22%] +tests/test_search.py::TestSearch::test_search_transcript_bad_species PASSED [ 22%] +tests/test_search.py::TestSearch::test_search_transcript_two_sw_and PASSED [ 22%] +tests/test_diamond.py::TestDiamond::test_diamond_both_files PASSED [ 23%] tests/test_diamond.py::TestDiamond::test_diamond_query_file PASSED [ 23%] -tests/test_cosmic.py::TestCosmicWorkflow::test_cosmic_defaults PASSED [ 23%] -tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_clean_up_default_dir_when_none PASSED [ 23%] -tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_custom_dir PASSED [ 23%] -tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_cli_exposes_jackhmmer_savedir_flag PASSED [ 24%] -tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_clean_up_removes_custom_dir PASSED [ 24%] -tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_clean_up_missing_dir_is_safe PASSED [ 24%] -tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_default_dir PASSED [ 24%] -tests/test_archs4.py::TestArchs4MissingColor::test_tissue_missing_color_does_not_crash PASSED [ 25%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue_json PASSED [ 25%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue PASSED [ 25%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue_ensembl PASSED [ 25%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_gene_tissue PASSED [ 26%] -tests/test_archs4.py::TestArchs4::test_archs4_defaults PASSED [ 26%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_which PASSED [ 26%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_ensembl PASSED [ 26%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue_mouse PASSED [ 27%] -tests/test_archs4.py::TestArchs4::test_archs4_mouse_json_ensembl PASSED [ 27%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_species PASSED [ 27%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_gene PASSED [ 27%] -tests/test_elm.py::TestELM::test_elm_uniprot_id_in_elm PASSED [ 28%] -tests/test_elm.py::TestELM::test_elm_uniprot_id_new PASSED [ 28%] -tests/test_elm.py::TestELM::test_elm_uniprot_aminoacidseq PASSED [ 28%] -tests/test_pdb.py::TestPDB::test_pdb_pdb PASSED [ 28%] -tests/test_pdb.py::TestPDB::test_pdb_legacy_fallback_to_mmcif PASSED [ 29%] -tests/test_pdb.py::TestPDB::test_pdb_mmcif PASSED [ 29%] -tests/test_pdb.py::TestPDB::test_pdb_assembly PASSED [ 29%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_release_date PASSED [ 29%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_combined_filters PASSED [ 30%] -tests/test_virus.py::TestVirus::test_check_min_max_date_valid PASSED [ 30%] -tests/test_virus.py::TestVirus::test_check_min_max_equal PASSED [ 30%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_gene_count PASSED [ 30%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_remove_parentheses PASSED [ 31%] -tests/test_virus.py::TestVirus::test_virus_invalid_keep_temp_type PASSED [ 31%] -tests/test_virus.py::TestVirus::test_batch_accessions_for_url PASSED [ 31%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_empty_raises PASSED [ 31%] -tests/test_virus.py::TestVirus::test_track_failed_operation_appends PASSED [ 32%] -tests/test_virus.py::TestVirus::test_force_garbage_collection_runs PASSED [ 32%] -tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter PASSED [ 32%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_gen_mol_type PASSED [ 32%] -tests/test_virus.py::TestVirus::test_is_sars_cov2_query_negative PASSED [ 33%] -tests/test_virus.py::TestVirus::test_virus_completeness_filter_verification PASSED [ 33%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_no_filters PASSED [ 33%] -tests/test_virus.py::TestVirus::test_validate_datasets_binary_valid PASSED [ 33%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_geographic_location PASSED [ 33%] -tests/test_virus.py::TestVirus::test_virus_with_genbank_metadata_retrieval PASSED [ 34%] -tests/test_virus.py::TestVirus::test_datasets_cli_version_output PASSED [ 34%] -tests/test_virus.py::TestVirus::test_local_name_without_namespace PASSED [ 34%] -tests/test_virus.py::TestVirus::test_virus_empty_virus_name PASSED [ 34%] -tests/test_virus.py::TestVirus::test_virus_invalid_is_accession_type PASSED [ 35%] -tests/test_virus.py::TestVirus::test_deduplicate_all_existing PASSED [ 35%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_country PASSED [ 35%] -tests/test_virus.py::TestVirus::test_retry_helper_success_after_retry PASSED [ 35%] -tests/test_virus.py::TestVirus::test_stream_copy_fasta_with_accession_filter PASSED [ 36%] -tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_empty PASSED [ 36%] -tests/test_virus.py::TestVirus::test_local_name_with_namespace PASSED [ 36%] -tests/test_virus.py::TestVirus::test_parse_accession_input_space_separated PASSED [ 36%] -tests/test_virus.py::TestVirus::test_deduplicate_metadata_against_baseline PASSED [ 37%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_max_release_date PASSED [ 37%] -tests/test_virus.py::TestVirus::test_merge_metadata_csvs_no_overwrite PASSED [ 37%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_negative PASSED [ 37%] -tests/test_virus.py::TestVirus::test_parse_partial_date_empty_raises PASSED [ 38%] -tests/test_virus.py::TestVirus::test_parse_date_full PASSED [ 38%] +tests/test_diamond.py::TestDiamond::test_diamond_seqs_single PASSED [ 23%] +tests/test_diamond.py::TestDiamond::test_diamond_JSON_out PASSED [ 23%] +tests/test_diamond.py::TestDiamond::test_diamond_ref_file PASSED [ 24%] +tests/test_diamond.py::TestDiamond::test_diamond_seqs_multiple PASSED [ 24%] +tests/test_virus.py::TestVirus::test_unzip_file_bad_zip_raises PASSED [ 24%] +tests/test_virus.py::TestVirus::test_virus_invalid_is_accession_type PASSED [ 24%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_combined_filters PASSED [ 25%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype_list PASSED [ 25%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_institution PASSED [ 25%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_already_correct_returns_none PASSED [ 25%] +tests/test_virus.py::TestVirus::test_parse_partial_date_full_date PASSED [ 25%] +tests/test_virus.py::TestVirus::test_validate_datasets_binary_valid PASSED [ 26%] +tests/test_virus.py::TestVirus::test_retry_helper_failed_commands_tracking PASSED [ 26%] +tests/test_virus.py::TestVirus::test_virus_host_filter_verification PASSED [ 26%] +tests/test_virus.py::TestVirus::test_virus_invalid_lab_passaged_type PASSED [ 26%] +tests/test_virus.py::TestVirus::test_genbank_xml_to_csv_basic PASSED [ 27%] +tests/test_virus.py::TestVirus::test_write_fasta_record_with_description PASSED [ 27%] +tests/test_virus.py::TestVirus::test_save_metadata_to_csv_basic PASSED [ 27%] +tests/test_virus.py::TestVirus::test_virus_completeness_filter_verification PASSED [ 27%] +tests/test_virus.py::TestVirus::test_filter_sequences_max_ambiguous_chars PASSED [ 28%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_protein_count PASSED [ 28%] +tests/test_virus.py::TestVirus::test_save_partial_metadata PASSED [ 28%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_true PASSED [ 28%] +tests/test_virus.py::TestVirus::test_virus_with_completeness_filter PASSED [ 29%] +tests/test_virus.py::TestVirus::test_parse_genbank_xml_empty_set PASSED [ 29%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_none_raises PASSED [ 29%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_mature_peptide_count PASSED [ 29%] +tests/test_virus.py::TestVirus::test_get_datasets_path_uses_bundled_binary PASSED [ 30%] +tests/test_virus.py::TestVirus::test_local_name_without_namespace PASSED [ 30%] +tests/test_virus.py::TestVirus::test_deduplicate_all_existing PASSED [ 30%] +tests/test_virus.py::TestVirus::test_filter_cached_min_release_date PASSED [ 30%] +tests/test_virus.py::TestVirus::test_get_gget_version_returns_string PASSED [ 30%] +tests/test_virus.py::TestVirus::test_is_sars_cov2_query_accession_mode PASSED [ 31%] +tests/test_virus.py::TestVirus::test_filter_sequences_no_filters PASSED [ 31%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_max_release_date PASSED [ 31%] +tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_common_names PASSED [ 31%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_source_database PASSED [ 32%] +tests/test_virus.py::TestVirus::test_virus_with_collection_date_filters PASSED [ 32%] +tests/test_virus.py::TestVirus::test_check_min_max_date_valid PASSED [ 32%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_release_date PASSED [ 32%] +tests/test_virus.py::TestVirus::test_retry_helper_success_after_retry PASSED [ 33%] +tests/test_virus.py::TestVirus::test_virus_with_multiple_filters PASSED [ 33%] +tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter PASSED [ 33%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_empty_returns_none PASSED [ 33%] +tests/test_virus.py::TestVirus::test_parse_genbank_xml_basic PASSED [ 34%] +tests/test_virus.py::TestVirus::test_stream_copy_fasta_all_records PASSED [ 34%] +tests/test_virus.py::TestVirus::test_clean_xml_declarations PASSED [ 34%] +tests/test_virus.py::TestVirus::test_virus_multi_accession_space_separated PASSED [ 34%] +tests/test_virus.py::TestVirus::test_parse_partial_date_empty_raises PASSED [ 35%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_false PASSED [ 35%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_max_seq_length PASSED [ 35%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_false PASSED [ 35%] +tests/test_virus.py::TestVirus::test_local_name_with_namespace PASSED [ 35%] +tests/test_virus.py::TestVirus::test_save_partial_metadata_empty PASSED [ 36%] +tests/test_virus.py::TestVirus::test_is_sars_cov2_query_negative PASSED [ 36%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_text PASSED [ 36%] +tests/test_virus.py::TestVirus::test_save_command_summary_creates_file PASSED [ 36%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_csv PASSED [ 37%] +tests/test_virus.py::TestVirus::test_get_datasets_version_returns_string_or_none PASSED [ 37%] +tests/test_virus.py::TestVirus::test_is_sars_cov2_query_common_names PASSED [ 37%] +tests/test_virus.py::TestVirus::test_validate_datasets_binary_empty_path PASSED [ 37%] +tests/test_virus.py::TestVirus::test_save_metadata_to_csv_empty_metadata PASSED [ 38%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_isolate PASSED [ 38%] tests/test_virus.py::TestVirus::test_virus_with_annotated_filter PASSED [ 38%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype_list PASSED [ 38%] -tests/test_virus.py::TestVirus::test_save_partial_metadata_empty PASSED [ 39%] -tests/test_virus.py::TestVirus::test_parse_genbank_xml_empty_set PASSED [ 39%] -tests/test_virus.py::TestVirus::test_virus_relationship_check_counts_match PASSED [ 39%] -tests/test_virus.py::TestVirus::test_is_sars_cov2_query_accession_mode PASSED [ 39%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_nonexistent_raises PASSED [ 40%] -tests/test_virus.py::TestVirus::test_retry_helper_exponential_backoff_timing PASSED [ 40%] -tests/test_virus.py::TestVirus::test_virus_invalid_lab_passaged_type PASSED [ 40%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_min_seq_length PASSED [ 40%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_no_filters PASSED [ 41%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_already_correct_returns_none PASSED [ 41%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_false PASSED [ 41%] -tests/test_virus.py::TestVirus::test_save_partial_metadata PASSED [ 41%] -tests/test_virus.py::TestVirus::test_track_failed_operation_creates_key PASSED [ 42%] -tests/test_virus.py::TestVirus::test_merge_baseline_with_new_csv PASSED [ 42%] -tests/test_virus.py::TestVirus::test_virus_specific_accession_file_creation PASSED [ 42%] -tests/test_virus.py::TestVirus::test_virus_with_completeness_filter PASSED [ 42%] -tests/test_virus.py::TestVirus::test_virus_with_collection_date_filters PASSED [ 43%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_multiple PASSED [ 43%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_virus_suffix PASSED [ 43%] -tests/test_virus.py::TestVirus::test_filter_sequences_no_filters PASSED [ 43%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_false PASSED [ 44%] -tests/test_virus.py::TestVirus::test_parse_genbank_xml_basic PASSED [ 44%] -tests/test_virus.py::TestVirus::test_get_datasets_version_returns_string_or_none PASSED [ 44%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_mature_peptide_count PASSED [ 44%] -tests/test_virus.py::TestVirus::test_filter_cached_refseq_only PASSED [ 44%] -tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_negative PASSED [ 45%] -tests/test_virus.py::TestVirus::test_retry_helper_non_retryable_exception PASSED [ 45%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_protein_count PASSED [ 45%] -tests/test_virus.py::TestVirus::test_calculate_max_accessions_per_batch PASSED [ 45%] -tests/test_virus.py::TestVirus::test_validate_datasets_binary_nonexistent PASSED [ 46%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_metadata_type PASSED [ 46%] -tests/test_virus.py::TestVirus::test_parse_partial_date_full_date PASSED [ 46%] -tests/test_virus.py::TestVirus::test_unzip_file_nonexistent_raises PASSED [ 46%] -tests/test_virus.py::TestVirus::test_virus_invalid_annotated_type PASSED [ 47%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_zero PASSED [ 47%] -tests/test_virus.py::TestVirus::test_virus_with_host_filter PASSED [ 47%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_source_database PASSED [ 47%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_invalid_attempt_returns_none PASSED [ 48%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_max_seq_length PASSED [ 48%] -tests/test_virus.py::TestVirus::test_parse_accession_input_from_file PASSED [ 48%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_json PASSED [ 48%] -tests/test_virus.py::TestVirus::test_virus_integer_virus_id PASSED [ 49%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_true PASSED [ 49%] -tests/test_virus.py::TestVirus::test_unzip_file_bad_zip_raises PASSED [ 49%] -tests/test_virus.py::TestVirus::test_parse_genbank_xml_invalid_raises PASSED [ 49%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_true PASSED [ 50%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_jsonl PASSED [ 50%] -tests/test_virus.py::TestVirus::test_check_min_max_none_values PASSED [ 50%] -tests/test_virus.py::TestVirus::test_save_command_summary_creates_file PASSED [ 50%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_type PASSED [ 51%] -tests/test_virus.py::TestVirus::test_get_datasets_path_uses_bundled_binary PASSED [ 51%] -tests/test_virus.py::TestVirus::test_is_sars_cov2_query_common_names PASSED [ 51%] -tests/test_virus.py::TestVirus::test_filter_cached_min_release_date PASSED [ 51%] -tests/test_virus.py::TestVirus::test_unzip_file_valid PASSED [ 52%] -tests/test_virus.py::TestVirus::test_filter_sequences_proteins_complete PASSED [ 52%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_false PASSED [ 52%] -tests/test_virus.py::TestVirus::test_merge_baseline_with_new_empty_new PASSED [ 52%] -tests/test_virus.py::TestVirus::test_filter_cached_complete_only PASSED [ 53%] -tests/test_virus.py::TestVirus::test_filter_cached_no_filters PASSED [ 53%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_space_before_virus PASSED [ 53%] -tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_basic PASSED [ 53%] -tests/test_virus.py::TestVirus::test_parse_date_invalid_raises PASSED [ 54%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_seq_length PASSED [ 54%] -tests/test_virus.py::TestVirus::test_parse_accession_input_single PASSED [ 54%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_institution PASSED [ 54%] -tests/test_virus.py::TestVirus::test_clean_xml_declarations PASSED [ 55%] -tests/test_virus.py::TestVirus::test_merge_baseline_with_new_deduplicates PASSED [ 55%] -tests/test_virus.py::TestVirus::test_get_memory_usage_returns_dict PASSED [ 55%] -tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_accession_mode PASSED [ 55%] -tests/test_virus.py::TestVirus::test_parse_accession_input_empty_file_raises_error PASSED [ 55%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_true PASSED [ 56%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_empty_returns_none PASSED [ 56%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype PASSED [ 56%] -tests/test_virus.py::TestVirus::test_merge_metadata_csvs_fills_missing PASSED [ 56%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_empty PASSED [ 57%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_min_gene_count PASSED [ 57%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_csv PASSED [ 57%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_env_source PASSED [ 57%] -tests/test_virus.py::TestVirus::test_virus_metadata_schema_validation PASSED [ 58%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_collection_date PASSED [ 58%] -tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter PASSED [ 58%] -tests/test_virus.py::TestVirus::test_check_min_max_invalid_raises PASSED [ 58%] -tests/test_virus.py::TestVirus::test_check_min_max_valid PASSED [ 59%] -tests/test_virus.py::TestVirus::test_stream_copy_fasta_all_records PASSED [ 59%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_peptide_count PASSED [ 59%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_has_proteins PASSED [ 59%] -tests/test_virus.py::TestVirus::test_parse_accession_input_nonexistent_file_raises_error PASSED [ 60%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_true PASSED [ 60%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_name PASSED [ 38%] +tests/test_virus.py::TestVirus::test_virus_invalid_keep_temp_type PASSED [ 39%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_max_comparison PASSED [ 39%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_gen_mol_type PASSED [ 39%] +tests/test_virus.py::TestVirus::test_merge_metadata_csvs_fills_missing PASSED [ 39%] +tests/test_virus.py::TestVirus::test_virus_none_virus_name PASSED [ 40%] +tests/test_virus.py::TestVirus::test_check_min_max_valid PASSED [ 40%] +tests/test_virus.py::TestVirus::test_merge_baseline_with_new_empty_new PASSED [ 40%] +tests/test_virus.py::TestVirus::test_parse_accession_input_nonexistent_file_raises_error PASSED [ 40%] +tests/test_virus.py::TestVirus::test_check_min_max_invalid_raises PASSED [ 40%] +tests/test_virus.py::TestVirus::test_virus_with_host_filter PASSED [ 41%] +tests/test_virus.py::TestVirus::test_unzip_file_valid PASSED [ 41%] +tests/test_virus.py::TestVirus::test_virus_invalid_completeness PASSED [ 41%] +tests/test_virus.py::TestVirus::test_virus_with_length_filters PASSED [ 41%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_gene_count PASSED [ 42%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_true PASSED [ 42%] +tests/test_virus.py::TestVirus::test_datasets_cli_version_output PASSED [ 42%] +tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter PASSED [ 42%] +tests/test_virus.py::TestVirus::test_validate_datasets_binary_nonexistent PASSED [ 43%] +tests/test_virus.py::TestVirus::test_get_memory_usage_returns_dict PASSED [ 43%] +tests/test_virus.py::TestVirus::test_virus_multiple_filters_relationship_check PASSED [ 43%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_collection_date PASSED [ 43%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_isolation_source PASSED [ 44%] +tests/test_virus.py::TestVirus::test_merge_baseline_with_new_deduplicates PASSED [ 44%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_collection_date_range PASSED [ 44%] +tests/test_virus.py::TestVirus::test_virus_with_geographic_location_filter PASSED [ 44%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_geographic_location PASSED [ 45%] +tests/test_virus.py::TestVirus::test_check_min_max_none_values PASSED [ 45%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_min_comparison PASSED [ 45%] +tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_basic PASSED [ 45%] +tests/test_virus.py::TestVirus::test_virus_release_date_filter_verification PASSED [ 45%] +tests/test_virus.py::TestVirus::test_filter_cached_no_filters PASSED [ 46%] +tests/test_virus.py::TestVirus::test_filter_cached_annotated PASSED [ 46%] +tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters PASSED [ 46%] +tests/test_virus.py::TestVirus::test_get_datasets_path_returns_valid_path PASSED [ 46%] +tests/test_virus.py::TestVirus::test_retry_helper_custom_retryable_exceptions PASSED [ 47%] +tests/test_virus.py::TestVirus::test_parse_genbank_xml_invalid_raises PASSED [ 47%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_no_parentheses_returns_none PASSED [ 47%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_space_before_virus PASSED [ 47%] +tests/test_virus.py::TestVirus::test_batch_accessions_for_url PASSED [ 48%] +tests/test_virus.py::TestVirus::test_virus_relationship_check_counts_match PASSED [ 48%] +tests/test_virus.py::TestVirus::test_virus_integer_virus_id PASSED [ 48%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_zero PASSED [ 48%] +tests/test_virus.py::TestVirus::test_track_failed_operation_creates_key PASSED [ 49%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_segment PASSED [ 49%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_empty PASSED [ 49%] +tests/test_virus.py::TestVirus::test_clean_xml_declarations_no_declarations PASSED [ 49%] +tests/test_virus.py::TestVirus::test_check_min_max_equal PASSED [ 50%] +tests/test_virus.py::TestVirus::test_calculate_max_accessions_per_batch PASSED [ 50%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_basic PASSED [ 50%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_empty_raises PASSED [ 50%] +tests/test_virus.py::TestVirus::test_filter_cached_host_in_strategy_skipped PASSED [ 50%] +tests/test_virus.py::TestVirus::test_virus_with_genbank_metadata_retrieval PASSED [ 51%] +tests/test_virus.py::TestVirus::test_write_fasta_record_without_description PASSED [ 51%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_min_gene_count PASSED [ 51%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_json PASSED [ 51%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_peptide_count PASSED [ 52%] +tests/test_virus.py::TestVirus::test_filter_cached_geographic_location PASSED [ 52%] +tests/test_virus.py::TestVirus::test_filter_cached_complete_only PASSED [ 52%] +tests/test_virus.py::TestVirus::test_virus_specific_accession_file_creation PASSED [ 52%] +tests/test_virus.py::TestVirus::test_virus_invalid_proteins_complete_type PASSED [ 53%] +tests/test_virus.py::TestVirus::test_parse_date_various_formats PASSED [ 53%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_min PASSED [ 53%] +tests/test_virus.py::TestVirus::test_check_min_max_date_invalid_raises PASSED [ 53%] +tests/test_virus.py::TestVirus::test_filter_sequences_proteins_complete PASSED [ 54%] +tests/test_virus.py::TestVirus::test_force_garbage_collection_runs PASSED [ 54%] +tests/test_virus.py::TestVirus::test_filter_cached_host_not_in_strategy PASSED [ 54%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_negative PASSED [ 54%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_min_seq_length PASSED [ 55%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_empty PASSED [ 55%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_true PASSED [ 55%] +tests/test_virus.py::TestVirus::test_parse_accession_input_space_separated PASSED [ 55%] +tests/test_virus.py::TestVirus::test_merge_metadata_csvs_missing_standard_file PASSED [ 55%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_metadata_type PASSED [ 56%] +tests/test_virus.py::TestVirus::test_parse_accession_input_from_file PASSED [ 56%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_env_source PASSED [ 56%] +tests/test_virus.py::TestVirus::test_merge_metadata_csvs_no_overwrite PASSED [ 56%] +tests/test_virus.py::TestVirus::test_virus_empty_virus_name PASSED [ 57%] +tests/test_virus.py::TestVirus::test_retry_helper_non_retryable_exception PASSED [ 57%] +tests/test_virus.py::TestVirus::test_virus_with_source_database_filter PASSED [ 57%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_max PASSED [ 57%] +tests/test_virus.py::TestVirus::test_track_failed_operation_appends PASSED [ 58%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_has_proteins PASSED [ 58%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_false PASSED [ 58%] +tests/test_virus.py::TestVirus::test_unzip_file_nonexistent_raises PASSED [ 58%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_protein_count PASSED [ 59%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_seq_length PASSED [ 59%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_combined PASSED [ 59%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_host PASSED [ 59%] +tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter PASSED [ 60%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_no_filters PASSED [ 60%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_virus_suffix PASSED [ 60%] tests/test_virus.py::TestVirus::test_save_command_summary_with_error PASSED [ 60%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_combined PASSED [ 60%] -tests/test_virus.py::TestVirus::test_save_metadata_to_csv_basic PASSED [ 61%] -tests/test_virus.py::TestVirus::test_retry_helper_custom_retryable_exceptions PASSED [ 61%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_host PASSED [ 61%] -tests/test_virus.py::TestVirus::test_save_metadata_to_csv_empty_metadata PASSED [ 61%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_no_parentheses_returns_none PASSED [ 62%] -tests/test_virus.py::TestVirus::test_filter_cached_host_not_in_strategy PASSED [ 62%] -tests/test_virus.py::TestVirus::test_retry_helper_successful_operation PASSED [ 62%] -tests/test_virus.py::TestVirus::test_virus_with_multiple_filters PASSED [ 62%] -tests/test_virus.py::TestVirus::test_clean_xml_declarations_no_declarations PASSED [ 63%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_isolate PASSED [ 63%] +tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_empty PASSED [ 60%] +tests/test_virus.py::TestVirus::test_parse_accession_input_empty_file_raises_error PASSED [ 61%] +tests/test_virus.py::TestVirus::test_write_fasta_record_long_sequence_wraps PASSED [ 61%] +tests/test_virus.py::TestVirus::test_retry_helper_exponential_backoff_timing PASSED [ 61%] +tests/test_virus.py::TestVirus::test_deduplicate_empty_baseline PASSED [ 61%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_nuc_completeness_partial PASSED [ 62%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_jsonl PASSED [ 62%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_country PASSED [ 62%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_remove_parentheses PASSED [ 62%] +tests/test_virus.py::TestVirus::test_virus_metadata_schema_validation PASSED [ 63%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_multiple PASSED [ 63%] +tests/test_virus.py::TestVirus::test_deduplicate_metadata_against_baseline PASSED [ 63%] tests/test_virus.py::TestVirus::test_track_failed_operation_none_dict PASSED [ 63%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_min PASSED [ 63%] -tests/test_virus.py::TestVirus::test_get_datasets_path_returns_valid_path PASSED [ 64%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_max_comparison PASSED [ 64%] -tests/test_virus.py::TestVirus::test_genbank_xml_to_csv_basic PASSED [ 64%] +tests/test_virus.py::TestVirus::test_retry_helper_successful_operation PASSED [ 64%] tests/test_virus.py::TestVirus::test_filter_genbank_metadata_max_gene_count PASSED [ 64%] -tests/test_virus.py::TestVirus::test_check_min_max_date_invalid_raises PASSED [ 65%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_empty PASSED [ 65%] -tests/test_virus.py::TestVirus::test_virus_invalid_completeness PASSED [ 65%] -tests/test_virus.py::TestVirus::test_filter_cached_annotated PASSED [ 65%] -tests/test_virus.py::TestVirus::test_virus_invalid_proteins_complete_type PASSED [ 66%] -tests/test_virus.py::TestVirus::test_write_fasta_record_long_sequence_wraps PASSED [ 66%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_protein_count PASSED [ 66%] -tests/test_virus.py::TestVirus::test_validate_datasets_binary_empty_path PASSED [ 66%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_min_comparison PASSED [ 66%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_missing_accession PASSED [ 67%] -tests/test_virus.py::TestVirus::test_virus_none_virus_name PASSED [ 67%] -tests/test_virus.py::TestVirus::test_merge_metadata_csvs_missing_standard_file PASSED [ 67%] -tests/test_virus.py::TestVirus::test_get_gget_version_returns_string PASSED [ 67%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_collection_date_range PASSED [ 68%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_segment PASSED [ 68%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_none_raises PASSED [ 68%] -tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_common_names PASSED [ 68%] -tests/test_virus.py::TestVirus::test_filter_sequences_max_ambiguous_chars PASSED [ 69%] -tests/test_virus.py::TestVirus::test_virus_with_length_filters PASSED [ 69%] -tests/test_virus.py::TestVirus::test_virus_with_geographic_location_filter PASSED [ 69%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_basic PASSED [ 69%] -tests/test_virus.py::TestVirus::test_virus_multi_accession_file_input PASSED [ 70%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_max PASSED [ 70%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_name PASSED [ 70%] -tests/test_virus.py::TestVirus::test_virus_multi_accession_space_separated PASSED [ 70%] -tests/test_virus.py::TestVirus::test_virus_with_source_database_filter PASSED [ 71%] -tests/test_virus.py::TestVirus::test_filter_cached_geographic_location PASSED [ 71%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_nuc_completeness_partial PASSED [ 71%] -tests/test_virus.py::TestVirus::test_parse_date_various_formats PASSED [ 71%] -tests/test_virus.py::TestVirus::test_retry_helper_failed_commands_tracking PASSED [ 72%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_false PASSED [ 72%] -tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter PASSED [ 72%] -tests/test_virus.py::TestVirus::test_write_fasta_record_without_description PASSED [ 72%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_text PASSED [ 73%] -tests/test_virus.py::TestVirus::test_virus_multiple_filters_relationship_check PASSED [ 73%] -tests/test_virus.py::TestVirus::test_filter_cached_host_in_strategy_skipped PASSED [ 73%] -tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters PASSED [ 73%] -tests/test_virus.py::TestVirus::test_deduplicate_empty_baseline PASSED [ 74%] -tests/test_virus.py::TestVirus::test_write_fasta_record_with_description PASSED [ 74%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_isolation_source PASSED [ 74%] -tests/test_virus.py::TestVirus::test_virus_host_filter_verification PASSED [ 74%] -tests/test_virus.py::TestVirus::test_virus_release_date_filter_verification PASSED [ 75%] -tests/test_muscle.py::TestMuscleAA::test_muscle_aa PASSED [ 75%] -tests/test_muscle.py::TestMuscleAASuper::test_muscle_aa_super5 PASSED [ 75%] -tests/test_muscle.py::TestMusclePrints::test_muscle_print_nt PASSED [ 75%] -tests/test_muscle.py::TestMuscleSeqsInput::test_muscle_seqs_as_input PASSED [ 76%] -tests/test_muscle.py::TestMuscleSuper::test_muscle_nt_super5 PASSED [ 76%] -tests/test_muscle.py::TestMuscle::test_muscle_nt PASSED [ 76%] -tests/test_muscle.py::TestMuscle::test_muscle_nt_txt PASSED [ 76%] -tests/test_8cube.py::TestGeneExpression::test_gene_expression_basic PASSED [ 77%] -tests/test_8cube.py::TestSpecificity::test_specificity_basic PASSED [ 77%] -tests/test_8cube.py::TestPsiBlock::test_psi_block_basic PASSED [ 77%] -tests/test_bgee.py::TestBgee::test_bgee_orthologs PASSED [ 77%] -tests/test_bgee.py::TestBgee::test_error_bgee_orthologs_no_exist PASSED [ 77%] -tests/test_bgee.py::TestBgee::test_bgee_expression_multiple PASSED [ 78%] -tests/test_bgee.py::TestBgee::test_error_bgee_unknown_type PASSED [ 78%] -tests/test_bgee.py::TestBgee::test_bgee_expression PASSED [ 78%] -tests/test_bgee.py::TestBgee::test_error_bgee_expression_no_exist PASSED [ 78%] -tests/test_compile.py::TestCompilerWindows::test_compiler_windows PASSED [ 79%] -tests/test_blast.py::TestBlast::test_blast_bad_db1 PASSED [ 79%] -tests/test_blast.py::TestBlast::test_blast_bad_db2 PASSED [ 79%] -tests/test_blast.py::TestBlast::test_blast_bad_fasta PASSED [ 79%] -tests/test_blast.py::TestBlast::test_blast_bad_seq PASSED [ 80%] -tests/test_blast.py::TestBlast::test_blast_bad_program PASSED [ 80%] -tests/test_blast.py::TestBlast::test_blast_db_missing PASSED [ 80%] -tests/test_blast.py::TestBlast::test_blast_nt PASSED [ 80%] -tests/test_mutate.py::test_mismatch_error PASSED [ 81%] -tests/test_mutate.py::test_csv_of_mutations PASSED [ 81%] -tests/test_mutate.py::TestMutate::test_inversion_with_overlaps PASSED [ 81%] -tests/test_mutate.py::TestMutate::test_index_error PASSED [ 81%] -tests/test_mutate.py::TestMutate::test_intron_mutation_plus PASSED [ 82%] -tests/test_mutate.py::TestMutate::test_list_of_mutations PASSED [ 82%] -tests/test_mutate.py::TestMutate::test_intron_mutation_minus PASSED [ 82%] -tests/test_mutate.py::TestMutate::test_single_substitution_near_left_end PASSED [ 82%] -tests/test_mutate.py::TestMutate::test_multi_insertion PASSED [ 83%] -tests/test_mutate.py::TestMutate::test_multi_deletion_with_right_repeats PASSED [ 83%] -tests/test_mutate.py::TestMutate::test_uncertain_mutation PASSED [ 83%] -tests/test_mutate.py::TestMutate::test_single_deletion PASSED [ 83%] -tests/test_mutate.py::TestMutate::test_single_substitution_near_right_end PASSED [ 84%] -tests/test_mutate.py::TestMutate::test_multi_delins PASSED [ 84%] -tests/test_mutate.py::TestMutate::test_multi_insertion_with_left_repeats PASSED [ 84%] -tests/test_mutate.py::TestMutate::test_single_deletion_with_left_repeats PASSED [ 84%] -tests/test_mutate.py::TestMutate::test_multi_delins_with_psuedo_left_repeats PASSED [ 85%] -tests/test_mutate.py::TestMutate::test_multi_deletion PASSED [ 85%] -tests/test_mutate.py::TestMutate::test_single_substitution PASSED [ 85%] -tests/test_mutate.py::TestMutate::test_single_deletion_with_right_repeats PASSED [ 85%] -tests/test_mutate.py::TestMutate::test_large_k PASSED [ 86%] -tests/test_mutate.py::TestMutate::test_multi_delins_with_true_right_repeats PASSED [ 86%] -tests/test_mutate.py::TestMutate::test_single_delins PASSED [ 86%] -tests/test_mutate.py::TestMutate::test_single_dup PASSED [ 86%] -tests/test_mutate.py::TestMutate::test_multi_dup PASSED [ 87%] -tests/test_mutate.py::TestMutate::test_ambiguous_mutation PASSED [ 87%] -tests/test_mutate.py::TestMutate::test_posttranslational_mutation PASSED [ 87%] -tests/test_mutate.py::TestMutate::test_single_insertion PASSED [ 87%] -tests/test_mutate.py::TestMutate::test_multi_delins_with_true_left_repeats PASSED [ 88%] -tests/test_cbio.py::TestCbio::test_cbio_download_partially_existing_files PASSED [ 88%] -tests/test_cbio.py::TestCbio::test_error_cbio_download PASSED [ 88%] -tests/test_cbio.py::TestCbio::test_cbio_download PASSED [ 88%] -tests/test_cbio.py::TestCbioSearch::test_cbio_search PASSED [ 88%] -tests/test_info.py::TestInfo::test_info_ncbitrue_uniprotfalse PASSED [ 89%] -tests/test_info.py::TestInfo::test_info_exon PASSED [ 89%] -tests/test_info.py::TestInfo::test_info_gene PASSED [ 89%] -tests/test_info.py::TestInfo::test_info_gene_list_non_model PASSED [ 89%] -tests/test_info.py::TestInfo::test_info_ncbifalse_uniprottrue PASSED [ 90%] -tests/test_info.py::TestInfo::test_info_ncbifalse_uniprotfalse PASSED [ 90%] -tests/test_info.py::TestInfo::test_info_mix PASSED [ 90%] -tests/test_info.py::TestInfo::test_info_WB_transcript PASSED [ 90%] -tests/test_info.py::TestInfo::test_info_transcript PASSED [ 91%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions PASSED [ 91%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap_filter PASSED [ 91%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_pharmacogenetics PASSED [ 91%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets PASSED [ 92%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_diseases_filter PASSED [ 92%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap PASSED [ 92%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_simple_filter PASSED [ 92%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_diseases PASSED [ 93%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_expression_no_limit SKIPPED [ 93%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_drugs_invalid_filter PASSED [ 93%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_expression SKIPPED [ 93%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_drugs PASSED [ 94%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_resource PASSED [ 94%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_nonexistent_id PASSED [ 94%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_tractability PASSED [ 94%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_limit PASSED [ 95%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_no_limit PASSED [ 95%] -tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata SKIPPED [ 95%] -tests/test_cellxgene.py::TestCellxgene::test_cellxgene_adata SKIPPED [ 95%] -tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata_macaca_mulatta SKIPPED [ 96%] -tests/test_cellxgene.py::TestCellxgeneValidation::test_invalid_species_raises_valueerror PASSED [ 96%] -tests/test_cellxgene.py::TestCellxgeneValidation::test_typo_species_raises_valueerror PASSED [ 96%] -tests/test_cellxgene.py::TestCellxgeneValidation::test_supported_species_includes_new_primates PASSED [ 96%] -tests/test_ref.py::TestRef::test_ref_list PASSED [ 97%] -tests/test_ref.py::TestRef::test_ref_rel_protist PASSED [ 97%] -tests/test_ref.py::TestRef::test_ref_bad_species PASSED [ 97%] -tests/test_ref.py::TestRef::test_ref_bad_which PASSED [ 97%] -tests/test_ref.py::TestRef::test_ref_which PASSED [ 98%] -tests/test_ref.py::TestRef::test_ref_plant PASSED [ 98%] -tests/test_ref.py::TestRef::test_ref_which_plant PASSED [ 98%] -tests/test_ref.py::TestRef::test_ref_rel_ftp PASSED [ 98%] -tests/test_ref.py::TestRef::test_ref_rel PASSED [ 99%] -tests/test_ref.py::TestRef::test_ref_ftp PASSED [ 99%] -tests/test_ref.py::TestRef::test_ref_rel_ftp_octopus PASSED [ 99%] -tests/test_ref.py::TestRef::test_ref_bad_rel PASSED [ 99%] -tests/test_ref.py::TestRef::test_ref PASSED [100%] - -=============================== warnings summary =============================== -tests/test_search.py::TestSearch::test_search_plant -tests/test_search.py::TestSearch::test_search_transcript_two_sw_or -tests/test_search.py::TestSearch::test_search_release -tests/test_utils.py::TestUtils::test_search_species_options - /home/runner/work/gget/gget/gget/utils.py:899: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. - for subsoup in soup.body.findAll("a"): - -tests/test_search.py::TestSearch::test_search_plant -tests/test_search.py::TestSearch::test_search_plant -tests/test_search.py::TestSearch::test_search_plant -tests/test_search.py::TestSearch::test_search_plant -tests/test_utils.py::TestUtils::test_search_iv_species_options -tests/test_utils.py::TestUtils::test_search_iv_species_options -tests/test_utils.py::TestUtils::test_search_iv_species_options -tests/test_utils.py::TestUtils::test_search_iv_species_options - /home/runner/work/gget/gget/gget/utils.py:883: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. - for subsoup in soup.body.findAll("a"): - -tests/test_search.py: 10 warnings - /home/runner/work/gget/gget/gget/gget_search.py:267: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy. - df_temp = pd.read_sql(query, con=db_connection) - -tests/test_search.py: 19 warnings -tests/test_ref.py: 7 warnings - /home/runner/work/gget/gget/gget/utils.py:922: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. - for subsoup in soup.body.findAll("a"): - -tests/test_search.py::TestSearch::test_search_transcript_two_sw_and -tests/test_search.py::TestSearch::test_search_transcript_two_sw_or -tests/test_search.py::TestSearch::test_search_gene_two_sw_limit -tests/test_search.py::TestSearch::test_search_transcript_one_sw - /home/runner/work/gget/gget/gget/gget_search.py:302: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy. - df_temp = pd.read_sql(query, con=db_connection) - -tests/test_utils.py: 4 warnings -tests/test_ref.py: 24 warnings - /home/runner/work/gget/gget/gget/utils.py:975: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. - for subsoup in soup.body.findAll("a"): - -tests/test_utils.py: 1 warning -tests/test_ref.py: 11 warnings - /home/runner/work/gget/gget/gget/utils.py:998: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. - for subsoup in soup.body.findAll("a"): - -tests/test_mutate.py: 29 warnings - /home/runner/work/gget/gget/gget/gget_mutate.py:667: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract. - mask = mutations[mut_column].str.contains(combined_pattern) - -tests/test_cbio.py::TestCbioSearch::test_cbio_search -tests/test_cbio.py::TestCbioSearch::test_cbio_search - /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/swagger_spec_validator/validator12.py:18: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. - from jsonschema import RefResolver - -tests/test_cbio.py::TestCbioSearch::test_cbio_search - /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/swagger_spec_validator/ref_validators.py:14: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. - from jsonschema.validators import RefResolver - -tests/test_cbio.py::TestCbioSearch::test_cbio_search - /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/swagger_spec_validator/validator20.py:18: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. - from jsonschema.validators import RefResolver - -tests/test_cbio.py::TestCbioSearch::test_cbio_search -tests/test_cbio.py::TestCbioSearch::test_cbio_search - /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/bravado_core/swagger20_validator.py:6: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. - from jsonschema import RefResolver - -tests/test_cbio.py::TestCbioSearch::test_cbio_search - /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/bravado_core/spec.py:14: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. - from jsonschema.validators import RefResolver - -tests/test_cbio.py: 16 warnings - /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/bravado_core/model.py:888: DeprecationWarning: jsonschema.RefResolver.in_scope is deprecated and will be removed in a future release. - with spec.resolver.in_scope(additional_uri): - -tests/test_ref.py: 39 warnings - /home/runner/work/gget/gget/gget/gget_ref.py:49: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. - links = [stuff.text.strip() for stuff in soup.findAll("td")] - -tests/test_ref.py::TestRef::test_ref_ftp -tests/test_ref.py::TestRef::test_ref - /home/runner/work/gget/gget/gget/gget_ref.py:325: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. - links = [stuff.text.strip() for stuff in soup.findAll("td")] - --- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html -============================= slowest 10 durations ============================= -184.25s call tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter -177.79s call tests/test_virus.py::TestVirus::test_virus_with_source_database_filter -134.37s call tests/test_virus.py::TestVirus::test_virus_integer_virus_id -131.12s call tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter -82.32s call tests/test_blast.py::TestBlast::test_blast_nt -73.55s call tests/test_virus.py::TestVirus::test_virus_with_annotated_filter -73.25s call tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters -71.92s call tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter -68.64s call tests/test_search.py::TestSearch::test_search_gene_two_sw_limit -22.03s call tests/test_virus.py::TestVirus::test_virus_host_filter_verification -=========================== short test summary info ============================ -SKIPPED [2] tests/from_json.py:286: Open Targets deprecated the `expressions` GraphQL field (returns []) in favor of `baselineExpression`, which has a different schema (tissueBiosample, q1/q3/median/min/max instead of tissue/rna sub-objects). Migration is a user-facing API change; tracked separately. -SKIPPED [1] tests/test_cellxgene.py:55: cellxgene-census is not installed -SKIPPED [1] tests/test_cellxgene.py:45: cellxgene-census is not installed -SKIPPED [1] tests/test_cellxgene.py:65: cellxgene-census is not installed -========== 404 passed, 5 skipped, 185 warnings in 2070.38s (0:34:30) =========== +tests/test_virus.py::TestVirus::test_get_modified_virus_name_invalid_attempt_returns_none PASSED [ 64%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_true PASSED [ 64%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype PASSED [ 65%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_no_filters PASSED [ 65%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_missing_accession PASSED [ 65%] +tests/test_virus.py::TestVirus::test_merge_baseline_with_new_csv PASSED [ 65%] +tests/test_virus.py::TestVirus::test_virus_multi_accession_file_input PASSED [ 65%] +tests/test_virus.py::TestVirus::test_parse_date_invalid_raises PASSED [ 66%] +tests/test_virus.py::TestVirus::test_filter_cached_refseq_only PASSED [ 66%] +tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_negative PASSED [ 66%] +tests/test_virus.py::TestVirus::test_parse_date_full PASSED [ 66%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_false PASSED [ 67%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_type PASSED [ 67%] +tests/test_virus.py::TestVirus::test_virus_invalid_annotated_type PASSED [ 67%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_nonexistent_raises PASSED [ 67%] +tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_accession_mode PASSED [ 68%] +tests/test_virus.py::TestVirus::test_parse_accession_input_single PASSED [ 68%] +tests/test_virus.py::TestVirus::test_stream_copy_fasta_with_accession_filter PASSED [ 68%] +tests/test_blat.py::TestBlat::test_blat_aa_protein PASSED [ 68%] +tests/test_blat.py::TestBlat::test_blat_nt_RNA PASSED [ 69%] +tests/test_blat.py::TestBlat::test_blat_bad_seqtype PASSED [ 69%] +tests/test_blat.py::TestBlat::test_blat_bad_fasta PASSED [ 69%] +tests/test_blat.py::TestBlat::test_blat_nt_transDNA PASSED [ 69%] +tests/test_blat.py::TestBlat::test_blat_bad_assembly PASSED [ 70%] +tests/test_blat.py::TestBlat::test_blat_aa PASSED [ 70%] +tests/test_blat.py::TestBlat::test_blat_nt_protein PASSED [ 70%] +tests/test_blat.py::TestBlat::test_blat_nt PASSED [ 70%] +tests/test_blat.py::TestBlat::test_blat_nt_json PASSED [ 70%] +tests/test_blat.py::TestBlat::test_blat_bad_txt PASSED [ 71%] +tests/test_blat.py::TestBlat::test_blat_bad_fileformat PASSED [ 71%] +tests/test_blat.py::TestBlat::test_blat_aa_RNA PASSED [ 71%] +tests/test_blat.py::TestBlat::test_blat_nt_txt PASSED [ 71%] +tests/test_blat.py::TestBlat::test_blat_nt_DNA PASSED [ 72%] +tests/test_blat.py::TestBlat::test_blat_shortseq PASSED [ 72%] +tests/test_blat.py::TestBlat::test_blat_nt_fasta PASSED [ 72%] +tests/test_compile.py::TestCompilerWindows::test_compiler_windows PASSED [ 72%] +tests/test_g2p.py::TestG2P::test_g2p_schema_invariant_across_input_modes PASSED [ 73%] +tests/test_g2p.py::TestG2P::test_g2p_invalid_pair_returns_none PASSED [ 73%] +tests/test_g2p.py::TestG2P::test_g2p_features PASSED [ 73%] +tests/test_g2p.py::TestG2P::test_g2p_residues_filter PASSED [ 73%] +tests/test_g2p.py::TestG2P::test_g2p_uniprot_auto_resolved PASSED [ 74%] +tests/test_g2p.py::TestG2P::test_g2p_out_writes_to_explicit_path PASSED [ 74%] +tests/test_g2p.py::TestG2P::test_g2p_residues_single_int PASSED [ 74%] +tests/test_g2p.py::TestG2P::test_g2p_alignment PASSED [ 74%] +tests/test_g2p.py::TestG2P::test_g2p_map_has_pdb_list_column PASSED [ 75%] +tests/test_g2p.py::TestG2P::test_g2p_map PASSED [ 75%] +tests/test_g2p.py::TestG2P::test_g2p_gene_auto_resolved PASSED [ 75%] +tests/test_g2p.py::TestG2PValidation::test_alignment_requires_isoform PASSED [ 75%] +tests/test_g2p.py::TestG2PValidation::test_missing_both_raises PASSED [ 75%] +tests/test_g2p.py::TestG2PValidation::test_residues_wrong_type_raises PASSED [ 76%] +tests/test_g2p.py::TestG2PValidation::test_alignment_requires_explicit_uniprot PASSED [ 76%] +tests/test_g2p.py::TestG2PValidation::test_residues_on_map_raises PASSED [ 76%] +tests/test_g2p.py::TestG2PValidation::test_invalid_resource_raises PASSED [ 76%] +tests/test_pdb.py::TestPDB::test_pdb_mmcif PASSED [ 77%] +tests/test_pdb.py::TestPDB::test_pdb_legacy_fallback_to_mmcif PASSED [ 77%] +tests/test_pdb.py::TestPDB::test_pdb_pdb PASSED [ 77%] +tests/test_pdb.py::TestPDB::test_pdb_assembly PASSED [ 77%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_no_limit PASSED [ 78%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions PASSED [ 78%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap_filter PASSED [ 78%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_resource PASSED [ 78%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_limit PASSED [ 79%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap PASSED [ 79%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_drugs_invalid_filter PASSED [ 79%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_nonexistent_id PASSED [ 79%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_simple_filter PASSED [ 80%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_expression SKIPPED [ 80%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_drugs PASSED [ 80%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_tractability PASSED [ 80%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_diseases PASSED [ 80%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_diseases_filter PASSED [ 81%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_pharmacogenetics PASSED [ 81%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_expression_no_limit SKIPPED [ 81%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets PASSED [ 81%] +tests/test_muscle.py::TestMuscle::test_muscle_nt_txt PASSED [ 82%] +tests/test_muscle.py::TestMuscle::test_muscle_nt PASSED [ 82%] +tests/test_muscle.py::TestMusclePrints::test_muscle_print_nt PASSED [ 82%] +tests/test_muscle.py::TestMuscleSeqsInput::test_muscle_seqs_as_input PASSED [ 82%] +tests/test_muscle.py::TestMuscleAA::test_muscle_aa PASSED [ 83%] +tests/test_muscle.py::TestMuscleAASuper::test_muscle_aa_super5 PASSED [ 83%] +tests/test_muscle.py::TestMuscleSuper::test_muscle_nt_super5 PASSED [ 83%] +tests/test_ref.py::TestRef::test_ref_plant PASSED [ 83%] +tests/test_ref.py::TestRef::test_ref_rel_ftp_octopus PASSED [ 84%] +tests/test_ref.py::TestRef::test_ref_bad_rel PASSED [ 84%] +tests/test_ref.py::TestRef::test_ref_bad_which PASSED [ 84%] +tests/test_ref.py::TestRef::test_ref_rel_protist PASSED [ 84%] +tests/test_ref.py::TestRef::test_ref_ftp PASSED [ 85%] +tests/test_ref.py::TestRef::test_ref PASSED [ 85%] +tests/test_ref.py::TestRef::test_ref_which_plant PASSED [ 85%] +tests/test_ref.py::TestRef::test_ref_rel_ftp PASSED [ 85%] +tests/test_ref.py::TestRef::test_ref_list PASSED [ 85%] +tests/test_ref.py::TestRef::test_ref_rel PASSED [ 86%] +tests/test_ref.py::TestRef::test_ref_which PASSED [ 86%] +tests/test_ref.py::TestRef::test_ref_bad_species PASSED [ 86%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_json PASSED [ 86%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_mouse_is_human PASSED [ 87%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_fly PASSED [ 87%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_gene PASSED [ 87%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_kinase_interactions PASSED [ 87%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_database_shortcut PASSED [ 88%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_background PASSED [ 88%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background_list PASSED [ 88%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_none PASSED [ 88%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_diseases_drugs PASSED [ 89%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_celltypes PASSED [ 89%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_species PASSED [ 89%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_worm PASSED [ 89%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_yeast PASSED [ 90%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_plot PASSED [ 90%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_background_ensembl PASSED [ 90%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background PASSED [ 90%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_ontology PASSED [ 90%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_transcription PASSED [ 91%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_ensembl_ids PASSED [ 91%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_pathway PASSED [ 91%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_fish PASSED [ 91%] +tests/test_8cube.py::TestSpecificity::test_specificity_basic PASSED [ 92%] +tests/test_8cube.py::TestGeneExpression::test_gene_expression_basic PASSED [ 92%] +tests/test_8cube.py::TestPsiBlock::test_psi_block_basic PASSED [ 92%] +tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_default_dir PASSED [ 92%] +tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_clean_up_missing_dir_is_safe PASSED [ 93%] +tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_clean_up_default_dir_when_none PASSED [ 93%] +tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_custom_dir PASSED [ 93%] +tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_cli_exposes_jackhmmer_savedir_flag PASSED [ 93%] +tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_clean_up_removes_custom_dir PASSED [ 94%] +tests/test_blast.py::TestBlast::test_blast_db_missing PASSED [ 94%] +tests/test_blast.py::TestBlast::test_blast_bad_db1 PASSED [ 94%] +tests/test_blast.py::TestBlast::test_blast_bad_db2 PASSED [ 94%] +tests/test_blast.py::TestBlast::test_blast_bad_seq PASSED [ 95%] +tests/test_blast.py::TestBlast::test_blast_bad_program PASSED [ 95%] +tests/test_blast.py::TestBlast::test_blast_nt \ No newline at end of file From 81b319e027ff53efaa107147888b283c02b1a776 Mon Sep 17 00:00:00 2001 From: Elarwei <168552401+Elarwei001@users.noreply.github.com> Date: Sun, 28 Jun 2026 04:10:51 +0800 Subject: [PATCH 25/34] docs(opentargets): correct all example tables/filters + clarify diseases score & IDs (#240) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * docs(opentargets): clarify diseases score meaning and EFO/MONDO IDs (#168) Clarify in the documentation that the `diseases` resource `score` is OpenTargets' single overall target–disease association score (0–1) aggregated across all data types/sources (not a per-data-source score), and that the returned `disease.id` values are EFO-mapped traits that include not only MONDO diseases but also HP phenotypes and EFO measurements (e.g. "blood protein measurement"). gget returns the associations exactly as OpenTargets reports them; documented how to filter to MONDO terms only. Also updated the diseases example table to the current post-rewrite column names. Co-Authored-By: Claude Opus 4.8 (1M context) * docs(opentargets): replace stale EFO example with generic phrasing The diseases-score note cited `EFO_0007937` "blood protein measurement" as an example of an EFO measurement trait surfacing as a "disease". That ID is stale — copied verbatim from the 2024-era issue #168 (gget 0.29.0). Against the current Open Targets API: - EFO_0007937 no longer resolves (direct lookup + search both empty) - "blood protein measurement" is no longer a standalone term (closest current ID is EFO_0004536 "total blood protein measurement") - it no longer appears in LILRA4's associations Rather than swap in another exact ID that will rot the same way, replace it with generic phrasing ("biomarker or blood-measurement traits"). The conceptual point — EFO measurement traits appear among the results — is verified correct: LILRA4 currently returns a mix of MONDO/HP/EFO/Orphanet IDs. The rest of the note (overall-score semantics, the MONDO_0004980 atopic-eczema example, the MONDO filter recipe) was fact-checked against the live API and is accurate. * docs(opentargets): correct all example tables to actual 0.30.5+ output Verified every resource example against live API output. Only the `diseases` table (fixed earlier in this PR) was correct; the other six example tables and the resource "Valid Filters" column still showed pre-0.30.5 column names that no longer exist, so anyone copying them (especially into --filter) would get wrong results or a "Filter key not found" ValueError. Corrected against real output for ENSG00000169194 (IL13): - drugs: id/name/type/... -> drug.id/drug.name/drug.drugType/ drug.mechanismsOfAction.rows/.../drug.indications.rows - tractability: label/modality -> modality/label/value (value was missing) - pharmacogenetics: rs_id/genotype_id/... -> variantId/genotypeId/.../ variantFunctionalConsequence.id/.label - expression: reordered to actual column order, added celltypeBiosample.* columns + a single-cell example row - depmap: depmap_id/effect/tissue_id/... -> tissueId/tissueName/ cellLineName/expression/diseaseFromSource/depmapId/geneEffect - interactions: evidence_score/source_db/protein_a_id/... -> score/ sourceDatabase/intA/.../targetB.approvedSymbol (taxonId is 134, not 9606) Replaced the two interactions filter examples, which documented a removed API (filter_mode/OR and -fpa/--filter_gene_b shortcuts removed in 0.30.5; protein_a_id/gene_b_id keys are not real columns), with one working example using the generic --filter key=value on real column names. Updated the resource table's "Valid Filters" column accordingly. Co-Authored-By: Claude Opus 4.7 (1M context) --------- Co-authored-by: Claude Opus 4.8 (1M context) Co-authored-by: Laura Luebbert --- docs/src/en/opentargets.md | 121 ++++++++++++++++--------------------- docs/src/en/updates.md | 1 + 2 files changed, 52 insertions(+), 70 deletions(-) diff --git a/docs/src/en/opentargets.md b/docs/src/en/opentargets.md index 9b2cc2122..b1966a5f3 100644 --- a/docs/src/en/opentargets.md +++ b/docs/src/en/opentargets.md @@ -20,13 +20,13 @@ Possible resources are: | Resource | Return Value | Valid Filters | Sources | |--------------------|-------------------------------------------------------------------|---------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `diseases` | Associated diseases | None | Various:
  • [Open Targets](https://genetics.opentargets.org/)
  • [ChEMBL](https://www.ebi.ac.uk/chembl/)
  • [Europe PMC](http://europepmc.org/)
etc. | -| `drugs` | Associated drugs | `disease_id` | [ChEMBL](https://www.ebi.ac.uk/chembl/) | +| `diseases` | Associated diseases, phenotypes & traits (EFO-mapped) with the overall association `score` (0–1) | None | Various:
  • [Open Targets](https://genetics.opentargets.org/)
  • [ChEMBL](https://www.ebi.ac.uk/chembl/)
  • [Europe PMC](http://europepmc.org/)
etc. | +| `drugs` | Associated drugs | `drug.drugType`
`drug.maximumClinicalStage` | [ChEMBL](https://www.ebi.ac.uk/chembl/) | | `tractability` | Tractability data | None | [Open Targets](https://platform-docs.opentargets.org/target/tractability) | -| `pharmacogenetics` | Pharmacogenetic responses | `drug_id` | [PharmGKB](https://www.pharmgkb.org/) | +| `pharmacogenetics` | Pharmacogenetic responses | `datasourceId`
`pgxCategory`
`evidenceLevel` | [PharmGKB](https://www.pharmgkb.org/) | | `expression` | Baseline expression per biosample (tissue/cell type) with summary statistics | `tissueBiosample.biosampleId`
`datasourceId`
`datatypeId` |
  • [GTEx](https://www.gtexportal.org/home/)
  • [ExpressionAtlas](https://www.ebi.ac.uk/gxa/home)
  • single-cell datasets
| -| `depmap` | DepMap gene→disease-effect data. | `tissue_id` | [DepMap Portal](https://depmap.org/portal/) | -| `interactions` | Protein⇄protein interactions | `protein_a_id`
`protein_b_id`
`gene_b_id` |
  • [Open Targets](https://platform-docs.opentargets.org/target/molecular-interactions)
  • [IntAct](https://platform-docs.opentargets.org/target/molecular-interactions#intact)
  • [Signor](https://platform-docs.opentargets.org/target/molecular-interactions#signor)
  • [Reactome](https://platform-docs.opentargets.org/target/molecular-interactions#reactome)
  • [String](https://platform-docs.opentargets.org/target/molecular-interactions#string)
| +| `depmap` | DepMap gene→disease-effect data. | `tissueId`
`diseaseFromSource` | [DepMap Portal](https://depmap.org/portal/) | +| `interactions` | Protein⇄protein interactions | `sourceDatabase`
`targetB.id`
`targetB.approvedSymbol` |
  • [Open Targets](https://platform-docs.opentargets.org/target/molecular-interactions)
  • [IntAct](https://platform-docs.opentargets.org/target/molecular-interactions#intact)
  • [Signor](https://platform-docs.opentargets.org/target/molecular-interactions#signor)
  • [Reactome](https://platform-docs.opentargets.org/target/molecular-interactions#reactome)
  • [String](https://platform-docs.opentargets.org/target/molecular-interactions#string)
| `-l` `--limit` Limit the number of results, e.g 10. Default: No limit. @@ -68,9 +68,13 @@ gget.opentargets('ENSG00000169194', resource='diseases', limit=1) ``` → Returns the top disease associated with the gene ENSG00000169194. -| id | name | description | score | -|---------------|--------------------|-----------------------------------------------------------------------|------------------| -| EFO_0000274 | atopic eczema | A chronic inflammatory genetically determined disease of the skin ... | 0.66364347241831 | +| score | disease.id | disease.name | disease.description | +|--------------------|----------------|--------------------|-------------------------------------------------------------------------| +| 0.7279798021712002 | MONDO_0004980 | atopic eczema | A common chronic pruritic inflammatory skin disease with a strong ... | + +> **Understanding the `score` column and disease IDs** ([issue #168](https://github.com/scverse/gget/issues/168)) +> - `score` is OpenTargets' **overall target–disease association score** — a single value between 0 and 1 that aggregates the evidence across *all* data types and data sources. It is **not** a per-data-source score. The OpenTargets website shows, in addition, a per-data-type breakdown (genetic associations, somatic mutations, known drugs, animal models, etc.) in its "Associations" view; `gget opentargets` currently returns only the aggregated `score`, so a single gget row corresponds to one whole row of that web table. +> - `disease.id` is an [EFO](https://www.ebi.ac.uk/efo/) ontology ID. OpenTargets maps every associated trait to EFO, which imports terms from several ontologies. As a result the returned IDs are **not exclusively diseases**: they can be MONDO disease terms (`MONDO_*`), Human Phenotype Ontology phenotypes (`HP_*`), Orphanet rare diseases (`Orphanet_*`), or EFO measurements/traits (`EFO_*`, e.g. biomarker or blood-measurement traits). `gget opentargets` returns the associations **exactly as OpenTargets reports them**, without dropping non-disease terms. To keep only MONDO disease terms, filter the returned data frame, e.g. `df[df["disease.id"].str.startswith("MONDO")]`.

@@ -86,12 +90,12 @@ gget.opentargets('ENSG00000169194', resource='drugs', limit=2) → Returns the top 2 drugs associated with the gene ENSG00000169194. -| id | name | type | action_mechanism | description | synonyms | trade_names | disease_id | disease_name | trial_phase | trial_status | trial_ids | approved | -|---------------|--------------|----------|-------------------------------------|--------------------------------------------------------------|----------------------------------------------------|-----------------------|-------------|-------------------------------|-------------|--------------|---------------|----------| -| CHEMBL1743081 | TRALOKINUMAB | Antibody | Interleukin‑13 inhibitor | Antibody drug with a maximum clinical trial phase of IV ... | ['CAT-354', 'Tralokinumab'] | ['Adbry', 'Adtralza'] | EFO_0000274 | atopic eczema | 4 | | [] | True | -| CHEMBL4297864 | CENDAKIMAB | Antibody | Interleukin‑13 inhibitor | Antibody drug with a maximum clinical trial phase of III ... | [ABT-308, Abt-308, CC-93538, Cendakimab, RPC-4046] | [] | EFO_0004232 | eosinophilic esophagitis | 3 | Recruiting | [NCT04991935] | False | +| drug.id | drug.name | drug.drugType | drug.mechanismsOfAction.rows | drug.description | drug.synonyms | drug.tradeNames | drug.maximumClinicalStage | drug.indications.rows | +|---------------|--------------|---------------|-------------------------------------|--------------------------------------------------------------|----------------------------------------|-----------------|---------------------------|---------------------------------------------------------------------------------| +| CHEMBL1743035 | LEBRIKIZUMAB | Antibody | Interleukin‑13 inhibitor | Antibody drug with a maximum clinical stage of Approval ... | ['Lebrikizumab', 'MILR-1444A', ...] | Ebglyss | APPROVAL | [{'id': 'MONDO_0004980', 'name': 'atopic eczema'}, {'id': 'MONDO_0004979', 'name': 'asthma'}, ...] | +| CHEMBL1742985 | ANRUKINZUMAB | Antibody | Interleukin‑13 inhibitor | Antibody drug with a maximum clinical stage of Phase 2 ... | ['Anrukinzumab', 'IMA-638'] | [] | PHASE2 | [{'id': 'MONDO_0005101', 'name': 'ulcerative colitis'}, ...] | -*Note: Returned `trial_ids` are [ClinicalTrials.gov](https://clinicaltrials.gov) identifiers* +*Note: associated diseases/indications are nested under `drug.indications.rows` (each a `{'id', 'name'}` dict); the `drug.id` values are [ChEMBL](https://www.ebi.ac.uk/chembl/) identifiers.*

@@ -107,13 +111,14 @@ gget.opentargets('ENSG00000169194', resource='tractability') → Returns tractability data for the gene ENSG00000169194. -| label | modality | -|-----------------------|----------------| -| High-Quality Pocket | Small molecule | -| Approved Drug | Antibody | -| GO CC high conf | Antibody | -| UniProt loc med conf | Antibody | -| UniProt SigP or TMHMM | Antibody | +| modality | label | value | +|----------|---------------------|-------| +| SM | Approved Drug | False | +| SM | High-Quality Pocket | True | +| AB | Approved Drug | True | +| AB | Advanced Clinical | False | + +*Note: `modality` is `SM` (small molecule), `AB` (antibody), `PR` (PROTAC), `OC` (other clinical), etc.; `value` is a boolean indicating whether the target meets that tractability bucket.*

@@ -129,11 +134,11 @@ gget.opentargets('ENSG00000169194', resource='pharmacogenetics', limit=1) → Returns pharmacogenetic responses for the gene ENSG00000169194. -| rs_id | genotype_id | genotype | variant_consequence_id | variant_consequence_label | drugs | phenotype | genotype_annotation | response_category | direct_target | evidence_level | source | literature | -|-----------|-------------------|----------|------------------------|---------------------------|-----------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------|-------------------|---------------|----------------|----------|------------| -| rs1295686 | 5_132660151_T_T,T | TT | SO:0002073 | no_sequence_alteration |     id        name
0  None  hepatitis vaccines | increased risk for non‑immune response to the hepatitis B vaccine | Patients with the TT genotype may be at increased risk for non-immune response to the hepatitis B vaccine... | efficacy | False | 3 | pharmgkb | [21111021] | +| variantId | genotypeId | genotype | drugs | phenotypeText | genotypeAnnotationText | pgxCategory | isDirectTarget | evidenceLevel | datasourceId | literature | variantFunctionalConsequence.id | variantFunctionalConsequence.label | +|-----------------|--------------------|----------|---------------------------------------------|--------------------------------------------|-------------------------------------------|-------------|----------------|---------------|--------------|------------|---------------------------------|------------------------------------| +| 5_132657117_C_T | 5_132657117_C_C,T | CT | {'id': 'CHEMBL535', 'name': 'SUNITINIB'} | decreased severity of drug-induced toxicity | Patients with renal cell carcinoma and ... | toxicity | False | 3 | clinpgx | 26387812 | SO:0001631 | upstream_gene_variant | -*Note: Returned `literature` ids are [Europe PMC](https://europepmc.org/article/med/) identifiers* +*Note: `drugs` is a `{'id', 'name'}` dict (or list of them); `literature` ids are [Europe PMC](https://europepmc.org/article/med/) identifiers.*

@@ -149,9 +154,12 @@ gget.opentargets('ENSG00000169194', resource='expression', limit=2) → Returns baseline expression summary statistics for the gene ENSG00000169194 per biosample. -| tissueBiosample.biosampleId | tissueBiosample.biosampleName | median | min | q1 | q3 | max | unit | datasourceId | datatypeId | -|-----------------------------|-------------------------------|----------|-----|----------|----------|---------|------|--------------|--------------| -| UBERON_0000007 | pituitary gland | 0.066891 | 0 | 0.028268 | 0.142208 | 1.69407 | TPM | gtex | bulk rna-seq | +| median | min | q1 | q3 | max | unit | datasourceId | datatypeId | tissueBiosample.biosampleId | tissueBiosample.biosampleName | celltypeBiosample.biosampleId | celltypeBiosample.biosampleName | +|----------|-----|----------|----------|---------|-----------------------------|----------------|---------------|-----------------------------|-------------------------------|-------------------------------|---------------------------------| +| 0.066891 | 0 | 0.028268 | 0.142208 | 1.69407 | TPM | gtex | bulk rna-seq | UBERON_0000007 | pituitary gland | None | None | +| 0.0 | 0 | 0.0 | 0.0 | 0.0 | CPM(pseudobulk sum) | tabula_sapiens | scrna-seq | UBERON_0000016 | endocrine pancreas | CL_0000115 | endothelial cell | + +*Note: bulk sources (e.g. GTEx) populate only `tissueBiosample.*` (`celltypeBiosample.*` is `None`); single-cell sources (e.g. Tabula Sapiens) populate both.* > **Note (OpenTargets API change):** OpenTargets retired the per-tissue `target.expressions` field (it now returns nothing) and moved baseline expression to the paginated `target.baselineExpression` field. `gget opentargets -r expression` now returns per-biosample expression summary statistics (`median`, `min`, `q1`, `q3`, `max`) from the current sources (e.g. GTEx bulk RNA-seq and single-cell datasets), with `tissueBiosample`/`celltypeBiosample` identifiers and `datasourceId`/`datatypeId` so results can be filtered. The returned columns therefore differ from earlier gget versions. A gene can have thousands of biosamples; OpenTargets returns at most 3000 per request, so for genes that exceed this a warning is logged and you should narrow the query with `--filters` (e.g. `datasourceId` or `datatypeId`). Use `--limit` to fetch fewer rows. @@ -169,9 +177,9 @@ gget.opentargets('ENSG00000169194', resource='depmap') → Returns DepMap gene-disease effect data for the gene ENSG00000169194. -| depmap_id | expression | effect | tissue_id | tissue_name | cell_line_name | disease_cell_line_id | disease_name | mutation | -|------------------|------------|----------|----------------|-------------|----------------|----------------------|----------------------|----------| -| ACH‑001532 | 0.176323 | 0.054950 | UBERON_0002113 | kidney | JMU-RTK-2 | None | Rhabdoid Cancer | None | +| tissueId | tissueName | cellLineName | expression | diseaseFromSource | depmapId | geneEffect | +|----------------|------------|--------------|-------------|-----------------------|-------------|-------------| +| UBERON_0000977 | pleura | NCI-H2452 | 0.0223550275 | Pleural Mesothelioma | ACH-000092 | 0.0368397422 |

@@ -187,57 +195,30 @@ gget.opentargets('ENSG00000169194', resource='interactions', limit=2) → Returns the top 2 protein-protein interactions for the gene ENSG00000169194. -| evidence_score | evidence_count | source_db | protein_a_id | gene_a_id | gene_a_symbol | role_a | taxon_a | protein_b_id | gene_b_id | gene_b_symbol | role_b | taxon_b | -|----------------|----------------|-----------|-----------------|-----------------|---------------|-----------------------|---------|-----------------|-----------------|---------------|-----------------------|---------| -| 0.999 | 3 | string | ENSP00000304915 | ENSG00000169194 | IL13 | unspecified role | 9606 | ENSP00000379111 | ENSG00000077238 | IL4R | unspecified role | 9606 | -| 0.999 | 3 | string | ENSP00000304915 | ENSG00000169194 | IL13 | unspecified role | 9606 | ENSP00000360730 | ENSG00000131724 | IL13RA1 | unspecified role | 9606 | +| score | count | sourceDatabase | intA | intABiologicalRole | intB | intBBiologicalRole | targetA.id | targetA.approvedSymbol | speciesA.taxonId | targetB.id | targetB.approvedSymbol | speciesB.taxonId | +|-------|-------|----------------|-----------------|-----------------------|-----------------|-----------------------|-----------------|------------------------|------------------|-----------------|------------------------|------------------| +| 0.999 | 3 | string | ENSP00000304915 | unspecified role | ENSP00000360730 | unspecified role | ENSG00000169194 | IL13 | 134 | ENSG00000131724 | IL13RA1 | 134 | +| 0.999 | 3 | string | ENSP00000304915 | unspecified role | ENSP00000361004 | unspecified role | ENSG00000169194 | IL13 | 134 | ENSG00000123496 | IL13RA2 | 134 |

-**Get protein-protein interactions for a specific gene, filtering by protein and gene IDs:** +**Get protein-protein interactions for a specific gene, filtered by column values:** + +Filters use the generic `--filter key=value` flag (CLI) / `filters={...}` argument (Python), where the keys are the exact returned column names. Multiple filters are combined with **AND** (exact equality). (The previous `filter_mode`/OR option and the `-fpa`/`--filter_gene_b` shortcuts were removed in v0.30.5.) ```bash -gget opentargets ENSG00000169194 -r interactions -fpa P35225 --filter_gene_b ENSG00000077238 +gget opentargets ENSG00000169194 -r interactions --filter sourceDatabase=string --filter targetB.approvedSymbol=IL13RA1 ``` ```python # Python import gget -gget.opentargets('ENSG00000169194', resource='interactions', filters={'protein_a_id': 'P35225', 'gene_b_id': 'ENSG00000077238'}) +gget.opentargets('ENSG00000169194', resource='interactions', filters={'sourceDatabase': 'string', 'targetB.approvedSymbol': 'IL13RA1'}) ``` -→ Returns protein-protein interactions for the gene ENSG00000169194, where the first protein is P35225 **and** the second gene is ENSG00000077238. - -| evidence_score | evidence_count | source_db | protein_a_id | gene_a_id | gene_a_symbol | role_a | taxon_a | protein_b_id | gene_b_id | gene_b_symbol | role_b | taxon_b | -|----------------|----------------|-----------|--------------|-----------------|---------------|-----------------------|---------|--------------|-----------------|---------------|-----------------------|---------| -| None | 3 | reactome | P35225 | ENSG00000169194 | IL13 | unspecified role | 9606 | P24394 | ENSG00000077238 | IL4R | unspecified role | 9606 | -| None | 2 | signor | P35225 | ENSG00000169194 | IL13 | regulator | 9606 | P24394 | ENSG00000077238 | IL4R | regulator target | 9606 | - -

+→ Returns the `string`-sourced interactions of IL13 where the partner is IL13RA1. -**Get protein-protein interactions for a specific gene, filtering by protein or gene IDs:** -```bash -gget opentargets ENSG00000169194 -r interactions -fpa P35225 --filter_gene_b ENSG00000077238 ENSG00000111537 --or -l 5 -``` -```python -# Python -import gget -gget.opentargets( - 'ENSG00000169194', - resource='interactions', - filters={'protein_a_id': 'P35225', 'gene_b_id': ['ENSG00000077238', 'ENSG00000111537']}, - filter_mode='or', - limit=5 -) -``` - -→ Returns protein-protein interactions for the gene ENSG00000169194, where the first protein is P35225 **or** the second gene is either ENSG00000077238 or ENSG00000111537. - -| evidence_score | evidence_count | source_db | protein_a_id | gene_a_id | gene_a_symbol | role_a | taxon_a | protein_b_id | gene_b_id | gene_b_symbol | role_b | taxon_b | -|----------------|----------------|-----------|-----------------|-----------------|---------------|-----------------------|---------|-----------------|-----------------|---------------|-----------------------|---------| -| 0.999 | 3 | string | ENSP00000304915 | ENSG00000169194 | IL13 | unspecified role | 9606 | ENSP00000379111 | ENSG00000077238 | IL4R | unspecified role | 9606 | -| 0.961 | 2 | string | ENSP00000304915 | ENSG00000169194 | IL13 | unspecified role | 9606 | ENSP00000229135 | ENSG00000111537 | IFNG | unspecified role | 9606 | -| 0.800 | 9 | intact | P35225 | ENSG00000169194 | IL13 | unspecified role | 9606 | Q14627 | ENSG00000123496 | IL13RA2 | unspecified role | 9606 | -| 0.740 | 6 | intact | P35225 | ENSG00000169194 | IL13 | unspecified role | 9606 | P78552 | ENSG00000131724 | IL13RA1 | unspecified role | 9606 | -| 0.400 | 1 | intact | P35225 | ENSG00000169194 | IL13 | unspecified role | 9606 | Q86XT9 | ENSG00000149932 | TMEM219 | stimulator | 9606 | +| score | count | sourceDatabase | intA | intABiologicalRole | intB | intBBiologicalRole | targetA.id | targetA.approvedSymbol | speciesA.taxonId | targetB.id | targetB.approvedSymbol | speciesB.taxonId | +|-------|-------|----------------|-----------------|-----------------------|-----------------|-----------------------|-----------------|------------------------|------------------|-----------------|------------------------|------------------| +| 0.999 | 3 | string | ENSP00000304915 | unspecified role | ENSP00000360730 | unspecified role | ENSG00000169194 | IL13 | 134 | ENSG00000131724 | IL13RA1 | 134 | diff --git a/docs/src/en/updates.md b/docs/src/en/updates.md index 06e135aec..8d4d20ac4 100644 --- a/docs/src/en/updates.md +++ b/docs/src/en/updates.md @@ -20,6 +20,7 @@ - [`gget opentargets`](opentargets.md): Adapted to several upstream Open Targets GraphQL API changes: - **Fixed**: `gget opentargets resource="drugs"` was failing with `HTTP 400 — Field 'synonyms' of type '[DrugLabelAndSource!]!' must have a sub selection.` Open Targets changed `Drug.synonyms` and `Drug.tradeNames` from scalar lists to lists of structured `DrugLabelAndSource` objects. The internal GraphQL query was updated to request the `label` sub-field; the `drug.synonyms` / `drug.tradeNames` columns in the returned DataFrame remain `list[str]`, so existing user code is unaffected. - **Fixed**: `gget opentargets resource="expression"` had started returning an empty DataFrame because Open Targets retired the `Target.expressions` field. The query now uses the current `Target.baselineExpression` field. **The returned columns have changed** because the upstream data model changed: results are now per-biosample (tissue/cell type) baseline expression summary statistics (`median`, `min`, `q1`, `q3`, `max`, `unit`) with `tissueBiosample`/`celltypeBiosample` identifiers and `datasourceId`/`datatypeId`, instead of the old per-tissue RNA `zscore`/`value`/`level` fields. Resolves [issue 247](https://github.com/scverse/gget/issues/247). + - **Docs**: Clarified the meaning of the `diseases` resource `score` column (OpenTargets' single overall target–disease association score, 0–1, aggregated across all data types/sources — not a per-data-source score) and that `disease.id` values are EFO-mapped traits that include not only MONDO diseases but also phenotypes (`HP_*`) and measurements (`EFO_*`), with an example of how to filter to MONDO disease terms only. Addresses [issue 168](https://github.com/scverse/gget/issues/168). - [`gget archs4`](archs4.md) (tissue mode): No longer crashes with `KeyError: ['color'] not found in axis` when ARCHS4 intermittently omits the optional `color` column from its CSV response. The column is now dropped only if present. Output also has a deterministic row order (sorted by `median` descending, with `id` as tiebreaker) so equal-median tissues no longer flip order between requests. From fdc9e8a5ba497e0d82d81312d116cb6df019e4d0 Mon Sep 17 00:00:00 2001 From: Laura Luebbert Date: Sat, 27 Jun 2026 16:16:34 -0400 Subject: [PATCH 26/34] docs(updates): add missing 0.30.8 entries (bgee User-Agent; expression truncation) Comprehensiveness pass on the 0.30.8 changelog: - Added the gget bgee User-Agent change (#224), which was merged but undocumented. - Expanded the opentargets expression entry to note the limit-driven page size, the 3000-row API cap, and the truncation warning (#248 follow-up). Verified all other 0.30.8 entries against merged PRs and confirmed the 0.30.7 vs 0.30.8 split matches the v0.30.7 tag contents. Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/src/en/updates.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/src/en/updates.md b/docs/src/en/updates.md index 8d4d20ac4..0a6582640 100644 --- a/docs/src/en/updates.md +++ b/docs/src/en/updates.md @@ -19,9 +19,10 @@ - The default `resource="pdb"` now automatically falls back to PDBx/mmCIF when the legacy PDB file is unavailable (e.g. for large structures), since the legacy PDB format is being phased out by RCSB. A warning is logged and saved files use the correct extension (`.cif`). - [`gget opentargets`](opentargets.md): Adapted to several upstream Open Targets GraphQL API changes: - **Fixed**: `gget opentargets resource="drugs"` was failing with `HTTP 400 — Field 'synonyms' of type '[DrugLabelAndSource!]!' must have a sub selection.` Open Targets changed `Drug.synonyms` and `Drug.tradeNames` from scalar lists to lists of structured `DrugLabelAndSource` objects. The internal GraphQL query was updated to request the `label` sub-field; the `drug.synonyms` / `drug.tradeNames` columns in the returned DataFrame remain `list[str]`, so existing user code is unaffected. - - **Fixed**: `gget opentargets resource="expression"` had started returning an empty DataFrame because Open Targets retired the `Target.expressions` field. The query now uses the current `Target.baselineExpression` field. **The returned columns have changed** because the upstream data model changed: results are now per-biosample (tissue/cell type) baseline expression summary statistics (`median`, `min`, `q1`, `q3`, `max`, `unit`) with `tissueBiosample`/`celltypeBiosample` identifiers and `datasourceId`/`datatypeId`, instead of the old per-tissue RNA `zscore`/`value`/`level` fields. Resolves [issue 247](https://github.com/scverse/gget/issues/247). + - **Fixed**: `gget opentargets resource="expression"` had started returning an empty DataFrame because Open Targets retired the `Target.expressions` field. The query now uses the current `Target.baselineExpression` field. **The returned columns have changed** because the upstream data model changed: results are now per-biosample (tissue/cell type) baseline expression summary statistics (`median`, `min`, `q1`, `q3`, `max`, `unit`) with `tissueBiosample`/`celltypeBiosample` identifiers and `datasourceId`/`datatypeId`, instead of the old per-tissue RNA `zscore`/`value`/`level` fields. A gene can have thousands of biosamples; the page size follows `--limit` (capped at the API's 3000-per-request maximum), and a warning is logged if results are truncated — narrow with `--filters` (e.g. `datasourceId`, `datatypeId`). Resolves [issue 247](https://github.com/scverse/gget/issues/247). - **Docs**: Clarified the meaning of the `diseases` resource `score` column (OpenTargets' single overall target–disease association score, 0–1, aggregated across all data types/sources — not a per-data-source score) and that `disease.id` values are EFO-mapped traits that include not only MONDO diseases but also phenotypes (`HP_*`) and measurements (`EFO_*`), with an example of how to filter to MONDO disease terms only. Addresses [issue 168](https://github.com/scverse/gget/issues/168). - [`gget archs4`](archs4.md) (tissue mode): No longer crashes with `KeyError: ['color'] not found in axis` when ARCHS4 intermittently omits the optional `color` column from its CSV response. The column is now dropped only if present. Output also has a deterministic row order (sorted by `median` descending, with `id` as tiebreaker) so equal-median tissues no longer flip order between requests. +- [`gget bgee`](bgee.md): Outbound Bgee API requests now send a `User-Agent: gget/` header so the Bgee service can attribute (and, if needed, allow-list) gget traffic, improving resilience against intermittent request blocking. **Version ≥ 0.30.7** (Jun 21, 2026): From 99ea6053ed38b86c11a6629c7e7e36470ac7367c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 27 Jun 2026 20:30:41 +0000 Subject: [PATCH 27/34] CI: update pytest results (dev) --- .github/badges/tests.json | 2 +- tests/pytest_results.txt | 1025 ++++++++++++++++++++++--------------- 2 files changed, 624 insertions(+), 403 deletions(-) diff --git a/.github/badges/tests.json b/.github/badges/tests.json index 6c55dc113..8aad020e5 100644 --- a/.github/badges/tests.json +++ b/.github/badges/tests.json @@ -1 +1 @@ -{"schemaVersion": 1, "label": "tests", "message": "no results", "color": "lightgrey"} +{"schemaVersion": 1, "label": "tests", "message": "418/422 passing", "color": "yellow"} diff --git a/tests/pytest_results.txt b/tests/pytest_results.txt index fcfe1f184..7d992216b 100644 --- a/tests/pytest_results.txt +++ b/tests/pytest_results.txt @@ -1,413 +1,634 @@ -Pytest results (Python 3.14) - 2026-06-27T18:25:23Z +Pytest results (Python 3.14) - 2026-06-27T20:12:18Z ============================= test session starts ============================== platform linux -- Python 3.14.6, pytest-9.1.1, pluggy-1.6.0 -- /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/bin/python3 cachedir: .pytest_cache -Using --randomly-seed=1280788875 +Using --randomly-seed=2701692524 rootdir: /home/runner/work/gget/gget configfile: pyproject.toml testpaths: tests plugins: randomly-3.16.0, rerunfailures-14.0, mock-3.15.1, cov-7.1.0, xdist-3.8.0 -collecting ... collected 420 items +collecting ... collected 422 items -tests/test_cellxgene.py::TestCellxgeneValidation::test_typo_species_raises_valueerror PASSED [ 0%] -tests/test_cellxgene.py::TestCellxgeneValidation::test_invalid_species_raises_valueerror PASSED [ 0%] -tests/test_cellxgene.py::TestCellxgeneValidation::test_supported_species_includes_new_primates PASSED [ 0%] -tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata SKIPPED [ 0%] -tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata_macaca_mulatta SKIPPED [ 1%] -tests/test_cellxgene.py::TestCellxgene::test_cellxgene_adata SKIPPED [ 1%] -tests/test_utils.py::TestUtils::test_ref_species_options PASSED [ 1%] -tests/test_utils.py::TestUtils::test_get_uniprot_info_transcript PASSED [ 1%] -tests/test_utils.py::TestUtils::test_rest_query PASSED [ 2%] -tests/test_utils.py::TestUtils::test_get_uniprot_info_gene PASSED [ 2%] -tests/test_utils.py::TestUtils::test_ref_iv_species_options PASSED [ 2%] -tests/test_utils.py::TestUtils::test_rest_query_bad_type PASSED [ 2%] -tests/test_utils.py::TestUtils::test_search_species_options PASSED [ 3%] -tests/test_utils.py::TestUtils::test_read_fasta PASSED [ 3%] -tests/test_utils.py::TestUtils::test_n_colors PASSED [ 3%] -tests/test_utils.py::TestUtils::test_aa_colors PASSED [ 3%] -tests/test_utils.py::TestUtils::test_get_uniprot_seqs PASSED [ 4%] -tests/test_utils.py::TestUtils::test_search_iv_species_options PASSED [ 4%] -tests/test_utils.py::TestUtils::test_search_species_options_bad_type PASSED [ 4%] -tests/test_utils.py::TestUtils::test_find_latest_ens_rel PASSED [ 4%] -tests/test_utils.py::TestUtils::test_ref_species_options_bad_type PASSED [ 5%] -tests/test_elm.py::TestELM::test_elm_uniprot_id_in_elm PASSED [ 5%] -tests/test_elm.py::TestELM::test_elm_uniprot_aminoacidseq PASSED [ 5%] -tests/test_elm.py::TestELM::test_elm_uniprot_id_new PASSED [ 5%] -tests/test_mutate.py::TestMutate::test_single_deletion PASSED [ 5%] -tests/test_mutate.py::TestMutate::test_large_k PASSED [ 6%] -tests/test_mutate.py::TestMutate::test_intron_mutation_minus PASSED [ 6%] -tests/test_mutate.py::TestMutate::test_ambiguous_mutation PASSED [ 6%] -tests/test_mutate.py::TestMutate::test_single_deletion_with_right_repeats PASSED [ 6%] -tests/test_mutate.py::TestMutate::test_inversion_with_overlaps PASSED [ 7%] -tests/test_mutate.py::TestMutate::test_multi_delins_with_psuedo_left_repeats PASSED [ 7%] -tests/test_mutate.py::TestMutate::test_multi_delins_with_true_right_repeats PASSED [ 7%] -tests/test_mutate.py::TestMutate::test_multi_insertion PASSED [ 7%] -tests/test_mutate.py::TestMutate::test_index_error PASSED [ 8%] -tests/test_mutate.py::TestMutate::test_multi_deletion PASSED [ 8%] -tests/test_mutate.py::TestMutate::test_single_substitution_near_right_end PASSED [ 8%] -tests/test_mutate.py::TestMutate::test_multi_delins_with_true_left_repeats PASSED [ 8%] -tests/test_mutate.py::TestMutate::test_multi_deletion_with_right_repeats PASSED [ 9%] -tests/test_mutate.py::TestMutate::test_single_dup PASSED [ 9%] -tests/test_mutate.py::TestMutate::test_list_of_mutations PASSED [ 9%] -tests/test_mutate.py::TestMutate::test_single_substitution_near_left_end PASSED [ 9%] -tests/test_mutate.py::TestMutate::test_uncertain_mutation PASSED [ 10%] -tests/test_mutate.py::TestMutate::test_single_insertion PASSED [ 10%] -tests/test_mutate.py::TestMutate::test_single_deletion_with_left_repeats PASSED [ 10%] -tests/test_mutate.py::TestMutate::test_multi_dup PASSED [ 10%] -tests/test_mutate.py::TestMutate::test_single_substitution PASSED [ 10%] -tests/test_mutate.py::TestMutate::test_multi_delins PASSED [ 11%] -tests/test_mutate.py::TestMutate::test_single_delins PASSED [ 11%] -tests/test_mutate.py::TestMutate::test_multi_insertion_with_left_repeats PASSED [ 11%] -tests/test_mutate.py::TestMutate::test_intron_mutation_plus PASSED [ 11%] -tests/test_mutate.py::TestMutate::test_posttranslational_mutation PASSED [ 12%] -tests/test_mutate.py::test_csv_of_mutations PASSED [ 12%] -tests/test_mutate.py::test_mismatch_error PASSED [ 12%] -tests/test_seq.py::TestSeq::test_seq_transcript_transcript_WB PASSED [ 12%] -tests/test_seq.py::TestSeq::test_seq_transcript_gene PASSED [ 13%] -tests/test_seq.py::TestSeq::test_seq_transcript_gene_iso PASSED [ 13%] -tests/test_seq.py::TestSeq::test_seq_transcript_gene_WB PASSED [ 13%] -tests/test_seq.py::TestSeq::test_seq_transcript_transcript_iso PASSED [ 13%] -tests/test_seq.py::TestSeq::test_seq_gene_iso PASSED [ 14%] -tests/test_seq.py::TestSeq::test_seq_gene PASSED [ 14%] -tests/test_seq.py::TestSeq::test_seq_gene_transcript_iso PASSED [ 14%] -tests/test_seq.py::TestSeq::test_seq_transcript PASSED [ 14%] -tests/test_seq.py::TestSeq::test_seq_missing_uniprot_gene_name PASSED [ 15%] -tests/test_cosmic.py::TestCosmicWorkflow::test_cosmic_defaults PASSED [ 15%] -tests/test_info.py::TestInfo::test_info_ncbitrue_uniprotfalse PASSED [ 15%] -tests/test_info.py::TestInfo::test_info_ncbifalse_uniprottrue PASSED [ 15%] -tests/test_info.py::TestInfo::test_info_mix PASSED [ 15%] -tests/test_info.py::TestInfo::test_info_gene_list_non_model PASSED [ 16%] -tests/test_info.py::TestInfo::test_info_transcript PASSED [ 16%] -tests/test_info.py::TestInfo::test_info_exon PASSED [ 16%] -tests/test_info.py::TestInfo::test_info_WB_transcript PASSED [ 16%] -tests/test_info.py::TestInfo::test_info_ncbifalse_uniprotfalse PASSED [ 17%] -tests/test_info.py::TestInfo::test_info_gene PASSED [ 17%] -tests/test_gpt.py::TestGpt::test_gpt PASSED [ 17%] -tests/test_cbio.py::TestCbioSearch::test_cbio_search PASSED [ 17%] -tests/test_cbio.py::TestCbio::test_cbio_download PASSED [ 18%] -tests/test_cbio.py::TestCbio::test_error_cbio_download PASSED [ 18%] -tests/test_cbio.py::TestCbio::test_cbio_download_partially_existing_files PASSED [ 18%] -tests/test_search.py::TestSearch::test_search_gene_one_sw_json PASSED [ 18%] -tests/test_search.py::TestSearch::test_search_release PASSED [ 19%] -tests/test_search.py::TestSearch::test_search_db PASSED [ 19%] -tests/test_search.py::TestSearch::test_search_gene_two_sw_and PASSED [ 19%] -tests/test_search.py::TestSearch::test_search_gene_two_sw_or PASSED [ 19%] -tests/test_search.py::TestSearch::test_search_gene_bad_andor PASSED [ 20%] -tests/test_search.py::TestSearch::test_search_gene_one_sw_limit PASSED [ 20%] -tests/test_search.py::TestSearch::test_search_transcript_bad_andor PASSED [ 20%] -tests/test_search.py::TestSearch::test_search_gene_bad_species PASSED [ 20%] -tests/test_search.py::TestSearch::test_search_octopus PASSED [ 20%] -tests/test_search.py::TestSearch::test_search_gene_one_sw PASSED [ 21%] -tests/test_search.py::TestSearch::test_search_transcript_two_sw_or PASSED [ 21%] -tests/test_search.py::TestSearch::test_search_gene_two_sw_limit PASSED [ 21%] -tests/test_search.py::TestSearch::test_search_transcript_one_sw PASSED [ 21%] -tests/test_search.py::TestSearch::test_search_plant PASSED [ 22%] -tests/test_search.py::TestSearch::test_search_plant_db PASSED [ 22%] -tests/test_search.py::TestSearch::test_search_transcript_bad_species PASSED [ 22%] -tests/test_search.py::TestSearch::test_search_transcript_two_sw_and PASSED [ 22%] -tests/test_diamond.py::TestDiamond::test_diamond_both_files PASSED [ 23%] -tests/test_diamond.py::TestDiamond::test_diamond_query_file PASSED [ 23%] -tests/test_diamond.py::TestDiamond::test_diamond_seqs_single PASSED [ 23%] -tests/test_diamond.py::TestDiamond::test_diamond_JSON_out PASSED [ 23%] -tests/test_diamond.py::TestDiamond::test_diamond_ref_file PASSED [ 24%] -tests/test_diamond.py::TestDiamond::test_diamond_seqs_multiple PASSED [ 24%] -tests/test_virus.py::TestVirus::test_unzip_file_bad_zip_raises PASSED [ 24%] -tests/test_virus.py::TestVirus::test_virus_invalid_is_accession_type PASSED [ 24%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_combined_filters PASSED [ 25%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype_list PASSED [ 25%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_institution PASSED [ 25%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_already_correct_returns_none PASSED [ 25%] -tests/test_virus.py::TestVirus::test_parse_partial_date_full_date PASSED [ 25%] -tests/test_virus.py::TestVirus::test_validate_datasets_binary_valid PASSED [ 26%] -tests/test_virus.py::TestVirus::test_retry_helper_failed_commands_tracking PASSED [ 26%] -tests/test_virus.py::TestVirus::test_virus_host_filter_verification PASSED [ 26%] -tests/test_virus.py::TestVirus::test_virus_invalid_lab_passaged_type PASSED [ 26%] -tests/test_virus.py::TestVirus::test_genbank_xml_to_csv_basic PASSED [ 27%] -tests/test_virus.py::TestVirus::test_write_fasta_record_with_description PASSED [ 27%] -tests/test_virus.py::TestVirus::test_save_metadata_to_csv_basic PASSED [ 27%] -tests/test_virus.py::TestVirus::test_virus_completeness_filter_verification PASSED [ 27%] -tests/test_virus.py::TestVirus::test_filter_sequences_max_ambiguous_chars PASSED [ 28%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_protein_count PASSED [ 28%] -tests/test_virus.py::TestVirus::test_save_partial_metadata PASSED [ 28%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_true PASSED [ 28%] -tests/test_virus.py::TestVirus::test_virus_with_completeness_filter PASSED [ 29%] -tests/test_virus.py::TestVirus::test_parse_genbank_xml_empty_set PASSED [ 29%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_none_raises PASSED [ 29%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_mature_peptide_count PASSED [ 29%] -tests/test_virus.py::TestVirus::test_get_datasets_path_uses_bundled_binary PASSED [ 30%] -tests/test_virus.py::TestVirus::test_local_name_without_namespace PASSED [ 30%] -tests/test_virus.py::TestVirus::test_deduplicate_all_existing PASSED [ 30%] -tests/test_virus.py::TestVirus::test_filter_cached_min_release_date PASSED [ 30%] -tests/test_virus.py::TestVirus::test_get_gget_version_returns_string PASSED [ 30%] -tests/test_virus.py::TestVirus::test_is_sars_cov2_query_accession_mode PASSED [ 31%] -tests/test_virus.py::TestVirus::test_filter_sequences_no_filters PASSED [ 31%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_max_release_date PASSED [ 31%] -tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_common_names PASSED [ 31%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_source_database PASSED [ 32%] -tests/test_virus.py::TestVirus::test_virus_with_collection_date_filters PASSED [ 32%] -tests/test_virus.py::TestVirus::test_check_min_max_date_valid PASSED [ 32%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_release_date PASSED [ 32%] -tests/test_virus.py::TestVirus::test_retry_helper_success_after_retry PASSED [ 33%] -tests/test_virus.py::TestVirus::test_virus_with_multiple_filters PASSED [ 33%] -tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter PASSED [ 33%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_empty_returns_none PASSED [ 33%] -tests/test_virus.py::TestVirus::test_parse_genbank_xml_basic PASSED [ 34%] -tests/test_virus.py::TestVirus::test_stream_copy_fasta_all_records PASSED [ 34%] -tests/test_virus.py::TestVirus::test_clean_xml_declarations PASSED [ 34%] -tests/test_virus.py::TestVirus::test_virus_multi_accession_space_separated PASSED [ 34%] -tests/test_virus.py::TestVirus::test_parse_partial_date_empty_raises PASSED [ 35%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_false PASSED [ 35%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_max_seq_length PASSED [ 35%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_false PASSED [ 35%] -tests/test_virus.py::TestVirus::test_local_name_with_namespace PASSED [ 35%] -tests/test_virus.py::TestVirus::test_save_partial_metadata_empty PASSED [ 36%] -tests/test_virus.py::TestVirus::test_is_sars_cov2_query_negative PASSED [ 36%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_text PASSED [ 36%] -tests/test_virus.py::TestVirus::test_save_command_summary_creates_file PASSED [ 36%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_csv PASSED [ 37%] -tests/test_virus.py::TestVirus::test_get_datasets_version_returns_string_or_none PASSED [ 37%] -tests/test_virus.py::TestVirus::test_is_sars_cov2_query_common_names PASSED [ 37%] -tests/test_virus.py::TestVirus::test_validate_datasets_binary_empty_path PASSED [ 37%] -tests/test_virus.py::TestVirus::test_save_metadata_to_csv_empty_metadata PASSED [ 38%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_isolate PASSED [ 38%] -tests/test_virus.py::TestVirus::test_virus_with_annotated_filter PASSED [ 38%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_name PASSED [ 38%] -tests/test_virus.py::TestVirus::test_virus_invalid_keep_temp_type PASSED [ 39%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_max_comparison PASSED [ 39%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_gen_mol_type PASSED [ 39%] -tests/test_virus.py::TestVirus::test_merge_metadata_csvs_fills_missing PASSED [ 39%] -tests/test_virus.py::TestVirus::test_virus_none_virus_name PASSED [ 40%] -tests/test_virus.py::TestVirus::test_check_min_max_valid PASSED [ 40%] -tests/test_virus.py::TestVirus::test_merge_baseline_with_new_empty_new PASSED [ 40%] -tests/test_virus.py::TestVirus::test_parse_accession_input_nonexistent_file_raises_error PASSED [ 40%] -tests/test_virus.py::TestVirus::test_check_min_max_invalid_raises PASSED [ 40%] -tests/test_virus.py::TestVirus::test_virus_with_host_filter PASSED [ 41%] -tests/test_virus.py::TestVirus::test_unzip_file_valid PASSED [ 41%] -tests/test_virus.py::TestVirus::test_virus_invalid_completeness PASSED [ 41%] -tests/test_virus.py::TestVirus::test_virus_with_length_filters PASSED [ 41%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_gene_count PASSED [ 42%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_true PASSED [ 42%] -tests/test_virus.py::TestVirus::test_datasets_cli_version_output PASSED [ 42%] -tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter PASSED [ 42%] -tests/test_virus.py::TestVirus::test_validate_datasets_binary_nonexistent PASSED [ 43%] -tests/test_virus.py::TestVirus::test_get_memory_usage_returns_dict PASSED [ 43%] -tests/test_virus.py::TestVirus::test_virus_multiple_filters_relationship_check PASSED [ 43%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_collection_date PASSED [ 43%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_isolation_source PASSED [ 44%] -tests/test_virus.py::TestVirus::test_merge_baseline_with_new_deduplicates PASSED [ 44%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_collection_date_range PASSED [ 44%] -tests/test_virus.py::TestVirus::test_virus_with_geographic_location_filter PASSED [ 44%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_geographic_location PASSED [ 45%] -tests/test_virus.py::TestVirus::test_check_min_max_none_values PASSED [ 45%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_min_comparison PASSED [ 45%] -tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_basic PASSED [ 45%] -tests/test_virus.py::TestVirus::test_virus_release_date_filter_verification PASSED [ 45%] -tests/test_virus.py::TestVirus::test_filter_cached_no_filters PASSED [ 46%] -tests/test_virus.py::TestVirus::test_filter_cached_annotated PASSED [ 46%] -tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters PASSED [ 46%] -tests/test_virus.py::TestVirus::test_get_datasets_path_returns_valid_path PASSED [ 46%] -tests/test_virus.py::TestVirus::test_retry_helper_custom_retryable_exceptions PASSED [ 47%] -tests/test_virus.py::TestVirus::test_parse_genbank_xml_invalid_raises PASSED [ 47%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_no_parentheses_returns_none PASSED [ 47%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_space_before_virus PASSED [ 47%] -tests/test_virus.py::TestVirus::test_batch_accessions_for_url PASSED [ 48%] -tests/test_virus.py::TestVirus::test_virus_relationship_check_counts_match PASSED [ 48%] -tests/test_virus.py::TestVirus::test_virus_integer_virus_id PASSED [ 48%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_zero PASSED [ 48%] -tests/test_virus.py::TestVirus::test_track_failed_operation_creates_key PASSED [ 49%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_segment PASSED [ 49%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_empty PASSED [ 49%] -tests/test_virus.py::TestVirus::test_clean_xml_declarations_no_declarations PASSED [ 49%] -tests/test_virus.py::TestVirus::test_check_min_max_equal PASSED [ 50%] -tests/test_virus.py::TestVirus::test_calculate_max_accessions_per_batch PASSED [ 50%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_basic PASSED [ 50%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_empty_raises PASSED [ 50%] +tests/test_pdb.py::TestPDB::test_pdb_assembly PASSED [ 0%] +tests/test_pdb.py::TestPDB::test_pdb_mmcif PASSED [ 0%] +tests/test_pdb.py::TestPDB::test_pdb_pdb PASSED [ 0%] +tests/test_pdb.py::TestPDB::test_pdb_legacy_fallback_to_mmcif PASSED [ 0%] +tests/test_cellxgene.py::TestCellxgeneValidation::test_supported_species_includes_new_primates PASSED [ 1%] +tests/test_cellxgene.py::TestCellxgeneValidation::test_typo_species_raises_valueerror PASSED [ 1%] +tests/test_cellxgene.py::TestCellxgeneValidation::test_invalid_species_raises_valueerror PASSED [ 1%] +tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata SKIPPED [ 1%] +tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata_macaca_mulatta SKIPPED [ 2%] +tests/test_cellxgene.py::TestCellxgene::test_cellxgene_adata SKIPPED [ 2%] +tests/test_8cube.py::TestGeneExpression::test_gene_expression_basic PASSED [ 2%] +tests/test_8cube.py::TestPsiBlock::test_psi_block_basic PASSED [ 2%] +tests/test_8cube.py::TestSpecificity::test_specificity_basic PASSED [ 3%] +tests/test_info.py::TestInfo::test_info_ncbitrue_uniprotfalse FAILED [ 3%] +tests/test_info.py::TestInfo::test_info_transcript PASSED [ 3%] +tests/test_info.py::TestInfo::test_info_gene_list_non_model PASSED [ 3%] +tests/test_info.py::TestInfo::test_info_exon PASSED [ 4%] +tests/test_info.py::TestInfo::test_info_WB_transcript PASSED [ 4%] +tests/test_info.py::TestInfo::test_info_ncbifalse_uniprotfalse PASSED [ 4%] +tests/test_info.py::TestInfo::test_info_ncbifalse_uniprottrue PASSED [ 4%] +tests/test_info.py::TestInfo::test_info_mix PASSED [ 4%] +tests/test_info.py::TestInfo::test_info_gene PASSED [ 5%] +tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_cli_exposes_jackhmmer_savedir_flag PASSED [ 5%] +tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_custom_dir PASSED [ 5%] +tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_default_dir PASSED [ 5%] +tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_clean_up_missing_dir_is_safe PASSED [ 6%] +tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_clean_up_default_dir_when_none PASSED [ 6%] +tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_clean_up_removes_custom_dir PASSED [ 6%] +tests/test_gpt.py::TestGpt::test_gpt PASSED [ 6%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_diseases_filter PASSED [ 7%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_diseases PASSED [ 7%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_pharmacogenetics PASSED [ 7%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions PASSED [ 7%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_resource PASSED [ 8%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_drugs_invalid_filter PASSED [ 8%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_no_limit PASSED [ 8%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap_filter PASSED [ 8%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets PASSED [ 9%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_nonexistent_id PASSED [ 9%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap PASSED [ 9%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_tractability PASSED [ 9%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_simple_filter PASSED [ 9%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_limit PASSED [ 10%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_drugs PASSED [ 10%] +tests/test_opentargets.py::TestOpenTargetsExpressionMocked::test_expression_limit PASSED [ 10%] +tests/test_opentargets.py::TestOpenTargetsExpressionMocked::test_expression_parses_baseline_rows PASSED [ 10%] +tests/test_opentargets.py::TestOpenTargetsExpressionMocked::test_expression_empty_is_graceful PASSED [ 11%] +tests/test_opentargets.py::TestOpenTargetsExpressionMocked::test_expression_json PASSED [ 11%] +tests/test_blast.py::TestBlast::test_blast_bad_db2 PASSED [ 11%] +tests/test_blast.py::TestBlast::test_blast_bad_program PASSED [ 11%] +tests/test_blast.py::TestBlast::test_blast_bad_seq PASSED [ 12%] +tests/test_blast.py::TestBlast::test_blast_nt PASSED [ 12%] +tests/test_blast.py::TestBlast::test_blast_bad_fasta PASSED [ 12%] +tests/test_blast.py::TestBlast::test_blast_db_missing PASSED [ 12%] +tests/test_blast.py::TestBlast::test_blast_bad_db1 PASSED [ 13%] +tests/test_mutate.py::TestMutate::test_list_of_mutations PASSED [ 13%] +tests/test_mutate.py::TestMutate::test_intron_mutation_minus PASSED [ 13%] +tests/test_mutate.py::TestMutate::test_multi_insertion PASSED [ 13%] +tests/test_mutate.py::TestMutate::test_single_delins PASSED [ 13%] +tests/test_mutate.py::TestMutate::test_inversion_with_overlaps PASSED [ 14%] +tests/test_mutate.py::TestMutate::test_single_deletion_with_right_repeats PASSED [ 14%] +tests/test_mutate.py::TestMutate::test_multi_deletion PASSED [ 14%] +tests/test_mutate.py::TestMutate::test_multi_delins_with_psuedo_left_repeats PASSED [ 14%] +tests/test_mutate.py::TestMutate::test_multi_delins_with_true_right_repeats PASSED [ 15%] +tests/test_mutate.py::TestMutate::test_uncertain_mutation PASSED [ 15%] +tests/test_mutate.py::TestMutate::test_single_insertion PASSED [ 15%] +tests/test_mutate.py::TestMutate::test_single_dup PASSED [ 15%] +tests/test_mutate.py::TestMutate::test_posttranslational_mutation PASSED [ 16%] +tests/test_mutate.py::TestMutate::test_multi_delins_with_true_left_repeats PASSED [ 16%] +tests/test_mutate.py::TestMutate::test_single_deletion_with_left_repeats PASSED [ 16%] +tests/test_mutate.py::TestMutate::test_single_substitution_near_left_end PASSED [ 16%] +tests/test_mutate.py::TestMutate::test_intron_mutation_plus PASSED [ 17%] +tests/test_mutate.py::TestMutate::test_single_deletion PASSED [ 17%] +tests/test_mutate.py::TestMutate::test_multi_insertion_with_left_repeats PASSED [ 17%] +tests/test_mutate.py::TestMutate::test_multi_delins PASSED [ 17%] +tests/test_mutate.py::TestMutate::test_single_substitution PASSED [ 18%] +tests/test_mutate.py::TestMutate::test_single_substitution_near_right_end PASSED [ 18%] +tests/test_mutate.py::TestMutate::test_index_error PASSED [ 18%] +tests/test_mutate.py::TestMutate::test_large_k PASSED [ 18%] +tests/test_mutate.py::TestMutate::test_multi_deletion_with_right_repeats PASSED [ 18%] +tests/test_mutate.py::TestMutate::test_multi_dup PASSED [ 19%] +tests/test_mutate.py::TestMutate::test_ambiguous_mutation PASSED [ 19%] +tests/test_mutate.py::test_csv_of_mutations PASSED [ 19%] +tests/test_mutate.py::test_mismatch_error PASSED [ 19%] +tests/test_diamond.py::TestDiamond::test_diamond_seqs_multiple PASSED [ 20%] +tests/test_diamond.py::TestDiamond::test_diamond_JSON_out PASSED [ 20%] +tests/test_diamond.py::TestDiamond::test_diamond_both_files PASSED [ 20%] +tests/test_diamond.py::TestDiamond::test_diamond_seqs_single PASSED [ 20%] +tests/test_diamond.py::TestDiamond::test_diamond_ref_file PASSED [ 21%] +tests/test_diamond.py::TestDiamond::test_diamond_query_file PASSED [ 21%] +tests/test_cbio.py::TestCbio::test_cbio_download_partially_existing_files PASSED [ 21%] +tests/test_cbio.py::TestCbio::test_cbio_download PASSED [ 21%] +tests/test_cbio.py::TestCbio::test_error_cbio_download PASSED [ 22%] +tests/test_cbio.py::TestCbioSearch::test_cbio_search PASSED [ 22%] +tests/test_g2p.py::TestG2P::test_g2p_residues_filter PASSED [ 22%] +tests/test_g2p.py::TestG2P::test_g2p_map PASSED [ 22%] +tests/test_g2p.py::TestG2P::test_g2p_invalid_pair_returns_none PASSED [ 22%] +tests/test_g2p.py::TestG2P::test_g2p_residues_single_int PASSED [ 23%] +tests/test_g2p.py::TestG2P::test_g2p_schema_invariant_across_input_modes PASSED [ 23%] +tests/test_g2p.py::TestG2P::test_g2p_features PASSED [ 23%] +tests/test_g2p.py::TestG2P::test_g2p_map_has_pdb_list_column PASSED [ 23%] +tests/test_g2p.py::TestG2P::test_g2p_uniprot_auto_resolved PASSED [ 24%] +tests/test_g2p.py::TestG2P::test_g2p_gene_auto_resolved PASSED [ 24%] +tests/test_g2p.py::TestG2P::test_g2p_alignment PASSED [ 24%] +tests/test_g2p.py::TestG2P::test_g2p_out_writes_to_explicit_path PASSED [ 24%] +tests/test_g2p.py::TestG2PValidation::test_residues_on_map_raises PASSED [ 25%] +tests/test_g2p.py::TestG2PValidation::test_alignment_requires_explicit_uniprot PASSED [ 25%] +tests/test_g2p.py::TestG2PValidation::test_missing_both_raises PASSED [ 25%] +tests/test_g2p.py::TestG2PValidation::test_residues_wrong_type_raises PASSED [ 25%] +tests/test_g2p.py::TestG2PValidation::test_alignment_requires_isoform PASSED [ 26%] +tests/test_g2p.py::TestG2PValidation::test_invalid_resource_raises PASSED [ 26%] +tests/test_ref.py::TestRef::test_ref_which_plant PASSED [ 26%] +tests/test_ref.py::TestRef::test_ref_plant PASSED [ 26%] +tests/test_ref.py::TestRef::test_ref_rel_ftp PASSED [ 27%] +tests/test_ref.py::TestRef::test_ref_bad_rel PASSED [ 27%] +tests/test_ref.py::TestRef::test_ref_which PASSED [ 27%] +tests/test_ref.py::TestRef::test_ref_rel PASSED [ 27%] +tests/test_ref.py::TestRef::test_ref PASSED [ 27%] +tests/test_ref.py::TestRef::test_ref_rel_ftp_octopus PASSED [ 28%] +tests/test_ref.py::TestRef::test_ref_list PASSED [ 28%] +tests/test_ref.py::TestRef::test_ref_bad_which PASSED [ 28%] +tests/test_ref.py::TestRef::test_ref_bad_species PASSED [ 28%] +tests/test_ref.py::TestRef::test_ref_rel_protist PASSED [ 29%] +tests/test_ref.py::TestRef::test_ref_ftp PASSED [ 29%] +tests/test_search.py::TestSearch::test_search_transcript_bad_andor PASSED [ 29%] +tests/test_search.py::TestSearch::test_search_transcript_bad_species PASSED [ 29%] +tests/test_search.py::TestSearch::test_search_gene_two_sw_and PASSED [ 30%] +tests/test_search.py::TestSearch::test_search_gene_one_sw_limit PASSED [ 30%] +tests/test_search.py::TestSearch::test_search_gene_bad_species PASSED [ 30%] +tests/test_search.py::TestSearch::test_search_gene_one_sw PASSED [ 30%] +tests/test_search.py::TestSearch::test_search_db PASSED [ 31%] +tests/test_search.py::TestSearch::test_search_plant_db PASSED [ 31%] +tests/test_search.py::TestSearch::test_search_gene_one_sw_json PASSED [ 31%] +tests/test_search.py::TestSearch::test_search_plant PASSED [ 31%] +tests/test_search.py::TestSearch::test_search_octopus PASSED [ 31%] +tests/test_search.py::TestSearch::test_search_gene_two_sw_limit PASSED [ 32%] +tests/test_search.py::TestSearch::test_search_transcript_two_sw_and PASSED [ 32%] +tests/test_search.py::TestSearch::test_search_gene_bad_andor PASSED [ 32%] +tests/test_search.py::TestSearch::test_search_transcript_two_sw_or PASSED [ 32%] +tests/test_search.py::TestSearch::test_search_transcript_one_sw PASSED [ 33%] +tests/test_search.py::TestSearch::test_search_release PASSED [ 33%] +tests/test_search.py::TestSearch::test_search_gene_two_sw_or PASSED [ 33%] +tests/test_elm.py::TestELM::test_elm_uniprot_aminoacidseq PASSED [ 33%] +tests/test_elm.py::TestELM::test_elm_uniprot_id_in_elm PASSED [ 34%] +tests/test_elm.py::TestELM::test_elm_uniprot_id_new PASSED [ 34%] +tests/test_blat.py::TestBlat::test_blat_aa PASSED [ 34%] +tests/test_blat.py::TestBlat::test_blat_nt_RNA PASSED [ 34%] +tests/test_blat.py::TestBlat::test_blat_bad_fasta PASSED [ 35%] +tests/test_blat.py::TestBlat::test_blat_bad_assembly PASSED [ 35%] +tests/test_blat.py::TestBlat::test_blat_nt_protein PASSED [ 35%] +tests/test_blat.py::TestBlat::test_blat_bad_txt PASSED [ 35%] +tests/test_blat.py::TestBlat::test_blat_shortseq PASSED [ 36%] +tests/test_blat.py::TestBlat::test_blat_nt PASSED [ 36%] +tests/test_blat.py::TestBlat::test_blat_bad_fileformat PASSED [ 36%] +tests/test_blat.py::TestBlat::test_blat_nt_transDNA PASSED [ 36%] +tests/test_blat.py::TestBlat::test_blat_nt_fasta PASSED [ 36%] +tests/test_blat.py::TestBlat::test_blat_aa_protein PASSED [ 37%] +tests/test_blat.py::TestBlat::test_blat_nt_json PASSED [ 37%] +tests/test_blat.py::TestBlat::test_blat_bad_seqtype PASSED [ 37%] +tests/test_blat.py::TestBlat::test_blat_nt_txt PASSED [ 37%] +tests/test_blat.py::TestBlat::test_blat_nt_DNA PASSED [ 38%] +tests/test_blat.py::TestBlat::test_blat_aa_RNA PASSED [ 38%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background_list PASSED [ 38%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_celltypes PASSED [ 38%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_none PASSED [ 39%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_background PASSED [ 39%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_kinase_interactions PASSED [ 39%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_gene PASSED [ 39%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_ontology PASSED [ 40%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_diseases_drugs PASSED [ 40%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_fish PASSED [ 40%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background PASSED [ 40%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_fly PASSED [ 40%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_mouse_is_human PASSED [ 41%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_background_ensembl PASSED [ 41%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_database_shortcut PASSED [ 41%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_plot PASSED [ 41%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_species PASSED [ 42%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_json PASSED [ 42%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_pathway PASSED [ 42%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_yeast PASSED [ 42%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_transcription PASSED [ 43%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_worm PASSED [ 43%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_ensembl_ids PASSED [ 43%] +tests/test_seq.py::TestSeq::test_seq_transcript PASSED [ 43%] +tests/test_seq.py::TestSeq::test_seq_transcript_transcript_iso PASSED [ 44%] +tests/test_seq.py::TestSeq::test_seq_gene_transcript_iso PASSED [ 44%] +tests/test_seq.py::TestSeq::test_seq_missing_uniprot_gene_name PASSED [ 44%] +tests/test_seq.py::TestSeq::test_seq_gene PASSED [ 44%] +tests/test_seq.py::TestSeq::test_seq_transcript_transcript_WB PASSED [ 45%] +tests/test_seq.py::TestSeq::test_seq_transcript_gene_iso PASSED [ 45%] +tests/test_seq.py::TestSeq::test_seq_transcript_gene_WB PASSED [ 45%] +tests/test_seq.py::TestSeq::test_seq_gene_iso PASSED [ 45%] +tests/test_seq.py::TestSeq::test_seq_transcript_gene PASSED [ 45%] +tests/test_compile.py::TestCompilerWindows::test_compiler_windows PASSED [ 46%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_protein_count PASSED [ 46%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_min_comparison PASSED [ 46%] +tests/test_virus.py::TestVirus::test_filter_sequences_max_ambiguous_chars PASSED [ 46%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_csv PASSED [ 47%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_false PASSED [ 47%] +tests/test_virus.py::TestVirus::test_deduplicate_empty_baseline PASSED [ 47%] +tests/test_virus.py::TestVirus::test_virus_invalid_annotated_type PASSED [ 47%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_remove_parentheses PASSED [ 48%] +tests/test_virus.py::TestVirus::test_virus_none_virus_name PASSED [ 48%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_invalid_attempt_returns_none PASSED [ 48%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_empty_returns_none PASSED [ 48%] +tests/test_virus.py::TestVirus::test_virus_invalid_completeness PASSED [ 49%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_already_correct_returns_none PASSED [ 49%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_min_gene_count PASSED [ 49%] +tests/test_virus.py::TestVirus::test_save_metadata_to_csv_empty_metadata PASSED [ 49%] tests/test_virus.py::TestVirus::test_filter_cached_host_in_strategy_skipped PASSED [ 50%] -tests/test_virus.py::TestVirus::test_virus_with_genbank_metadata_retrieval PASSED [ 51%] -tests/test_virus.py::TestVirus::test_write_fasta_record_without_description PASSED [ 51%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_min_gene_count PASSED [ 51%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_json PASSED [ 51%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_peptide_count PASSED [ 52%] -tests/test_virus.py::TestVirus::test_filter_cached_geographic_location PASSED [ 52%] -tests/test_virus.py::TestVirus::test_filter_cached_complete_only PASSED [ 52%] -tests/test_virus.py::TestVirus::test_virus_specific_accession_file_creation PASSED [ 52%] -tests/test_virus.py::TestVirus::test_virus_invalid_proteins_complete_type PASSED [ 53%] -tests/test_virus.py::TestVirus::test_parse_date_various_formats PASSED [ 53%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_min PASSED [ 53%] -tests/test_virus.py::TestVirus::test_check_min_max_date_invalid_raises PASSED [ 53%] -tests/test_virus.py::TestVirus::test_filter_sequences_proteins_complete PASSED [ 54%] -tests/test_virus.py::TestVirus::test_force_garbage_collection_runs PASSED [ 54%] -tests/test_virus.py::TestVirus::test_filter_cached_host_not_in_strategy PASSED [ 54%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_negative PASSED [ 54%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_min_seq_length PASSED [ 55%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_empty PASSED [ 55%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_true PASSED [ 55%] -tests/test_virus.py::TestVirus::test_parse_accession_input_space_separated PASSED [ 55%] -tests/test_virus.py::TestVirus::test_merge_metadata_csvs_missing_standard_file PASSED [ 55%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_metadata_type PASSED [ 56%] -tests/test_virus.py::TestVirus::test_parse_accession_input_from_file PASSED [ 56%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_env_source PASSED [ 56%] -tests/test_virus.py::TestVirus::test_merge_metadata_csvs_no_overwrite PASSED [ 56%] -tests/test_virus.py::TestVirus::test_virus_empty_virus_name PASSED [ 57%] -tests/test_virus.py::TestVirus::test_retry_helper_non_retryable_exception PASSED [ 57%] -tests/test_virus.py::TestVirus::test_virus_with_source_database_filter PASSED [ 57%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_max PASSED [ 57%] -tests/test_virus.py::TestVirus::test_track_failed_operation_appends PASSED [ 58%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_has_proteins PASSED [ 58%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_false PASSED [ 58%] -tests/test_virus.py::TestVirus::test_unzip_file_nonexistent_raises PASSED [ 58%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_protein_count PASSED [ 59%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_seq_length PASSED [ 59%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_combined PASSED [ 59%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_host PASSED [ 59%] -tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter PASSED [ 60%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_no_filters PASSED [ 60%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_virus_suffix PASSED [ 60%] -tests/test_virus.py::TestVirus::test_save_command_summary_with_error PASSED [ 60%] -tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_empty PASSED [ 60%] -tests/test_virus.py::TestVirus::test_parse_accession_input_empty_file_raises_error PASSED [ 61%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_has_proteins PASSED [ 50%] +tests/test_virus.py::TestVirus::test_virus_invalid_proteins_complete_type PASSED [ 50%] +tests/test_virus.py::TestVirus::test_is_sars_cov2_query_common_names PASSED [ 50%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_env_source PASSED [ 50%] +tests/test_virus.py::TestVirus::test_filter_cached_annotated PASSED [ 51%] +tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_accession_mode PASSED [ 51%] +tests/test_virus.py::TestVirus::test_check_min_max_valid PASSED [ 51%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_host PASSED [ 51%] +tests/test_virus.py::TestVirus::test_virus_relationship_check_counts_match PASSED [ 52%] +tests/test_virus.py::TestVirus::test_virus_with_geographic_location_filter PASSED [ 52%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_no_filters PASSED [ 52%] +tests/test_virus.py::TestVirus::test_track_failed_operation_none_dict PASSED [ 52%] +tests/test_virus.py::TestVirus::test_virus_multi_accession_file_input PASSED [ 53%] +tests/test_virus.py::TestVirus::test_filter_cached_geographic_location PASSED [ 53%] +tests/test_virus.py::TestVirus::test_parse_genbank_xml_empty_set PASSED [ 53%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_negative PASSED [ 53%] +tests/test_virus.py::TestVirus::test_validate_datasets_binary_nonexistent PASSED [ 54%] +tests/test_virus.py::TestVirus::test_write_fasta_record_with_description PASSED [ 54%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_collection_date PASSED [ 54%] +tests/test_virus.py::TestVirus::test_retry_helper_custom_retryable_exceptions PASSED [ 54%] +tests/test_virus.py::TestVirus::test_virus_integer_virus_id PASSED [ 54%] +tests/test_virus.py::TestVirus::test_merge_baseline_with_new_csv PASSED [ 55%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_json PASSED [ 55%] +tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter PASSED [ 55%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_institution PASSED [ 55%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype PASSED [ 56%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_false PASSED [ 56%] +tests/test_virus.py::TestVirus::test_virus_with_length_filters PASSED [ 56%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_virus_suffix PASSED [ 56%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_basic PASSED [ 57%] +tests/test_virus.py::TestVirus::test_write_fasta_record_without_description PASSED [ 57%] +tests/test_virus.py::TestVirus::test_virus_multiple_filters_relationship_check PASSED [ 57%] +tests/test_virus.py::TestVirus::test_is_sars_cov2_query_negative PASSED [ 57%] +tests/test_virus.py::TestVirus::test_parse_date_invalid_raises PASSED [ 58%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_country PASSED [ 58%] +tests/test_virus.py::TestVirus::test_parse_date_various_formats PASSED [ 58%] +tests/test_virus.py::TestVirus::test_virus_with_source_database_filter PASSED [ 58%] +tests/test_virus.py::TestVirus::test_virus_host_filter_verification PASSED [ 59%] +tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter PASSED [ 59%] +tests/test_virus.py::TestVirus::test_check_min_max_date_valid PASSED [ 59%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_empty PASSED [ 59%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_space_before_virus PASSED [ 59%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_true PASSED [ 60%] +tests/test_virus.py::TestVirus::test_validate_datasets_binary_empty_path PASSED [ 60%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_combined PASSED [ 60%] +tests/test_virus.py::TestVirus::test_batch_accessions_for_url PASSED [ 60%] +tests/test_virus.py::TestVirus::test_filter_cached_host_not_in_strategy PASSED [ 61%] tests/test_virus.py::TestVirus::test_write_fasta_record_long_sequence_wraps PASSED [ 61%] -tests/test_virus.py::TestVirus::test_retry_helper_exponential_backoff_timing PASSED [ 61%] -tests/test_virus.py::TestVirus::test_deduplicate_empty_baseline PASSED [ 61%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_nuc_completeness_partial PASSED [ 62%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_jsonl PASSED [ 62%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_country PASSED [ 62%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_remove_parentheses PASSED [ 62%] -tests/test_virus.py::TestVirus::test_virus_metadata_schema_validation PASSED [ 63%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_multiple PASSED [ 63%] -tests/test_virus.py::TestVirus::test_deduplicate_metadata_against_baseline PASSED [ 63%] -tests/test_virus.py::TestVirus::test_track_failed_operation_none_dict PASSED [ 63%] -tests/test_virus.py::TestVirus::test_retry_helper_successful_operation PASSED [ 64%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_max_gene_count PASSED [ 64%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_invalid_attempt_returns_none PASSED [ 64%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_true PASSED [ 64%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype PASSED [ 65%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_no_filters PASSED [ 65%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_missing_accession PASSED [ 65%] -tests/test_virus.py::TestVirus::test_merge_baseline_with_new_csv PASSED [ 65%] -tests/test_virus.py::TestVirus::test_virus_multi_accession_file_input PASSED [ 65%] -tests/test_virus.py::TestVirus::test_parse_date_invalid_raises PASSED [ 66%] -tests/test_virus.py::TestVirus::test_filter_cached_refseq_only PASSED [ 66%] -tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_negative PASSED [ 66%] -tests/test_virus.py::TestVirus::test_parse_date_full PASSED [ 66%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_false PASSED [ 67%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_type PASSED [ 67%] -tests/test_virus.py::TestVirus::test_virus_invalid_annotated_type PASSED [ 67%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_nonexistent_raises PASSED [ 67%] -tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_accession_mode PASSED [ 68%] -tests/test_virus.py::TestVirus::test_parse_accession_input_single PASSED [ 68%] -tests/test_virus.py::TestVirus::test_stream_copy_fasta_with_accession_filter PASSED [ 68%] -tests/test_blat.py::TestBlat::test_blat_aa_protein PASSED [ 68%] -tests/test_blat.py::TestBlat::test_blat_nt_RNA PASSED [ 69%] -tests/test_blat.py::TestBlat::test_blat_bad_seqtype PASSED [ 69%] -tests/test_blat.py::TestBlat::test_blat_bad_fasta PASSED [ 69%] -tests/test_blat.py::TestBlat::test_blat_nt_transDNA PASSED [ 69%] -tests/test_blat.py::TestBlat::test_blat_bad_assembly PASSED [ 70%] -tests/test_blat.py::TestBlat::test_blat_aa PASSED [ 70%] -tests/test_blat.py::TestBlat::test_blat_nt_protein PASSED [ 70%] -tests/test_blat.py::TestBlat::test_blat_nt PASSED [ 70%] -tests/test_blat.py::TestBlat::test_blat_nt_json PASSED [ 70%] -tests/test_blat.py::TestBlat::test_blat_bad_txt PASSED [ 71%] -tests/test_blat.py::TestBlat::test_blat_bad_fileformat PASSED [ 71%] -tests/test_blat.py::TestBlat::test_blat_aa_RNA PASSED [ 71%] -tests/test_blat.py::TestBlat::test_blat_nt_txt PASSED [ 71%] -tests/test_blat.py::TestBlat::test_blat_nt_DNA PASSED [ 72%] -tests/test_blat.py::TestBlat::test_blat_shortseq PASSED [ 72%] -tests/test_blat.py::TestBlat::test_blat_nt_fasta PASSED [ 72%] -tests/test_compile.py::TestCompilerWindows::test_compiler_windows PASSED [ 72%] -tests/test_g2p.py::TestG2P::test_g2p_schema_invariant_across_input_modes PASSED [ 73%] -tests/test_g2p.py::TestG2P::test_g2p_invalid_pair_returns_none PASSED [ 73%] -tests/test_g2p.py::TestG2P::test_g2p_features PASSED [ 73%] -tests/test_g2p.py::TestG2P::test_g2p_residues_filter PASSED [ 73%] -tests/test_g2p.py::TestG2P::test_g2p_uniprot_auto_resolved PASSED [ 74%] -tests/test_g2p.py::TestG2P::test_g2p_out_writes_to_explicit_path PASSED [ 74%] -tests/test_g2p.py::TestG2P::test_g2p_residues_single_int PASSED [ 74%] -tests/test_g2p.py::TestG2P::test_g2p_alignment PASSED [ 74%] -tests/test_g2p.py::TestG2P::test_g2p_map_has_pdb_list_column PASSED [ 75%] -tests/test_g2p.py::TestG2P::test_g2p_map PASSED [ 75%] -tests/test_g2p.py::TestG2P::test_g2p_gene_auto_resolved PASSED [ 75%] -tests/test_g2p.py::TestG2PValidation::test_alignment_requires_isoform PASSED [ 75%] -tests/test_g2p.py::TestG2PValidation::test_missing_both_raises PASSED [ 75%] -tests/test_g2p.py::TestG2PValidation::test_residues_wrong_type_raises PASSED [ 76%] -tests/test_g2p.py::TestG2PValidation::test_alignment_requires_explicit_uniprot PASSED [ 76%] -tests/test_g2p.py::TestG2PValidation::test_residues_on_map_raises PASSED [ 76%] -tests/test_g2p.py::TestG2PValidation::test_invalid_resource_raises PASSED [ 76%] -tests/test_pdb.py::TestPDB::test_pdb_mmcif PASSED [ 77%] -tests/test_pdb.py::TestPDB::test_pdb_legacy_fallback_to_mmcif PASSED [ 77%] -tests/test_pdb.py::TestPDB::test_pdb_pdb PASSED [ 77%] -tests/test_pdb.py::TestPDB::test_pdb_assembly PASSED [ 77%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_no_limit PASSED [ 78%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions PASSED [ 78%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap_filter PASSED [ 78%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_resource PASSED [ 78%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_limit PASSED [ 79%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap PASSED [ 79%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_drugs_invalid_filter PASSED [ 79%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_nonexistent_id PASSED [ 79%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_simple_filter PASSED [ 80%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_expression SKIPPED [ 80%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_drugs PASSED [ 80%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_tractability PASSED [ 80%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_diseases PASSED [ 80%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_diseases_filter PASSED [ 81%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_pharmacogenetics PASSED [ 81%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_expression_no_limit SKIPPED [ 81%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets PASSED [ 81%] -tests/test_muscle.py::TestMuscle::test_muscle_nt_txt PASSED [ 82%] -tests/test_muscle.py::TestMuscle::test_muscle_nt PASSED [ 82%] -tests/test_muscle.py::TestMusclePrints::test_muscle_print_nt PASSED [ 82%] -tests/test_muscle.py::TestMuscleSeqsInput::test_muscle_seqs_as_input PASSED [ 82%] -tests/test_muscle.py::TestMuscleAA::test_muscle_aa PASSED [ 83%] -tests/test_muscle.py::TestMuscleAASuper::test_muscle_aa_super5 PASSED [ 83%] -tests/test_muscle.py::TestMuscleSuper::test_muscle_nt_super5 PASSED [ 83%] -tests/test_ref.py::TestRef::test_ref_plant PASSED [ 83%] -tests/test_ref.py::TestRef::test_ref_rel_ftp_octopus PASSED [ 84%] -tests/test_ref.py::TestRef::test_ref_bad_rel PASSED [ 84%] -tests/test_ref.py::TestRef::test_ref_bad_which PASSED [ 84%] -tests/test_ref.py::TestRef::test_ref_rel_protist PASSED [ 84%] -tests/test_ref.py::TestRef::test_ref_ftp PASSED [ 85%] -tests/test_ref.py::TestRef::test_ref PASSED [ 85%] -tests/test_ref.py::TestRef::test_ref_which_plant PASSED [ 85%] -tests/test_ref.py::TestRef::test_ref_rel_ftp PASSED [ 85%] -tests/test_ref.py::TestRef::test_ref_list PASSED [ 85%] -tests/test_ref.py::TestRef::test_ref_rel PASSED [ 86%] -tests/test_ref.py::TestRef::test_ref_which PASSED [ 86%] -tests/test_ref.py::TestRef::test_ref_bad_species PASSED [ 86%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_json PASSED [ 86%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_mouse_is_human PASSED [ 87%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_fly PASSED [ 87%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_gene PASSED [ 87%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_kinase_interactions PASSED [ 87%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_database_shortcut PASSED [ 88%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_background PASSED [ 88%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background_list PASSED [ 88%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_none PASSED [ 88%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_diseases_drugs PASSED [ 89%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_celltypes PASSED [ 89%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_species PASSED [ 89%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_worm PASSED [ 89%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_yeast PASSED [ 90%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_plot PASSED [ 90%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_background_ensembl PASSED [ 90%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background PASSED [ 90%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_ontology PASSED [ 90%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_transcription PASSED [ 91%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_ensembl_ids PASSED [ 91%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_pathway PASSED [ 91%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_fish PASSED [ 91%] -tests/test_8cube.py::TestSpecificity::test_specificity_basic PASSED [ 92%] -tests/test_8cube.py::TestGeneExpression::test_gene_expression_basic PASSED [ 92%] -tests/test_8cube.py::TestPsiBlock::test_psi_block_basic PASSED [ 92%] -tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_default_dir PASSED [ 92%] -tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_clean_up_missing_dir_is_safe PASSED [ 93%] -tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_clean_up_default_dir_when_none PASSED [ 93%] -tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_custom_dir PASSED [ 93%] -tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_cli_exposes_jackhmmer_savedir_flag PASSED [ 93%] -tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_clean_up_removes_custom_dir PASSED [ 94%] -tests/test_blast.py::TestBlast::test_blast_db_missing PASSED [ 94%] -tests/test_blast.py::TestBlast::test_blast_bad_db1 PASSED [ 94%] -tests/test_blast.py::TestBlast::test_blast_bad_db2 PASSED [ 94%] -tests/test_blast.py::TestBlast::test_blast_bad_seq PASSED [ 95%] -tests/test_blast.py::TestBlast::test_blast_bad_program PASSED [ 95%] -tests/test_blast.py::TestBlast::test_blast_nt \ No newline at end of file +tests/test_virus.py::TestVirus::test_virus_with_completeness_filter PASSED [ 61%] +tests/test_virus.py::TestVirus::test_parse_partial_date_full_date PASSED [ 61%] +tests/test_virus.py::TestVirus::test_unzip_file_bad_zip_raises PASSED [ 62%] +tests/test_virus.py::TestVirus::test_merge_baseline_with_new_deduplicates PASSED [ 62%] +tests/test_virus.py::TestVirus::test_local_name_without_namespace PASSED [ 62%] +tests/test_virus.py::TestVirus::test_retry_helper_failed_commands_tracking PASSED [ 62%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_jsonl PASSED [ 63%] +tests/test_virus.py::TestVirus::test_virus_with_annotated_filter PASSED [ 63%] +tests/test_virus.py::TestVirus::test_save_partial_metadata PASSED [ 63%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_true PASSED [ 63%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_no_filters PASSED [ 63%] +tests/test_virus.py::TestVirus::test_merge_metadata_csvs_no_overwrite PASSED [ 64%] +tests/test_virus.py::TestVirus::test_retry_helper_success_after_retry PASSED [ 64%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_min PASSED [ 64%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_empty PASSED [ 64%] +tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_common_names PASSED [ 65%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_isolation_source PASSED [ 65%] +tests/test_virus.py::TestVirus::test_merge_metadata_csvs_missing_standard_file PASSED [ 65%] +tests/test_virus.py::TestVirus::test_filter_sequences_no_filters PASSED [ 65%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_release_date PASSED [ 66%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_segment PASSED [ 66%] +tests/test_virus.py::TestVirus::test_merge_baseline_with_new_empty_new PASSED [ 66%] +tests/test_virus.py::TestVirus::test_virus_multi_accession_space_separated PASSED [ 66%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_text PASSED [ 67%] +tests/test_virus.py::TestVirus::test_get_memory_usage_returns_dict PASSED [ 67%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_seq_length PASSED [ 67%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_false PASSED [ 67%] +tests/test_virus.py::TestVirus::test_parse_genbank_xml_invalid_raises PASSED [ 68%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_nonexistent_raises PASSED [ 68%] +tests/test_virus.py::TestVirus::test_get_datasets_path_returns_valid_path PASSED [ 68%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_empty_raises PASSED [ 68%] +tests/test_virus.py::TestVirus::test_genbank_xml_to_csv_basic PASSED [ 68%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_max_seq_length PASSED [ 69%] +tests/test_virus.py::TestVirus::test_check_min_max_equal PASSED [ 69%] +tests/test_virus.py::TestVirus::test_parse_accession_input_space_separated PASSED [ 69%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_none_raises PASSED [ 69%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_true PASSED [ 70%] +tests/test_virus.py::TestVirus::test_parse_accession_input_from_file PASSED [ 70%] +tests/test_virus.py::TestVirus::test_validate_datasets_binary_valid PASSED [ 70%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_combined_filters PASSED [ 70%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_missing_accession PASSED [ 71%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_source_database PASSED [ 71%] +tests/test_virus.py::TestVirus::test_local_name_with_namespace PASSED [ 71%] +tests/test_virus.py::TestVirus::test_virus_with_host_filter PASSED [ 71%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_metadata_type PASSED [ 72%] +tests/test_virus.py::TestVirus::test_virus_completeness_filter_verification PASSED [ 72%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype_list PASSED [ 72%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_max_comparison PASSED [ 72%] +tests/test_virus.py::TestVirus::test_virus_invalid_keep_temp_type PASSED [ 72%] +tests/test_virus.py::TestVirus::test_deduplicate_all_existing PASSED [ 73%] +tests/test_virus.py::TestVirus::test_virus_specific_accession_file_creation PASSED [ 73%] +tests/test_virus.py::TestVirus::test_filter_cached_no_filters PASSED [ 73%] +tests/test_virus.py::TestVirus::test_check_min_max_none_values PASSED [ 73%] +tests/test_virus.py::TestVirus::test_virus_metadata_schema_validation PASSED [ 74%] +tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters PASSED [ 74%] +tests/test_virus.py::TestVirus::test_parse_accession_input_nonexistent_file_raises_error PASSED [ 74%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_type PASSED [ 74%] +tests/test_virus.py::TestVirus::test_virus_invalid_is_accession_type PASSED [ 75%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_no_parentheses_returns_none PASSED [ 75%] +tests/test_virus.py::TestVirus::test_unzip_file_valid PASSED [ 75%] +tests/test_virus.py::TestVirus::test_parse_accession_input_single PASSED [ 75%] +tests/test_virus.py::TestVirus::test_merge_metadata_csvs_fills_missing PASSED [ 76%] +tests/test_virus.py::TestVirus::test_virus_empty_virus_name PASSED [ 76%] +tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_empty PASSED [ 76%] +tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter PASSED [ 76%] +tests/test_virus.py::TestVirus::test_check_min_max_invalid_raises PASSED [ 77%] +tests/test_virus.py::TestVirus::test_retry_helper_exponential_backoff_timing PASSED [ 77%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_mature_peptide_count PASSED [ 77%] +tests/test_virus.py::TestVirus::test_force_garbage_collection_runs PASSED [ 77%] +tests/test_virus.py::TestVirus::test_datasets_cli_version_output PASSED [ 77%] +tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_negative PASSED [ 78%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_false PASSED [ 78%] +tests/test_virus.py::TestVirus::test_save_command_summary_creates_file PASSED [ 78%] +tests/test_virus.py::TestVirus::test_is_sars_cov2_query_accession_mode PASSED [ 78%] +tests/test_virus.py::TestVirus::test_get_datasets_version_returns_string_or_none PASSED [ 79%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_collection_date_range PASSED [ 79%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_max_gene_count PASSED [ 79%] +tests/test_virus.py::TestVirus::test_calculate_max_accessions_per_batch PASSED [ 79%] +tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_basic PASSED [ 80%] +tests/test_virus.py::TestVirus::test_deduplicate_metadata_against_baseline PASSED [ 80%] +tests/test_virus.py::TestVirus::test_parse_genbank_xml_basic PASSED [ 80%] +tests/test_virus.py::TestVirus::test_virus_with_collection_date_filters PASSED [ 80%] +tests/test_virus.py::TestVirus::test_stream_copy_fasta_with_accession_filter PASSED [ 81%] +tests/test_virus.py::TestVirus::test_save_command_summary_with_error PASSED [ 81%] +tests/test_virus.py::TestVirus::test_check_min_max_date_invalid_raises PASSED [ 81%] +tests/test_virus.py::TestVirus::test_track_failed_operation_creates_key PASSED [ 81%] +tests/test_virus.py::TestVirus::test_stream_copy_fasta_all_records PASSED [ 81%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_peptide_count PASSED [ 82%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_geographic_location PASSED [ 82%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_zero PASSED [ 82%] +tests/test_virus.py::TestVirus::test_filter_sequences_proteins_complete PASSED [ 82%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_gen_mol_type PASSED [ 83%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_multiple PASSED [ 83%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_true PASSED [ 83%] +tests/test_virus.py::TestVirus::test_retry_helper_non_retryable_exception PASSED [ 83%] +tests/test_virus.py::TestVirus::test_filter_cached_complete_only PASSED [ 84%] +tests/test_virus.py::TestVirus::test_get_datasets_path_uses_bundled_binary PASSED [ 84%] +tests/test_virus.py::TestVirus::test_parse_date_full PASSED [ 84%] +tests/test_virus.py::TestVirus::test_parse_partial_date_empty_raises PASSED [ 84%] +tests/test_virus.py::TestVirus::test_filter_cached_min_release_date PASSED [ 85%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_max_release_date PASSED [ 85%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_isolate PASSED [ 85%] +tests/test_virus.py::TestVirus::test_virus_with_genbank_metadata_retrieval PASSED [ 85%] +tests/test_virus.py::TestVirus::test_get_gget_version_returns_string PASSED [ 86%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_max PASSED [ 86%] +tests/test_virus.py::TestVirus::test_parse_accession_input_empty_file_raises_error PASSED [ 86%] +tests/test_virus.py::TestVirus::test_virus_release_date_filter_verification PASSED [ 86%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_min_seq_length PASSED [ 86%] +tests/test_virus.py::TestVirus::test_unzip_file_nonexistent_raises PASSED [ 87%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_gene_count PASSED [ 87%] +tests/test_virus.py::TestVirus::test_virus_with_multiple_filters PASSED [ 87%] +tests/test_virus.py::TestVirus::test_save_partial_metadata_empty PASSED [ 87%] +tests/test_virus.py::TestVirus::test_clean_xml_declarations_no_declarations PASSED [ 88%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_protein_count PASSED [ 88%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_nuc_completeness_partial PASSED [ 88%] +tests/test_virus.py::TestVirus::test_filter_cached_refseq_only PASSED [ 88%] +tests/test_virus.py::TestVirus::test_track_failed_operation_appends PASSED [ 89%] +tests/test_virus.py::TestVirus::test_retry_helper_successful_operation PASSED [ 89%] +tests/test_virus.py::TestVirus::test_clean_xml_declarations PASSED [ 89%] +tests/test_virus.py::TestVirus::test_virus_invalid_lab_passaged_type PASSED [ 89%] +tests/test_virus.py::TestVirus::test_save_metadata_to_csv_basic PASSED [ 90%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_name PASSED [ 90%] +tests/test_bgee.py::TestBgee::test_error_bgee_expression_no_exist PASSED [ 90%] +tests/test_bgee.py::TestBgee::test_bgee_expression PASSED [ 90%] +tests/test_bgee.py::TestBgee::test_error_bgee_unknown_type PASSED [ 90%] +tests/test_bgee.py::TestBgee::test_bgee_orthologs PASSED [ 91%] +tests/test_bgee.py::TestBgee::test_error_bgee_orthologs_no_exist PASSED [ 91%] +tests/test_bgee.py::TestBgee::test_bgee_expression_multiple PASSED [ 91%] +tests/test_muscle.py::TestMusclePrints::test_muscle_print_nt PASSED [ 91%] +tests/test_muscle.py::TestMuscleAASuper::test_muscle_aa_super5 PASSED [ 92%] +tests/test_muscle.py::TestMuscle::test_muscle_nt_txt PASSED [ 92%] +tests/test_muscle.py::TestMuscle::test_muscle_nt PASSED [ 92%] +tests/test_muscle.py::TestMuscleSeqsInput::test_muscle_seqs_as_input PASSED [ 92%] +tests/test_muscle.py::TestMuscleAA::test_muscle_aa PASSED [ 93%] +tests/test_muscle.py::TestMuscleSuper::test_muscle_nt_super5 PASSED [ 93%] +tests/test_archs4.py::TestArchs4::test_archs4_defaults PASSED [ 93%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_gene_tissue PASSED [ 93%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_species PASSED [ 94%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue_mouse PASSED [ 94%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue PASSED [ 94%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_gene PASSED [ 94%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue_ensembl PASSED [ 95%] +tests/test_archs4.py::TestArchs4::test_archs4_mouse_json_ensembl PASSED [ 95%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_which PASSED [ 95%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue_json PASSED [ 95%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_ensembl PASSED [ 95%] +tests/test_archs4.py::TestArchs4MissingColor::test_tissue_missing_color_does_not_crash PASSED [ 96%] +tests/test_cosmic.py::TestCosmicWorkflow::test_cosmic_defaults PASSED [ 96%] +tests/test_utils.py::TestUtils::test_search_species_options_bad_type PASSED [ 96%] +tests/test_utils.py::TestUtils::test_read_fasta PASSED [ 96%] +tests/test_utils.py::TestUtils::test_rest_query PASSED [ 97%] +tests/test_utils.py::TestUtils::test_ref_iv_species_options PASSED [ 97%] +tests/test_utils.py::TestUtils::test_get_uniprot_info_gene PASSED [ 97%] +tests/test_utils.py::TestUtils::test_find_latest_ens_rel PASSED [ 97%] +tests/test_utils.py::TestUtils::test_search_species_options PASSED [ 98%] +tests/test_utils.py::TestUtils::test_ref_species_options_bad_type PASSED [ 98%] +tests/test_utils.py::TestUtils::test_search_iv_species_options PASSED [ 98%] +tests/test_utils.py::TestUtils::test_n_colors PASSED [ 98%] +tests/test_utils.py::TestUtils::test_get_uniprot_info_transcript PASSED [ 99%] +tests/test_utils.py::TestUtils::test_get_uniprot_seqs PASSED [ 99%] +tests/test_utils.py::TestUtils::test_rest_query_bad_type PASSED [ 99%] +tests/test_utils.py::TestUtils::test_ref_species_options PASSED [ 99%] +tests/test_utils.py::TestUtils::test_aa_colors PASSED [100%] + +=================================== FAILURES =================================== +___________________ TestInfo.test_info_ncbitrue_uniprotfalse ___________________ + +self = + + def assert_equal(self: unittest.TestCase): + test = name + expected_result = td[test]["expected_result"] + result_to_test = do_call(func, td[test]["args"]) + if test == "test_cosmic_defaults": # special case for cosmic + import numpy as np + + expected_result = pd.DataFrame(expected_result[0]) + expected_result = expected_result.replace({None: np.nan}) + # result_to_test.equals(expected_result) + pd.testing.assert_frame_equal(result_to_test, expected_result, check_dtype=False) + return + + # If result is a DataFrame, convert to list + if isinstance(result_to_test, pd.DataFrame): + result_to_test = result_to_test.dropna(axis=1).values.tolist() + +> self.assertEqual(result_to_test, expected_result) +E AssertionError: Lists differ: [['EN[14 chars]7', 'homo_sapiens', 'GRCh38', 'KRTAP9-8', 'ker[227 chars]04]]] != [['EN[14 chars]7', '83901', 'homo_sapiens', 'GRCh38', 'KRTAP9[860 chars]04]]] +E +E First differing element 0: +E ['ENS[13 chars]7', 'homo_sapiens', 'GRCh38', 'KRTAP9-8', 'ker[226 chars]004]] +E ['ENS[13 chars]7', '83901', 'homo_sapiens', 'GRCh38', 'KRTAP9[859 chars]004]] +E +E [['ENSG00000187272.7', +E + '83901', +E 'homo_sapiens', +E 'GRCh38', +E 'KRTAP9-8', +E + ['KAP9.8', 'KRTAP9.8'], +E 'keratin associated protein 9-8 [Source:HGNC Symbol;Acc:HGNC:17231]', +E + 'This protein is a member of the keratin-associated protein (KAP) family. ' +E + 'The KAP proteins form a matrix of keratin intermediate filaments which ' +E + 'contribute to the structure of hair fibers. KAP family members appear to ' +E + 'have unique, family-specific amino- and carboxyl-terminal regions and are ' +E + 'subdivided into three multi-gene families according to amino acid ' +E + 'composition: the high sulfur, the ultrahigh sulfur, and the high ' +E + 'tyrosine/glycine KAPs. This protein is a member of the ultrahigh sulfur KAP ' +E + 'family and the gene is localized to a cluster of KAPs at 17q12-q21. ' +E + '[provided by RefSeq, Jul 2008]', +E 'Gene', +E 'protein_coding', +E 'ENST00000254072.7', +E '17', +E 1, +E 41237999, +E 41239004, +E ['ENST00000254072.7'], +E ['protein_coding'], +E ['KRTAP9-8-201'], +E [1], +E [41237999], +E [41239004]]] + +tests/from_json.py:82: AssertionError +------------------------------ Captured log call ------------------------------- +ERROR gget.utils:gget_info.py:315 The NCBI server request for Ensembl ID 'ENSG00000187272' returned the following error: +Response ended prematurely +=============================== warnings summary =============================== +tests/test_mutate.py: 29 warnings + /home/runner/work/gget/gget/gget/gget_mutate.py:667: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract. + mask = mutations[mut_column].str.contains(combined_pattern) + +tests/test_cbio.py::TestCbioSearch::test_cbio_search +tests/test_cbio.py::TestCbioSearch::test_cbio_search + /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/swagger_spec_validator/validator12.py:18: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. + from jsonschema import RefResolver + +tests/test_cbio.py::TestCbioSearch::test_cbio_search + /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/swagger_spec_validator/ref_validators.py:14: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. + from jsonschema.validators import RefResolver + +tests/test_cbio.py::TestCbioSearch::test_cbio_search + /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/swagger_spec_validator/validator20.py:18: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. + from jsonschema.validators import RefResolver + +tests/test_cbio.py::TestCbioSearch::test_cbio_search +tests/test_cbio.py::TestCbioSearch::test_cbio_search + /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/bravado_core/swagger20_validator.py:6: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. + from jsonschema import RefResolver + +tests/test_cbio.py::TestCbioSearch::test_cbio_search + /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/bravado_core/spec.py:14: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. + from jsonschema.validators import RefResolver + +tests/test_cbio.py: 16 warnings + /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/bravado_core/model.py:888: DeprecationWarning: jsonschema.RefResolver.in_scope is deprecated and will be removed in a future release. + with spec.resolver.in_scope(additional_uri): + +tests/test_ref.py: 11 warnings +tests/test_utils.py: 1 warning + /home/runner/work/gget/gget/gget/utils.py:998: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. + for subsoup in soup.body.findAll("a"): + +tests/test_ref.py: 24 warnings +tests/test_utils.py: 4 warnings + /home/runner/work/gget/gget/gget/utils.py:975: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. + for subsoup in soup.body.findAll("a"): + +tests/test_ref.py: 7 warnings +tests/test_search.py: 19 warnings + /home/runner/work/gget/gget/gget/utils.py:922: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. + for subsoup in soup.body.findAll("a"): + +tests/test_ref.py: 39 warnings + /home/runner/work/gget/gget/gget/gget_ref.py:49: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. + links = [stuff.text.strip() for stuff in soup.findAll("td")] + +tests/test_ref.py::TestRef::test_ref +tests/test_ref.py::TestRef::test_ref_ftp + /home/runner/work/gget/gget/gget/gget_ref.py:325: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. + links = [stuff.text.strip() for stuff in soup.findAll("td")] + +tests/test_search.py::TestSearch::test_search_transcript_bad_species +tests/test_search.py::TestSearch::test_search_transcript_two_sw_or +tests/test_search.py::TestSearch::test_search_release +tests/test_utils.py::TestUtils::test_search_species_options + /home/runner/work/gget/gget/gget/utils.py:899: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. + for subsoup in soup.body.findAll("a"): + +tests/test_search.py::TestSearch::test_search_transcript_bad_species +tests/test_search.py::TestSearch::test_search_transcript_bad_species +tests/test_search.py::TestSearch::test_search_transcript_bad_species +tests/test_search.py::TestSearch::test_search_transcript_bad_species +tests/test_utils.py::TestUtils::test_search_iv_species_options +tests/test_utils.py::TestUtils::test_search_iv_species_options +tests/test_utils.py::TestUtils::test_search_iv_species_options +tests/test_utils.py::TestUtils::test_search_iv_species_options + /home/runner/work/gget/gget/gget/utils.py:883: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. + for subsoup in soup.body.findAll("a"): + +tests/test_search.py: 10 warnings + /home/runner/work/gget/gget/gget/gget_search.py:267: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy. + df_temp = pd.read_sql(query, con=db_connection) + +tests/test_search.py::TestSearch::test_search_gene_two_sw_limit +tests/test_search.py::TestSearch::test_search_transcript_two_sw_and +tests/test_search.py::TestSearch::test_search_transcript_two_sw_or +tests/test_search.py::TestSearch::test_search_transcript_one_sw + /home/runner/work/gget/gget/gget/gget_search.py:302: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy. + df_temp = pd.read_sql(query, con=db_connection) + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +============================= slowest 10 durations ============================= +130.22s call tests/test_virus.py::TestVirus::test_virus_with_source_database_filter +128.90s call tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter +127.97s call tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter +91.02s call tests/test_blast.py::TestBlast::test_blast_nt +84.15s call tests/test_virus.py::TestVirus::test_virus_integer_virus_id +66.85s call tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter +23.56s call tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters +23.38s call tests/test_virus.py::TestVirus::test_virus_with_annotated_filter +20.59s call tests/test_virus.py::TestVirus::test_virus_with_host_filter +19.01s call tests/test_virus.py::TestVirus::test_virus_with_length_filters +=========================== short test summary info ============================ +SKIPPED [1] tests/test_cellxgene.py:55: cellxgene-census is not installed +SKIPPED [1] tests/test_cellxgene.py:65: cellxgene-census is not installed +SKIPPED [1] tests/test_cellxgene.py:45: cellxgene-census is not installed +FAILED tests/test_info.py::TestInfo::test_info_ncbitrue_uniprotfalse - AssertionError: Lists differ: [['EN[14 chars]7', 'homo_sapiens', 'GRCh38', 'KRTAP9-8', 'ker[227 chars]04]]] != [['EN[14 chars]7', '83901', 'homo_sapiens', 'GRCh38', 'KRTAP9[860 chars]04]]] + +First differing element 0: +['ENS[13 chars]7', 'homo_sapiens', 'GRCh38', 'KRTAP9-8', 'ker[226 chars]004]] +['ENS[13 chars]7', '83901', 'homo_sapiens', 'GRCh38', 'KRTAP9[859 chars]004]] + + [['ENSG00000187272.7', ++ '83901', + 'homo_sapiens', + 'GRCh38', + 'KRTAP9-8', ++ ['KAP9.8', 'KRTAP9.8'], + 'keratin associated protein 9-8 [Source:HGNC Symbol;Acc:HGNC:17231]', ++ 'This protein is a member of the keratin-associated protein (KAP) family. ' ++ 'The KAP proteins form a matrix of keratin intermediate filaments which ' ++ 'contribute to the structure of hair fibers. KAP family members appear to ' ++ 'have unique, family-specific amino- and carboxyl-terminal regions and are ' ++ 'subdivided into three multi-gene families according to amino acid ' ++ 'composition: the high sulfur, the ultrahigh sulfur, and the high ' ++ 'tyrosine/glycine KAPs. This protein is a member of the ultrahigh sulfur KAP ' ++ 'family and the gene is localized to a cluster of KAPs at 17q12-q21. ' ++ '[provided by RefSeq, Jul 2008]', + 'Gene', + 'protein_coding', + 'ENST00000254072.7', + '17', + 1, + 41237999, + 41239004, + ['ENST00000254072.7'], + ['protein_coding'], + ['KRTAP9-8-201'], + [1], + [41237999], + [41239004]]] +===== 1 failed, 418 passed, 3 skipped, 185 warnings in 1095.63s (0:18:15) ====== From e0e7e18fa249b3526f813199331512d775d3dcb5 Mon Sep 17 00:00:00 2001 From: Laura Luebbert Date: Sun, 28 Jun 2026 13:23:34 -0400 Subject: [PATCH 28/34] ci(mypy): adopt mypy-baseline so pre-commit only fails on new type errors The mypy hook had ~553 pre-existing errors and exited non-zero, so it failed on every PR (pre-commit.ci runs --all-files, so per-file diffing doesn't help). Switch to mypy-baseline: - .mypy-baseline.txt grandfathers the existing errors (line numbers normalized to 0 so they survive line shifts). - The pre-commit hook now runs `mypy gget | mypy-baseline filter`, which fails only on NEW errors not in the baseline. Verified: a clean tree passes; a freshly introduced type error fails. - Works on pre-commit.ci because the baseline filters by error identity, not by file. - Added mypy-baseline to the test dependency group; excluded the generated baseline file from the hygiene hooks. Refresh the baseline after fixing errors with: mypy gget | mypy-baseline sync Tracked in #216. Co-Authored-By: Claude Opus 4.7 (1M context) --- .mypy-baseline.txt | 725 ++++++++++++++++++++++++++++++++++++++++ .pre-commit-config.yaml | 21 +- pyproject.toml | 7 + 3 files changed, 749 insertions(+), 4 deletions(-) create mode 100644 .mypy-baseline.txt diff --git a/.mypy-baseline.txt b/.mypy-baseline.txt new file mode 100644 index 000000000..f7944e2d9 --- /dev/null +++ b/.mypy-baseline.txt @@ -0,0 +1,725 @@ +gget/utils.py:0: error: Item "NavigableString" of "Tag | NavigableString | None" has no attribute "get" [union-attr] +gget/utils.py:0: error: Item "None" of "Tag | NavigableString | None" has no attribute "get" [union-attr] +gget/utils.py:0: error: Item "list[str]" of "str | list[str] | Any | None" has no attribute "split" [union-attr] +gget/utils.py:0: error: Item "None" of "str | list[str] | Any | None" has no attribute "split" [union-attr] +gget/utils.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "bool") [assignment] +gget/utils.py:0: error: Incompatible types in assignment (expression has type "int", variable has type "bool") [assignment] +gget/utils.py:0: error: Unsupported operand types for + ("bool" and "str") [operator] +gget/utils.py:0: error: Argument 1 to "append" of "list" has incompatible type "bool"; expected "Literal[True]" [arg-type] +gget/utils.py:0: error: Incompatible return value type (got "tuple[list[str], list[Literal[True]]]", expected "tuple[list[str], list[str]]") [return-value] +gget/utils.py:0: error: Incompatible types in assignment (expression has type "list[str]", variable has type "Index[str]") [assignment] +gget/utils.py:0: error: Incompatible types in assignment (expression has type "list[str]", variable has type "Index[str]") [assignment] +gget/utils.py:0: error: Incompatible types in assignment (expression has type "ndarray[tuple[Any, ...], dtype[Any]]", variable has type "list[Any]") [assignment] +gget/utils.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "list[Any]") [assignment] +gget/utils.py:0: error: Incompatible types in assignment (expression has type "list[ndarray[tuple[int], dtype[Any]] | ExtensionArray]", target has type "str | bytes | date | datetime | timedelta | <7 more items> | complex | integer[Any] | floating[Any] | complexfloating[Any, Any] | NAType | NaTType | None | Sequence[str | bytes | date | datetime | timedelta | <7 more items> | complex | integer[Any] | floating[Any] | complexfloating[Any, Any] | NAType | NaTType | None] | Sequence[Sequence[str | bytes | date | datetime | timedelta | <7 more items> | complex | integer[Any] | floating[Any] | complexfloating[Any, Any] | NAType | NaTType | None]] | Mapping[Any, str | bytes | date | datetime | timedelta | <7 more items> | complex | integer[Any] | floating[Any] | complexfloating[Any, Any] | NAType | NaTType | None] | ExtensionArray | ndarray[tuple[Any, ...], dtype[Any]] | IndexOpsMixin[Any, Any] | DataFrame") [assignment] +gget/utils.py:0: error: Incompatible types in assignment (expression has type "list[ndarray[tuple[int], dtype[Any]] | ExtensionArray]", target has type "str | bytes | date | datetime | timedelta | <7 more items> | complex | integer[Any] | floating[Any] | complexfloating[Any, Any] | NAType | NaTType | None | Sequence[str | bytes | date | datetime | timedelta | <7 more items> | complex | integer[Any] | floating[Any] | complexfloating[Any, Any] | NAType | NaTType | None] | Sequence[Sequence[str | bytes | date | datetime | timedelta | <7 more items> | complex | integer[Any] | floating[Any] | complexfloating[Any, Any] | NAType | NaTType | None]] | Mapping[Any, str | bytes | date | datetime | timedelta | <7 more items> | complex | integer[Any] | floating[Any] | complexfloating[Any, Any] | NAType | NaTType | None] | ExtensionArray | ndarray[tuple[Any, ...], dtype[Any]] | IndexOpsMixin[Any, Any] | DataFrame") [assignment] +gget/utils.py:0: error: Item "None" of "Tag | None" has no attribute "findAll" [union-attr] +gget/utils.py:0: error: Item "None" of "Tag | None" has no attribute "findAll" [union-attr] +gget/utils.py:0: error: Missing return statement [return] +gget/utils.py:0: error: Item "None" of "Tag | None" has no attribute "findAll" [union-attr] +gget/utils.py:0: error: Item "None" of "Tag | None" has no attribute "findAll" [union-attr] +gget/utils.py:0: error: Item "None" of "Tag | None" has no attribute "findAll" [union-attr] +gget/utils.py:0: error: Argument 1 to "sorted" has incompatible type "list[list[Any]]"; expected "Iterable[str]" [arg-type] +gget/gget_search.py:0: error: Return value expected [return-value] +gget/gget_search.py:0: error: Incompatible types in assignment (expression has type "list[Never]", variable has type "str") [assignment] +gget/gget_search.py:0: error: "str" has no attribute "append" [attr-defined] +gget/gget_search.py:0: error: "Series[Any]" not callable [operator] +gget/gget_search.py:0: error: "Series[Any]" not callable [operator] +gget/gget_ref.py:0: error: Item "None" of "str | None" has no attribute "lower" [union-attr] +gget/gget_ref.py:0: error: Item "None" of "str | None" has no attribute "split" [union-attr] +gget/gget_ref.py:0: error: Item "None" of "str | None" has no attribute "split" [union-attr] +gget/gget_ref.py:0: error: Item "None" of "str | None" has no attribute "split" [union-attr] +gget/gget_ref.py:0: error: Item "None" of "str | None" has no attribute "split" [union-attr] +gget/gget_ref.py:0: error: Item "None" of "str | None" has no attribute "split" [union-attr] +gget/gget_ref.py:0: error: Item "None" of "str | None" has no attribute "split" [union-attr] +gget/gget_ref.py:0: error: Item "None" of "str | None" has no attribute "split" [union-attr] +gget/gget_ref.py:0: error: Item "None" of "str | None" has no attribute "split" [union-attr] +gget/gget_ref.py:0: error: Item "None" of "str | None" has no attribute "split" [union-attr] +gget/gget_ref.py:0: error: Item "None" of "str | None" has no attribute "split" [union-attr] +gget/gget_ref.py:0: error: Item "None" of "str | None" has no attribute "split" [union-attr] +gget/gget_ref.py:0: error: Item "None" of "str | None" has no attribute "split" [union-attr] +gget/gget_ref.py:0: error: Item "None" of "str | None" has no attribute "split" [union-attr] +gget/gget_ref.py:0: error: Item "None" of "str | None" has no attribute "split" [union-attr] +gget/gget_ref.py:0: error: Item "None" of "str | None" has no attribute "split" [union-attr] +gget/gget_ref.py:0: error: Item "None" of "str | None" has no attribute "split" [union-attr] +gget/gget_ref.py:0: error: Item "None" of "str | None" has no attribute "split" [union-attr] +gget/gget_ref.py:0: error: Item "None" of "str | None" has no attribute "split" [union-attr] +gget/gget_ref.py:0: error: Item "None" of "str | None" has no attribute "split" [union-attr] +gget/gget_ref.py:0: error: Item "None" of "str | None" has no attribute "split" [union-attr] +gget/gget_opentargets.py:0: error: Incompatible types in assignment (expression has type "int", target has type "str") [assignment] +gget/gget_mutate.py:0: error: Argument 1 to "read_fasta" has incompatible type "str | list[str]"; expected "str" [arg-type] +gget/gget_mutate.py:0: error: Incompatible types in assignment (expression has type "DataFrame", variable has type "str | list[str]") [assignment] +gget/gget_mutate.py:0: error: "str" has no attribute "columns" [attr-defined] +gget/gget_mutate.py:0: error: Incompatible types in assignment (expression has type "DataFrame", variable has type "str | list[str]") [assignment] +gget/gget_mutate.py:0: error: "str" has no attribute "columns" [attr-defined] +gget/gget_mutate.py:0: error: Incompatible types in assignment (expression has type "DataFrame", variable has type "str | list[str]") [assignment] +gget/gget_mutate.py:0: error: Incompatible types in assignment (expression has type "DataFrame", variable has type "str | list[str]") [assignment] +gget/gget_mutate.py:0: error: Incompatible types in assignment (expression has type "DataFrame", variable has type "str | list[str]") [assignment] +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Item "str" of "str | Any" has no attribute "isna" [union-attr] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Item "str" of "str | list[str]" has no attribute "dropna" [union-attr] +gget/gget_mutate.py:0: error: Item "list[str]" of "str | list[str]" has no attribute "dropna" [union-attr] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str | list[str]") [index] +gget/gget_mutate.py:0: error: No overload variant of "__setitem__" of "list" matches argument types "str", "Any" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __setitem__(self, SupportsIndex, str, /) -> None +gget/gget_mutate.py:0: note: def __setitem__(self, slice, Iterable[str], /) -> None +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Item "str" of "str | Any" has no attribute "apply" [union-attr] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Incompatible types in assignment (expression has type "DataFrame", variable has type "str | list[str]") [assignment] +gget/gget_mutate.py:0: error: Argument 1 to "add_mutation_type" has incompatible type "str | list[str]"; expected "DataFrame" [arg-type] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str | list[str]") [index] +gget/gget_mutate.py:0: error: No overload variant of "__setitem__" of "list" matches argument types "str", "Any" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __setitem__(self, SupportsIndex, str, /) -> None +gget/gget_mutate.py:0: note: def __setitem__(self, slice, Iterable[str], /) -> None +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Item "str" of "str | Any" has no attribute "map" [union-attr] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Item "str" of "str | Any" has no attribute "isin" [union-attr] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: "str" has no attribute "values" [attr-defined] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Item "str" of "str | list[str]" has no attribute "dropna" [union-attr] +gget/gget_mutate.py:0: error: Item "list[str]" of "str | list[str]" has no attribute "dropna" [union-attr] +gget/gget_mutate.py:0: error: Item "str" of "str | list[str]" has no attribute "shape" [union-attr] +gget/gget_mutate.py:0: error: Item "list[str]" of "str | list[str]" has no attribute "shape" [union-attr] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str | list[str]") [index] +gget/gget_mutate.py:0: error: No overload variant of "__setitem__" of "list" matches argument types "str", "str" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __setitem__(self, SupportsIndex, str, /) -> None +gget/gget_mutate.py:0: note: def __setitem__(self, slice, Iterable[str], /) -> None +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str | list[str]") [index] +gget/gget_mutate.py:0: error: No overload variant of "__setitem__" of "list" matches argument types "str", "str | Any" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __setitem__(self, SupportsIndex, str, /) -> None +gget/gget_mutate.py:0: note: def __setitem__(self, slice, Iterable[str], /) -> None +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Item "str" of "str | Any" has no attribute "str" [union-attr] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Item "str" of "str | Any" has no attribute "str" [union-attr] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Item "str" of "str | Any" has no attribute "str" [union-attr] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Item "str" of "str | Any" has no attribute "str" [union-attr] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Item "str" of "str | Any" has no attribute "str" [union-attr] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str | Any") [index] +gget/gget_mutate.py:0: error: Item "str" of "str | Any" has no attribute "str" [union-attr] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Item "str" of "str | Any" has no attribute "isna" [union-attr] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Item "str" of "str | Any" has no attribute "dropna" [union-attr] +gget/gget_mutate.py:0: error: Item "str" of "str | list[str]" has no attribute "empty" [union-attr] +gget/gget_mutate.py:0: error: Item "list[str]" of "str | list[str]" has no attribute "empty" [union-attr] +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Item "str" of "str | Any" has no attribute "str" [union-attr] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str | list[str]") [index] +gget/gget_mutate.py:0: error: No overload variant of "__setitem__" of "list" matches argument types "str", "Any" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __setitem__(self, SupportsIndex, str, /) -> None +gget/gget_mutate.py:0: note: def __setitem__(self, slice, Iterable[str], /) -> None +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str | list[str]") [index] +gget/gget_mutate.py:0: error: No overload variant of "__setitem__" of "list" matches argument types "str", "Any" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __setitem__(self, SupportsIndex, str, /) -> None +gget/gget_mutate.py:0: note: def __setitem__(self, slice, Iterable[str], /) -> None +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str | list[str]") [index] +gget/gget_mutate.py:0: error: No overload variant of "__setitem__" of "list" matches argument types "str", "str | Any" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __setitem__(self, SupportsIndex, str, /) -> None +gget/gget_mutate.py:0: note: def __setitem__(self, slice, Iterable[str], /) -> None +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Item "str" of "str | list[str]" has no attribute "loc" [union-attr] +gget/gget_mutate.py:0: error: Item "list[str]" of "str | list[str]" has no attribute "loc" [union-attr] +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Item "str" of "str | Any" has no attribute "isna" [union-attr] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str | list[str]") [index] +gget/gget_mutate.py:0: error: No overload variant of "__setitem__" of "list" matches argument types "list[str]", "Any" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __setitem__(self, SupportsIndex, str, /) -> None +gget/gget_mutate.py:0: note: def __setitem__(self, slice, Iterable[str], /) -> None +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "list[str]" [call-overload] +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Item "str" of "str | Any" has no attribute "astype" [union-attr] +gget/gget_mutate.py:0: error: Invalid index type "list[str]" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str | list[str]") [index] +gget/gget_mutate.py:0: error: Unsupported operand types for - (likely involving Union) [operator] +gget/gget_mutate.py:0: note: Left operand is of type "str | Any" +gget/gget_mutate.py:0: error: No overload variant of "__setitem__" of "list" matches argument types "str", "int | Any" [call-overload] +gget/gget_mutate.py:0: note: def __setitem__(self, SupportsIndex, str, /) -> None +gget/gget_mutate.py:0: note: def __setitem__(self, slice, Iterable[str], /) -> None +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str | list[str]") [index] +gget/gget_mutate.py:0: error: Unsupported operand types for - (likely involving Union) [operator] +gget/gget_mutate.py:0: note: Left operand is of type "str | Any" +gget/gget_mutate.py:0: error: No overload variant of "__setitem__" of "list" matches argument types "str", "int | Any" [call-overload] +gget/gget_mutate.py:0: note: def __setitem__(self, SupportsIndex, str, /) -> None +gget/gget_mutate.py:0: note: def __setitem__(self, slice, Iterable[str], /) -> None +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str | list[str]") [index] +gget/gget_mutate.py:0: error: No overload variant of "__setitem__" of "list" matches argument types "str", "Any" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __setitem__(self, SupportsIndex, str, /) -> None +gget/gget_mutate.py:0: note: def __setitem__(self, slice, Iterable[str], /) -> None +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Item "str" of "str | Any" has no attribute "apply" [union-attr] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Item "bool" of "bool | Any" has no attribute "sum" [union-attr] +gget/gget_mutate.py:0: error: "str" has no attribute "empty" [attr-defined] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str") [index] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Unsupported left operand type for - ("str") [operator] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Unsupported left operand type for - ("str") [operator] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str") [index] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "str" [attr-defined] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: "str" has no attribute "isna" [attr-defined] +gget/gget_mutate.py:0: error: Invalid index type "list[str]" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: "str" has no attribute "empty" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str") [index] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str") [index] +gget/gget_mutate.py:0: error: Unsupported operand types for - ("str" and "int") [operator] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str") [index] +gget/gget_mutate.py:0: error: "str" has no attribute "combine" [attr-defined] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str") [index] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Unsupported operand types for + ("str" and "int") [operator] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str") [index] +gget/gget_mutate.py:0: error: "str" has no attribute "min" [attr-defined] +gget/gget_mutate.py:0: error: Invalid index type "list[str]" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Item "None" of "str | None" has no attribute "endswith" [union-attr] +gget/gget_mutate.py:0: error: "str" has no attribute "columns" [attr-defined] +gget/gget_mutate.py:0: error: Incompatible types in assignment (expression has type "DataFrame", variable has type "str | list[str]") [assignment] +gget/gget_mutate.py:0: error: Argument 1 to "merge_gtf_transcript_locations_into_cosmic_csv" has incompatible type "str"; expected "DataFrame" [arg-type] +gget/gget_mutate.py:0: error: Argument "gtf_transcript_id_column" to "merge_gtf_transcript_locations_into_cosmic_csv" has incompatible type "str | None"; expected "str" [arg-type] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str") [index] +gget/gget_mutate.py:0: error: Unsupported operand types for - ("str" and "int") [operator] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str") [index] +gget/gget_mutate.py:0: error: "str" has no attribute "max" [attr-defined] +gget/gget_mutate.py:0: error: Invalid index type "list[str]" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str") [index] +gget/gget_mutate.py:0: error: "str" has no attribute "min" [attr-defined] +gget/gget_mutate.py:0: error: Invalid index type "list[str]" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: "str" has no attribute "progress_apply" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "apply" [attr-defined] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str") [index] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str") [index] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str") [index] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str") [index] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str") [index] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str") [index] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str") [index] +gget/gget_mutate.py:0: error: "str" has no attribute "fillna" [attr-defined] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str") [index] +gget/gget_mutate.py:0: error: "str" has no attribute "fillna" [attr-defined] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str") [index] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str") [index] +gget/gget_mutate.py:0: error: "bool" has no attribute "any" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "bool" has no attribute "any" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: "str" has no attribute "loc" [attr-defined] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str") [index] +gget/gget_mutate.py:0: error: "str" has no attribute "sum" [attr-defined] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Unsupported operand type for ~ ("str") [operator] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str") [index] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str") [index] +gget/gget_mutate.py:0: error: "str" has no attribute "apply" [attr-defined] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: "str" has no attribute "max" [attr-defined] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Unsupported operand types for < ("str" and "int") [operator] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Unsupported operand types for >= ("str" and "int") [operator] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str") [index] +gget/gget_mutate.py:0: error: "str" has no attribute "str" [attr-defined] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Unsupported operand types for > ("str" and "int") [operator] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Unsupported operand types for <= ("str" and "int") [operator] +gget/gget_mutate.py:0: error: "str" has no attribute "drop" [attr-defined] +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Argument 1 to "cut" has incompatible type "str | Any"; expected "Series[Timestamp]" [arg-type] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Argument "bins" to "cut" has incompatible type "range"; expected "int | Sequence[datetime64[Any] | Timestamp] | IntervalIndex[Interval[Timestamp]] | DatetimeIndex | Series[Timestamp]" [arg-type] +gget/gget_mutate.py:0: error: Item "str" of "str | list[str]" has no attribute "shape" [union-attr] +gget/gget_mutate.py:0: error: Item "list[str]" of "str | list[str]" has no attribute "shape" [union-attr] +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str | list[str]") [index] +gget/gget_mutate.py:0: error: No overload variant of "__setitem__" of "list" matches argument types "str", "Any" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __setitem__(self, SupportsIndex, str, /) -> None +gget/gget_mutate.py:0: note: def __setitem__(self, slice, Iterable[str], /) -> None +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Item "str" of "str | Any" has no attribute "progress_apply" [union-attr] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Argument "end" to "translate_sequence" has incompatible type "Any | int | str"; expected "int" [arg-type] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str | list[str]") [index] +gget/gget_mutate.py:0: error: No overload variant of "__setitem__" of "list" matches argument types "str", "Any" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __setitem__(self, SupportsIndex, str, /) -> None +gget/gget_mutate.py:0: note: def __setitem__(self, slice, Iterable[str], /) -> None +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Item "str" of "str | Any" has no attribute "apply" [union-attr] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Argument "end" to "translate_sequence" has incompatible type "Any | int | str"; expected "int" [arg-type] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str | list[str]") [index] +gget/gget_mutate.py:0: error: No overload variant of "__setitem__" of "list" matches argument types "str", "Any" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __setitem__(self, SupportsIndex, str, /) -> None +gget/gget_mutate.py:0: note: def __setitem__(self, slice, Iterable[str], /) -> None +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Item "str" of "str | Any" has no attribute "progress_apply" [union-attr] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Argument "end" to "translate_sequence" has incompatible type "Any | int | str"; expected "int" [arg-type] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str | list[str]") [index] +gget/gget_mutate.py:0: error: No overload variant of "__setitem__" of "list" matches argument types "str", "Any" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __setitem__(self, SupportsIndex, str, /) -> None +gget/gget_mutate.py:0: note: def __setitem__(self, slice, Iterable[str], /) -> None +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Item "str" of "str | Any" has no attribute "apply" [union-attr] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Argument "end" to "translate_sequence" has incompatible type "Any | int | str"; expected "int" [arg-type] +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Item "str" of "str | list[str]" has no attribute "columns" [union-attr] +gget/gget_mutate.py:0: error: Item "list[str]" of "str | list[str]" has no attribute "columns" [union-attr] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str | list[str]") [index] +gget/gget_mutate.py:0: error: No overload variant of "__setitem__" of "list" matches argument types "str", "int" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __setitem__(self, SupportsIndex, str, /) -> None +gget/gget_mutate.py:0: note: def __setitem__(self, slice, Iterable[str], /) -> None +gget/gget_mutate.py:0: error: Item "str" of "str | list[str]" has no attribute "columns" [union-attr] +gget/gget_mutate.py:0: error: Item "list[str]" of "str | list[str]" has no attribute "columns" [union-attr] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str | list[str]") [index] +gget/gget_mutate.py:0: error: No overload variant of "__setitem__" of "list" matches argument types "str", "str | Any" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __setitem__(self, SupportsIndex, str, /) -> None +gget/gget_mutate.py:0: note: def __setitem__(self, slice, Iterable[str], /) -> None +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str | list[str]") [index] +gget/gget_mutate.py:0: error: No overload variant of "__setitem__" of "list" matches argument types "str", "Any" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __setitem__(self, SupportsIndex, str, /) -> None +gget/gget_mutate.py:0: note: def __setitem__(self, slice, Iterable[str], /) -> None +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str | list[str]") [index] +gget/gget_mutate.py:0: error: No overload variant of "__setitem__" of "list" matches argument types "str", "Any" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __setitem__(self, SupportsIndex, str, /) -> None +gget/gget_mutate.py:0: note: def __setitem__(self, slice, Iterable[str], /) -> None +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "list[str]" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Invalid index type "list[str]" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Item "str" of "str | Any" has no attribute "groupby" [union-attr] +gget/gget_mutate.py:0: error: Item "str" of "str | Any" has no attribute "groupby" [union-attr] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str | list[str]") [index] +gget/gget_mutate.py:0: error: No overload variant of "__setitem__" of "list" matches argument types "str", "Any" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __setitem__(self, SupportsIndex, str, /) -> None +gget/gget_mutate.py:0: note: def __setitem__(self, slice, Iterable[str], /) -> None +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Item "str" of "str | Any" has no attribute "apply" [union-attr] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str | list[str]") [index] +gget/gget_mutate.py:0: error: No overload variant of "__setitem__" of "list" matches argument types "str", "Any" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __setitem__(self, SupportsIndex, str, /) -> None +gget/gget_mutate.py:0: note: def __setitem__(self, slice, Iterable[str], /) -> None +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Item "str" of "str | Any" has no attribute "str" [union-attr] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str | list[str]") [index] +gget/gget_mutate.py:0: error: No overload variant of "__setitem__" of "list" matches argument types "str", "Any" [call-overload] +gget/gget_mutate.py:0: note: def __setitem__(self, SupportsIndex, str, /) -> None +gget/gget_mutate.py:0: note: def __setitem__(self, slice, Iterable[str], /) -> None +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Unsupported operand types for + (likely involving Union) [operator] +gget/gget_mutate.py:0: note: Left operand is of type "str | Any" +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str | list[str]") [index] +gget/gget_mutate.py:0: error: No overload variant of "__setitem__" of "list" matches argument types "str", "str | Any" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __setitem__(self, SupportsIndex, str, /) -> None +gget/gget_mutate.py:0: note: def __setitem__(self, slice, Iterable[str], /) -> None +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Argument 1 to "replace" of "str" has incompatible type "int"; expected "str" [arg-type] +gget/gget_mutate.py:0: error: Argument 2 to "replace" of "str" has incompatible type "float"; expected "str" [arg-type] +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Item "str" of "str | Any" has no attribute "sum" [union-attr] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Item "str" of "str | list[str]" has no attribute "drop" [union-attr] +gget/gget_mutate.py:0: error: Item "list[str]" of "str | list[str]" has no attribute "drop" [union-attr] +gget/gget_mutate.py:0: error: Item "bool" of "bool | Any" has no attribute "sum" [union-attr] +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: No overload variant of "__getitem__" of "list" matches argument type "str" [call-overload] +gget/gget_mutate.py:0: note: Possible overload variants: +gget/gget_mutate.py:0: note: def __getitem__(self, SupportsIndex, /) -> str +gget/gget_mutate.py:0: note: def __getitem__(self, slice, /) -> list[str] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str") [index] +gget/gget_mutate.py:0: error: "str" has no attribute "str" [attr-defined] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: "str" has no attribute "to_csv" [attr-defined] +gget/gget_mutate.py:0: error: Unsupported target for indexed assignment ("str") [index] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: "str" has no attribute "values" [attr-defined] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: Invalid index type "list[str]" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_mutate.py:0: error: "str" has no attribute "values" [attr-defined] +gget/gget_mutate.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_info.py:0: error: Incompatible types in assignment (expression has type "list[str]", variable has type "Index[str]") [assignment] +gget/gget_info.py:0: error: Item "None" of "Tag | NavigableString | None" has no attribute "text" [union-attr] +gget/gget_info.py:0: error: Item "None" of "Tag | NavigableString | None" has no attribute "text" [union-attr] +gget/gget_info.py:0: error: Item "NavigableString" of "Tag | NavigableString | None" has no attribute "get" [union-attr] +gget/gget_info.py:0: error: Item "None" of "Tag | NavigableString | None" has no attribute "get" [union-attr] +gget/gget_info.py:0: error: Incompatible types in assignment (expression has type "str | list[str] | Any | None", variable has type "float") [assignment] +gget/gget_info.py:0: error: Item "None" of "Tag | NavigableString | None" has no attribute "find" [union-attr] +gget/gget_info.py:0: error: Unexpected keyword argument "string" for "find" of "str" [call-arg] +gget/gget_info.py:0: error: Item "None" of "Tag | NavigableString | int | Any | None" has no attribute "find_next_sibling" [union-attr] +gget/gget_info.py:0: error: Item "int" of "Tag | NavigableString | int | Any | None" has no attribute "find_next_sibling" [union-attr] +gget/gget_info.py:0: error: Item "None" of "Tag | NavigableString | Any | None" has no attribute "text" [union-attr] +gget/gget_info.py:0: error: Incompatible types in assignment (expression has type "str | Any", variable has type "float") [assignment] +gget/gget_info.py:0: error: Item "None" of "Tag | NavigableString | None" has no attribute "find" [union-attr] +gget/gget_info.py:0: error: Unexpected keyword argument "string" for "find" of "str" [call-arg] +gget/gget_info.py:0: error: Item "None" of "Tag | NavigableString | int | Any | None" has no attribute "find_next_sibling" [union-attr] +gget/gget_info.py:0: error: Item "int" of "Tag | NavigableString | int | Any | None" has no attribute "find_next_sibling" [union-attr] +gget/gget_info.py:0: error: Item "None" of "Tag | NavigableString | Any | None" has no attribute "text" [union-attr] +gget/gget_info.py:0: error: Incompatible types in assignment (expression has type "list[str]", variable has type "Index[str]") [assignment] +gget/gget_info.py:0: error: Incompatible types in assignment (expression has type "list[str]", variable has type "Index[str]") [assignment] +gget/gget_info.py:0: error: Incompatible types in assignment (expression has type "str | Any", variable has type "list[Any]") [assignment] +gget/gget_info.py:0: error: Argument 1 to "append" of "list" has incompatible type "float"; expected "str" [arg-type] +gget/gget_info.py:0: error: Argument 1 to "append" of "list" has incompatible type "float"; expected "str" [arg-type] +gget/gget_info.py:0: error: Argument 1 to "append" of "list" has incompatible type "float"; expected "str" [arg-type] +gget/gget_gpt.py:0: error: Return value expected [return-value] +gget/gget_g2p.py:0: error: Argument "params" to "get" has incompatible type "dict[str, object]"; expected "SupportsItems[str | bytes | int | float, str | bytes | int | float | Iterable[str | bytes | int | float] | None] | tuple[str | bytes | int | float, str | bytes | int | float | Iterable[str | bytes | int | float] | None] | Iterable[tuple[str | bytes | int | float, str | bytes | int | float | Iterable[str | bytes | int | float] | None]] | str | bytes | None" [arg-type] +gget/gget_g2p.py:0: error: Unused "type: ignore" comment [unused-ignore] +gget/gget_g2p.py:0: error: Unsupported operand types for + ("slice" and "int") [operator] +gget/gget_g2p.py:0: note: Left operand is of type "int | slice | ndarray[tuple[int], dtype[numpy.bool[builtins.bool]]]" +gget/gget_g2p.py:0: error: Argument 1 to "insert" of "DataFrame" has incompatible type "int | ndarray[tuple[Any, ...], dtype[signedinteger[Any]]]"; expected "int" [arg-type] +gget/gget_cbio.py:0: error: Cannot assign to a method [method-assign] +gget/gget_cbio.py:0: error: "type[DataFrame]" has no attribute "applymap" [attr-defined] +gget/gget_cbio.py:0: note: By default the bodies of untyped functions are not checked, consider using --check-untyped-defs [annotation-unchecked] +gget/gget_cbio.py:0: error: "Series[Any]" not callable [operator] +gget/gget_cbio.py:0: note: By default the bodies of untyped functions are not checked, consider using --check-untyped-defs [annotation-unchecked] +gget/gget_cbio.py:0: note: By default the bodies of untyped functions are not checked, consider using --check-untyped-defs [annotation-unchecked] +gget/gget_cbio.py:0: note: By default the bodies of untyped functions are not checked, consider using --check-untyped-defs [annotation-unchecked] +gget/gget_cbio.py:0: note: By default the bodies of untyped functions are not checked, consider using --check-untyped-defs [annotation-unchecked] +gget/gget_cbio.py:0: note: By default the bodies of untyped functions are not checked, consider using --check-untyped-defs [annotation-unchecked] +gget/gget_cbio.py:0: note: By default the bodies of untyped functions are not checked, consider using --check-untyped-defs [annotation-unchecked] +gget/gget_blat.py:0: error: Return value expected [return-value] +gget/gget_blat.py:0: error: Return value expected [return-value] +gget/gget_blast.py:0: error: Missing return statement [return] +gget/gget_blast.py:0: error: Incompatible types in assignment (expression has type "None", variable has type "bool") [assignment] +gget/gget_blast.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "bool") [assignment] +gget/gget_blast.py:0: error: Incompatible types in assignment (expression has type "None", variable has type "bool") [assignment] +gget/gget_blast.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "bool") [assignment] +gget/gget_blast.py:0: error: Return value expected [return-value] +gget/gget_blast.py:0: error: Return value expected [return-value] +gget/gget_blast.py:0: error: Return value expected [return-value] +gget/gget_blast.py:0: error: Return value expected [return-value] +gget/gget_bgee.py:0: error: Argument 1 to "_bgee_orthologs" has incompatible type "str | list[str]"; expected "str" [arg-type] +gget/compile.py:0: error: Item "None" of "IO[bytes] | None" has no attribute "read" [union-attr] +gget/compile.py:0: error: Item "None" of "IO[bytes] | None" has no attribute "read" [union-attr] +gget/gget_setup.py:0: error: Item "None" of "IO[bytes] | None" has no attribute "read" [union-attr] +gget/gget_setup.py:0: error: Item "None" of "IO[bytes] | None" has no attribute "read" [union-attr] +gget/gget_setup.py:0: error: Item "None" of "IO[bytes] | None" has no attribute "read" [union-attr] +gget/gget_setup.py:0: error: Item "None" of "IO[bytes] | None" has no attribute "read" [union-attr] +gget/gget_seq.py:0: error: Return value expected [return-value] +gget/gget_seq.py:0: error: Argument 2 to "rest_query" has incompatible type "dict[str, list[str]]"; expected "str" [arg-type] +gget/gget_seq.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "dict[str, list[str]]") [assignment] +gget/gget_seq.py:0: error: Argument 2 to "rest_query" has incompatible type "dict[str, list[str]]"; expected "str" [arg-type] +gget/gget_muscle.py:0: error: Value of type variable "AnyStr" of "abspath" cannot be "str | list[str]" [type-var] +gget/gget_muscle.py:0: error: Item "list[str]" of "str | list[str]" has no attribute "replace" [union-attr] +gget/gget_muscle.py:0: error: Item "None" of "IO[bytes] | None" has no attribute "read" [union-attr] +gget/gget_muscle.py:0: error: Argument 1 to "Popen" has incompatible type "list[str | list[str]]"; expected "str | bytes | PathLike[str] | PathLike[bytes] | Sequence[str | bytes | PathLike[str] | PathLike[bytes]]" [arg-type] +gget/gget_muscle.py:0: error: Item "None" of "IO[bytes] | None" has no attribute "read" [union-attr] +gget/gget_muscle.py:0: error: Argument 1 to "remove" has incompatible type "str | list[str]"; expected "str | bytes | PathLike[str] | PathLike[bytes]" [arg-type] +gget/gget_enrichr.py:0: error: Item "None" of "DataFrame | None" has no attribute "index" [union-attr] +gget/gget_enrichr.py:0: error: Item "None" of "DataFrame | None" has no attribute "loc" [union-attr] +gget/gget_enrichr.py:0: error: Return value expected [return-value] +gget/gget_enrichr.py:0: error: Return value expected [return-value] +gget/gget_enrichr.py:0: error: Return value expected [return-value] +gget/gget_enrichr.py:0: error: Return value expected [return-value] +gget/gget_enrichr.py:0: error: Return value expected [return-value] +gget/gget_diamond.py:0: error: Value of type variable "AnyStr" of "abspath" cannot be "str | list[str]" [type-var] +gget/gget_diamond.py:0: error: Value of type variable "AnyStr" of "abspath" cannot be "str | list[str]" [type-var] +gget/gget_diamond.py:0: error: Item "list[str]" of "str | list[str]" has no attribute "replace" [union-attr] +gget/gget_diamond.py:0: error: Item "list[str]" of "str | list[str]" has no attribute "replace" [union-attr] +gget/gget_diamond.py:0: error: Item "None" of "IO[bytes] | None" has no attribute "read" [union-attr] +gget/gget_diamond.py:0: error: Item "None" of "IO[bytes] | None" has no attribute "read" [union-attr] +gget/gget_diamond.py:0: error: Item "None" of "IO[bytes] | None" has no attribute "read" [union-attr] +gget/gget_cosmic.py:0: error: Missing return statement [return] +gget/gget_cosmic.py:0: error: Unsupported operand types for + ("Series[str]" and "str") [operator] +gget/gget_cosmic.py:0: error: Unsupported operand types for + ("Series[bool]" and "Series[str]") [operator] +gget/gget_cosmic.py:0: error: Argument 3 to "query_local_cosmic" has incompatible type "str | None"; expected "str" [arg-type] +gget/gget_archs4.py:0: error: Missing return statement [return] +gget/gget_archs4.py:0: error: Return value expected [return-value] +gget/gget_archs4.py:0: error: Incompatible types in assignment (expression has type "Any | Series[Any]", variable has type "str") [assignment] +gget/gget_archs4.py:0: error: Return value expected [return-value] +gget/gget_archs4.py:0: error: Return value expected [return-value] +gget/gget_archs4.py:0: error: Return value expected [return-value] +gget/gget_elm.py:0: error: Incompatible types in assignment (expression has type "list[str]", variable has type "ndarray[tuple[int], dtype[Any]] | ExtensionArray") [assignment] +gget/gget_elm.py:0: error: Argument "sequences" to "seq_workflow" has incompatible type "ndarray[tuple[int], dtype[Any]] | ExtensionArray"; expected "list[str]" [arg-type] +gget/gget_alphafold.py:0: error: Argument 1 to "open" has incompatible type "str | list[str]"; expected "int | str | bytes | PathLike[str] | PathLike[bytes]" [arg-type] +gget/gget_alphafold.py:0: error: Argument 1 to "open" has incompatible type "str | list[str]"; expected "int | str | bytes | PathLike[str] | PathLike[bytes]" [arg-type] +gget/gget_alphafold.py:0: error: Incompatible types in assignment (expression has type "str | list[str]", variable has type "list[str]") [assignment] +gget/gget_alphafold.py:0: error: List comprehension has incompatible type List[object]; expected List[bool] [misc] +gget/gget_alphafold.py:0: error: Item "None" of "IO[bytes] | None" has no attribute "read" [union-attr] +gget/gget_alphafold.py:0: error: Incompatible types in assignment (expression has type "TextIOWrapper[_WrappedBuffer]", variable has type "Future[str]") [assignment] +gget/gget_alphafold.py:0: error: "Future[str]" has no attribute "write" [attr-defined] +gget/gget_alphafold.py:0: error: Incompatible types in assignment (expression has type "TextIOWrapper[_WrappedBuffer]", variable has type "Future[str]") [assignment] +gget/gget_alphafold.py:0: error: "Future[str]" has no attribute "write" [attr-defined] +gget/gget_alphafold.py:0: error: Incompatible types in assignment (expression has type "TextIOWrapper[_WrappedBuffer]", variable has type "Future[str]") [assignment] +gget/gget_alphafold.py:0: error: Argument 2 to "dump" has incompatible type "Future[str]"; expected "SupportsWrite[str]" [arg-type] +gget/gget_virus.py:0: error: Library stubs not installed for "dateutil" [import-untyped] +gget/gget_virus.py:0: note: Hint: "python3 -m pip install types-python-dateutil" +gget/gget_virus.py:0: note: (or run "mypy --install-types" to install all missing stub packages) +gget/gget_virus.py:0: note: See https://mypy.readthedocs.io/en/stable/running_mypy.html#missing-imports +gget/gget_virus.py:0: error: Incompatible types in assignment (expression has type "float", target has type "bool | None") [assignment] +gget/gget_virus.py:0: error: Incompatible types in assignment (expression has type "float", target has type "bool | None") [assignment] +gget/gget_virus.py:0: error: Incompatible types in assignment (expression has type "float", target has type "bool | None") [assignment] +gget/gget_virus.py:0: error: Incompatible types in assignment (expression has type "float", target has type "bool | None") [assignment] +gget/gget_virus.py:0: error: Incompatible types in assignment (expression has type "float | Any", target has type "bool | None") [assignment] +gget/gget_virus.py:0: error: Unsupported operand types for / ("bool" and "None") [operator] +gget/gget_virus.py:0: error: Unsupported operand types for / ("None" and "bool") [operator] +gget/gget_virus.py:0: error: Unsupported left operand type for / ("None") [operator] +gget/gget_virus.py:0: note: Both left and right operands are unions +gget/gget_virus.py:0: error: Incompatible return value type (got "list[Never]", expected "tuple[list[Any], dict[str, Any] | None]") [return-value] +gget/gget_virus.py:0: error: Value of type "object" is not indexable [index] +gget/gget_virus.py:0: error: Argument 1 to "makedirs" has incompatible type "str | None"; expected "str | bytes | PathLike[str] | PathLike[bytes]" [arg-type] +gget/gget_virus.py:0: error: Argument 1 to "join" has incompatible type "str | None"; expected "str" [arg-type] +gget/gget_virus.py:0: error: Incompatible types in assignment (expression has type "IO[Any]", variable has type "TextIOWrapper[_WrappedBuffer] | None") [assignment] +gget/gget_virus.py:0: error: Argument 1 to "open" has incompatible type "str | None"; expected "int | str | bytes | PathLike[str] | PathLike[bytes]" [arg-type] +gget/gget_virus.py:0: error: Argument 1 to "join" has incompatible type "str | None"; expected "str" [arg-type] +gget/gget_virus.py:0: error: Argument 1 to "_parse_accession_input" has incompatible type "str | None"; expected "str" [arg-type] +gget/gget_virus.py:0: error: Argument 1 to "_parse_accession_input" has incompatible type "str | None"; expected "str" [arg-type] +gget/gget_virus.py:0: error: Item "None" of "dict[str, Any] | None" has no attribute "get" [union-attr] +gget/gget_virus.py:0: error: Value of type "dict[str, Any] | None" is not indexable [index] +gget/gget_virus.py:0: error: Argument 4 to "_track_failed_operation" has incompatible type "dict[str, Any] | None"; expected "dict[str, Any]" [arg-type] +gget/gget_virus.py:0: error: Value of type "dict[str, Any] | None" is not indexable [index] +gget/gget_virus.py:0: error: Argument 4 to "_track_failed_operation" has incompatible type "dict[str, Any] | None"; expected "dict[str, Any]" [arg-type] +gget/gget_virus.py:0: error: Argument 4 to "_track_failed_operation" has incompatible type "dict[str, Any] | None"; expected "dict[str, Any]" [arg-type] +gget/gget_virus.py:0: error: Incompatible types in assignment (expression has type "bool", target has type "str") [assignment] +gget/gget_virus.py:0: error: Incompatible types in assignment (expression has type "bool", target has type "str") [assignment] +gget/gget_virus.py:0: error: Incompatible types in assignment (expression has type "bool", target has type "str") [assignment] +gget/gget_virus.py:0: error: Argument 1 to "_parse_date" has incompatible type "str | None"; expected "str" [arg-type] +gget/gget_virus.py:0: error: Item "None" of "str | None" has no attribute "lower" [union-attr] +gget/gget_virus.py:0: error: Item "None" of "str | None" has no attribute "lower" [union-attr] +gget/gget_virus.py:0: error: Item "None" of "str | None" has no attribute "lower" [union-attr] +gget/gget_virus.py:0: error: Value of type variable "SupportsRichComparisonT" of "min" cannot be "Any | None" [type-var] +gget/gget_virus.py:0: error: Value of type variable "SupportsRichComparisonT" of "max" cannot be "Any | None" [type-var] +gget/gget_virus.py:0: error: Argument 1 to "sum" has incompatible type "list[Any | None]"; expected "Iterable[bool]" [arg-type] +gget/gget_virus.py:0: error: Argument "params" to "get" has incompatible type "dict[str, object]"; expected "SupportsItems[str | bytes | int | float, str | bytes | int | float | Iterable[str | bytes | int | float] | None] | tuple[str | bytes | int | float, str | bytes | int | float | Iterable[str | bytes | int | float] | None] | Iterable[tuple[str | bytes | int | float, str | bytes | int | float | Iterable[str | bytes | int | float] | None]] | str | bytes | None" [arg-type] +gget/gget_virus.py:0: error: Argument 1 to "int" has incompatible type "str | None"; expected "str | Buffer | SupportsInt | SupportsIndex | SupportsTrunc" [arg-type] +gget/gget_virus.py:0: error: Item "None" of "Element | None" has no attribute "text" [union-attr] +gget/gget_virus.py:0: error: Value of type "str | None" is not indexable [index] +gget/gget_virus.py:0: error: Argument 1 to "len" has incompatible type "str | None"; expected "Sized" [arg-type] +gget/gget_virus.py:0: error: Unexpected keyword argument "method_whitelist" for "Retry" [call-arg] +gget/gget_virus.py:0: error: Argument "params" to "get" of "Session" has incompatible type "dict[str, object]"; expected "SupportsItems[str | bytes | int | float, str | bytes | int | float | Iterable[str | bytes | int | float] | None] | tuple[str | bytes | int | float, str | bytes | int | float | Iterable[str | bytes | int | float] | None] | Iterable[tuple[str | bytes | int | float, str | bytes | int | float | Iterable[str | bytes | int | float] | None]] | str | bytes | None" [arg-type] +gget/gget_virus.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "str") [assignment] +gget/gget_virus.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "str") [assignment] +gget/gget_virus.py:0: error: Incompatible return value type (got "tuple[dict[str, Any], str | None]", expected "dict[str, Any]") [return-value] +gget/gget_virus.py:0: error: Unexpected keyword argument "method_whitelist" for "Retry" [call-arg] +gget/gget_virus.py:0: error: Argument 1 to "int" has incompatible type "str | None"; expected "str | Buffer | SupportsInt | SupportsIndex | SupportsTrunc" [arg-type] +gget/gget_virus.py:0: error: Incompatible types in assignment (expression has type "bool", target has type "str | None") [assignment] +gget/gget_virus.py:0: error: "dict[str | None, str | None]" has no attribute "append" [attr-defined] +gget/gget_virus.py:0: error: Incompatible types in assignment (expression has type "list[dict[str | None, str | None]]", target has type "dict[str | None, str | None]") [assignment] +gget/gget_virus.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "str") [assignment] +gget/gget_virus.py:0: error: Incompatible return value type (got "dict[str | None, dict[str, Any]]", expected "dict[str, Any]") [return-value] +gget/gget_virus.py:0: error: Incompatible types in assignment (expression has type "Literal[True]", target has type "str") [assignment] +gget/gget_virus.py:0: error: Incompatible types in assignment (expression has type "Literal[True]", target has type "str") [assignment] +gget/gget_virus.py:0: error: Incompatible types in assignment (expression has type "Literal[True]", target has type "str") [assignment] +gget/gget_virus.py:0: error: Argument 1 to "_parse_date" has incompatible type "str | None"; expected "str" [arg-type] +gget/gget_virus.py:0: error: Item "None" of "str | None" has no attribute "lower" [union-attr] +gget/gget_virus.py:0: error: Item "None" of "str | None" has no attribute "lower" [union-attr] +gget/gget_virus.py:0: error: Item "None" of "str | None" has no attribute "lower" [union-attr] +gget/gget_virus.py:0: error: Incompatible types in assignment (expression has type "datetime | None", variable has type "str | None") [assignment] +gget/gget_virus.py:0: error: Incompatible types in assignment (expression has type "datetime | None", variable has type "str | None") [assignment] +gget/gget_virus.py:0: error: Incompatible types in assignment (expression has type "datetime | None", variable has type "str | None") [assignment] +gget/gget_virus.py:0: error: Unsupported operand types for < ("datetime" and "str") [operator] +gget/gget_virus.py:0: error: Unsupported operand types for > ("datetime" and "str") [operator] +gget/gget_virus.py:0: error: Unsupported operand types for > ("datetime" and "str") [operator] +gget/gget_virus.py:0: error: Incompatible return value type (got "list[Never]", expected "tuple[list[str], dict[str, int]]") [return-value] +gget/gget_virus.py:0: error: Argument 1 to "download_sars_cov2_optimized" has incompatible type "**dict[str, bool | str | None]"; expected "str | None" [arg-type] +gget/gget_virus.py:0: error: Argument 1 to "download_sars_cov2_optimized" has incompatible type "**dict[str, bool | str | None]"; expected "bool | None" [arg-type] +gget/gget_virus.py:0: error: Argument 1 to "download_sars_cov2_optimized" has incompatible type "**dict[str, bool | str | None]"; expected "bool" [arg-type] +gget/gget_virus.py:0: error: Argument 1 to "download_alphainfluenza_optimized" has incompatible type "**dict[str, bool | str | None]"; expected "str | None" [arg-type] +gget/gget_virus.py:0: error: Argument 1 to "download_alphainfluenza_optimized" has incompatible type "**dict[str, bool | str | None]"; expected "bool | None" [arg-type] +gget/gget_virus.py:0: error: Argument 1 to "download_alphainfluenza_optimized" has incompatible type "**dict[str, bool | str | None]"; expected "bool" [arg-type] +gget/gget_virus.py:0: error: Incompatible types in assignment (expression has type "str", variable has type "dict[str, Any]") [assignment] +gget/gget_virus.py:0: error: Name "genbank_data_prefetch" already defined on line 0 [no-redef] +gget/gget_virus.py:0: error: Argument "genbank_metadata" to "filter_genbank_metadata" has incompatible type "str"; expected "dict[str, Any]" [arg-type] +gget/gget_virus.py:0: error: Incompatible types in assignment (expression has type "dict[str, str]", variable has type "str | None") [assignment] +gget/gget_virus.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/gget_virus.py:0: error: Incompatible types in assignment (expression has type "dict[Never, Never]", variable has type "str | None") [assignment] +gget/gget_virus.py:0: error: Argument 4 to "filter_sequences" has incompatible type "**dict[str, int | None]"; expected "bool" [arg-type] +gget/gget_virus.py:0: error: Argument "genbank_metadata" to "save_genbank_metadata_to_csv" has incompatible type "str"; expected "dict[str, Any]" [arg-type] +gget/gget_virus.py:0: error: Argument "genbank_metadata" to "save_genbank_metadata_to_csv" has incompatible type "str"; expected "dict[str, Any]" [arg-type] +gget/gget_virus.py:0: error: Argument "genbank_metadata" to "filter_genbank_metadata" has incompatible type "str"; expected "dict[str, Any]" [arg-type] +gget/gget_virus.py:0: error: Invalid index type "str" for "str"; expected type "SupportsIndex | slice" [index] +gget/main.py:0: error: Argument "type" to "add_argument" of "_ActionsContainer" has incompatible type "type[dict[Any, Any]]"; expected "Callable[[str], Any] | FileType | str" [arg-type] +gget/main.py:0: error: Argument 1 to "write" of "IO" has incompatible type "str | None"; expected "str" [arg-type] +gget/main.py:0: error: Incompatible types in assignment (expression has type "DataFrame | None", variable has type "DataFrame") [assignment] diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7513579ff..bbd239186 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -27,6 +27,7 @@ exclude: | | tests/fixtures/ | tests/pytest_results.*\.txt | \.github/badges/.*\.json + | \.mypy-baseline\.txt ) repos: - repo: https://github.com/biomejs/pre-commit @@ -45,12 +46,24 @@ repos: args: [--fix, --exit-non-zero-on-fix] - id: ruff-format types_or: [python, pyi, jupyter] - - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.13.0 + # mypy is run through mypy-baseline: the ~550 pre-existing type errors are + # grandfathered in .mypy-baseline.txt, so this hook only fails on NEW type + # errors introduced by a change. Works on pre-commit.ci (which runs + # --all-files) because the baseline filters by error identity, not by file. + # To refresh the baseline after fixing errors: + # mypy gget | mypy-baseline sync + # See https://github.com/scverse/gget/issues/216 + - repo: local hooks: - - id: mypy - files: ^gget/ + - id: mypy-baseline + name: mypy (new errors only, baseline-filtered) + entry: bash -c 'mypy gget | mypy-baseline filter' + language: python + pass_filenames: false + always_run: true additional_dependencies: + - mypy==1.13.0 + - mypy-baseline - pandas-stubs - types-requests - types-tqdm diff --git a/pyproject.toml b/pyproject.toml index 59deb2859..0c60bbd0d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -60,6 +60,7 @@ test = [ "bravado==11.0.3", "coverage>=7", "mypy>=1.13", + "mypy-baseline", "openai<=0.28.1", "pandas-stubs", "parameterized==0.9", @@ -142,6 +143,12 @@ warn_redundant_casts = true warn_unused_ignores = true show_error_codes = true +# mypy-baseline grandfathers the pre-existing type errors so the pre-commit +# mypy hook only fails on NEW errors. Refresh after fixing some with: +# mypy gget | mypy-baseline sync +[tool.mypy-baseline] +baseline_path = ".mypy-baseline.txt" + [tool.pytest] ini_options.testpaths = [ "tests" ] ini_options.addopts = [ "-ra" ] From caa516e9d0dc907d31257cba3bdc31738ea28b1f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 28 Jun 2026 18:30:48 +0000 Subject: [PATCH 29/34] CI: update pytest results (dev) --- .github/badges/tests.json | 2 +- tests/pytest_results.txt | 1046 +++++++++++++++++-------------------- 2 files changed, 475 insertions(+), 573 deletions(-) diff --git a/.github/badges/tests.json b/.github/badges/tests.json index 8aad020e5..0f66c31ae 100644 --- a/.github/badges/tests.json +++ b/.github/badges/tests.json @@ -1 +1 @@ -{"schemaVersion": 1, "label": "tests", "message": "418/422 passing", "color": "yellow"} +{"schemaVersion": 1, "label": "tests", "message": "419/422 passing", "color": "brightgreen"} diff --git a/tests/pytest_results.txt b/tests/pytest_results.txt index 7d992216b..3236f3a40 100644 --- a/tests/pytest_results.txt +++ b/tests/pytest_results.txt @@ -1,506 +1,477 @@ -Pytest results (Python 3.14) - 2026-06-27T20:12:18Z +Pytest results (Python 3.14) - 2026-06-28T18:09:06Z ============================= test session starts ============================== platform linux -- Python 3.14.6, pytest-9.1.1, pluggy-1.6.0 -- /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/bin/python3 cachedir: .pytest_cache -Using --randomly-seed=2701692524 +Using --randomly-seed=1997994390 rootdir: /home/runner/work/gget/gget configfile: pyproject.toml testpaths: tests plugins: randomly-3.16.0, rerunfailures-14.0, mock-3.15.1, cov-7.1.0, xdist-3.8.0 collecting ... collected 422 items -tests/test_pdb.py::TestPDB::test_pdb_assembly PASSED [ 0%] -tests/test_pdb.py::TestPDB::test_pdb_mmcif PASSED [ 0%] -tests/test_pdb.py::TestPDB::test_pdb_pdb PASSED [ 0%] -tests/test_pdb.py::TestPDB::test_pdb_legacy_fallback_to_mmcif PASSED [ 0%] -tests/test_cellxgene.py::TestCellxgeneValidation::test_supported_species_includes_new_primates PASSED [ 1%] -tests/test_cellxgene.py::TestCellxgeneValidation::test_typo_species_raises_valueerror PASSED [ 1%] -tests/test_cellxgene.py::TestCellxgeneValidation::test_invalid_species_raises_valueerror PASSED [ 1%] -tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata SKIPPED [ 1%] -tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata_macaca_mulatta SKIPPED [ 2%] -tests/test_cellxgene.py::TestCellxgene::test_cellxgene_adata SKIPPED [ 2%] -tests/test_8cube.py::TestGeneExpression::test_gene_expression_basic PASSED [ 2%] -tests/test_8cube.py::TestPsiBlock::test_psi_block_basic PASSED [ 2%] -tests/test_8cube.py::TestSpecificity::test_specificity_basic PASSED [ 3%] -tests/test_info.py::TestInfo::test_info_ncbitrue_uniprotfalse FAILED [ 3%] -tests/test_info.py::TestInfo::test_info_transcript PASSED [ 3%] -tests/test_info.py::TestInfo::test_info_gene_list_non_model PASSED [ 3%] -tests/test_info.py::TestInfo::test_info_exon PASSED [ 4%] -tests/test_info.py::TestInfo::test_info_WB_transcript PASSED [ 4%] -tests/test_info.py::TestInfo::test_info_ncbifalse_uniprotfalse PASSED [ 4%] -tests/test_info.py::TestInfo::test_info_ncbifalse_uniprottrue PASSED [ 4%] -tests/test_info.py::TestInfo::test_info_mix PASSED [ 4%] -tests/test_info.py::TestInfo::test_info_gene PASSED [ 5%] -tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_cli_exposes_jackhmmer_savedir_flag PASSED [ 5%] -tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_custom_dir PASSED [ 5%] -tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_default_dir PASSED [ 5%] -tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_clean_up_missing_dir_is_safe PASSED [ 6%] -tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_clean_up_default_dir_when_none PASSED [ 6%] -tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_clean_up_removes_custom_dir PASSED [ 6%] -tests/test_gpt.py::TestGpt::test_gpt PASSED [ 6%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_diseases_filter PASSED [ 7%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_diseases PASSED [ 7%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_pharmacogenetics PASSED [ 7%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions PASSED [ 7%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_resource PASSED [ 8%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_drugs_invalid_filter PASSED [ 8%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_no_limit PASSED [ 8%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap_filter PASSED [ 8%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets PASSED [ 9%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_nonexistent_id PASSED [ 9%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap PASSED [ 9%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_tractability PASSED [ 9%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_simple_filter PASSED [ 9%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_limit PASSED [ 10%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_drugs PASSED [ 10%] -tests/test_opentargets.py::TestOpenTargetsExpressionMocked::test_expression_limit PASSED [ 10%] -tests/test_opentargets.py::TestOpenTargetsExpressionMocked::test_expression_parses_baseline_rows PASSED [ 10%] -tests/test_opentargets.py::TestOpenTargetsExpressionMocked::test_expression_empty_is_graceful PASSED [ 11%] -tests/test_opentargets.py::TestOpenTargetsExpressionMocked::test_expression_json PASSED [ 11%] -tests/test_blast.py::TestBlast::test_blast_bad_db2 PASSED [ 11%] -tests/test_blast.py::TestBlast::test_blast_bad_program PASSED [ 11%] -tests/test_blast.py::TestBlast::test_blast_bad_seq PASSED [ 12%] -tests/test_blast.py::TestBlast::test_blast_nt PASSED [ 12%] -tests/test_blast.py::TestBlast::test_blast_bad_fasta PASSED [ 12%] -tests/test_blast.py::TestBlast::test_blast_db_missing PASSED [ 12%] -tests/test_blast.py::TestBlast::test_blast_bad_db1 PASSED [ 13%] -tests/test_mutate.py::TestMutate::test_list_of_mutations PASSED [ 13%] -tests/test_mutate.py::TestMutate::test_intron_mutation_minus PASSED [ 13%] -tests/test_mutate.py::TestMutate::test_multi_insertion PASSED [ 13%] -tests/test_mutate.py::TestMutate::test_single_delins PASSED [ 13%] -tests/test_mutate.py::TestMutate::test_inversion_with_overlaps PASSED [ 14%] -tests/test_mutate.py::TestMutate::test_single_deletion_with_right_repeats PASSED [ 14%] -tests/test_mutate.py::TestMutate::test_multi_deletion PASSED [ 14%] -tests/test_mutate.py::TestMutate::test_multi_delins_with_psuedo_left_repeats PASSED [ 14%] -tests/test_mutate.py::TestMutate::test_multi_delins_with_true_right_repeats PASSED [ 15%] -tests/test_mutate.py::TestMutate::test_uncertain_mutation PASSED [ 15%] -tests/test_mutate.py::TestMutate::test_single_insertion PASSED [ 15%] -tests/test_mutate.py::TestMutate::test_single_dup PASSED [ 15%] -tests/test_mutate.py::TestMutate::test_posttranslational_mutation PASSED [ 16%] -tests/test_mutate.py::TestMutate::test_multi_delins_with_true_left_repeats PASSED [ 16%] -tests/test_mutate.py::TestMutate::test_single_deletion_with_left_repeats PASSED [ 16%] -tests/test_mutate.py::TestMutate::test_single_substitution_near_left_end PASSED [ 16%] -tests/test_mutate.py::TestMutate::test_intron_mutation_plus PASSED [ 17%] -tests/test_mutate.py::TestMutate::test_single_deletion PASSED [ 17%] -tests/test_mutate.py::TestMutate::test_multi_insertion_with_left_repeats PASSED [ 17%] -tests/test_mutate.py::TestMutate::test_multi_delins PASSED [ 17%] -tests/test_mutate.py::TestMutate::test_single_substitution PASSED [ 18%] -tests/test_mutate.py::TestMutate::test_single_substitution_near_right_end PASSED [ 18%] -tests/test_mutate.py::TestMutate::test_index_error PASSED [ 18%] -tests/test_mutate.py::TestMutate::test_large_k PASSED [ 18%] -tests/test_mutate.py::TestMutate::test_multi_deletion_with_right_repeats PASSED [ 18%] -tests/test_mutate.py::TestMutate::test_multi_dup PASSED [ 19%] -tests/test_mutate.py::TestMutate::test_ambiguous_mutation PASSED [ 19%] -tests/test_mutate.py::test_csv_of_mutations PASSED [ 19%] -tests/test_mutate.py::test_mismatch_error PASSED [ 19%] -tests/test_diamond.py::TestDiamond::test_diamond_seqs_multiple PASSED [ 20%] -tests/test_diamond.py::TestDiamond::test_diamond_JSON_out PASSED [ 20%] -tests/test_diamond.py::TestDiamond::test_diamond_both_files PASSED [ 20%] -tests/test_diamond.py::TestDiamond::test_diamond_seqs_single PASSED [ 20%] -tests/test_diamond.py::TestDiamond::test_diamond_ref_file PASSED [ 21%] -tests/test_diamond.py::TestDiamond::test_diamond_query_file PASSED [ 21%] -tests/test_cbio.py::TestCbio::test_cbio_download_partially_existing_files PASSED [ 21%] -tests/test_cbio.py::TestCbio::test_cbio_download PASSED [ 21%] -tests/test_cbio.py::TestCbio::test_error_cbio_download PASSED [ 22%] -tests/test_cbio.py::TestCbioSearch::test_cbio_search PASSED [ 22%] -tests/test_g2p.py::TestG2P::test_g2p_residues_filter PASSED [ 22%] -tests/test_g2p.py::TestG2P::test_g2p_map PASSED [ 22%] -tests/test_g2p.py::TestG2P::test_g2p_invalid_pair_returns_none PASSED [ 22%] -tests/test_g2p.py::TestG2P::test_g2p_residues_single_int PASSED [ 23%] -tests/test_g2p.py::TestG2P::test_g2p_schema_invariant_across_input_modes PASSED [ 23%] -tests/test_g2p.py::TestG2P::test_g2p_features PASSED [ 23%] -tests/test_g2p.py::TestG2P::test_g2p_map_has_pdb_list_column PASSED [ 23%] -tests/test_g2p.py::TestG2P::test_g2p_uniprot_auto_resolved PASSED [ 24%] -tests/test_g2p.py::TestG2P::test_g2p_gene_auto_resolved PASSED [ 24%] -tests/test_g2p.py::TestG2P::test_g2p_alignment PASSED [ 24%] -tests/test_g2p.py::TestG2P::test_g2p_out_writes_to_explicit_path PASSED [ 24%] -tests/test_g2p.py::TestG2PValidation::test_residues_on_map_raises PASSED [ 25%] -tests/test_g2p.py::TestG2PValidation::test_alignment_requires_explicit_uniprot PASSED [ 25%] -tests/test_g2p.py::TestG2PValidation::test_missing_both_raises PASSED [ 25%] -tests/test_g2p.py::TestG2PValidation::test_residues_wrong_type_raises PASSED [ 25%] -tests/test_g2p.py::TestG2PValidation::test_alignment_requires_isoform PASSED [ 26%] -tests/test_g2p.py::TestG2PValidation::test_invalid_resource_raises PASSED [ 26%] -tests/test_ref.py::TestRef::test_ref_which_plant PASSED [ 26%] -tests/test_ref.py::TestRef::test_ref_plant PASSED [ 26%] -tests/test_ref.py::TestRef::test_ref_rel_ftp PASSED [ 27%] -tests/test_ref.py::TestRef::test_ref_bad_rel PASSED [ 27%] -tests/test_ref.py::TestRef::test_ref_which PASSED [ 27%] -tests/test_ref.py::TestRef::test_ref_rel PASSED [ 27%] -tests/test_ref.py::TestRef::test_ref PASSED [ 27%] -tests/test_ref.py::TestRef::test_ref_rel_ftp_octopus PASSED [ 28%] -tests/test_ref.py::TestRef::test_ref_list PASSED [ 28%] -tests/test_ref.py::TestRef::test_ref_bad_which PASSED [ 28%] -tests/test_ref.py::TestRef::test_ref_bad_species PASSED [ 28%] -tests/test_ref.py::TestRef::test_ref_rel_protist PASSED [ 29%] -tests/test_ref.py::TestRef::test_ref_ftp PASSED [ 29%] -tests/test_search.py::TestSearch::test_search_transcript_bad_andor PASSED [ 29%] -tests/test_search.py::TestSearch::test_search_transcript_bad_species PASSED [ 29%] -tests/test_search.py::TestSearch::test_search_gene_two_sw_and PASSED [ 30%] -tests/test_search.py::TestSearch::test_search_gene_one_sw_limit PASSED [ 30%] -tests/test_search.py::TestSearch::test_search_gene_bad_species PASSED [ 30%] -tests/test_search.py::TestSearch::test_search_gene_one_sw PASSED [ 30%] -tests/test_search.py::TestSearch::test_search_db PASSED [ 31%] -tests/test_search.py::TestSearch::test_search_plant_db PASSED [ 31%] -tests/test_search.py::TestSearch::test_search_gene_one_sw_json PASSED [ 31%] -tests/test_search.py::TestSearch::test_search_plant PASSED [ 31%] -tests/test_search.py::TestSearch::test_search_octopus PASSED [ 31%] -tests/test_search.py::TestSearch::test_search_gene_two_sw_limit PASSED [ 32%] -tests/test_search.py::TestSearch::test_search_transcript_two_sw_and PASSED [ 32%] -tests/test_search.py::TestSearch::test_search_gene_bad_andor PASSED [ 32%] -tests/test_search.py::TestSearch::test_search_transcript_two_sw_or PASSED [ 32%] -tests/test_search.py::TestSearch::test_search_transcript_one_sw PASSED [ 33%] -tests/test_search.py::TestSearch::test_search_release PASSED [ 33%] -tests/test_search.py::TestSearch::test_search_gene_two_sw_or PASSED [ 33%] -tests/test_elm.py::TestELM::test_elm_uniprot_aminoacidseq PASSED [ 33%] -tests/test_elm.py::TestELM::test_elm_uniprot_id_in_elm PASSED [ 34%] -tests/test_elm.py::TestELM::test_elm_uniprot_id_new PASSED [ 34%] -tests/test_blat.py::TestBlat::test_blat_aa PASSED [ 34%] -tests/test_blat.py::TestBlat::test_blat_nt_RNA PASSED [ 34%] -tests/test_blat.py::TestBlat::test_blat_bad_fasta PASSED [ 35%] -tests/test_blat.py::TestBlat::test_blat_bad_assembly PASSED [ 35%] -tests/test_blat.py::TestBlat::test_blat_nt_protein PASSED [ 35%] -tests/test_blat.py::TestBlat::test_blat_bad_txt PASSED [ 35%] -tests/test_blat.py::TestBlat::test_blat_shortseq PASSED [ 36%] -tests/test_blat.py::TestBlat::test_blat_nt PASSED [ 36%] -tests/test_blat.py::TestBlat::test_blat_bad_fileformat PASSED [ 36%] -tests/test_blat.py::TestBlat::test_blat_nt_transDNA PASSED [ 36%] -tests/test_blat.py::TestBlat::test_blat_nt_fasta PASSED [ 36%] -tests/test_blat.py::TestBlat::test_blat_aa_protein PASSED [ 37%] -tests/test_blat.py::TestBlat::test_blat_nt_json PASSED [ 37%] -tests/test_blat.py::TestBlat::test_blat_bad_seqtype PASSED [ 37%] -tests/test_blat.py::TestBlat::test_blat_nt_txt PASSED [ 37%] -tests/test_blat.py::TestBlat::test_blat_nt_DNA PASSED [ 38%] -tests/test_blat.py::TestBlat::test_blat_aa_RNA PASSED [ 38%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background_list PASSED [ 38%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_celltypes PASSED [ 38%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_none PASSED [ 39%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_background PASSED [ 39%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_kinase_interactions PASSED [ 39%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_gene PASSED [ 39%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_ontology PASSED [ 40%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_diseases_drugs PASSED [ 40%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_fish PASSED [ 40%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background PASSED [ 40%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_fly PASSED [ 40%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_mouse_is_human PASSED [ 41%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_background_ensembl PASSED [ 41%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_database_shortcut PASSED [ 41%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_plot PASSED [ 41%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_species PASSED [ 42%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_json PASSED [ 42%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_pathway PASSED [ 42%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_yeast PASSED [ 42%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_transcription PASSED [ 43%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_worm PASSED [ 43%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_ensembl_ids PASSED [ 43%] -tests/test_seq.py::TestSeq::test_seq_transcript PASSED [ 43%] -tests/test_seq.py::TestSeq::test_seq_transcript_transcript_iso PASSED [ 44%] -tests/test_seq.py::TestSeq::test_seq_gene_transcript_iso PASSED [ 44%] -tests/test_seq.py::TestSeq::test_seq_missing_uniprot_gene_name PASSED [ 44%] -tests/test_seq.py::TestSeq::test_seq_gene PASSED [ 44%] -tests/test_seq.py::TestSeq::test_seq_transcript_transcript_WB PASSED [ 45%] -tests/test_seq.py::TestSeq::test_seq_transcript_gene_iso PASSED [ 45%] -tests/test_seq.py::TestSeq::test_seq_transcript_gene_WB PASSED [ 45%] -tests/test_seq.py::TestSeq::test_seq_gene_iso PASSED [ 45%] -tests/test_seq.py::TestSeq::test_seq_transcript_gene PASSED [ 45%] -tests/test_compile.py::TestCompilerWindows::test_compiler_windows PASSED [ 46%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_protein_count PASSED [ 46%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_min_comparison PASSED [ 46%] -tests/test_virus.py::TestVirus::test_filter_sequences_max_ambiguous_chars PASSED [ 46%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_csv PASSED [ 47%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_false PASSED [ 47%] -tests/test_virus.py::TestVirus::test_deduplicate_empty_baseline PASSED [ 47%] -tests/test_virus.py::TestVirus::test_virus_invalid_annotated_type PASSED [ 47%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_remove_parentheses PASSED [ 48%] -tests/test_virus.py::TestVirus::test_virus_none_virus_name PASSED [ 48%] +tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_clean_up_missing_dir_is_safe PASSED [ 0%] +tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_clean_up_removes_custom_dir PASSED [ 0%] +tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_cli_exposes_jackhmmer_savedir_flag PASSED [ 0%] +tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_default_dir PASSED [ 0%] +tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_custom_dir PASSED [ 1%] +tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_clean_up_default_dir_when_none PASSED [ 1%] +tests/test_mutate.py::TestMutate::test_posttranslational_mutation PASSED [ 1%] +tests/test_mutate.py::TestMutate::test_single_deletion_with_right_repeats PASSED [ 1%] +tests/test_mutate.py::TestMutate::test_multi_delins_with_true_right_repeats PASSED [ 2%] +tests/test_mutate.py::TestMutate::test_ambiguous_mutation PASSED [ 2%] +tests/test_mutate.py::TestMutate::test_index_error PASSED [ 2%] +tests/test_mutate.py::TestMutate::test_multi_insertion PASSED [ 2%] +tests/test_mutate.py::TestMutate::test_single_dup PASSED [ 3%] +tests/test_mutate.py::TestMutate::test_inversion_with_overlaps PASSED [ 3%] +tests/test_mutate.py::TestMutate::test_large_k PASSED [ 3%] +tests/test_mutate.py::TestMutate::test_single_deletion_with_left_repeats PASSED [ 3%] +tests/test_mutate.py::TestMutate::test_multi_delins_with_true_left_repeats PASSED [ 4%] +tests/test_mutate.py::TestMutate::test_single_substitution_near_left_end PASSED [ 4%] +tests/test_mutate.py::TestMutate::test_multi_insertion_with_left_repeats PASSED [ 4%] +tests/test_mutate.py::TestMutate::test_list_of_mutations PASSED [ 4%] +tests/test_mutate.py::TestMutate::test_single_substitution PASSED [ 4%] +tests/test_mutate.py::TestMutate::test_multi_dup PASSED [ 5%] +tests/test_mutate.py::TestMutate::test_intron_mutation_minus PASSED [ 5%] +tests/test_mutate.py::TestMutate::test_uncertain_mutation PASSED [ 5%] +tests/test_mutate.py::TestMutate::test_multi_delins_with_psuedo_left_repeats PASSED [ 5%] +tests/test_mutate.py::TestMutate::test_intron_mutation_plus PASSED [ 6%] +tests/test_mutate.py::TestMutate::test_multi_deletion PASSED [ 6%] +tests/test_mutate.py::TestMutate::test_single_insertion PASSED [ 6%] +tests/test_mutate.py::TestMutate::test_single_substitution_near_right_end PASSED [ 6%] +tests/test_mutate.py::TestMutate::test_single_deletion PASSED [ 7%] +tests/test_mutate.py::TestMutate::test_single_delins PASSED [ 7%] +tests/test_mutate.py::TestMutate::test_multi_deletion_with_right_repeats PASSED [ 7%] +tests/test_mutate.py::TestMutate::test_multi_delins PASSED [ 7%] +tests/test_mutate.py::test_mismatch_error PASSED [ 8%] +tests/test_mutate.py::test_csv_of_mutations PASSED [ 8%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue_mouse PASSED [ 8%] +tests/test_archs4.py::TestArchs4::test_archs4_mouse_json_ensembl PASSED [ 8%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_gene PASSED [ 9%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue PASSED [ 9%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_which PASSED [ 9%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_ensembl PASSED [ 9%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_species PASSED [ 9%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_gene_tissue PASSED [ 10%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue_ensembl PASSED [ 10%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue_json PASSED [ 10%] +tests/test_archs4.py::TestArchs4::test_archs4_defaults PASSED [ 10%] +tests/test_archs4.py::TestArchs4MissingColor::test_tissue_missing_color_does_not_crash PASSED [ 11%] +tests/test_virus.py::TestVirus::test_write_fasta_record_long_sequence_wraps PASSED [ 11%] +tests/test_virus.py::TestVirus::test_virus_multi_accession_file_input PASSED [ 11%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_host PASSED [ 11%] +tests/test_virus.py::TestVirus::test_check_min_max_valid PASSED [ 12%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_csv PASSED [ 12%] +tests/test_virus.py::TestVirus::test_get_gget_version_returns_string PASSED [ 12%] +tests/test_virus.py::TestVirus::test_merge_baseline_with_new_deduplicates PASSED [ 12%] +tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter PASSED [ 13%] +tests/test_virus.py::TestVirus::test_retry_helper_success_after_retry PASSED [ 13%] +tests/test_virus.py::TestVirus::test_virus_with_length_filters PASSED [ 13%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_no_parentheses_returns_none PASSED [ 13%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_missing_accession PASSED [ 13%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_max_release_date PASSED [ 14%] +tests/test_virus.py::TestVirus::test_filter_sequences_proteins_complete PASSED [ 14%] +tests/test_virus.py::TestVirus::test_filter_sequences_max_ambiguous_chars PASSED [ 14%] +tests/test_virus.py::TestVirus::test_deduplicate_all_existing PASSED [ 14%] +tests/test_virus.py::TestVirus::test_parse_date_invalid_raises PASSED [ 15%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_min_seq_length PASSED [ 15%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_false PASSED [ 15%] +tests/test_virus.py::TestVirus::test_parse_genbank_xml_basic PASSED [ 15%] +tests/test_virus.py::TestVirus::test_filter_sequences_no_filters PASSED [ 16%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_geographic_location PASSED [ 16%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_min PASSED [ 16%] +tests/test_virus.py::TestVirus::test_check_min_max_equal PASSED [ 16%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_text PASSED [ 17%] +tests/test_virus.py::TestVirus::test_validate_datasets_binary_valid PASSED [ 17%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_already_correct_returns_none PASSED [ 17%] +tests/test_virus.py::TestVirus::test_stream_copy_fasta_all_records PASSED [ 17%] +tests/test_virus.py::TestVirus::test_retry_helper_custom_retryable_exceptions PASSED [ 18%] +tests/test_virus.py::TestVirus::test_track_failed_operation_none_dict PASSED [ 18%] +tests/test_virus.py::TestVirus::test_stream_copy_fasta_with_accession_filter PASSED [ 18%] +tests/test_virus.py::TestVirus::test_virus_invalid_annotated_type PASSED [ 18%] +tests/test_virus.py::TestVirus::test_virus_with_geographic_location_filter PASSED [ 18%] +tests/test_virus.py::TestVirus::test_retry_helper_non_retryable_exception PASSED [ 19%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_no_filters PASSED [ 19%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_multiple PASSED [ 19%] +tests/test_virus.py::TestVirus::test_filter_cached_annotated PASSED [ 19%] +tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter PASSED [ 20%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_combined PASSED [ 20%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_nuc_completeness_partial PASSED [ 20%] +tests/test_virus.py::TestVirus::test_retry_helper_successful_operation PASSED [ 20%] +tests/test_virus.py::TestVirus::test_is_sars_cov2_query_negative PASSED [ 21%] +tests/test_virus.py::TestVirus::test_virus_none_virus_name PASSED [ 21%] +tests/test_virus.py::TestVirus::test_merge_metadata_csvs_no_overwrite PASSED [ 21%] +tests/test_virus.py::TestVirus::test_virus_metadata_schema_validation PASSED [ 21%] +tests/test_virus.py::TestVirus::test_virus_empty_virus_name PASSED [ 22%] +tests/test_virus.py::TestVirus::test_virus_invalid_keep_temp_type PASSED [ 22%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_true PASSED [ 22%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_protein_count PASSED [ 22%] +tests/test_virus.py::TestVirus::test_check_min_max_date_valid PASSED [ 22%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_min_comparison PASSED [ 23%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_min_gene_count PASSED [ 23%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_empty_returns_none PASSED [ 23%] +tests/test_virus.py::TestVirus::test_parse_date_full PASSED [ 23%] +tests/test_virus.py::TestVirus::test_batch_accessions_for_url PASSED [ 24%] +tests/test_virus.py::TestVirus::test_clean_xml_declarations PASSED [ 24%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_release_date PASSED [ 24%] +tests/test_virus.py::TestVirus::test_save_command_summary_with_error PASSED [ 24%] +tests/test_virus.py::TestVirus::test_virus_invalid_is_accession_type PASSED [ 25%] +tests/test_virus.py::TestVirus::test_filter_cached_complete_only PASSED [ 25%] +tests/test_virus.py::TestVirus::test_validate_datasets_binary_empty_path PASSED [ 25%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_isolate PASSED [ 25%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_seq_length PASSED [ 26%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_name PASSED [ 26%] +tests/test_virus.py::TestVirus::test_filter_cached_refseq_only PASSED [ 26%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_empty_raises PASSED [ 26%] +tests/test_virus.py::TestVirus::test_virus_multi_accession_space_separated PASSED [ 27%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_isolation_source PASSED [ 27%] +tests/test_virus.py::TestVirus::test_get_memory_usage_returns_dict PASSED [ 27%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype_list PASSED [ 27%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_json PASSED [ 27%] +tests/test_virus.py::TestVirus::test_check_min_max_none_values PASSED [ 28%] +tests/test_virus.py::TestVirus::test_check_min_max_date_invalid_raises PASSED [ 28%] +tests/test_virus.py::TestVirus::test_retry_helper_failed_commands_tracking PASSED [ 28%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_protein_count PASSED [ 28%] +tests/test_virus.py::TestVirus::test_virus_host_filter_verification PASSED [ 29%] +tests/test_virus.py::TestVirus::test_parse_genbank_xml_invalid_raises PASSED [ 29%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_institution PASSED [ 29%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_false PASSED [ 29%] +tests/test_virus.py::TestVirus::test_virus_invalid_lab_passaged_type PASSED [ 30%] +tests/test_virus.py::TestVirus::test_parse_accession_input_single PASSED [ 30%] +tests/test_virus.py::TestVirus::test_virus_with_genbank_metadata_retrieval PASSED [ 30%] +tests/test_virus.py::TestVirus::test_parse_partial_date_full_date PASSED [ 30%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_combined_filters PASSED [ 31%] +tests/test_virus.py::TestVirus::test_merge_baseline_with_new_csv PASSED [ 31%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_has_proteins PASSED [ 31%] +tests/test_virus.py::TestVirus::test_deduplicate_empty_baseline PASSED [ 31%] +tests/test_virus.py::TestVirus::test_get_datasets_version_returns_string_or_none PASSED [ 31%] +tests/test_virus.py::TestVirus::test_filter_cached_no_filters PASSED [ 32%] +tests/test_virus.py::TestVirus::test_virus_invalid_proteins_complete_type PASSED [ 32%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_metadata_type PASSED [ 32%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_true PASSED [ 32%] +tests/test_virus.py::TestVirus::test_unzip_file_nonexistent_raises PASSED [ 33%] +tests/test_virus.py::TestVirus::test_datasets_cli_version_output PASSED [ 33%] +tests/test_virus.py::TestVirus::test_virus_specific_accession_file_creation PASSED [ 33%] +tests/test_virus.py::TestVirus::test_get_datasets_path_uses_bundled_binary PASSED [ 33%] +tests/test_virus.py::TestVirus::test_local_name_with_namespace PASSED [ 34%] +tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_empty PASSED [ 34%] +tests/test_virus.py::TestVirus::test_parse_accession_input_from_file PASSED [ 34%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_collection_date PASSED [ 34%] +tests/test_virus.py::TestVirus::test_merge_metadata_csvs_missing_standard_file PASSED [ 35%] +tests/test_virus.py::TestVirus::test_virus_completeness_filter_verification PASSED [ 35%] +tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_basic PASSED [ 35%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_true PASSED [ 35%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_max PASSED [ 36%] +tests/test_virus.py::TestVirus::test_calculate_max_accessions_per_batch PASSED [ 36%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_negative PASSED [ 36%] +tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_accession_mode PASSED [ 36%] +tests/test_virus.py::TestVirus::test_get_datasets_path_returns_valid_path PASSED [ 36%] +tests/test_virus.py::TestVirus::test_save_command_summary_creates_file PASSED [ 37%] +tests/test_virus.py::TestVirus::test_validate_datasets_binary_nonexistent PASSED [ 37%] +tests/test_virus.py::TestVirus::test_unzip_file_valid PASSED [ 37%] +tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_negative PASSED [ 37%] +tests/test_virus.py::TestVirus::test_deduplicate_metadata_against_baseline PASSED [ 38%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_max_comparison PASSED [ 38%] +tests/test_virus.py::TestVirus::test_is_sars_cov2_query_common_names PASSED [ 38%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_none_raises PASSED [ 38%] +tests/test_virus.py::TestVirus::test_filter_cached_host_in_strategy_skipped PASSED [ 39%] +tests/test_virus.py::TestVirus::test_virus_release_date_filter_verification PASSED [ 39%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_false PASSED [ 39%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_empty PASSED [ 39%] +tests/test_virus.py::TestVirus::test_virus_integer_virus_id PASSED [ 40%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_collection_date_range PASSED [ 40%] +tests/test_virus.py::TestVirus::test_parse_partial_date_empty_raises PASSED [ 40%] +tests/test_virus.py::TestVirus::test_force_garbage_collection_runs PASSED [ 40%] +tests/test_virus.py::TestVirus::test_virus_multiple_filters_relationship_check PASSED [ 40%] +tests/test_virus.py::TestVirus::test_merge_metadata_csvs_fills_missing PASSED [ 41%] +tests/test_virus.py::TestVirus::test_virus_with_annotated_filter PASSED [ 41%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_remove_parentheses PASSED [ 41%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_true PASSED [ 41%] +tests/test_virus.py::TestVirus::test_virus_invalid_completeness PASSED [ 42%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_zero PASSED [ 42%] +tests/test_virus.py::TestVirus::test_parse_genbank_xml_empty_set PASSED [ 42%] +tests/test_virus.py::TestVirus::test_virus_with_collection_date_filters PASSED [ 42%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_segment PASSED [ 43%] +tests/test_virus.py::TestVirus::test_track_failed_operation_creates_key PASSED [ 43%] +tests/test_virus.py::TestVirus::test_parse_accession_input_empty_file_raises_error PASSED [ 43%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_peptide_count PASSED [ 43%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_mature_peptide_count PASSED [ 44%] +tests/test_virus.py::TestVirus::test_save_partial_metadata_empty PASSED [ 44%] +tests/test_virus.py::TestVirus::test_virus_with_host_filter PASSED [ 44%] +tests/test_virus.py::TestVirus::test_is_sars_cov2_query_accession_mode PASSED [ 44%] +tests/test_virus.py::TestVirus::test_save_metadata_to_csv_basic PASSED [ 45%] +tests/test_virus.py::TestVirus::test_save_partial_metadata PASSED [ 45%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_basic PASSED [ 45%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype PASSED [ 45%] +tests/test_virus.py::TestVirus::test_filter_cached_min_release_date PASSED [ 45%] +tests/test_virus.py::TestVirus::test_check_min_max_invalid_raises PASSED [ 46%] +tests/test_virus.py::TestVirus::test_retry_helper_exponential_backoff_timing PASSED [ 46%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_env_source PASSED [ 46%] +tests/test_virus.py::TestVirus::test_write_fasta_record_without_description PASSED [ 46%] +tests/test_virus.py::TestVirus::test_parse_accession_input_nonexistent_file_raises_error PASSED [ 47%] +tests/test_virus.py::TestVirus::test_virus_relationship_check_counts_match PASSED [ 47%] +tests/test_virus.py::TestVirus::test_track_failed_operation_appends PASSED [ 47%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_source_database PASSED [ 47%] +tests/test_virus.py::TestVirus::test_filter_cached_host_not_in_strategy PASSED [ 48%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_gen_mol_type PASSED [ 48%] tests/test_virus.py::TestVirus::test_get_modified_virus_name_invalid_attempt_returns_none PASSED [ 48%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_empty_returns_none PASSED [ 48%] -tests/test_virus.py::TestVirus::test_virus_invalid_completeness PASSED [ 49%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_already_correct_returns_none PASSED [ 49%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_min_gene_count PASSED [ 49%] -tests/test_virus.py::TestVirus::test_save_metadata_to_csv_empty_metadata PASSED [ 49%] -tests/test_virus.py::TestVirus::test_filter_cached_host_in_strategy_skipped PASSED [ 50%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_has_proteins PASSED [ 50%] -tests/test_virus.py::TestVirus::test_virus_invalid_proteins_complete_type PASSED [ 50%] -tests/test_virus.py::TestVirus::test_is_sars_cov2_query_common_names PASSED [ 50%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_env_source PASSED [ 50%] -tests/test_virus.py::TestVirus::test_filter_cached_annotated PASSED [ 51%] -tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_accession_mode PASSED [ 51%] -tests/test_virus.py::TestVirus::test_check_min_max_valid PASSED [ 51%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_host PASSED [ 51%] -tests/test_virus.py::TestVirus::test_virus_relationship_check_counts_match PASSED [ 52%] -tests/test_virus.py::TestVirus::test_virus_with_geographic_location_filter PASSED [ 52%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_no_filters PASSED [ 52%] -tests/test_virus.py::TestVirus::test_track_failed_operation_none_dict PASSED [ 52%] -tests/test_virus.py::TestVirus::test_virus_multi_accession_file_input PASSED [ 53%] -tests/test_virus.py::TestVirus::test_filter_cached_geographic_location PASSED [ 53%] -tests/test_virus.py::TestVirus::test_parse_genbank_xml_empty_set PASSED [ 53%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_negative PASSED [ 53%] -tests/test_virus.py::TestVirus::test_validate_datasets_binary_nonexistent PASSED [ 54%] -tests/test_virus.py::TestVirus::test_write_fasta_record_with_description PASSED [ 54%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_collection_date PASSED [ 54%] -tests/test_virus.py::TestVirus::test_retry_helper_custom_retryable_exceptions PASSED [ 54%] -tests/test_virus.py::TestVirus::test_virus_integer_virus_id PASSED [ 54%] -tests/test_virus.py::TestVirus::test_merge_baseline_with_new_csv PASSED [ 55%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_json PASSED [ 55%] -tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter PASSED [ 55%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_institution PASSED [ 55%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype PASSED [ 56%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_false PASSED [ 56%] -tests/test_virus.py::TestVirus::test_virus_with_length_filters PASSED [ 56%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_virus_suffix PASSED [ 56%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_basic PASSED [ 57%] -tests/test_virus.py::TestVirus::test_write_fasta_record_without_description PASSED [ 57%] -tests/test_virus.py::TestVirus::test_virus_multiple_filters_relationship_check PASSED [ 57%] -tests/test_virus.py::TestVirus::test_is_sars_cov2_query_negative PASSED [ 57%] -tests/test_virus.py::TestVirus::test_parse_date_invalid_raises PASSED [ 58%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_country PASSED [ 58%] -tests/test_virus.py::TestVirus::test_parse_date_various_formats PASSED [ 58%] -tests/test_virus.py::TestVirus::test_virus_with_source_database_filter PASSED [ 58%] -tests/test_virus.py::TestVirus::test_virus_host_filter_verification PASSED [ 59%] -tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter PASSED [ 59%] -tests/test_virus.py::TestVirus::test_check_min_max_date_valid PASSED [ 59%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_empty PASSED [ 59%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_space_before_virus PASSED [ 59%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_true PASSED [ 60%] -tests/test_virus.py::TestVirus::test_validate_datasets_binary_empty_path PASSED [ 60%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_combined PASSED [ 60%] -tests/test_virus.py::TestVirus::test_batch_accessions_for_url PASSED [ 60%] -tests/test_virus.py::TestVirus::test_filter_cached_host_not_in_strategy PASSED [ 61%] -tests/test_virus.py::TestVirus::test_write_fasta_record_long_sequence_wraps PASSED [ 61%] -tests/test_virus.py::TestVirus::test_virus_with_completeness_filter PASSED [ 61%] -tests/test_virus.py::TestVirus::test_parse_partial_date_full_date PASSED [ 61%] -tests/test_virus.py::TestVirus::test_unzip_file_bad_zip_raises PASSED [ 62%] -tests/test_virus.py::TestVirus::test_merge_baseline_with_new_deduplicates PASSED [ 62%] -tests/test_virus.py::TestVirus::test_local_name_without_namespace PASSED [ 62%] -tests/test_virus.py::TestVirus::test_retry_helper_failed_commands_tracking PASSED [ 62%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_jsonl PASSED [ 63%] -tests/test_virus.py::TestVirus::test_virus_with_annotated_filter PASSED [ 63%] -tests/test_virus.py::TestVirus::test_save_partial_metadata PASSED [ 63%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_true PASSED [ 63%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_no_filters PASSED [ 63%] -tests/test_virus.py::TestVirus::test_merge_metadata_csvs_no_overwrite PASSED [ 64%] -tests/test_virus.py::TestVirus::test_retry_helper_success_after_retry PASSED [ 64%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_min PASSED [ 64%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_empty PASSED [ 64%] -tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_common_names PASSED [ 65%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_isolation_source PASSED [ 65%] -tests/test_virus.py::TestVirus::test_merge_metadata_csvs_missing_standard_file PASSED [ 65%] -tests/test_virus.py::TestVirus::test_filter_sequences_no_filters PASSED [ 65%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_release_date PASSED [ 66%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_segment PASSED [ 66%] -tests/test_virus.py::TestVirus::test_merge_baseline_with_new_empty_new PASSED [ 66%] -tests/test_virus.py::TestVirus::test_virus_multi_accession_space_separated PASSED [ 66%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_text PASSED [ 67%] -tests/test_virus.py::TestVirus::test_get_memory_usage_returns_dict PASSED [ 67%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_seq_length PASSED [ 67%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_false PASSED [ 67%] -tests/test_virus.py::TestVirus::test_parse_genbank_xml_invalid_raises PASSED [ 68%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_nonexistent_raises PASSED [ 68%] -tests/test_virus.py::TestVirus::test_get_datasets_path_returns_valid_path PASSED [ 68%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_empty_raises PASSED [ 68%] -tests/test_virus.py::TestVirus::test_genbank_xml_to_csv_basic PASSED [ 68%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_max_seq_length PASSED [ 69%] -tests/test_virus.py::TestVirus::test_check_min_max_equal PASSED [ 69%] -tests/test_virus.py::TestVirus::test_parse_accession_input_space_separated PASSED [ 69%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_none_raises PASSED [ 69%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_true PASSED [ 70%] -tests/test_virus.py::TestVirus::test_parse_accession_input_from_file PASSED [ 70%] -tests/test_virus.py::TestVirus::test_validate_datasets_binary_valid PASSED [ 70%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_combined_filters PASSED [ 70%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_missing_accession PASSED [ 71%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_source_database PASSED [ 71%] -tests/test_virus.py::TestVirus::test_local_name_with_namespace PASSED [ 71%] -tests/test_virus.py::TestVirus::test_virus_with_host_filter PASSED [ 71%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_metadata_type PASSED [ 72%] -tests/test_virus.py::TestVirus::test_virus_completeness_filter_verification PASSED [ 72%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype_list PASSED [ 72%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_max_comparison PASSED [ 72%] -tests/test_virus.py::TestVirus::test_virus_invalid_keep_temp_type PASSED [ 72%] -tests/test_virus.py::TestVirus::test_deduplicate_all_existing PASSED [ 73%] -tests/test_virus.py::TestVirus::test_virus_specific_accession_file_creation PASSED [ 73%] -tests/test_virus.py::TestVirus::test_filter_cached_no_filters PASSED [ 73%] -tests/test_virus.py::TestVirus::test_check_min_max_none_values PASSED [ 73%] -tests/test_virus.py::TestVirus::test_virus_metadata_schema_validation PASSED [ 74%] -tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters PASSED [ 74%] -tests/test_virus.py::TestVirus::test_parse_accession_input_nonexistent_file_raises_error PASSED [ 74%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_type PASSED [ 74%] -tests/test_virus.py::TestVirus::test_virus_invalid_is_accession_type PASSED [ 75%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_no_parentheses_returns_none PASSED [ 75%] -tests/test_virus.py::TestVirus::test_unzip_file_valid PASSED [ 75%] -tests/test_virus.py::TestVirus::test_parse_accession_input_single PASSED [ 75%] -tests/test_virus.py::TestVirus::test_merge_metadata_csvs_fills_missing PASSED [ 76%] -tests/test_virus.py::TestVirus::test_virus_empty_virus_name PASSED [ 76%] -tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_empty PASSED [ 76%] -tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter PASSED [ 76%] -tests/test_virus.py::TestVirus::test_check_min_max_invalid_raises PASSED [ 77%] -tests/test_virus.py::TestVirus::test_retry_helper_exponential_backoff_timing PASSED [ 77%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_mature_peptide_count PASSED [ 77%] -tests/test_virus.py::TestVirus::test_force_garbage_collection_runs PASSED [ 77%] -tests/test_virus.py::TestVirus::test_datasets_cli_version_output PASSED [ 77%] -tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_negative PASSED [ 78%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_false PASSED [ 78%] -tests/test_virus.py::TestVirus::test_save_command_summary_creates_file PASSED [ 78%] -tests/test_virus.py::TestVirus::test_is_sars_cov2_query_accession_mode PASSED [ 78%] -tests/test_virus.py::TestVirus::test_get_datasets_version_returns_string_or_none PASSED [ 79%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_collection_date_range PASSED [ 79%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_max_gene_count PASSED [ 79%] -tests/test_virus.py::TestVirus::test_calculate_max_accessions_per_batch PASSED [ 79%] -tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_basic PASSED [ 80%] -tests/test_virus.py::TestVirus::test_deduplicate_metadata_against_baseline PASSED [ 80%] -tests/test_virus.py::TestVirus::test_parse_genbank_xml_basic PASSED [ 80%] -tests/test_virus.py::TestVirus::test_virus_with_collection_date_filters PASSED [ 80%] -tests/test_virus.py::TestVirus::test_stream_copy_fasta_with_accession_filter PASSED [ 81%] -tests/test_virus.py::TestVirus::test_save_command_summary_with_error PASSED [ 81%] -tests/test_virus.py::TestVirus::test_check_min_max_date_invalid_raises PASSED [ 81%] -tests/test_virus.py::TestVirus::test_track_failed_operation_creates_key PASSED [ 81%] -tests/test_virus.py::TestVirus::test_stream_copy_fasta_all_records PASSED [ 81%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_peptide_count PASSED [ 82%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_geographic_location PASSED [ 82%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_zero PASSED [ 82%] -tests/test_virus.py::TestVirus::test_filter_sequences_proteins_complete PASSED [ 82%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_gen_mol_type PASSED [ 83%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_multiple PASSED [ 83%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_true PASSED [ 83%] -tests/test_virus.py::TestVirus::test_retry_helper_non_retryable_exception PASSED [ 83%] -tests/test_virus.py::TestVirus::test_filter_cached_complete_only PASSED [ 84%] -tests/test_virus.py::TestVirus::test_get_datasets_path_uses_bundled_binary PASSED [ 84%] -tests/test_virus.py::TestVirus::test_parse_date_full PASSED [ 84%] -tests/test_virus.py::TestVirus::test_parse_partial_date_empty_raises PASSED [ 84%] -tests/test_virus.py::TestVirus::test_filter_cached_min_release_date PASSED [ 85%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_max_release_date PASSED [ 85%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_isolate PASSED [ 85%] -tests/test_virus.py::TestVirus::test_virus_with_genbank_metadata_retrieval PASSED [ 85%] -tests/test_virus.py::TestVirus::test_get_gget_version_returns_string PASSED [ 86%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_max PASSED [ 86%] -tests/test_virus.py::TestVirus::test_parse_accession_input_empty_file_raises_error PASSED [ 86%] -tests/test_virus.py::TestVirus::test_virus_release_date_filter_verification PASSED [ 86%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_min_seq_length PASSED [ 86%] -tests/test_virus.py::TestVirus::test_unzip_file_nonexistent_raises PASSED [ 87%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_gene_count PASSED [ 87%] -tests/test_virus.py::TestVirus::test_virus_with_multiple_filters PASSED [ 87%] -tests/test_virus.py::TestVirus::test_save_partial_metadata_empty PASSED [ 87%] -tests/test_virus.py::TestVirus::test_clean_xml_declarations_no_declarations PASSED [ 88%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_protein_count PASSED [ 88%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_nuc_completeness_partial PASSED [ 88%] -tests/test_virus.py::TestVirus::test_filter_cached_refseq_only PASSED [ 88%] -tests/test_virus.py::TestVirus::test_track_failed_operation_appends PASSED [ 89%] -tests/test_virus.py::TestVirus::test_retry_helper_successful_operation PASSED [ 89%] -tests/test_virus.py::TestVirus::test_clean_xml_declarations PASSED [ 89%] -tests/test_virus.py::TestVirus::test_virus_invalid_lab_passaged_type PASSED [ 89%] -tests/test_virus.py::TestVirus::test_save_metadata_to_csv_basic PASSED [ 90%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_name PASSED [ 90%] -tests/test_bgee.py::TestBgee::test_error_bgee_expression_no_exist PASSED [ 90%] -tests/test_bgee.py::TestBgee::test_bgee_expression PASSED [ 90%] -tests/test_bgee.py::TestBgee::test_error_bgee_unknown_type PASSED [ 90%] -tests/test_bgee.py::TestBgee::test_bgee_orthologs PASSED [ 91%] -tests/test_bgee.py::TestBgee::test_error_bgee_orthologs_no_exist PASSED [ 91%] -tests/test_bgee.py::TestBgee::test_bgee_expression_multiple PASSED [ 91%] -tests/test_muscle.py::TestMusclePrints::test_muscle_print_nt PASSED [ 91%] -tests/test_muscle.py::TestMuscleAASuper::test_muscle_aa_super5 PASSED [ 92%] -tests/test_muscle.py::TestMuscle::test_muscle_nt_txt PASSED [ 92%] -tests/test_muscle.py::TestMuscle::test_muscle_nt PASSED [ 92%] -tests/test_muscle.py::TestMuscleSeqsInput::test_muscle_seqs_as_input PASSED [ 92%] -tests/test_muscle.py::TestMuscleAA::test_muscle_aa PASSED [ 93%] -tests/test_muscle.py::TestMuscleSuper::test_muscle_nt_super5 PASSED [ 93%] -tests/test_archs4.py::TestArchs4::test_archs4_defaults PASSED [ 93%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_gene_tissue PASSED [ 93%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_species PASSED [ 94%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue_mouse PASSED [ 94%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue PASSED [ 94%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_gene PASSED [ 94%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue_ensembl PASSED [ 95%] -tests/test_archs4.py::TestArchs4::test_archs4_mouse_json_ensembl PASSED [ 95%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_which PASSED [ 95%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue_json PASSED [ 95%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_ensembl PASSED [ 95%] -tests/test_archs4.py::TestArchs4MissingColor::test_tissue_missing_color_does_not_crash PASSED [ 96%] -tests/test_cosmic.py::TestCosmicWorkflow::test_cosmic_defaults PASSED [ 96%] -tests/test_utils.py::TestUtils::test_search_species_options_bad_type PASSED [ 96%] -tests/test_utils.py::TestUtils::test_read_fasta PASSED [ 96%] -tests/test_utils.py::TestUtils::test_rest_query PASSED [ 97%] -tests/test_utils.py::TestUtils::test_ref_iv_species_options PASSED [ 97%] -tests/test_utils.py::TestUtils::test_get_uniprot_info_gene PASSED [ 97%] -tests/test_utils.py::TestUtils::test_find_latest_ens_rel PASSED [ 97%] -tests/test_utils.py::TestUtils::test_search_species_options PASSED [ 98%] -tests/test_utils.py::TestUtils::test_ref_species_options_bad_type PASSED [ 98%] -tests/test_utils.py::TestUtils::test_search_iv_species_options PASSED [ 98%] -tests/test_utils.py::TestUtils::test_n_colors PASSED [ 98%] -tests/test_utils.py::TestUtils::test_get_uniprot_info_transcript PASSED [ 99%] -tests/test_utils.py::TestUtils::test_get_uniprot_seqs PASSED [ 99%] -tests/test_utils.py::TestUtils::test_rest_query_bad_type PASSED [ 99%] -tests/test_utils.py::TestUtils::test_ref_species_options PASSED [ 99%] -tests/test_utils.py::TestUtils::test_aa_colors PASSED [100%] +tests/test_virus.py::TestVirus::test_write_fasta_record_with_description PASSED [ 48%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_type PASSED [ 49%] +tests/test_virus.py::TestVirus::test_local_name_without_namespace PASSED [ 49%] +tests/test_virus.py::TestVirus::test_filter_cached_geographic_location PASSED [ 49%] +tests/test_virus.py::TestVirus::test_clean_xml_declarations_no_declarations PASSED [ 49%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_jsonl PASSED [ 50%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_country PASSED [ 50%] +tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters PASSED [ 50%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_max_gene_count PASSED [ 50%] +tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter PASSED [ 50%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_virus_suffix PASSED [ 51%] +tests/test_virus.py::TestVirus::test_virus_with_completeness_filter PASSED [ 51%] +tests/test_virus.py::TestVirus::test_virus_with_multiple_filters PASSED [ 51%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_max_seq_length PASSED [ 51%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_space_before_virus PASSED [ 52%] +tests/test_virus.py::TestVirus::test_parse_accession_input_space_separated PASSED [ 52%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_gene_count PASSED [ 52%] +tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_common_names PASSED [ 52%] +tests/test_virus.py::TestVirus::test_merge_baseline_with_new_empty_new PASSED [ 53%] +tests/test_virus.py::TestVirus::test_genbank_xml_to_csv_basic PASSED [ 53%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_false PASSED [ 53%] +tests/test_virus.py::TestVirus::test_unzip_file_bad_zip_raises PASSED [ 53%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_empty PASSED [ 54%] +tests/test_virus.py::TestVirus::test_save_metadata_to_csv_empty_metadata PASSED [ 54%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_no_filters PASSED [ 54%] +tests/test_virus.py::TestVirus::test_virus_with_source_database_filter PASSED [ 54%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_nonexistent_raises PASSED [ 54%] +tests/test_virus.py::TestVirus::test_parse_date_various_formats PASSED [ 55%] +tests/test_blat.py::TestBlat::test_blat_nt_fasta PASSED [ 55%] +tests/test_blat.py::TestBlat::test_blat_aa PASSED [ 55%] +tests/test_blat.py::TestBlat::test_blat_bad_txt PASSED [ 55%] +tests/test_blat.py::TestBlat::test_blat_nt_protein PASSED [ 56%] +tests/test_blat.py::TestBlat::test_blat_bad_seqtype PASSED [ 56%] +tests/test_blat.py::TestBlat::test_blat_aa_protein PASSED [ 56%] +tests/test_blat.py::TestBlat::test_blat_bad_fileformat PASSED [ 56%] +tests/test_blat.py::TestBlat::test_blat_nt_txt PASSED [ 57%] +tests/test_blat.py::TestBlat::test_blat_nt PASSED [ 57%] +tests/test_blat.py::TestBlat::test_blat_aa_RNA PASSED [ 57%] +tests/test_blat.py::TestBlat::test_blat_nt_transDNA PASSED [ 57%] +tests/test_blat.py::TestBlat::test_blat_nt_DNA PASSED [ 58%] +tests/test_blat.py::TestBlat::test_blat_nt_RNA PASSED [ 58%] +tests/test_blat.py::TestBlat::test_blat_bad_assembly PASSED [ 58%] +tests/test_blat.py::TestBlat::test_blat_nt_json PASSED [ 58%] +tests/test_blat.py::TestBlat::test_blat_bad_fasta PASSED [ 59%] +tests/test_blat.py::TestBlat::test_blat_shortseq PASSED [ 59%] +tests/test_gpt.py::TestGpt::test_gpt PASSED [ 59%] +tests/test_pdb.py::TestPDB::test_pdb_legacy_fallback_to_mmcif PASSED [ 59%] +tests/test_pdb.py::TestPDB::test_pdb_mmcif PASSED [ 59%] +tests/test_pdb.py::TestPDB::test_pdb_pdb PASSED [ 60%] +tests/test_pdb.py::TestPDB::test_pdb_assembly PASSED [ 60%] +tests/test_search.py::TestSearch::test_search_gene_one_sw PASSED [ 60%] +tests/test_search.py::TestSearch::test_search_gene_two_sw_limit PASSED [ 60%] +tests/test_search.py::TestSearch::test_search_gene_one_sw_json PASSED [ 61%] +tests/test_search.py::TestSearch::test_search_gene_bad_andor PASSED [ 61%] +tests/test_search.py::TestSearch::test_search_transcript_two_sw_or PASSED [ 61%] +tests/test_search.py::TestSearch::test_search_transcript_two_sw_and PASSED [ 61%] +tests/test_search.py::TestSearch::test_search_octopus PASSED [ 62%] +tests/test_search.py::TestSearch::test_search_release PASSED [ 62%] +tests/test_search.py::TestSearch::test_search_gene_two_sw_or PASSED [ 62%] +tests/test_search.py::TestSearch::test_search_plant PASSED [ 62%] +tests/test_search.py::TestSearch::test_search_gene_bad_species PASSED [ 63%] +tests/test_search.py::TestSearch::test_search_gene_two_sw_and PASSED [ 63%] +tests/test_search.py::TestSearch::test_search_transcript_bad_andor PASSED [ 63%] +tests/test_search.py::TestSearch::test_search_transcript_bad_species PASSED [ 63%] +tests/test_search.py::TestSearch::test_search_plant_db PASSED [ 63%] +tests/test_search.py::TestSearch::test_search_gene_one_sw_limit PASSED [ 64%] +tests/test_search.py::TestSearch::test_search_db PASSED [ 64%] +tests/test_search.py::TestSearch::test_search_transcript_one_sw PASSED [ 64%] +tests/test_seq.py::TestSeq::test_seq_transcript_gene_WB PASSED [ 64%] +tests/test_seq.py::TestSeq::test_seq_transcript_gene PASSED [ 65%] +tests/test_seq.py::TestSeq::test_seq_gene PASSED [ 65%] +tests/test_seq.py::TestSeq::test_seq_gene_iso PASSED [ 65%] +tests/test_seq.py::TestSeq::test_seq_transcript_gene_iso PASSED [ 65%] +tests/test_seq.py::TestSeq::test_seq_transcript_transcript_iso PASSED [ 66%] +tests/test_seq.py::TestSeq::test_seq_transcript PASSED [ 66%] +tests/test_seq.py::TestSeq::test_seq_transcript_transcript_WB PASSED [ 66%] +tests/test_seq.py::TestSeq::test_seq_missing_uniprot_gene_name PASSED [ 66%] +tests/test_seq.py::TestSeq::test_seq_gene_transcript_iso PASSED [ 67%] +tests/test_opentargets.py::TestOpenTargetsExpressionMocked::test_expression_limit PASSED [ 67%] +tests/test_opentargets.py::TestOpenTargetsExpressionMocked::test_expression_json PASSED [ 67%] +tests/test_opentargets.py::TestOpenTargetsExpressionMocked::test_expression_parses_baseline_rows PASSED [ 67%] +tests/test_opentargets.py::TestOpenTargetsExpressionMocked::test_expression_empty_is_graceful PASSED [ 68%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_diseases_filter PASSED [ 68%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_pharmacogenetics PASSED [ 68%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap_filter PASSED [ 68%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_no_limit PASSED [ 68%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap PASSED [ 69%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_limit PASSED [ 69%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_resource PASSED [ 69%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_diseases PASSED [ 69%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_simple_filter PASSED [ 70%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_nonexistent_id PASSED [ 70%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_drugs PASSED [ 70%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions PASSED [ 70%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_tractability PASSED [ 71%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_drugs_invalid_filter PASSED [ 71%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets PASSED [ 71%] +tests/test_g2p.py::TestG2P::test_g2p_map PASSED [ 71%] +tests/test_g2p.py::TestG2P::test_g2p_alignment PASSED [ 72%] +tests/test_g2p.py::TestG2P::test_g2p_uniprot_auto_resolved PASSED [ 72%] +tests/test_g2p.py::TestG2P::test_g2p_map_has_pdb_list_column PASSED [ 72%] +tests/test_g2p.py::TestG2P::test_g2p_schema_invariant_across_input_modes PASSED [ 72%] +tests/test_g2p.py::TestG2P::test_g2p_residues_single_int PASSED [ 72%] +tests/test_g2p.py::TestG2P::test_g2p_residues_filter PASSED [ 73%] +tests/test_g2p.py::TestG2P::test_g2p_features PASSED [ 73%] +tests/test_g2p.py::TestG2P::test_g2p_out_writes_to_explicit_path PASSED [ 73%] +tests/test_g2p.py::TestG2P::test_g2p_gene_auto_resolved PASSED [ 73%] +tests/test_g2p.py::TestG2P::test_g2p_invalid_pair_returns_none PASSED [ 74%] +tests/test_g2p.py::TestG2PValidation::test_residues_on_map_raises PASSED [ 74%] +tests/test_g2p.py::TestG2PValidation::test_alignment_requires_explicit_uniprot PASSED [ 74%] +tests/test_g2p.py::TestG2PValidation::test_missing_both_raises PASSED [ 74%] +tests/test_g2p.py::TestG2PValidation::test_alignment_requires_isoform PASSED [ 75%] +tests/test_g2p.py::TestG2PValidation::test_residues_wrong_type_raises PASSED [ 75%] +tests/test_g2p.py::TestG2PValidation::test_invalid_resource_raises PASSED [ 75%] +tests/test_cbio.py::TestCbioSearch::test_cbio_search PASSED [ 75%] +tests/test_cbio.py::TestCbio::test_cbio_download PASSED [ 76%] +tests/test_cbio.py::TestCbio::test_error_cbio_download PASSED [ 76%] +tests/test_cbio.py::TestCbio::test_cbio_download_partially_existing_files PASSED [ 76%] +tests/test_diamond.py::TestDiamond::test_diamond_JSON_out PASSED [ 76%] +tests/test_diamond.py::TestDiamond::test_diamond_query_file PASSED [ 77%] +tests/test_diamond.py::TestDiamond::test_diamond_both_files PASSED [ 77%] +tests/test_diamond.py::TestDiamond::test_diamond_seqs_single PASSED [ 77%] +tests/test_diamond.py::TestDiamond::test_diamond_ref_file PASSED [ 77%] +tests/test_diamond.py::TestDiamond::test_diamond_seqs_multiple PASSED [ 77%] +tests/test_utils.py::TestUtils::test_ref_species_options_bad_type PASSED [ 78%] +tests/test_utils.py::TestUtils::test_ref_iv_species_options PASSED [ 78%] +tests/test_utils.py::TestUtils::test_read_fasta PASSED [ 78%] +tests/test_utils.py::TestUtils::test_get_uniprot_info_transcript PASSED [ 78%] +tests/test_utils.py::TestUtils::test_search_iv_species_options PASSED [ 79%] +tests/test_utils.py::TestUtils::test_search_species_options PASSED [ 79%] +tests/test_utils.py::TestUtils::test_get_uniprot_info_gene PASSED [ 79%] +tests/test_utils.py::TestUtils::test_ref_species_options PASSED [ 79%] +tests/test_utils.py::TestUtils::test_find_latest_ens_rel PASSED [ 80%] +tests/test_utils.py::TestUtils::test_get_uniprot_seqs PASSED [ 80%] +tests/test_utils.py::TestUtils::test_rest_query PASSED [ 80%] +tests/test_utils.py::TestUtils::test_rest_query_bad_type PASSED [ 80%] +tests/test_utils.py::TestUtils::test_aa_colors PASSED [ 81%] +tests/test_utils.py::TestUtils::test_n_colors PASSED [ 81%] +tests/test_utils.py::TestUtils::test_search_species_options_bad_type PASSED [ 81%] +tests/test_8cube.py::TestSpecificity::test_specificity_basic PASSED [ 81%] +tests/test_8cube.py::TestPsiBlock::test_psi_block_basic PASSED [ 81%] +tests/test_8cube.py::TestGeneExpression::test_gene_expression_basic PASSED [ 82%] +tests/test_info.py::TestInfo::test_info_gene PASSED [ 82%] +tests/test_info.py::TestInfo::test_info_mix PASSED [ 82%] +tests/test_info.py::TestInfo::test_info_WB_transcript PASSED [ 82%] +tests/test_info.py::TestInfo::test_info_ncbifalse_uniprotfalse PASSED [ 83%] +tests/test_info.py::TestInfo::test_info_ncbifalse_uniprottrue PASSED [ 83%] +tests/test_info.py::TestInfo::test_info_exon PASSED [ 83%] +tests/test_info.py::TestInfo::test_info_transcript PASSED [ 83%] +tests/test_info.py::TestInfo::test_info_ncbitrue_uniprotfalse PASSED [ 84%] +tests/test_info.py::TestInfo::test_info_gene_list_non_model PASSED [ 84%] +tests/test_bgee.py::TestBgee::test_error_bgee_orthologs_no_exist PASSED [ 84%] +tests/test_bgee.py::TestBgee::test_bgee_expression PASSED [ 84%] +tests/test_bgee.py::TestBgee::test_error_bgee_expression_no_exist PASSED [ 85%] +tests/test_bgee.py::TestBgee::test_bgee_expression_multiple PASSED [ 85%] +tests/test_bgee.py::TestBgee::test_bgee_orthologs PASSED [ 85%] +tests/test_bgee.py::TestBgee::test_error_bgee_unknown_type PASSED [ 85%] +tests/test_ref.py::TestRef::test_ref_rel PASSED [ 86%] +tests/test_ref.py::TestRef::test_ref_plant PASSED [ 86%] +tests/test_ref.py::TestRef::test_ref_bad_rel PASSED [ 86%] +tests/test_ref.py::TestRef::test_ref_which_plant PASSED [ 86%] +tests/test_ref.py::TestRef::test_ref_rel_ftp_octopus PASSED [ 86%] +tests/test_ref.py::TestRef::test_ref_ftp PASSED [ 87%] +tests/test_ref.py::TestRef::test_ref_list PASSED [ 87%] +tests/test_ref.py::TestRef::test_ref_bad_which PASSED [ 87%] +tests/test_ref.py::TestRef::test_ref_bad_species PASSED [ 87%] +tests/test_ref.py::TestRef::test_ref_rel_ftp PASSED [ 88%] +tests/test_ref.py::TestRef::test_ref_rel_protist PASSED [ 88%] +tests/test_ref.py::TestRef::test_ref PASSED [ 88%] +tests/test_ref.py::TestRef::test_ref_which PASSED [ 88%] +tests/test_cellxgene.py::TestCellxgene::test_cellxgene_adata SKIPPED [ 89%] +tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata SKIPPED [ 89%] +tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata_macaca_mulatta SKIPPED [ 89%] +tests/test_cellxgene.py::TestCellxgeneValidation::test_supported_species_includes_new_primates PASSED [ 89%] +tests/test_cellxgene.py::TestCellxgeneValidation::test_invalid_species_raises_valueerror PASSED [ 90%] +tests/test_cellxgene.py::TestCellxgeneValidation::test_typo_species_raises_valueerror PASSED [ 90%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_json PASSED [ 90%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_plot PASSED [ 90%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_ontology PASSED [ 90%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_transcription PASSED [ 91%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_fly PASSED [ 91%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background PASSED [ 91%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_species PASSED [ 91%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_background_ensembl PASSED [ 92%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_background PASSED [ 92%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_diseases_drugs PASSED [ 92%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_ensembl_ids PASSED [ 92%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_celltypes PASSED [ 93%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background_list PASSED [ 93%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_yeast PASSED [ 93%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_none PASSED [ 93%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_pathway PASSED [ 94%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_fish PASSED [ 94%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_kinase_interactions PASSED [ 94%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_mouse_is_human PASSED [ 94%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_gene PASSED [ 95%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_database_shortcut PASSED [ 95%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_worm PASSED [ 95%] +tests/test_blast.py::TestBlast::test_blast_nt PASSED [ 95%] +tests/test_blast.py::TestBlast::test_blast_bad_seq PASSED [ 95%] +tests/test_blast.py::TestBlast::test_blast_bad_program PASSED [ 96%] +tests/test_blast.py::TestBlast::test_blast_bad_db2 PASSED [ 96%] +tests/test_blast.py::TestBlast::test_blast_bad_db1 PASSED [ 96%] +tests/test_blast.py::TestBlast::test_blast_bad_fasta PASSED [ 96%] +tests/test_blast.py::TestBlast::test_blast_db_missing PASSED [ 97%] +tests/test_muscle.py::TestMuscleAASuper::test_muscle_aa_super5 PASSED [ 97%] +tests/test_muscle.py::TestMusclePrints::test_muscle_print_nt PASSED [ 97%] +tests/test_muscle.py::TestMuscleSeqsInput::test_muscle_seqs_as_input PASSED [ 97%] +tests/test_muscle.py::TestMuscleAA::test_muscle_aa PASSED [ 98%] +tests/test_muscle.py::TestMuscleSuper::test_muscle_nt_super5 PASSED [ 98%] +tests/test_muscle.py::TestMuscle::test_muscle_nt_txt PASSED [ 98%] +tests/test_muscle.py::TestMuscle::test_muscle_nt PASSED [ 98%] +tests/test_cosmic.py::TestCosmicWorkflow::test_cosmic_defaults PASSED [ 99%] +tests/test_elm.py::TestELM::test_elm_uniprot_id_in_elm PASSED [ 99%] +tests/test_elm.py::TestELM::test_elm_uniprot_aminoacidseq PASSED [ 99%] +tests/test_elm.py::TestELM::test_elm_uniprot_id_new PASSED [ 99%] +tests/test_compile.py::TestCompilerWindows::test_compiler_windows PASSED [100%] -=================================== FAILURES =================================== -___________________ TestInfo.test_info_ncbitrue_uniprotfalse ___________________ - -self = - - def assert_equal(self: unittest.TestCase): - test = name - expected_result = td[test]["expected_result"] - result_to_test = do_call(func, td[test]["args"]) - if test == "test_cosmic_defaults": # special case for cosmic - import numpy as np - - expected_result = pd.DataFrame(expected_result[0]) - expected_result = expected_result.replace({None: np.nan}) - # result_to_test.equals(expected_result) - pd.testing.assert_frame_equal(result_to_test, expected_result, check_dtype=False) - return - - # If result is a DataFrame, convert to list - if isinstance(result_to_test, pd.DataFrame): - result_to_test = result_to_test.dropna(axis=1).values.tolist() - -> self.assertEqual(result_to_test, expected_result) -E AssertionError: Lists differ: [['EN[14 chars]7', 'homo_sapiens', 'GRCh38', 'KRTAP9-8', 'ker[227 chars]04]]] != [['EN[14 chars]7', '83901', 'homo_sapiens', 'GRCh38', 'KRTAP9[860 chars]04]]] -E -E First differing element 0: -E ['ENS[13 chars]7', 'homo_sapiens', 'GRCh38', 'KRTAP9-8', 'ker[226 chars]004]] -E ['ENS[13 chars]7', '83901', 'homo_sapiens', 'GRCh38', 'KRTAP9[859 chars]004]] -E -E [['ENSG00000187272.7', -E + '83901', -E 'homo_sapiens', -E 'GRCh38', -E 'KRTAP9-8', -E + ['KAP9.8', 'KRTAP9.8'], -E 'keratin associated protein 9-8 [Source:HGNC Symbol;Acc:HGNC:17231]', -E + 'This protein is a member of the keratin-associated protein (KAP) family. ' -E + 'The KAP proteins form a matrix of keratin intermediate filaments which ' -E + 'contribute to the structure of hair fibers. KAP family members appear to ' -E + 'have unique, family-specific amino- and carboxyl-terminal regions and are ' -E + 'subdivided into three multi-gene families according to amino acid ' -E + 'composition: the high sulfur, the ultrahigh sulfur, and the high ' -E + 'tyrosine/glycine KAPs. This protein is a member of the ultrahigh sulfur KAP ' -E + 'family and the gene is localized to a cluster of KAPs at 17q12-q21. ' -E + '[provided by RefSeq, Jul 2008]', -E 'Gene', -E 'protein_coding', -E 'ENST00000254072.7', -E '17', -E 1, -E 41237999, -E 41239004, -E ['ENST00000254072.7'], -E ['protein_coding'], -E ['KRTAP9-8-201'], -E [1], -E [41237999], -E [41239004]]] - -tests/from_json.py:82: AssertionError ------------------------------- Captured log call ------------------------------- -ERROR gget.utils:gget_info.py:315 The NCBI server request for Ensembl ID 'ENSG00000187272' returned the following error: -Response ended prematurely =============================== warnings summary =============================== tests/test_mutate.py: 29 warnings /home/runner/work/gget/gget/gget/gget_mutate.py:667: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract. mask = mutations[mut_column].str.contains(combined_pattern) +tests/test_search.py: 10 warnings + /home/runner/work/gget/gget/gget/gget_search.py:267: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy. + df_temp = pd.read_sql(query, con=db_connection) + +tests/test_search.py: 19 warnings +tests/test_ref.py: 7 warnings + /home/runner/work/gget/gget/gget/utils.py:922: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. + for subsoup in soup.body.findAll("a"): + +tests/test_search.py::TestSearch::test_search_gene_two_sw_limit +tests/test_search.py::TestSearch::test_search_transcript_two_sw_or +tests/test_search.py::TestSearch::test_search_release +tests/test_utils.py::TestUtils::test_search_species_options + /home/runner/work/gget/gget/gget/utils.py:899: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. + for subsoup in soup.body.findAll("a"): + +tests/test_search.py::TestSearch::test_search_gene_two_sw_limit +tests/test_search.py::TestSearch::test_search_gene_two_sw_limit +tests/test_search.py::TestSearch::test_search_gene_two_sw_limit +tests/test_search.py::TestSearch::test_search_gene_two_sw_limit +tests/test_utils.py::TestUtils::test_search_iv_species_options +tests/test_utils.py::TestUtils::test_search_iv_species_options +tests/test_utils.py::TestUtils::test_search_iv_species_options +tests/test_utils.py::TestUtils::test_search_iv_species_options + /home/runner/work/gget/gget/gget/utils.py:883: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. + for subsoup in soup.body.findAll("a"): + +tests/test_search.py::TestSearch::test_search_gene_two_sw_limit +tests/test_search.py::TestSearch::test_search_transcript_two_sw_or +tests/test_search.py::TestSearch::test_search_transcript_two_sw_and +tests/test_search.py::TestSearch::test_search_transcript_one_sw + /home/runner/work/gget/gget/gget/gget_search.py:302: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy. + df_temp = pd.read_sql(query, con=db_connection) + tests/test_cbio.py::TestCbioSearch::test_cbio_search tests/test_cbio.py::TestCbioSearch::test_cbio_search /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/swagger_spec_validator/validator12.py:18: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. @@ -527,108 +498,39 @@ tests/test_cbio.py: 16 warnings /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/bravado_core/model.py:888: DeprecationWarning: jsonschema.RefResolver.in_scope is deprecated and will be removed in a future release. with spec.resolver.in_scope(additional_uri): -tests/test_ref.py: 11 warnings -tests/test_utils.py: 1 warning - /home/runner/work/gget/gget/gget/utils.py:998: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. - for subsoup in soup.body.findAll("a"): - -tests/test_ref.py: 24 warnings tests/test_utils.py: 4 warnings +tests/test_ref.py: 24 warnings /home/runner/work/gget/gget/gget/utils.py:975: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. for subsoup in soup.body.findAll("a"): -tests/test_ref.py: 7 warnings -tests/test_search.py: 19 warnings - /home/runner/work/gget/gget/gget/utils.py:922: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. +tests/test_utils.py: 1 warning +tests/test_ref.py: 11 warnings + /home/runner/work/gget/gget/gget/utils.py:998: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. for subsoup in soup.body.findAll("a"): tests/test_ref.py: 39 warnings /home/runner/work/gget/gget/gget/gget_ref.py:49: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. links = [stuff.text.strip() for stuff in soup.findAll("td")] -tests/test_ref.py::TestRef::test_ref tests/test_ref.py::TestRef::test_ref_ftp +tests/test_ref.py::TestRef::test_ref /home/runner/work/gget/gget/gget/gget_ref.py:325: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. links = [stuff.text.strip() for stuff in soup.findAll("td")] -tests/test_search.py::TestSearch::test_search_transcript_bad_species -tests/test_search.py::TestSearch::test_search_transcript_two_sw_or -tests/test_search.py::TestSearch::test_search_release -tests/test_utils.py::TestUtils::test_search_species_options - /home/runner/work/gget/gget/gget/utils.py:899: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. - for subsoup in soup.body.findAll("a"): - -tests/test_search.py::TestSearch::test_search_transcript_bad_species -tests/test_search.py::TestSearch::test_search_transcript_bad_species -tests/test_search.py::TestSearch::test_search_transcript_bad_species -tests/test_search.py::TestSearch::test_search_transcript_bad_species -tests/test_utils.py::TestUtils::test_search_iv_species_options -tests/test_utils.py::TestUtils::test_search_iv_species_options -tests/test_utils.py::TestUtils::test_search_iv_species_options -tests/test_utils.py::TestUtils::test_search_iv_species_options - /home/runner/work/gget/gget/gget/utils.py:883: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. - for subsoup in soup.body.findAll("a"): - -tests/test_search.py: 10 warnings - /home/runner/work/gget/gget/gget/gget_search.py:267: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy. - df_temp = pd.read_sql(query, con=db_connection) - -tests/test_search.py::TestSearch::test_search_gene_two_sw_limit -tests/test_search.py::TestSearch::test_search_transcript_two_sw_and -tests/test_search.py::TestSearch::test_search_transcript_two_sw_or -tests/test_search.py::TestSearch::test_search_transcript_one_sw - /home/runner/work/gget/gget/gget/gget_search.py:302: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy. - df_temp = pd.read_sql(query, con=db_connection) - -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html ============================= slowest 10 durations ============================= -130.22s call tests/test_virus.py::TestVirus::test_virus_with_source_database_filter -128.90s call tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter -127.97s call tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter -91.02s call tests/test_blast.py::TestBlast::test_blast_nt -84.15s call tests/test_virus.py::TestVirus::test_virus_integer_virus_id -66.85s call tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter -23.56s call tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters -23.38s call tests/test_virus.py::TestVirus::test_virus_with_annotated_filter -20.59s call tests/test_virus.py::TestVirus::test_virus_with_host_filter -19.01s call tests/test_virus.py::TestVirus::test_virus_with_length_filters +134.73s call tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter +130.95s call tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter +130.50s call tests/test_virus.py::TestVirus::test_virus_integer_virus_id +129.00s call tests/test_virus.py::TestVirus::test_virus_with_source_database_filter +95.24s call tests/test_blast.py::TestBlast::test_blast_nt +78.92s call tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters +72.29s call tests/test_virus.py::TestVirus::test_virus_with_annotated_filter +67.81s call tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter +26.80s call tests/test_search.py::TestSearch::test_search_gene_two_sw_limit +24.23s call tests/test_virus.py::TestVirus::test_virus_with_host_filter =========================== short test summary info ============================ +SKIPPED [1] tests/test_cellxgene.py:45: cellxgene-census is not installed SKIPPED [1] tests/test_cellxgene.py:55: cellxgene-census is not installed SKIPPED [1] tests/test_cellxgene.py:65: cellxgene-census is not installed -SKIPPED [1] tests/test_cellxgene.py:45: cellxgene-census is not installed -FAILED tests/test_info.py::TestInfo::test_info_ncbitrue_uniprotfalse - AssertionError: Lists differ: [['EN[14 chars]7', 'homo_sapiens', 'GRCh38', 'KRTAP9-8', 'ker[227 chars]04]]] != [['EN[14 chars]7', '83901', 'homo_sapiens', 'GRCh38', 'KRTAP9[860 chars]04]]] - -First differing element 0: -['ENS[13 chars]7', 'homo_sapiens', 'GRCh38', 'KRTAP9-8', 'ker[226 chars]004]] -['ENS[13 chars]7', '83901', 'homo_sapiens', 'GRCh38', 'KRTAP9[859 chars]004]] - - [['ENSG00000187272.7', -+ '83901', - 'homo_sapiens', - 'GRCh38', - 'KRTAP9-8', -+ ['KAP9.8', 'KRTAP9.8'], - 'keratin associated protein 9-8 [Source:HGNC Symbol;Acc:HGNC:17231]', -+ 'This protein is a member of the keratin-associated protein (KAP) family. ' -+ 'The KAP proteins form a matrix of keratin intermediate filaments which ' -+ 'contribute to the structure of hair fibers. KAP family members appear to ' -+ 'have unique, family-specific amino- and carboxyl-terminal regions and are ' -+ 'subdivided into three multi-gene families according to amino acid ' -+ 'composition: the high sulfur, the ultrahigh sulfur, and the high ' -+ 'tyrosine/glycine KAPs. This protein is a member of the ultrahigh sulfur KAP ' -+ 'family and the gene is localized to a cluster of KAPs at 17q12-q21. ' -+ '[provided by RefSeq, Jul 2008]', - 'Gene', - 'protein_coding', - 'ENST00000254072.7', - '17', - 1, - 41237999, - 41239004, - ['ENST00000254072.7'], - ['protein_coding'], - ['KRTAP9-8-201'], - [1], - [41237999], - [41239004]]] -===== 1 failed, 418 passed, 3 skipped, 185 warnings in 1095.63s (0:18:15) ====== +========== 419 passed, 3 skipped, 185 warnings in 1294.55s (0:21:34) =========== From 642ffac907a037a69d35bd8af507c17994ae11b6 Mon Sep 17 00:00:00 2001 From: Laura Luebbert Date: Sun, 28 Jun 2026 14:37:12 -0400 Subject: [PATCH 30/34] docs(contributing): note what runs automatically on PRs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Brief section so contributors know pre-commit.ci (ruff/biome/hygiene + mypy), the test matrix, and the build check run automatically — and that pre-commit.ci auto-fixes formatting and mypy only flags new errors (existing baseline grandfathered). Pairs with the existing upstream-flake note. Co-Authored-By: Claude Opus 4.7 (1M context) --- CONTRIBUTING.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 44f968809..bc474fda9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -61,6 +61,17 @@ Reviewers move faster on small, focused PRs. Whenever possible: - **Scope each PR to a single `gget` module or issue**. If you find yourself changing more than one module to address several distinct concerns, please open them as separate PRs — one per module. Bug fixes and small refactors inside one module can be combined; cross-module work should be split. - **Don't bundle unrelated changes** (e.g. a bug fix plus a new feature plus a refactor) in the same PR. +### What runs automatically on your PR + +When you open a PR, a few checks run automatically — you don't need to set anything up: + +- **Linting & formatting** ([pre-commit.ci](https://pre-commit.ci)): runs [ruff](https://docs.astral.sh/ruff/) (lint + format), [biome](https://biomejs.dev/), and basic hygiene hooks. It **auto-fixes** formatting issues by pushing a commit to your branch (just `git pull` afterwards); it only fails the check for problems it can't fix automatically (e.g. lint errors). +- **Type checking** (mypy, via pre-commit.ci): only **new** type errors fail the check — the existing baseline is grandfathered, so you're not on the hook for pre-existing issues. +- **Unit tests** (`CI - tests`): the test suite runs on Python 3.12, 3.13, and 3.14. +- **Build check**: confirms the package still builds and is publishable. + +You don't have to run these manually first, but doing the self-review above (especially `uvx hatch test` and `prek run --all-files`) catches most issues before they reach CI. + ### Failing tests for modules you didn't touch The `gget` test suite hits real upstream databases (Ensembl, UniProt, NCBI, ARCHS4, Open Targets, ELM, etc.). When those services change their data or schemas — which they do regularly — tests for the affected modules can start failing without anyone changing `gget` itself. **If automated CI tests fail in your PR for a module you did not touch, you can safely ignore those failures** when judging whether your PR is ready to merge. The maintainers track upstream-drift failures separately and do not expect contributors to fix unrelated breakages as a condition of merging. From 4b586a391bf2667216e52e29104adcd365da884e Mon Sep 17 00:00:00 2001 From: "Laura Luebbert, Ph.D." <56094636+lauraluebbert@users.noreply.github.com> Date: Sun, 28 Jun 2026 14:47:06 -0400 Subject: [PATCH 31/34] Update CONTRIBUTING.md --- CONTRIBUTING.md | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index bc474fda9..4b4e48fb3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -40,17 +40,17 @@ Commit the changes once you are happy with them. 1. Review the content for technical accuracy and biological relevance (who are your target users and is this useful to them?). 2. Copy-edit the changes/comments for grammar, spelling, and adherence to the general style of existing gget code. -3. **Testing new code:** Make sure the unit tests pass: - - The tested environments are defined in `pyproject.toml` under `[tool.hatch.envs.hatch-test]` (the single source of truth used by CI). Run the full matrix with `uvx hatch test`. - - For a quick single-environment run, install the test dependencies with `uv sync --group test` and run `uv run pytest -ra -v --cov=gget --cov-report=term-missing tests`. To also exercise the `gget cellxgene` module, install its extra (`uv sync --group test --extra cellxgene`) on Python 3.12/3.13 — its dependency has no wheels for newer Python versions yet, and that test skips itself when the dependency is absent. -4. **Unit tests:** Add new unit tests if applicable: - - Arguments and expected results are stored in json files in ./tests/fixtures/ - - Unit tests can be added to ./tests/test_*.py and will be automatically detected -5. **Command line interface:** Make sure edits keep the Python function and the command-line interface in sync. Any change to a function's arguments must be reflected in both the Python signature and the CLI argument parser. +3. **Command line interface:** Make sure edits keep the Python function and the command-line interface in sync. Any change to a function's arguments must be reflected in both the Python signature and the CLI argument parser. - The command line interface and arguments are defined in ./gget/main.py -6. **Documentation:** Add new modules/arguments to the documentation if applicable: +4. **Documentation:** Add new modules/arguments to the documentation if applicable: - The manual for each module can be added/edited in `./docs/src/en/*.md` (the Spanish version of the docs in `./docs/src/es/*.md` is automatically generated/updated, and does not need to be edited manually) - **Document all edits in `./docs/src/en/updates.md`.** Keep this brief and succinct. +5. **Add unit tests:** Add new unit tests if applicable: + - Arguments and expected results are stored in json files in ./tests/fixtures/ + - Unit tests can be added to ./tests/test_*.py and will be automatically detected +6. **Run unit tests:** Make sure the unit tests pass: + - The tested environments are defined in `pyproject.toml` under `[tool.hatch.envs.hatch-test]` (the single source of truth used by CI). Run the full matrix with `uvx hatch test`. + - For a quick single-environment run, install the test dependencies with `uv sync --group test` and run `uv run pytest -ra -v --cov=gget --cov-report=term-missing tests`. To also exercise the `gget cellxgene` module, install its extra (`uv sync --group test --extra cellxgene`) on Python 3.12/3.13 — its dependency has no wheels for newer Python versions yet, and that test skips itself when the dependency is absent. If you have any questions, feel free to start a [discussion](https://github.com/scverse/gget/discussions) or create an issue as described above. @@ -61,21 +61,6 @@ Reviewers move faster on small, focused PRs. Whenever possible: - **Scope each PR to a single `gget` module or issue**. If you find yourself changing more than one module to address several distinct concerns, please open them as separate PRs — one per module. Bug fixes and small refactors inside one module can be combined; cross-module work should be split. - **Don't bundle unrelated changes** (e.g. a bug fix plus a new feature plus a refactor) in the same PR. -### What runs automatically on your PR - -When you open a PR, a few checks run automatically — you don't need to set anything up: - -- **Linting & formatting** ([pre-commit.ci](https://pre-commit.ci)): runs [ruff](https://docs.astral.sh/ruff/) (lint + format), [biome](https://biomejs.dev/), and basic hygiene hooks. It **auto-fixes** formatting issues by pushing a commit to your branch (just `git pull` afterwards); it only fails the check for problems it can't fix automatically (e.g. lint errors). -- **Type checking** (mypy, via pre-commit.ci): only **new** type errors fail the check — the existing baseline is grandfathered, so you're not on the hook for pre-existing issues. -- **Unit tests** (`CI - tests`): the test suite runs on Python 3.12, 3.13, and 3.14. -- **Build check**: confirms the package still builds and is publishable. - -You don't have to run these manually first, but doing the self-review above (especially `uvx hatch test` and `prek run --all-files`) catches most issues before they reach CI. - -### Failing tests for modules you didn't touch - -The `gget` test suite hits real upstream databases (Ensembl, UniProt, NCBI, ARCHS4, Open Targets, ELM, etc.). When those services change their data or schemas — which they do regularly — tests for the affected modules can start failing without anyone changing `gget` itself. **If automated CI tests fail in your PR for a module you did not touch, you can safely ignore those failures** when judging whether your PR is ready to merge. The maintainers track upstream-drift failures separately and do not expect contributors to fix unrelated breakages as a condition of merging. - ### Pull Request When you're finished with the changes, [create a pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request), also known as a PR. @@ -90,7 +75,22 @@ When you're finished with the changes, [create a pull request](https://docs.gith Once you submit your PR, a `gget` team member will review your proposal. We may ask questions or request additional information. -### Your PR is merged! +### What runs automatically on your PR + +When you open a PR, a few checks run automatically — you don't need to set anything up: + +- **Linting & formatting** ([pre-commit.ci](https://pre-commit.ci)): runs [ruff](https://docs.astral.sh/ruff/) (lint + format), [biome](https://biomejs.dev/), and basic hygiene hooks. It **auto-fixes** formatting issues by pushing a commit to your branch; it only fails the check for problems it can't fix automatically (e.g. lint errors). +- **Type checking** (mypy, via pre-commit.ci): newly introduced type errors fail this check. +- **Unit tests** (`CI - tests`): the complete test suite for all modules runs on Python 3.12, 3.13, and 3.14. +- **Build check**: confirms the package still builds and is publishable. + +Optional: You can run these manually first (especially `uvx hatch test` and `prek run --all-files`) to catch most issues before creating the PR. + +### Failing tests for modules you didn't touch + +The `gget` test suite hits real upstream databases (Ensembl, UniProt, NCBI, ARCHS4, Open Targets, ELM, etc.). When those services change their data or schemas — which they do regularly — tests for the affected modules can start failing without anyone changing `gget` itself. **If automated CI tests fail in your PR for a module you did not touch, you can safely ignore those failures** when judging whether your PR is ready to merge. The maintainers track upstream-drift failures separately and do not expect contributors to fix unrelated breakages as a condition of merging. + +### Your PR gets merged! Congratulations! 🎉 The `gget` team thanks you. ✨ From f70ba3b7676761ea8234c3e26ce0d0560e2cdfde Mon Sep 17 00:00:00 2001 From: "Laura Luebbert, Ph.D." <56094636+lauraluebbert@users.noreply.github.com> Date: Sun, 28 Jun 2026 15:55:19 -0400 Subject: [PATCH 32/34] docs(archs4): clarify legacy endpoint vs archs4.org data source (#254) (#259) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * docs(archs4): document legacy endpoint + archs4.org data-source situation Addresses #254. gget archs4 uses the legacy maayanlab.cloud HTTP endpoints, which are lightweight and still maintained. The newer archs4.org dataset has no equivalent lightweight HTTP API — programmatic access there is only via archs4py + multi-GB HDF5 downloads, which doesn't fit gget's lightweight-query design. Documented this so users know where the data comes from, how it differs from archs4.org, and how to get the newer data (archs4py) if they need it. Migration remains tracked in #254. Docs-only; no code change. Co-Authored-By: Claude Opus 4.7 (1M context) * Update updates.md * Update archs4.md * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: Claude Opus 4.7 (1M context) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- docs/src/en/archs4.md | 2 ++ pyproject.toml | 12 ++++++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/src/en/archs4.md b/docs/src/en/archs4.md index e41b08644..32cf5b6f0 100644 --- a/docs/src/en/archs4.md +++ b/docs/src/en/archs4.md @@ -5,6 +5,8 @@ Find the most correlated genes to a gene of interest or find the gene's tissue expression atlas using [ARCHS4](https://maayanlab.cloud/archs4/). Return format: JSON (command-line) or data frame/CSV (Python). +> **Note on the data source:** `gget archs4` queries the legacy ARCHS4 HTTP endpoints at `maayanlab.cloud`, which are lightweight and still maintained. ARCHS4 has since launched a new site ([archs4.org](https://archs4.org)) with a larger, more up-to-date dataset, but its programmatic access is provided only via the [`archs4py`](https://github.com/MaayanLab/archs4py) package and multi-GB HDF5 downloads (there is currently no equivalent lightweight HTTP API to query). `gget archs4` therefore continues to use the legacy endpoints. A possible future migration is tracked in [issue 254](https://github.com/scverse/gget/issues/254). + **Positional argument** `gene` Short name (gene symbol) of gene of interest, e.g. STAT4. diff --git a/pyproject.toml b/pyproject.toml index 0c60bbd0d..dedfc0c9d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -143,12 +143,6 @@ warn_redundant_casts = true warn_unused_ignores = true show_error_codes = true -# mypy-baseline grandfathers the pre-existing type errors so the pre-commit -# mypy hook only fails on NEW errors. Refresh after fixing some with: -# mypy gget | mypy-baseline sync -[tool.mypy-baseline] -baseline_path = ".mypy-baseline.txt" - [tool.pytest] ini_options.testpaths = [ "tests" ] ini_options.addopts = [ "-ra" ] @@ -159,3 +153,9 @@ run.omit = [ "gget/main.py", ] run.source = [ "gget" ] + +# mypy-baseline grandfathers the pre-existing type errors so the pre-commit +# mypy hook only fails on NEW errors. Refresh after fixing some with: +# mypy gget | mypy-baseline sync +[tool.mypy-baseline] +baseline_path = ".mypy-baseline.txt" From 8eb4960ba2240199e55a80d402b411008b09c55c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 28 Jun 2026 20:20:28 +0000 Subject: [PATCH 33/34] CI: update pytest results (dev) --- tests/pytest_results.txt | 936 +++++++++++++++++++-------------------- 1 file changed, 468 insertions(+), 468 deletions(-) diff --git a/tests/pytest_results.txt b/tests/pytest_results.txt index 3236f3a40..013b763ca 100644 --- a/tests/pytest_results.txt +++ b/tests/pytest_results.txt @@ -1,439 +1,465 @@ -Pytest results (Python 3.14) - 2026-06-28T18:09:06Z +Pytest results (Python 3.14) - 2026-06-28T19:56:05Z ============================= test session starts ============================== platform linux -- Python 3.14.6, pytest-9.1.1, pluggy-1.6.0 -- /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/bin/python3 cachedir: .pytest_cache -Using --randomly-seed=1997994390 +Using --randomly-seed=1578840813 rootdir: /home/runner/work/gget/gget configfile: pyproject.toml testpaths: tests plugins: randomly-3.16.0, rerunfailures-14.0, mock-3.15.1, cov-7.1.0, xdist-3.8.0 collecting ... collected 422 items -tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_clean_up_missing_dir_is_safe PASSED [ 0%] -tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_clean_up_removes_custom_dir PASSED [ 0%] -tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_cli_exposes_jackhmmer_savedir_flag PASSED [ 0%] -tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_default_dir PASSED [ 0%] -tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_custom_dir PASSED [ 1%] -tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_clean_up_default_dir_when_none PASSED [ 1%] -tests/test_mutate.py::TestMutate::test_posttranslational_mutation PASSED [ 1%] -tests/test_mutate.py::TestMutate::test_single_deletion_with_right_repeats PASSED [ 1%] -tests/test_mutate.py::TestMutate::test_multi_delins_with_true_right_repeats PASSED [ 2%] -tests/test_mutate.py::TestMutate::test_ambiguous_mutation PASSED [ 2%] -tests/test_mutate.py::TestMutate::test_index_error PASSED [ 2%] -tests/test_mutate.py::TestMutate::test_multi_insertion PASSED [ 2%] -tests/test_mutate.py::TestMutate::test_single_dup PASSED [ 3%] -tests/test_mutate.py::TestMutate::test_inversion_with_overlaps PASSED [ 3%] -tests/test_mutate.py::TestMutate::test_large_k PASSED [ 3%] -tests/test_mutate.py::TestMutate::test_single_deletion_with_left_repeats PASSED [ 3%] -tests/test_mutate.py::TestMutate::test_multi_delins_with_true_left_repeats PASSED [ 4%] -tests/test_mutate.py::TestMutate::test_single_substitution_near_left_end PASSED [ 4%] -tests/test_mutate.py::TestMutate::test_multi_insertion_with_left_repeats PASSED [ 4%] -tests/test_mutate.py::TestMutate::test_list_of_mutations PASSED [ 4%] -tests/test_mutate.py::TestMutate::test_single_substitution PASSED [ 4%] -tests/test_mutate.py::TestMutate::test_multi_dup PASSED [ 5%] -tests/test_mutate.py::TestMutate::test_intron_mutation_minus PASSED [ 5%] -tests/test_mutate.py::TestMutate::test_uncertain_mutation PASSED [ 5%] -tests/test_mutate.py::TestMutate::test_multi_delins_with_psuedo_left_repeats PASSED [ 5%] -tests/test_mutate.py::TestMutate::test_intron_mutation_plus PASSED [ 6%] -tests/test_mutate.py::TestMutate::test_multi_deletion PASSED [ 6%] -tests/test_mutate.py::TestMutate::test_single_insertion PASSED [ 6%] -tests/test_mutate.py::TestMutate::test_single_substitution_near_right_end PASSED [ 6%] -tests/test_mutate.py::TestMutate::test_single_deletion PASSED [ 7%] -tests/test_mutate.py::TestMutate::test_single_delins PASSED [ 7%] -tests/test_mutate.py::TestMutate::test_multi_deletion_with_right_repeats PASSED [ 7%] -tests/test_mutate.py::TestMutate::test_multi_delins PASSED [ 7%] -tests/test_mutate.py::test_mismatch_error PASSED [ 8%] -tests/test_mutate.py::test_csv_of_mutations PASSED [ 8%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue_mouse PASSED [ 8%] -tests/test_archs4.py::TestArchs4::test_archs4_mouse_json_ensembl PASSED [ 8%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_gene PASSED [ 9%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue PASSED [ 9%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_which PASSED [ 9%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_ensembl PASSED [ 9%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_species PASSED [ 9%] -tests/test_archs4.py::TestArchs4::test_archs4_bad_gene_tissue PASSED [ 10%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue_ensembl PASSED [ 10%] -tests/test_archs4.py::TestArchs4::test_archs4_tissue_json PASSED [ 10%] -tests/test_archs4.py::TestArchs4::test_archs4_defaults PASSED [ 10%] -tests/test_archs4.py::TestArchs4MissingColor::test_tissue_missing_color_does_not_crash PASSED [ 11%] -tests/test_virus.py::TestVirus::test_write_fasta_record_long_sequence_wraps PASSED [ 11%] -tests/test_virus.py::TestVirus::test_virus_multi_accession_file_input PASSED [ 11%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_host PASSED [ 11%] -tests/test_virus.py::TestVirus::test_check_min_max_valid PASSED [ 12%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_csv PASSED [ 12%] -tests/test_virus.py::TestVirus::test_get_gget_version_returns_string PASSED [ 12%] -tests/test_virus.py::TestVirus::test_merge_baseline_with_new_deduplicates PASSED [ 12%] -tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter PASSED [ 13%] -tests/test_virus.py::TestVirus::test_retry_helper_success_after_retry PASSED [ 13%] -tests/test_virus.py::TestVirus::test_virus_with_length_filters PASSED [ 13%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_no_parentheses_returns_none PASSED [ 13%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_missing_accession PASSED [ 13%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_max_release_date PASSED [ 14%] -tests/test_virus.py::TestVirus::test_filter_sequences_proteins_complete PASSED [ 14%] -tests/test_virus.py::TestVirus::test_filter_sequences_max_ambiguous_chars PASSED [ 14%] -tests/test_virus.py::TestVirus::test_deduplicate_all_existing PASSED [ 14%] -tests/test_virus.py::TestVirus::test_parse_date_invalid_raises PASSED [ 15%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_min_seq_length PASSED [ 15%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_false PASSED [ 15%] -tests/test_virus.py::TestVirus::test_parse_genbank_xml_basic PASSED [ 15%] -tests/test_virus.py::TestVirus::test_filter_sequences_no_filters PASSED [ 16%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_geographic_location PASSED [ 16%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_min PASSED [ 16%] -tests/test_virus.py::TestVirus::test_check_min_max_equal PASSED [ 16%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_text PASSED [ 17%] -tests/test_virus.py::TestVirus::test_validate_datasets_binary_valid PASSED [ 17%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_already_correct_returns_none PASSED [ 17%] -tests/test_virus.py::TestVirus::test_stream_copy_fasta_all_records PASSED [ 17%] -tests/test_virus.py::TestVirus::test_retry_helper_custom_retryable_exceptions PASSED [ 18%] -tests/test_virus.py::TestVirus::test_track_failed_operation_none_dict PASSED [ 18%] -tests/test_virus.py::TestVirus::test_stream_copy_fasta_with_accession_filter PASSED [ 18%] -tests/test_virus.py::TestVirus::test_virus_invalid_annotated_type PASSED [ 18%] -tests/test_virus.py::TestVirus::test_virus_with_geographic_location_filter PASSED [ 18%] -tests/test_virus.py::TestVirus::test_retry_helper_non_retryable_exception PASSED [ 19%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_no_filters PASSED [ 19%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_multiple PASSED [ 19%] -tests/test_virus.py::TestVirus::test_filter_cached_annotated PASSED [ 19%] +tests/test_cbio.py::TestCbio::test_cbio_download PASSED [ 0%] +tests/test_cbio.py::TestCbio::test_cbio_download_partially_existing_files PASSED [ 0%] +tests/test_cbio.py::TestCbio::test_error_cbio_download PASSED [ 0%] +tests/test_cbio.py::TestCbioSearch::test_cbio_search PASSED [ 0%] +tests/test_8cube.py::TestSpecificity::test_specificity_basic PASSED [ 1%] +tests/test_8cube.py::TestGeneExpression::test_gene_expression_basic PASSED [ 1%] +tests/test_8cube.py::TestPsiBlock::test_psi_block_basic PASSED [ 1%] +tests/test_muscle.py::TestMusclePrints::test_muscle_print_nt PASSED [ 1%] +tests/test_muscle.py::TestMuscleSeqsInput::test_muscle_seqs_as_input PASSED [ 2%] +tests/test_muscle.py::TestMuscleAASuper::test_muscle_aa_super5 PASSED [ 2%] +tests/test_muscle.py::TestMuscleSuper::test_muscle_nt_super5 PASSED [ 2%] +tests/test_muscle.py::TestMuscleAA::test_muscle_aa PASSED [ 2%] +tests/test_muscle.py::TestMuscle::test_muscle_nt PASSED [ 3%] +tests/test_muscle.py::TestMuscle::test_muscle_nt_txt PASSED [ 3%] +tests/test_pdb.py::TestPDB::test_pdb_legacy_fallback_to_mmcif PASSED [ 3%] +tests/test_pdb.py::TestPDB::test_pdb_assembly PASSED [ 3%] +tests/test_pdb.py::TestPDB::test_pdb_mmcif PASSED [ 4%] +tests/test_pdb.py::TestPDB::test_pdb_pdb PASSED [ 4%] +tests/test_cellxgene.py::TestCellxgene::test_cellxgene_adata SKIPPED [ 4%] +tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata SKIPPED [ 4%] +tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata_macaca_mulatta SKIPPED [ 4%] +tests/test_cellxgene.py::TestCellxgeneValidation::test_invalid_species_raises_valueerror PASSED [ 5%] +tests/test_cellxgene.py::TestCellxgeneValidation::test_supported_species_includes_new_primates PASSED [ 5%] +tests/test_cellxgene.py::TestCellxgeneValidation::test_typo_species_raises_valueerror PASSED [ 5%] +tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_clean_up_default_dir_when_none PASSED [ 5%] +tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_cli_exposes_jackhmmer_savedir_flag PASSED [ 6%] +tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_custom_dir PASSED [ 6%] +tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_clean_up_missing_dir_is_safe PASSED [ 6%] +tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_default_dir PASSED [ 6%] +tests/test_alphafold.py::TestAlphafoldJackhmmerSavedir::test_clean_up_removes_custom_dir PASSED [ 7%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_empty PASSED [ 7%] +tests/test_virus.py::TestVirus::test_virus_with_multiple_filters PASSED [ 7%] +tests/test_virus.py::TestVirus::test_is_sars_cov2_query_common_names PASSED [ 7%] +tests/test_virus.py::TestVirus::test_is_sars_cov2_query_negative PASSED [ 8%] +tests/test_virus.py::TestVirus::test_merge_baseline_with_new_csv PASSED [ 8%] +tests/test_virus.py::TestVirus::test_get_gget_version_returns_string PASSED [ 8%] +tests/test_virus.py::TestVirus::test_unzip_file_valid PASSED [ 8%] +tests/test_virus.py::TestVirus::test_parse_genbank_xml_empty_set PASSED [ 9%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_min PASSED [ 9%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_seq_length PASSED [ 9%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_gen_mol_type PASSED [ 9%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_virus_suffix PASSED [ 9%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_nonexistent_raises PASSED [ 10%] +tests/test_virus.py::TestVirus::test_save_partial_metadata_empty PASSED [ 10%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_type PASSED [ 10%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_combined PASSED [ 10%] +tests/test_virus.py::TestVirus::test_merge_metadata_csvs_fills_missing PASSED [ 11%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_negative PASSED [ 11%] +tests/test_virus.py::TestVirus::test_save_partial_metadata PASSED [ 11%] +tests/test_virus.py::TestVirus::test_virus_with_annotated_filter PASSED [ 11%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_false PASSED [ 12%] +tests/test_virus.py::TestVirus::test_get_datasets_path_returns_valid_path PASSED [ 12%] +tests/test_virus.py::TestVirus::test_filter_cached_host_not_in_strategy PASSED [ 12%] +tests/test_virus.py::TestVirus::test_local_name_with_namespace PASSED [ 12%] +tests/test_virus.py::TestVirus::test_write_fasta_record_without_description PASSED [ 13%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_zero PASSED [ 13%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_country PASSED [ 13%] +tests/test_virus.py::TestVirus::test_validate_datasets_binary_valid PASSED [ 13%] +tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_empty PASSED [ 13%] +tests/test_virus.py::TestVirus::test_save_metadata_to_csv_basic PASSED [ 14%] +tests/test_virus.py::TestVirus::test_retry_helper_non_retryable_exception PASSED [ 14%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_mature_peptide_count PASSED [ 14%] +tests/test_virus.py::TestVirus::test_virus_relationship_check_counts_match PASSED [ 14%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_min_gene_count PASSED [ 15%] +tests/test_virus.py::TestVirus::test_genbank_xml_to_csv_basic PASSED [ 15%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_collection_date_range PASSED [ 15%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_space_before_virus PASSED [ 15%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_has_proteins PASSED [ 16%] +tests/test_virus.py::TestVirus::test_virus_completeness_filter_verification PASSED [ 16%] +tests/test_virus.py::TestVirus::test_virus_invalid_lab_passaged_type PASSED [ 16%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_max_seq_length PASSED [ 16%] +tests/test_virus.py::TestVirus::test_merge_baseline_with_new_empty_new PASSED [ 17%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_multiple PASSED [ 17%] +tests/test_virus.py::TestVirus::test_merge_baseline_with_new_deduplicates PASSED [ 17%] +tests/test_virus.py::TestVirus::test_deduplicate_all_existing PASSED [ 17%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_json PASSED [ 18%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_none_raises PASSED [ 18%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_empty_returns_none PASSED [ 18%] +tests/test_virus.py::TestVirus::test_write_fasta_record_with_description PASSED [ 18%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_false PASSED [ 18%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_max_gene_count PASSED [ 19%] +tests/test_virus.py::TestVirus::test_batch_accessions_for_url PASSED [ 19%] +tests/test_virus.py::TestVirus::test_virus_multi_accession_file_input PASSED [ 19%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_true PASSED [ 19%] +tests/test_virus.py::TestVirus::test_virus_with_collection_date_filters PASSED [ 20%] +tests/test_virus.py::TestVirus::test_clean_xml_declarations_no_declarations PASSED [ 20%] +tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters PASSED [ 20%] tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter PASSED [ 20%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_combined PASSED [ 20%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_nuc_completeness_partial PASSED [ 20%] -tests/test_virus.py::TestVirus::test_retry_helper_successful_operation PASSED [ 20%] -tests/test_virus.py::TestVirus::test_is_sars_cov2_query_negative PASSED [ 21%] -tests/test_virus.py::TestVirus::test_virus_none_virus_name PASSED [ 21%] -tests/test_virus.py::TestVirus::test_merge_metadata_csvs_no_overwrite PASSED [ 21%] -tests/test_virus.py::TestVirus::test_virus_metadata_schema_validation PASSED [ 21%] -tests/test_virus.py::TestVirus::test_virus_empty_virus_name PASSED [ 22%] -tests/test_virus.py::TestVirus::test_virus_invalid_keep_temp_type PASSED [ 22%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_true PASSED [ 22%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_protein_count PASSED [ 22%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_text PASSED [ 21%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_isolation_source PASSED [ 21%] +tests/test_virus.py::TestVirus::test_parse_date_full PASSED [ 21%] +tests/test_virus.py::TestVirus::test_parse_accession_input_single PASSED [ 21%] +tests/test_virus.py::TestVirus::test_filter_sequences_proteins_complete PASSED [ 22%] +tests/test_virus.py::TestVirus::test_virus_with_length_filters PASSED [ 22%] +tests/test_virus.py::TestVirus::test_track_failed_operation_appends PASSED [ 22%] tests/test_virus.py::TestVirus::test_check_min_max_date_valid PASSED [ 22%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_min_comparison PASSED [ 23%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_min_gene_count PASSED [ 23%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_empty_returns_none PASSED [ 23%] -tests/test_virus.py::TestVirus::test_parse_date_full PASSED [ 23%] -tests/test_virus.py::TestVirus::test_batch_accessions_for_url PASSED [ 24%] -tests/test_virus.py::TestVirus::test_clean_xml_declarations PASSED [ 24%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_release_date PASSED [ 24%] -tests/test_virus.py::TestVirus::test_save_command_summary_with_error PASSED [ 24%] -tests/test_virus.py::TestVirus::test_virus_invalid_is_accession_type PASSED [ 25%] -tests/test_virus.py::TestVirus::test_filter_cached_complete_only PASSED [ 25%] -tests/test_virus.py::TestVirus::test_validate_datasets_binary_empty_path PASSED [ 25%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_isolate PASSED [ 25%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_seq_length PASSED [ 26%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_name PASSED [ 26%] -tests/test_virus.py::TestVirus::test_filter_cached_refseq_only PASSED [ 26%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_empty_raises PASSED [ 26%] -tests/test_virus.py::TestVirus::test_virus_multi_accession_space_separated PASSED [ 27%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_isolation_source PASSED [ 27%] -tests/test_virus.py::TestVirus::test_get_memory_usage_returns_dict PASSED [ 27%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype_list PASSED [ 27%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_json PASSED [ 27%] -tests/test_virus.py::TestVirus::test_check_min_max_none_values PASSED [ 28%] -tests/test_virus.py::TestVirus::test_check_min_max_date_invalid_raises PASSED [ 28%] -tests/test_virus.py::TestVirus::test_retry_helper_failed_commands_tracking PASSED [ 28%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_protein_count PASSED [ 28%] -tests/test_virus.py::TestVirus::test_virus_host_filter_verification PASSED [ 29%] -tests/test_virus.py::TestVirus::test_parse_genbank_xml_invalid_raises PASSED [ 29%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_institution PASSED [ 29%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_false PASSED [ 29%] -tests/test_virus.py::TestVirus::test_virus_invalid_lab_passaged_type PASSED [ 30%] -tests/test_virus.py::TestVirus::test_parse_accession_input_single PASSED [ 30%] -tests/test_virus.py::TestVirus::test_virus_with_genbank_metadata_retrieval PASSED [ 30%] -tests/test_virus.py::TestVirus::test_parse_partial_date_full_date PASSED [ 30%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_combined_filters PASSED [ 31%] -tests/test_virus.py::TestVirus::test_merge_baseline_with_new_csv PASSED [ 31%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_has_proteins PASSED [ 31%] -tests/test_virus.py::TestVirus::test_deduplicate_empty_baseline PASSED [ 31%] -tests/test_virus.py::TestVirus::test_get_datasets_version_returns_string_or_none PASSED [ 31%] -tests/test_virus.py::TestVirus::test_filter_cached_no_filters PASSED [ 32%] -tests/test_virus.py::TestVirus::test_virus_invalid_proteins_complete_type PASSED [ 32%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_metadata_type PASSED [ 32%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_true PASSED [ 32%] -tests/test_virus.py::TestVirus::test_unzip_file_nonexistent_raises PASSED [ 33%] -tests/test_virus.py::TestVirus::test_datasets_cli_version_output PASSED [ 33%] -tests/test_virus.py::TestVirus::test_virus_specific_accession_file_creation PASSED [ 33%] -tests/test_virus.py::TestVirus::test_get_datasets_path_uses_bundled_binary PASSED [ 33%] -tests/test_virus.py::TestVirus::test_local_name_with_namespace PASSED [ 34%] -tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_empty PASSED [ 34%] -tests/test_virus.py::TestVirus::test_parse_accession_input_from_file PASSED [ 34%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_collection_date PASSED [ 34%] -tests/test_virus.py::TestVirus::test_merge_metadata_csvs_missing_standard_file PASSED [ 35%] -tests/test_virus.py::TestVirus::test_virus_completeness_filter_verification PASSED [ 35%] -tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_basic PASSED [ 35%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_true PASSED [ 35%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_max PASSED [ 36%] -tests/test_virus.py::TestVirus::test_calculate_max_accessions_per_batch PASSED [ 36%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_negative PASSED [ 36%] -tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_accession_mode PASSED [ 36%] -tests/test_virus.py::TestVirus::test_get_datasets_path_returns_valid_path PASSED [ 36%] -tests/test_virus.py::TestVirus::test_save_command_summary_creates_file PASSED [ 37%] -tests/test_virus.py::TestVirus::test_validate_datasets_binary_nonexistent PASSED [ 37%] -tests/test_virus.py::TestVirus::test_unzip_file_valid PASSED [ 37%] -tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_negative PASSED [ 37%] -tests/test_virus.py::TestVirus::test_deduplicate_metadata_against_baseline PASSED [ 38%] -tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_max_comparison PASSED [ 38%] -tests/test_virus.py::TestVirus::test_is_sars_cov2_query_common_names PASSED [ 38%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_none_raises PASSED [ 38%] -tests/test_virus.py::TestVirus::test_filter_cached_host_in_strategy_skipped PASSED [ 39%] -tests/test_virus.py::TestVirus::test_virus_release_date_filter_verification PASSED [ 39%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_false PASSED [ 39%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_empty PASSED [ 39%] -tests/test_virus.py::TestVirus::test_virus_integer_virus_id PASSED [ 40%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_collection_date_range PASSED [ 40%] -tests/test_virus.py::TestVirus::test_parse_partial_date_empty_raises PASSED [ 40%] -tests/test_virus.py::TestVirus::test_force_garbage_collection_runs PASSED [ 40%] -tests/test_virus.py::TestVirus::test_virus_multiple_filters_relationship_check PASSED [ 40%] -tests/test_virus.py::TestVirus::test_merge_metadata_csvs_fills_missing PASSED [ 41%] -tests/test_virus.py::TestVirus::test_virus_with_annotated_filter PASSED [ 41%] +tests/test_virus.py::TestVirus::test_force_garbage_collection_runs PASSED [ 22%] +tests/test_virus.py::TestVirus::test_unzip_file_nonexistent_raises PASSED [ 23%] +tests/test_virus.py::TestVirus::test_parse_partial_date_full_date PASSED [ 23%] +tests/test_virus.py::TestVirus::test_clean_xml_declarations PASSED [ 23%] +tests/test_virus.py::TestVirus::test_filter_sequences_max_ambiguous_chars PASSED [ 23%] +tests/test_virus.py::TestVirus::test_parse_partial_date_empty_raises PASSED [ 24%] +tests/test_virus.py::TestVirus::test_save_genbank_metadata_to_csv_basic PASSED [ 24%] +tests/test_virus.py::TestVirus::test_check_min_max_none_values PASSED [ 24%] +tests/test_virus.py::TestVirus::test_filter_cached_complete_only PASSED [ 24%] +tests/test_virus.py::TestVirus::test_retry_helper_custom_retryable_exceptions PASSED [ 25%] +tests/test_virus.py::TestVirus::test_check_min_max_valid PASSED [ 25%] +tests/test_virus.py::TestVirus::test_calculate_max_accessions_per_batch PASSED [ 25%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype PASSED [ 25%] +tests/test_virus.py::TestVirus::test_local_name_without_namespace PASSED [ 26%] +tests/test_virus.py::TestVirus::test_retry_helper_exponential_backoff_timing PASSED [ 26%] +tests/test_virus.py::TestVirus::test_virus_invalid_keep_temp_type PASSED [ 26%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_segment PASSED [ 26%] +tests/test_virus.py::TestVirus::test_parse_date_invalid_raises PASSED [ 27%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_geographic_location PASSED [ 27%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_name PASSED [ 27%] +tests/test_virus.py::TestVirus::test_deduplicate_empty_baseline PASSED [ 27%] +tests/test_virus.py::TestVirus::test_check_min_max_invalid_raises PASSED [ 27%] +tests/test_virus.py::TestVirus::test_virus_multi_accession_space_separated PASSED [ 28%] +tests/test_virus.py::TestVirus::test_virus_empty_virus_name PASSED [ 28%] +tests/test_virus.py::TestVirus::test_virus_none_virus_name PASSED [ 28%] +tests/test_virus.py::TestVirus::test_check_min_max_equal PASSED [ 28%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_basic PASSED [ 29%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_missing_accession PASSED [ 29%] +tests/test_virus.py::TestVirus::test_virus_with_completeness_filter PASSED [ 29%] +tests/test_virus.py::TestVirus::test_parse_accession_input_from_file PASSED [ 29%] +tests/test_virus.py::TestVirus::test_virus_metadata_schema_validation PASSED [ 30%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_isolate PASSED [ 30%] +tests/test_virus.py::TestVirus::test_filter_cached_geographic_location PASSED [ 30%] +tests/test_virus.py::TestVirus::test_track_failed_operation_none_dict PASSED [ 30%] +tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_common_names PASSED [ 31%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_jsonl PASSED [ 31%] +tests/test_virus.py::TestVirus::test_save_metadata_to_csv_empty_metadata PASSED [ 31%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_gene_count PASSED [ 31%] +tests/test_virus.py::TestVirus::test_filter_cached_no_filters PASSED [ 31%] +tests/test_virus.py::TestVirus::test_get_datasets_path_uses_bundled_binary PASSED [ 32%] +tests/test_virus.py::TestVirus::test_save_command_summary_creates_file PASSED [ 32%] +tests/test_virus.py::TestVirus::test_parse_genbank_xml_basic PASSED [ 32%] +tests/test_virus.py::TestVirus::test_parse_date_various_formats PASSED [ 32%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_no_filters PASSED [ 33%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_true PASSED [ 33%] +tests/test_virus.py::TestVirus::test_retry_helper_success_after_retry PASSED [ 33%] +tests/test_virus.py::TestVirus::test_merge_metadata_csvs_missing_standard_file PASSED [ 33%] +tests/test_virus.py::TestVirus::test_parse_genbank_xml_invalid_raises PASSED [ 34%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_min_seq_length PASSED [ 34%] +tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter PASSED [ 34%] +tests/test_virus.py::TestVirus::test_parse_accession_input_nonexistent_file_raises_error PASSED [ 34%] +tests/test_virus.py::TestVirus::test_virus_integer_virus_id PASSED [ 35%] +tests/test_virus.py::TestVirus::test_virus_specific_accession_file_creation PASSED [ 35%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_source_database PASSED [ 35%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_csv PASSED [ 35%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_max_comparison PASSED [ 36%] +tests/test_virus.py::TestVirus::test_check_min_max_date_invalid_raises PASSED [ 36%] +tests/test_virus.py::TestVirus::test_validate_datasets_binary_empty_path PASSED [ 36%] +tests/test_virus.py::TestVirus::test_virus_invalid_annotated_type PASSED [ 36%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_env_source PASSED [ 36%] +tests/test_virus.py::TestVirus::test_virus_invalid_proteins_complete_type PASSED [ 37%] +tests/test_virus.py::TestVirus::test_retry_helper_failed_commands_tracking PASSED [ 37%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype_list PASSED [ 37%] +tests/test_virus.py::TestVirus::test_virus_invalid_is_accession_type PASSED [ 37%] +tests/test_virus.py::TestVirus::test_parse_accession_input_space_separated PASSED [ 38%] +tests/test_virus.py::TestVirus::test_virus_multiple_filters_relationship_check PASSED [ 38%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_no_filters PASSED [ 38%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_host PASSED [ 38%] +tests/test_virus.py::TestVirus::test_stream_copy_fasta_with_accession_filter PASSED [ 39%] +tests/test_virus.py::TestVirus::test_virus_invalid_genbank_metadata_type PASSED [ 39%] +tests/test_virus.py::TestVirus::test_write_fasta_record_long_sequence_wraps PASSED [ 39%] +tests/test_virus.py::TestVirus::test_unzip_file_bad_zip_raises PASSED [ 39%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_only_min_comparison PASSED [ 40%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_protein_count PASSED [ 40%] +tests/test_virus.py::TestVirus::test_get_memory_usage_returns_dict PASSED [ 40%] +tests/test_virus.py::TestVirus::test_virus_host_filter_verification PASSED [ 40%] +tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter PASSED [ 40%] +tests/test_virus.py::TestVirus::test_virus_release_date_filter_verification PASSED [ 41%] tests/test_virus.py::TestVirus::test_get_modified_virus_name_remove_parentheses PASSED [ 41%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_true PASSED [ 41%] -tests/test_virus.py::TestVirus::test_virus_invalid_completeness PASSED [ 42%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_zero PASSED [ 42%] -tests/test_virus.py::TestVirus::test_parse_genbank_xml_empty_set PASSED [ 42%] -tests/test_virus.py::TestVirus::test_virus_with_collection_date_filters PASSED [ 42%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_segment PASSED [ 43%] -tests/test_virus.py::TestVirus::test_track_failed_operation_creates_key PASSED [ 43%] -tests/test_virus.py::TestVirus::test_parse_accession_input_empty_file_raises_error PASSED [ 43%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_peptide_count PASSED [ 43%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_mature_peptide_count PASSED [ 44%] -tests/test_virus.py::TestVirus::test_save_partial_metadata_empty PASSED [ 44%] -tests/test_virus.py::TestVirus::test_virus_with_host_filter PASSED [ 44%] -tests/test_virus.py::TestVirus::test_is_sars_cov2_query_accession_mode PASSED [ 44%] -tests/test_virus.py::TestVirus::test_save_metadata_to_csv_basic PASSED [ 45%] -tests/test_virus.py::TestVirus::test_save_partial_metadata PASSED [ 45%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_basic PASSED [ 45%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_genotype PASSED [ 45%] -tests/test_virus.py::TestVirus::test_filter_cached_min_release_date PASSED [ 45%] -tests/test_virus.py::TestVirus::test_check_min_max_invalid_raises PASSED [ 46%] -tests/test_virus.py::TestVirus::test_retry_helper_exponential_backoff_timing PASSED [ 46%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_env_source PASSED [ 46%] -tests/test_virus.py::TestVirus::test_write_fasta_record_without_description PASSED [ 46%] -tests/test_virus.py::TestVirus::test_parse_accession_input_nonexistent_file_raises_error PASSED [ 47%] -tests/test_virus.py::TestVirus::test_virus_relationship_check_counts_match PASSED [ 47%] -tests/test_virus.py::TestVirus::test_track_failed_operation_appends PASSED [ 47%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_source_database PASSED [ 47%] -tests/test_virus.py::TestVirus::test_filter_cached_host_not_in_strategy PASSED [ 48%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_gen_mol_type PASSED [ 48%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_invalid_attempt_returns_none PASSED [ 48%] -tests/test_virus.py::TestVirus::test_write_fasta_record_with_description PASSED [ 48%] -tests/test_virus.py::TestVirus::test_virus_invalid_genbank_batch_size_type PASSED [ 49%] -tests/test_virus.py::TestVirus::test_local_name_without_namespace PASSED [ 49%] -tests/test_virus.py::TestVirus::test_filter_cached_geographic_location PASSED [ 49%] -tests/test_virus.py::TestVirus::test_clean_xml_declarations_no_declarations PASSED [ 49%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_jsonl PASSED [ 50%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_country PASSED [ 50%] -tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters PASSED [ 50%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_max_gene_count PASSED [ 50%] -tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter PASSED [ 50%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_virus_suffix PASSED [ 51%] -tests/test_virus.py::TestVirus::test_virus_with_completeness_filter PASSED [ 51%] -tests/test_virus.py::TestVirus::test_virus_with_multiple_filters PASSED [ 51%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_max_seq_length PASSED [ 51%] -tests/test_virus.py::TestVirus::test_get_modified_virus_name_add_space_before_virus PASSED [ 52%] -tests/test_virus.py::TestVirus::test_parse_accession_input_space_separated PASSED [ 52%] -tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_gene_count PASSED [ 52%] -tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_common_names PASSED [ 52%] -tests/test_virus.py::TestVirus::test_merge_baseline_with_new_empty_new PASSED [ 53%] -tests/test_virus.py::TestVirus::test_genbank_xml_to_csv_basic PASSED [ 53%] -tests/test_virus.py::TestVirus::test_filter_metadata_only_vaccine_strain_false PASSED [ 53%] -tests/test_virus.py::TestVirus::test_unzip_file_bad_zip_raises PASSED [ 53%] -tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_empty PASSED [ 54%] -tests/test_virus.py::TestVirus::test_save_metadata_to_csv_empty_metadata PASSED [ 54%] -tests/test_virus.py::TestVirus::test_filter_genbank_metadata_no_filters PASSED [ 54%] -tests/test_virus.py::TestVirus::test_virus_with_source_database_filter PASSED [ 54%] -tests/test_virus.py::TestVirus::test_parse_baseline_file_nonexistent_raises PASSED [ 54%] -tests/test_virus.py::TestVirus::test_parse_date_various_formats PASSED [ 55%] -tests/test_blat.py::TestBlat::test_blat_nt_fasta PASSED [ 55%] -tests/test_blat.py::TestBlat::test_blat_aa PASSED [ 55%] -tests/test_blat.py::TestBlat::test_blat_bad_txt PASSED [ 55%] -tests/test_blat.py::TestBlat::test_blat_nt_protein PASSED [ 56%] +tests/test_virus.py::TestVirus::test_virus_with_host_filter PASSED [ 41%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_false PASSED [ 41%] +tests/test_virus.py::TestVirus::test_retry_helper_successful_operation PASSED [ 42%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_max_release_date PASSED [ 42%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_peptide_count PASSED [ 42%] +tests/test_virus.py::TestVirus::test_parse_partial_date_year_month_max PASSED [ 42%] +tests/test_virus.py::TestVirus::test_filter_cached_min_release_date PASSED [ 43%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_annotated_true PASSED [ 43%] +tests/test_virus.py::TestVirus::test_filter_genbank_metadata_provirus_true PASSED [ 43%] +tests/test_virus.py::TestVirus::test_merge_metadata_csvs_no_overwrite PASSED [ 43%] +tests/test_virus.py::TestVirus::test_validate_datasets_binary_nonexistent PASSED [ 44%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_nuc_completeness_partial PASSED [ 44%] +tests/test_virus.py::TestVirus::test_virus_with_genbank_metadata_retrieval PASSED [ 44%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_submitter_institution PASSED [ 44%] +tests/test_virus.py::TestVirus::test_parse_accession_input_empty_file_raises_error PASSED [ 45%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_lab_passaged_false PASSED [ 45%] +tests/test_virus.py::TestVirus::test_filter_cached_refseq_only PASSED [ 45%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_no_parentheses_returns_none PASSED [ 45%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_release_date PASSED [ 45%] +tests/test_virus.py::TestVirus::test_track_failed_operation_creates_key PASSED [ 46%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_already_correct_returns_none PASSED [ 46%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_protein_count PASSED [ 46%] +tests/test_virus.py::TestVirus::test_is_sars_cov2_query_accession_mode PASSED [ 46%] +tests/test_virus.py::TestVirus::test_virus_min_greater_than_max_collection_date PASSED [ 47%] +tests/test_virus.py::TestVirus::test_filter_cached_annotated PASSED [ 47%] +tests/test_virus.py::TestVirus::test_filter_sequences_no_filters PASSED [ 47%] +tests/test_virus.py::TestVirus::test_load_metadata_from_api_reports_empty PASSED [ 47%] +tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_negative PASSED [ 48%] +tests/test_virus.py::TestVirus::test_save_command_summary_with_error PASSED [ 48%] +tests/test_virus.py::TestVirus::test_virus_with_source_database_filter PASSED [ 48%] +tests/test_virus.py::TestVirus::test_deduplicate_metadata_against_baseline PASSED [ 48%] +tests/test_virus.py::TestVirus::test_datasets_cli_version_output PASSED [ 49%] +tests/test_virus.py::TestVirus::test_get_modified_virus_name_invalid_attempt_returns_none PASSED [ 49%] +tests/test_virus.py::TestVirus::test_filter_metadata_only_combined_filters PASSED [ 49%] +tests/test_virus.py::TestVirus::test_parse_baseline_file_empty_raises PASSED [ 49%] +tests/test_virus.py::TestVirus::test_filter_cached_host_in_strategy_skipped PASSED [ 50%] +tests/test_virus.py::TestVirus::test_virus_with_geographic_location_filter PASSED [ 50%] +tests/test_virus.py::TestVirus::test_get_datasets_version_returns_string_or_none PASSED [ 50%] +tests/test_virus.py::TestVirus::test_virus_invalid_completeness PASSED [ 50%] +tests/test_virus.py::TestVirus::test_stream_copy_fasta_all_records PASSED [ 50%] +tests/test_virus.py::TestVirus::test_is_alphainfluenza_query_accession_mode PASSED [ 51%] +tests/test_archs4.py::TestArchs4MissingColor::test_tissue_missing_color_does_not_crash PASSED [ 51%] +tests/test_archs4.py::TestArchs4::test_archs4_mouse_json_ensembl PASSED [ 51%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_species PASSED [ 51%] +tests/test_archs4.py::TestArchs4::test_archs4_defaults PASSED [ 52%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_which PASSED [ 52%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue_ensembl PASSED [ 52%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_gene_tissue PASSED [ 52%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue_json PASSED [ 53%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue PASSED [ 53%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_gene PASSED [ 53%] +tests/test_archs4.py::TestArchs4::test_archs4_tissue_mouse PASSED [ 53%] +tests/test_archs4.py::TestArchs4::test_archs4_bad_ensembl PASSED [ 54%] +tests/test_gpt.py::TestGpt::test_gpt PASSED [ 54%] +tests/test_info.py::TestInfo::test_info_gene PASSED [ 54%] +tests/test_info.py::TestInfo::test_info_exon PASSED [ 54%] +tests/test_info.py::TestInfo::test_info_transcript PASSED [ 54%] +tests/test_info.py::TestInfo::test_info_ncbifalse_uniprottrue PASSED [ 55%] +tests/test_info.py::TestInfo::test_info_ncbitrue_uniprotfalse PASSED [ 55%] +tests/test_info.py::TestInfo::test_info_gene_list_non_model PASSED [ 55%] +tests/test_info.py::TestInfo::test_info_mix PASSED [ 55%] +tests/test_info.py::TestInfo::test_info_ncbifalse_uniprotfalse PASSED [ 56%] +tests/test_info.py::TestInfo::test_info_WB_transcript PASSED [ 56%] tests/test_blat.py::TestBlat::test_blat_bad_seqtype PASSED [ 56%] -tests/test_blat.py::TestBlat::test_blat_aa_protein PASSED [ 56%] -tests/test_blat.py::TestBlat::test_blat_bad_fileformat PASSED [ 56%] -tests/test_blat.py::TestBlat::test_blat_nt_txt PASSED [ 57%] -tests/test_blat.py::TestBlat::test_blat_nt PASSED [ 57%] +tests/test_blat.py::TestBlat::test_blat_nt_RNA PASSED [ 56%] tests/test_blat.py::TestBlat::test_blat_aa_RNA PASSED [ 57%] -tests/test_blat.py::TestBlat::test_blat_nt_transDNA PASSED [ 57%] -tests/test_blat.py::TestBlat::test_blat_nt_DNA PASSED [ 58%] -tests/test_blat.py::TestBlat::test_blat_nt_RNA PASSED [ 58%] -tests/test_blat.py::TestBlat::test_blat_bad_assembly PASSED [ 58%] -tests/test_blat.py::TestBlat::test_blat_nt_json PASSED [ 58%] -tests/test_blat.py::TestBlat::test_blat_bad_fasta PASSED [ 59%] +tests/test_blat.py::TestBlat::test_blat_nt_fasta PASSED [ 57%] +tests/test_blat.py::TestBlat::test_blat_nt_DNA PASSED [ 57%] +tests/test_blat.py::TestBlat::test_blat_nt_protein PASSED [ 57%] +tests/test_blat.py::TestBlat::test_blat_aa PASSED [ 58%] +tests/test_blat.py::TestBlat::test_blat_nt_txt PASSED [ 58%] +tests/test_blat.py::TestBlat::test_blat_bad_fileformat PASSED [ 58%] +tests/test_blat.py::TestBlat::test_blat_nt PASSED [ 58%] +tests/test_blat.py::TestBlat::test_blat_bad_txt PASSED [ 59%] +tests/test_blat.py::TestBlat::test_blat_nt_json PASSED [ 59%] +tests/test_blat.py::TestBlat::test_blat_nt_transDNA PASSED [ 59%] tests/test_blat.py::TestBlat::test_blat_shortseq PASSED [ 59%] -tests/test_gpt.py::TestGpt::test_gpt PASSED [ 59%] -tests/test_pdb.py::TestPDB::test_pdb_legacy_fallback_to_mmcif PASSED [ 59%] -tests/test_pdb.py::TestPDB::test_pdb_mmcif PASSED [ 59%] -tests/test_pdb.py::TestPDB::test_pdb_pdb PASSED [ 60%] -tests/test_pdb.py::TestPDB::test_pdb_assembly PASSED [ 60%] -tests/test_search.py::TestSearch::test_search_gene_one_sw PASSED [ 60%] -tests/test_search.py::TestSearch::test_search_gene_two_sw_limit PASSED [ 60%] -tests/test_search.py::TestSearch::test_search_gene_one_sw_json PASSED [ 61%] -tests/test_search.py::TestSearch::test_search_gene_bad_andor PASSED [ 61%] -tests/test_search.py::TestSearch::test_search_transcript_two_sw_or PASSED [ 61%] -tests/test_search.py::TestSearch::test_search_transcript_two_sw_and PASSED [ 61%] -tests/test_search.py::TestSearch::test_search_octopus PASSED [ 62%] -tests/test_search.py::TestSearch::test_search_release PASSED [ 62%] -tests/test_search.py::TestSearch::test_search_gene_two_sw_or PASSED [ 62%] -tests/test_search.py::TestSearch::test_search_plant PASSED [ 62%] -tests/test_search.py::TestSearch::test_search_gene_bad_species PASSED [ 63%] -tests/test_search.py::TestSearch::test_search_gene_two_sw_and PASSED [ 63%] -tests/test_search.py::TestSearch::test_search_transcript_bad_andor PASSED [ 63%] -tests/test_search.py::TestSearch::test_search_transcript_bad_species PASSED [ 63%] -tests/test_search.py::TestSearch::test_search_plant_db PASSED [ 63%] -tests/test_search.py::TestSearch::test_search_gene_one_sw_limit PASSED [ 64%] -tests/test_search.py::TestSearch::test_search_db PASSED [ 64%] -tests/test_search.py::TestSearch::test_search_transcript_one_sw PASSED [ 64%] -tests/test_seq.py::TestSeq::test_seq_transcript_gene_WB PASSED [ 64%] -tests/test_seq.py::TestSeq::test_seq_transcript_gene PASSED [ 65%] -tests/test_seq.py::TestSeq::test_seq_gene PASSED [ 65%] -tests/test_seq.py::TestSeq::test_seq_gene_iso PASSED [ 65%] -tests/test_seq.py::TestSeq::test_seq_transcript_gene_iso PASSED [ 65%] -tests/test_seq.py::TestSeq::test_seq_transcript_transcript_iso PASSED [ 66%] -tests/test_seq.py::TestSeq::test_seq_transcript PASSED [ 66%] -tests/test_seq.py::TestSeq::test_seq_transcript_transcript_WB PASSED [ 66%] -tests/test_seq.py::TestSeq::test_seq_missing_uniprot_gene_name PASSED [ 66%] -tests/test_seq.py::TestSeq::test_seq_gene_transcript_iso PASSED [ 67%] -tests/test_opentargets.py::TestOpenTargetsExpressionMocked::test_expression_limit PASSED [ 67%] -tests/test_opentargets.py::TestOpenTargetsExpressionMocked::test_expression_json PASSED [ 67%] -tests/test_opentargets.py::TestOpenTargetsExpressionMocked::test_expression_parses_baseline_rows PASSED [ 67%] -tests/test_opentargets.py::TestOpenTargetsExpressionMocked::test_expression_empty_is_graceful PASSED [ 68%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_diseases_filter PASSED [ 68%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_pharmacogenetics PASSED [ 68%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap_filter PASSED [ 68%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_no_limit PASSED [ 68%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap PASSED [ 69%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_limit PASSED [ 69%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_resource PASSED [ 69%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_diseases PASSED [ 69%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_simple_filter PASSED [ 70%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_nonexistent_id PASSED [ 70%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_drugs PASSED [ 70%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions PASSED [ 70%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets_tractability PASSED [ 71%] -tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_drugs_invalid_filter PASSED [ 71%] -tests/test_opentargets.py::TestOpenTargets::test_opentargets PASSED [ 71%] -tests/test_g2p.py::TestG2P::test_g2p_map PASSED [ 71%] -tests/test_g2p.py::TestG2P::test_g2p_alignment PASSED [ 72%] -tests/test_g2p.py::TestG2P::test_g2p_uniprot_auto_resolved PASSED [ 72%] -tests/test_g2p.py::TestG2P::test_g2p_map_has_pdb_list_column PASSED [ 72%] -tests/test_g2p.py::TestG2P::test_g2p_schema_invariant_across_input_modes PASSED [ 72%] -tests/test_g2p.py::TestG2P::test_g2p_residues_single_int PASSED [ 72%] -tests/test_g2p.py::TestG2P::test_g2p_residues_filter PASSED [ 73%] -tests/test_g2p.py::TestG2P::test_g2p_features PASSED [ 73%] -tests/test_g2p.py::TestG2P::test_g2p_out_writes_to_explicit_path PASSED [ 73%] -tests/test_g2p.py::TestG2P::test_g2p_gene_auto_resolved PASSED [ 73%] -tests/test_g2p.py::TestG2P::test_g2p_invalid_pair_returns_none PASSED [ 74%] -tests/test_g2p.py::TestG2PValidation::test_residues_on_map_raises PASSED [ 74%] -tests/test_g2p.py::TestG2PValidation::test_alignment_requires_explicit_uniprot PASSED [ 74%] -tests/test_g2p.py::TestG2PValidation::test_missing_both_raises PASSED [ 74%] -tests/test_g2p.py::TestG2PValidation::test_alignment_requires_isoform PASSED [ 75%] -tests/test_g2p.py::TestG2PValidation::test_residues_wrong_type_raises PASSED [ 75%] -tests/test_g2p.py::TestG2PValidation::test_invalid_resource_raises PASSED [ 75%] -tests/test_cbio.py::TestCbioSearch::test_cbio_search PASSED [ 75%] -tests/test_cbio.py::TestCbio::test_cbio_download PASSED [ 76%] -tests/test_cbio.py::TestCbio::test_error_cbio_download PASSED [ 76%] -tests/test_cbio.py::TestCbio::test_cbio_download_partially_existing_files PASSED [ 76%] -tests/test_diamond.py::TestDiamond::test_diamond_JSON_out PASSED [ 76%] -tests/test_diamond.py::TestDiamond::test_diamond_query_file PASSED [ 77%] -tests/test_diamond.py::TestDiamond::test_diamond_both_files PASSED [ 77%] -tests/test_diamond.py::TestDiamond::test_diamond_seqs_single PASSED [ 77%] -tests/test_diamond.py::TestDiamond::test_diamond_ref_file PASSED [ 77%] -tests/test_diamond.py::TestDiamond::test_diamond_seqs_multiple PASSED [ 77%] -tests/test_utils.py::TestUtils::test_ref_species_options_bad_type PASSED [ 78%] -tests/test_utils.py::TestUtils::test_ref_iv_species_options PASSED [ 78%] -tests/test_utils.py::TestUtils::test_read_fasta PASSED [ 78%] -tests/test_utils.py::TestUtils::test_get_uniprot_info_transcript PASSED [ 78%] -tests/test_utils.py::TestUtils::test_search_iv_species_options PASSED [ 79%] -tests/test_utils.py::TestUtils::test_search_species_options PASSED [ 79%] -tests/test_utils.py::TestUtils::test_get_uniprot_info_gene PASSED [ 79%] -tests/test_utils.py::TestUtils::test_ref_species_options PASSED [ 79%] -tests/test_utils.py::TestUtils::test_find_latest_ens_rel PASSED [ 80%] -tests/test_utils.py::TestUtils::test_get_uniprot_seqs PASSED [ 80%] -tests/test_utils.py::TestUtils::test_rest_query PASSED [ 80%] -tests/test_utils.py::TestUtils::test_rest_query_bad_type PASSED [ 80%] -tests/test_utils.py::TestUtils::test_aa_colors PASSED [ 81%] -tests/test_utils.py::TestUtils::test_n_colors PASSED [ 81%] -tests/test_utils.py::TestUtils::test_search_species_options_bad_type PASSED [ 81%] -tests/test_8cube.py::TestSpecificity::test_specificity_basic PASSED [ 81%] -tests/test_8cube.py::TestPsiBlock::test_psi_block_basic PASSED [ 81%] -tests/test_8cube.py::TestGeneExpression::test_gene_expression_basic PASSED [ 82%] -tests/test_info.py::TestInfo::test_info_gene PASSED [ 82%] -tests/test_info.py::TestInfo::test_info_mix PASSED [ 82%] -tests/test_info.py::TestInfo::test_info_WB_transcript PASSED [ 82%] -tests/test_info.py::TestInfo::test_info_ncbifalse_uniprotfalse PASSED [ 83%] -tests/test_info.py::TestInfo::test_info_ncbifalse_uniprottrue PASSED [ 83%] -tests/test_info.py::TestInfo::test_info_exon PASSED [ 83%] -tests/test_info.py::TestInfo::test_info_transcript PASSED [ 83%] -tests/test_info.py::TestInfo::test_info_ncbitrue_uniprotfalse PASSED [ 84%] -tests/test_info.py::TestInfo::test_info_gene_list_non_model PASSED [ 84%] -tests/test_bgee.py::TestBgee::test_error_bgee_orthologs_no_exist PASSED [ 84%] -tests/test_bgee.py::TestBgee::test_bgee_expression PASSED [ 84%] -tests/test_bgee.py::TestBgee::test_error_bgee_expression_no_exist PASSED [ 85%] -tests/test_bgee.py::TestBgee::test_bgee_expression_multiple PASSED [ 85%] -tests/test_bgee.py::TestBgee::test_bgee_orthologs PASSED [ 85%] -tests/test_bgee.py::TestBgee::test_error_bgee_unknown_type PASSED [ 85%] -tests/test_ref.py::TestRef::test_ref_rel PASSED [ 86%] -tests/test_ref.py::TestRef::test_ref_plant PASSED [ 86%] -tests/test_ref.py::TestRef::test_ref_bad_rel PASSED [ 86%] -tests/test_ref.py::TestRef::test_ref_which_plant PASSED [ 86%] -tests/test_ref.py::TestRef::test_ref_rel_ftp_octopus PASSED [ 86%] -tests/test_ref.py::TestRef::test_ref_ftp PASSED [ 87%] -tests/test_ref.py::TestRef::test_ref_list PASSED [ 87%] -tests/test_ref.py::TestRef::test_ref_bad_which PASSED [ 87%] -tests/test_ref.py::TestRef::test_ref_bad_species PASSED [ 87%] -tests/test_ref.py::TestRef::test_ref_rel_ftp PASSED [ 88%] -tests/test_ref.py::TestRef::test_ref_rel_protist PASSED [ 88%] -tests/test_ref.py::TestRef::test_ref PASSED [ 88%] -tests/test_ref.py::TestRef::test_ref_which PASSED [ 88%] -tests/test_cellxgene.py::TestCellxgene::test_cellxgene_adata SKIPPED [ 89%] -tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata SKIPPED [ 89%] -tests/test_cellxgene.py::TestCellxgene::test_cellxgene_metadata_macaca_mulatta SKIPPED [ 89%] -tests/test_cellxgene.py::TestCellxgeneValidation::test_supported_species_includes_new_primates PASSED [ 89%] -tests/test_cellxgene.py::TestCellxgeneValidation::test_invalid_species_raises_valueerror PASSED [ 90%] -tests/test_cellxgene.py::TestCellxgeneValidation::test_typo_species_raises_valueerror PASSED [ 90%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_json PASSED [ 90%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_plot PASSED [ 90%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_ontology PASSED [ 90%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_transcription PASSED [ 91%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_fly PASSED [ 91%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background PASSED [ 91%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_species PASSED [ 91%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_background_ensembl PASSED [ 92%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_background PASSED [ 92%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_diseases_drugs PASSED [ 92%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_ensembl_ids PASSED [ 92%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_celltypes PASSED [ 93%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background_list PASSED [ 93%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_yeast PASSED [ 93%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_none PASSED [ 93%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_pathway PASSED [ 94%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_fish PASSED [ 94%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_kinase_interactions PASSED [ 94%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_mouse_is_human PASSED [ 94%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_gene PASSED [ 95%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_database_shortcut PASSED [ 95%] -tests/test_enrichr.py::TestEnrichr::test_enrichr_worm PASSED [ 95%] -tests/test_blast.py::TestBlast::test_blast_nt PASSED [ 95%] -tests/test_blast.py::TestBlast::test_blast_bad_seq PASSED [ 95%] -tests/test_blast.py::TestBlast::test_blast_bad_program PASSED [ 96%] -tests/test_blast.py::TestBlast::test_blast_bad_db2 PASSED [ 96%] -tests/test_blast.py::TestBlast::test_blast_bad_db1 PASSED [ 96%] -tests/test_blast.py::TestBlast::test_blast_bad_fasta PASSED [ 96%] -tests/test_blast.py::TestBlast::test_blast_db_missing PASSED [ 97%] -tests/test_muscle.py::TestMuscleAASuper::test_muscle_aa_super5 PASSED [ 97%] -tests/test_muscle.py::TestMusclePrints::test_muscle_print_nt PASSED [ 97%] -tests/test_muscle.py::TestMuscleSeqsInput::test_muscle_seqs_as_input PASSED [ 97%] -tests/test_muscle.py::TestMuscleAA::test_muscle_aa PASSED [ 98%] -tests/test_muscle.py::TestMuscleSuper::test_muscle_nt_super5 PASSED [ 98%] -tests/test_muscle.py::TestMuscle::test_muscle_nt_txt PASSED [ 98%] -tests/test_muscle.py::TestMuscle::test_muscle_nt PASSED [ 98%] -tests/test_cosmic.py::TestCosmicWorkflow::test_cosmic_defaults PASSED [ 99%] -tests/test_elm.py::TestELM::test_elm_uniprot_id_in_elm PASSED [ 99%] -tests/test_elm.py::TestELM::test_elm_uniprot_aminoacidseq PASSED [ 99%] -tests/test_elm.py::TestELM::test_elm_uniprot_id_new PASSED [ 99%] -tests/test_compile.py::TestCompilerWindows::test_compiler_windows PASSED [100%] +tests/test_blat.py::TestBlat::test_blat_aa_protein PASSED [ 59%] +tests/test_blat.py::TestBlat::test_blat_bad_assembly PASSED [ 60%] +tests/test_blat.py::TestBlat::test_blat_bad_fasta PASSED [ 60%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_transcription PASSED [ 60%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_json PASSED [ 60%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_yeast PASSED [ 61%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_database_shortcut PASSED [ 61%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_fish PASSED [ 61%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_gene PASSED [ 61%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_plot PASSED [ 62%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_none PASSED [ 62%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_ensembl_ids PASSED [ 62%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background_list PASSED [ 62%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_species PASSED [ 63%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_diseases_drugs PASSED [ 63%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_bad_background PASSED [ 63%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_background_ensembl PASSED [ 63%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_background PASSED [ 63%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_kinase_interactions PASSED [ 64%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_mouse_is_human PASSED [ 64%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_pathway PASSED [ 64%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_celltypes PASSED [ 64%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_fly PASSED [ 65%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_ontology PASSED [ 65%] +tests/test_enrichr.py::TestEnrichr::test_enrichr_worm PASSED [ 65%] +tests/test_cosmic.py::TestCosmicWorkflow::test_cosmic_defaults PASSED [ 65%] +tests/test_diamond.py::TestDiamond::test_diamond_both_files PASSED [ 66%] +tests/test_diamond.py::TestDiamond::test_diamond_seqs_multiple PASSED [ 66%] +tests/test_diamond.py::TestDiamond::test_diamond_query_file PASSED [ 66%] +tests/test_diamond.py::TestDiamond::test_diamond_JSON_out PASSED [ 66%] +tests/test_diamond.py::TestDiamond::test_diamond_seqs_single PASSED [ 67%] +tests/test_diamond.py::TestDiamond::test_diamond_ref_file PASSED [ 67%] +tests/test_mutate.py::test_csv_of_mutations PASSED [ 67%] +tests/test_mutate.py::test_mismatch_error PASSED [ 67%] +tests/test_mutate.py::TestMutate::test_single_dup PASSED [ 68%] +tests/test_mutate.py::TestMutate::test_ambiguous_mutation PASSED [ 68%] +tests/test_mutate.py::TestMutate::test_multi_dup PASSED [ 68%] +tests/test_mutate.py::TestMutate::test_multi_deletion_with_right_repeats PASSED [ 68%] +tests/test_mutate.py::TestMutate::test_single_delins PASSED [ 68%] +tests/test_mutate.py::TestMutate::test_large_k PASSED [ 69%] +tests/test_mutate.py::TestMutate::test_inversion_with_overlaps PASSED [ 69%] +tests/test_mutate.py::TestMutate::test_list_of_mutations PASSED [ 69%] +tests/test_mutate.py::TestMutate::test_multi_delins PASSED [ 69%] +tests/test_mutate.py::TestMutate::test_multi_delins_with_true_right_repeats PASSED [ 70%] +tests/test_mutate.py::TestMutate::test_single_deletion_with_right_repeats PASSED [ 70%] +tests/test_mutate.py::TestMutate::test_posttranslational_mutation PASSED [ 70%] +tests/test_mutate.py::TestMutate::test_single_deletion_with_left_repeats PASSED [ 70%] +tests/test_mutate.py::TestMutate::test_single_substitution_near_right_end PASSED [ 71%] +tests/test_mutate.py::TestMutate::test_index_error PASSED [ 71%] +tests/test_mutate.py::TestMutate::test_multi_deletion PASSED [ 71%] +tests/test_mutate.py::TestMutate::test_intron_mutation_plus PASSED [ 71%] +tests/test_mutate.py::TestMutate::test_multi_delins_with_true_left_repeats PASSED [ 72%] +tests/test_mutate.py::TestMutate::test_single_deletion PASSED [ 72%] +tests/test_mutate.py::TestMutate::test_single_substitution PASSED [ 72%] +tests/test_mutate.py::TestMutate::test_intron_mutation_minus PASSED [ 72%] +tests/test_mutate.py::TestMutate::test_multi_insertion PASSED [ 72%] +tests/test_mutate.py::TestMutate::test_multi_delins_with_psuedo_left_repeats PASSED [ 73%] +tests/test_mutate.py::TestMutate::test_multi_insertion_with_left_repeats PASSED [ 73%] +tests/test_mutate.py::TestMutate::test_single_substitution_near_left_end PASSED [ 73%] +tests/test_mutate.py::TestMutate::test_single_insertion PASSED [ 73%] +tests/test_mutate.py::TestMutate::test_uncertain_mutation PASSED [ 74%] +tests/test_seq.py::TestSeq::test_seq_transcript_gene_iso PASSED [ 74%] +tests/test_seq.py::TestSeq::test_seq_transcript_transcript_iso PASSED [ 74%] +tests/test_seq.py::TestSeq::test_seq_gene_transcript_iso PASSED [ 74%] +tests/test_seq.py::TestSeq::test_seq_gene PASSED [ 75%] +tests/test_seq.py::TestSeq::test_seq_transcript_transcript_WB PASSED [ 75%] +tests/test_seq.py::TestSeq::test_seq_transcript_gene_WB PASSED [ 75%] +tests/test_seq.py::TestSeq::test_seq_gene_iso PASSED [ 75%] +tests/test_seq.py::TestSeq::test_seq_transcript PASSED [ 76%] +tests/test_seq.py::TestSeq::test_seq_transcript_gene PASSED [ 76%] +tests/test_seq.py::TestSeq::test_seq_missing_uniprot_gene_name PASSED [ 76%] +tests/test_search.py::TestSearch::test_search_db PASSED [ 76%] +tests/test_search.py::TestSearch::test_search_transcript_two_sw_or PASSED [ 77%] +tests/test_search.py::TestSearch::test_search_plant PASSED [ 77%] +tests/test_search.py::TestSearch::test_search_gene_two_sw_and PASSED [ 77%] +tests/test_search.py::TestSearch::test_search_transcript_one_sw PASSED [ 77%] +tests/test_search.py::TestSearch::test_search_octopus PASSED [ 77%] +tests/test_search.py::TestSearch::test_search_release PASSED [ 78%] +tests/test_search.py::TestSearch::test_search_gene_bad_andor PASSED [ 78%] +tests/test_search.py::TestSearch::test_search_gene_two_sw_or PASSED [ 78%] +tests/test_search.py::TestSearch::test_search_transcript_bad_species PASSED [ 78%] +tests/test_search.py::TestSearch::test_search_transcript_bad_andor PASSED [ 79%] +tests/test_search.py::TestSearch::test_search_gene_one_sw PASSED [ 79%] +tests/test_search.py::TestSearch::test_search_transcript_two_sw_and PASSED [ 79%] +tests/test_search.py::TestSearch::test_search_gene_two_sw_limit PASSED [ 79%] +tests/test_search.py::TestSearch::test_search_gene_one_sw_limit PASSED [ 80%] +tests/test_search.py::TestSearch::test_search_plant_db PASSED [ 80%] +tests/test_search.py::TestSearch::test_search_gene_bad_species PASSED [ 80%] +tests/test_search.py::TestSearch::test_search_gene_one_sw_json PASSED [ 80%] +tests/test_bgee.py::TestBgee::test_error_bgee_expression_no_exist PASSED [ 81%] +tests/test_bgee.py::TestBgee::test_bgee_orthologs PASSED [ 81%] +tests/test_bgee.py::TestBgee::test_error_bgee_unknown_type PASSED [ 81%] +tests/test_bgee.py::TestBgee::test_bgee_expression PASSED [ 81%] +tests/test_bgee.py::TestBgee::test_bgee_expression_multiple PASSED [ 81%] +tests/test_bgee.py::TestBgee::test_error_bgee_orthologs_no_exist PASSED [ 82%] +tests/test_g2p.py::TestG2PValidation::test_alignment_requires_explicit_uniprot PASSED [ 82%] +tests/test_g2p.py::TestG2PValidation::test_residues_on_map_raises PASSED [ 82%] +tests/test_g2p.py::TestG2PValidation::test_invalid_resource_raises PASSED [ 82%] +tests/test_g2p.py::TestG2PValidation::test_residues_wrong_type_raises PASSED [ 83%] +tests/test_g2p.py::TestG2PValidation::test_alignment_requires_isoform PASSED [ 83%] +tests/test_g2p.py::TestG2PValidation::test_missing_both_raises PASSED [ 83%] +tests/test_g2p.py::TestG2P::test_g2p_features PASSED [ 83%] +tests/test_g2p.py::TestG2P::test_g2p_residues_filter PASSED [ 84%] +tests/test_g2p.py::TestG2P::test_g2p_alignment PASSED [ 84%] +tests/test_g2p.py::TestG2P::test_g2p_out_writes_to_explicit_path PASSED [ 84%] +tests/test_g2p.py::TestG2P::test_g2p_map_has_pdb_list_column PASSED [ 84%] +tests/test_g2p.py::TestG2P::test_g2p_residues_single_int PASSED [ 85%] +tests/test_g2p.py::TestG2P::test_g2p_map PASSED [ 85%] +tests/test_g2p.py::TestG2P::test_g2p_uniprot_auto_resolved PASSED [ 85%] +tests/test_g2p.py::TestG2P::test_g2p_schema_invariant_across_input_modes PASSED [ 85%] +tests/test_g2p.py::TestG2P::test_g2p_invalid_pair_returns_none PASSED [ 86%] +tests/test_g2p.py::TestG2P::test_g2p_gene_auto_resolved PASSED [ 86%] +tests/test_compile.py::TestCompilerWindows::test_compiler_windows PASSED [ 86%] +tests/test_opentargets.py::TestOpenTargetsExpressionMocked::test_expression_empty_is_graceful PASSED [ 86%] +tests/test_opentargets.py::TestOpenTargetsExpressionMocked::test_expression_json PASSED [ 86%] +tests/test_opentargets.py::TestOpenTargetsExpressionMocked::test_expression_parses_baseline_rows PASSED [ 87%] +tests/test_opentargets.py::TestOpenTargetsExpressionMocked::test_expression_limit PASSED [ 87%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_drugs PASSED [ 87%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets PASSED [ 87%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions PASSED [ 88%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_nonexistent_id PASSED [ 88%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_tractability PASSED [ 88%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_resource PASSED [ 88%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_drugs_invalid_filter PASSED [ 89%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_pharmacogenetics PASSED [ 89%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_simple_filter PASSED [ 89%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_interactions_no_limit PASSED [ 89%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap PASSED [ 90%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_diseases PASSED [ 90%] +tests/test_opentargets.py::TestOpenTargets::test_opentargets_depmap_filter PASSED [ 90%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_bad_limit PASSED [ 90%] +tests/test_opentargets.py::TestOpenTargets::test_error_opentargets_diseases_filter PASSED [ 90%] +tests/test_elm.py::TestELM::test_elm_uniprot_aminoacidseq PASSED [ 91%] +tests/test_elm.py::TestELM::test_elm_uniprot_id_new PASSED [ 91%] +tests/test_elm.py::TestELM::test_elm_uniprot_id_in_elm PASSED [ 91%] +tests/test_blast.py::TestBlast::test_blast_nt PASSED [ 91%] +tests/test_blast.py::TestBlast::test_blast_bad_seq PASSED [ 92%] +tests/test_blast.py::TestBlast::test_blast_db_missing PASSED [ 92%] +tests/test_blast.py::TestBlast::test_blast_bad_db1 PASSED [ 92%] +tests/test_blast.py::TestBlast::test_blast_bad_program PASSED [ 92%] +tests/test_blast.py::TestBlast::test_blast_bad_fasta PASSED [ 93%] +tests/test_blast.py::TestBlast::test_blast_bad_db2 PASSED [ 93%] +tests/test_ref.py::TestRef::test_ref_rel_protist PASSED [ 93%] +tests/test_ref.py::TestRef::test_ref_which PASSED [ 93%] +tests/test_ref.py::TestRef::test_ref_bad_which PASSED [ 94%] +tests/test_ref.py::TestRef::test_ref_rel_ftp_octopus PASSED [ 94%] +tests/test_ref.py::TestRef::test_ref PASSED [ 94%] +tests/test_ref.py::TestRef::test_ref_ftp PASSED [ 94%] +tests/test_ref.py::TestRef::test_ref_plant PASSED [ 95%] +tests/test_ref.py::TestRef::test_ref_bad_species PASSED [ 95%] +tests/test_ref.py::TestRef::test_ref_bad_rel PASSED [ 95%] +tests/test_ref.py::TestRef::test_ref_rel_ftp PASSED [ 95%] +tests/test_ref.py::TestRef::test_ref_rel PASSED [ 95%] +tests/test_ref.py::TestRef::test_ref_which_plant PASSED [ 96%] +tests/test_ref.py::TestRef::test_ref_list PASSED [ 96%] +tests/test_utils.py::TestUtils::test_n_colors PASSED [ 96%] +tests/test_utils.py::TestUtils::test_find_latest_ens_rel PASSED [ 96%] +tests/test_utils.py::TestUtils::test_search_species_options_bad_type PASSED [ 97%] +tests/test_utils.py::TestUtils::test_search_species_options PASSED [ 97%] +tests/test_utils.py::TestUtils::test_ref_species_options PASSED [ 97%] +tests/test_utils.py::TestUtils::test_read_fasta PASSED [ 97%] +tests/test_utils.py::TestUtils::test_rest_query_bad_type PASSED [ 98%] +tests/test_utils.py::TestUtils::test_get_uniprot_seqs PASSED [ 98%] +tests/test_utils.py::TestUtils::test_get_uniprot_info_gene PASSED [ 98%] +tests/test_utils.py::TestUtils::test_ref_species_options_bad_type PASSED [ 98%] +tests/test_utils.py::TestUtils::test_search_iv_species_options PASSED [ 99%] +tests/test_utils.py::TestUtils::test_ref_iv_species_options PASSED [ 99%] +tests/test_utils.py::TestUtils::test_get_uniprot_info_transcript PASSED [ 99%] +tests/test_utils.py::TestUtils::test_aa_colors PASSED [ 99%] +tests/test_utils.py::TestUtils::test_rest_query PASSED [100%] =============================== warnings summary =============================== +tests/test_cbio.py::TestCbioSearch::test_cbio_search +tests/test_cbio.py::TestCbioSearch::test_cbio_search + /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/swagger_spec_validator/validator12.py:18: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. + from jsonschema import RefResolver + +tests/test_cbio.py::TestCbioSearch::test_cbio_search + /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/swagger_spec_validator/ref_validators.py:14: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. + from jsonschema.validators import RefResolver + +tests/test_cbio.py::TestCbioSearch::test_cbio_search + /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/swagger_spec_validator/validator20.py:18: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. + from jsonschema.validators import RefResolver + +tests/test_cbio.py::TestCbioSearch::test_cbio_search +tests/test_cbio.py::TestCbioSearch::test_cbio_search + /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/bravado_core/swagger20_validator.py:6: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. + from jsonschema import RefResolver + +tests/test_cbio.py::TestCbioSearch::test_cbio_search + /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/bravado_core/spec.py:14: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. + from jsonschema.validators import RefResolver + +tests/test_cbio.py: 16 warnings + /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/bravado_core/model.py:888: DeprecationWarning: jsonschema.RefResolver.in_scope is deprecated and will be removed in a future release. + with spec.resolver.in_scope(additional_uri): + tests/test_mutate.py: 29 warnings /home/runner/work/gget/gget/gget/gget_mutate.py:667: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract. mask = mutations[mut_column].str.contains(combined_pattern) @@ -447,17 +473,17 @@ tests/test_ref.py: 7 warnings /home/runner/work/gget/gget/gget/utils.py:922: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. for subsoup in soup.body.findAll("a"): -tests/test_search.py::TestSearch::test_search_gene_two_sw_limit tests/test_search.py::TestSearch::test_search_transcript_two_sw_or +tests/test_search.py::TestSearch::test_search_plant tests/test_search.py::TestSearch::test_search_release tests/test_utils.py::TestUtils::test_search_species_options /home/runner/work/gget/gget/gget/utils.py:899: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. for subsoup in soup.body.findAll("a"): -tests/test_search.py::TestSearch::test_search_gene_two_sw_limit -tests/test_search.py::TestSearch::test_search_gene_two_sw_limit -tests/test_search.py::TestSearch::test_search_gene_two_sw_limit -tests/test_search.py::TestSearch::test_search_gene_two_sw_limit +tests/test_search.py::TestSearch::test_search_transcript_two_sw_or +tests/test_search.py::TestSearch::test_search_transcript_two_sw_or +tests/test_search.py::TestSearch::test_search_transcript_two_sw_or +tests/test_search.py::TestSearch::test_search_transcript_two_sw_or tests/test_utils.py::TestUtils::test_search_iv_species_options tests/test_utils.py::TestUtils::test_search_iv_species_options tests/test_utils.py::TestUtils::test_search_iv_species_options @@ -465,72 +491,46 @@ tests/test_utils.py::TestUtils::test_search_iv_species_options /home/runner/work/gget/gget/gget/utils.py:883: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. for subsoup in soup.body.findAll("a"): -tests/test_search.py::TestSearch::test_search_gene_two_sw_limit tests/test_search.py::TestSearch::test_search_transcript_two_sw_or -tests/test_search.py::TestSearch::test_search_transcript_two_sw_and tests/test_search.py::TestSearch::test_search_transcript_one_sw +tests/test_search.py::TestSearch::test_search_transcript_two_sw_and +tests/test_search.py::TestSearch::test_search_gene_two_sw_limit /home/runner/work/gget/gget/gget/gget_search.py:302: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy. df_temp = pd.read_sql(query, con=db_connection) -tests/test_cbio.py::TestCbioSearch::test_cbio_search -tests/test_cbio.py::TestCbioSearch::test_cbio_search - /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/swagger_spec_validator/validator12.py:18: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. - from jsonschema import RefResolver - -tests/test_cbio.py::TestCbioSearch::test_cbio_search - /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/swagger_spec_validator/ref_validators.py:14: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. - from jsonschema.validators import RefResolver - -tests/test_cbio.py::TestCbioSearch::test_cbio_search - /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/swagger_spec_validator/validator20.py:18: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. - from jsonschema.validators import RefResolver - -tests/test_cbio.py::TestCbioSearch::test_cbio_search -tests/test_cbio.py::TestCbioSearch::test_cbio_search - /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/bravado_core/swagger20_validator.py:6: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. - from jsonschema import RefResolver - -tests/test_cbio.py::TestCbioSearch::test_cbio_search - /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/bravado_core/spec.py:14: DeprecationWarning: jsonschema.RefResolver is deprecated as of v4.18.0, in favor of the https://github.com/python-jsonschema/referencing library, which provides more compliant referencing behavior as well as more flexible APIs for customization. A future release will remove RefResolver. Please file a feature request (on referencing) if you are missing an API for the kind of customization you need. - from jsonschema.validators import RefResolver - -tests/test_cbio.py: 16 warnings - /home/runner/.local/share/hatch/env/virtual/gget/dY-b3nRT/hatch-test.py3.14/lib/python3.14/site-packages/bravado_core/model.py:888: DeprecationWarning: jsonschema.RefResolver.in_scope is deprecated and will be removed in a future release. - with spec.resolver.in_scope(additional_uri): +tests/test_ref.py: 11 warnings +tests/test_utils.py: 1 warning + /home/runner/work/gget/gget/gget/utils.py:998: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. + for subsoup in soup.body.findAll("a"): -tests/test_utils.py: 4 warnings tests/test_ref.py: 24 warnings +tests/test_utils.py: 4 warnings /home/runner/work/gget/gget/gget/utils.py:975: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. for subsoup in soup.body.findAll("a"): -tests/test_utils.py: 1 warning -tests/test_ref.py: 11 warnings - /home/runner/work/gget/gget/gget/utils.py:998: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. - for subsoup in soup.body.findAll("a"): - tests/test_ref.py: 39 warnings /home/runner/work/gget/gget/gget/gget_ref.py:49: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. links = [stuff.text.strip() for stuff in soup.findAll("td")] -tests/test_ref.py::TestRef::test_ref_ftp tests/test_ref.py::TestRef::test_ref +tests/test_ref.py::TestRef::test_ref_ftp /home/runner/work/gget/gget/gget/gget_ref.py:325: DeprecationWarning: Call to deprecated method findAll. (Replaced by find_all) -- Deprecated since version 4.0.0. links = [stuff.text.strip() for stuff in soup.findAll("td")] -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html ============================= slowest 10 durations ============================= -134.73s call tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter -130.95s call tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter -130.50s call tests/test_virus.py::TestVirus::test_virus_integer_virus_id -129.00s call tests/test_virus.py::TestVirus::test_virus_with_source_database_filter -95.24s call tests/test_blast.py::TestBlast::test_blast_nt -78.92s call tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters -72.29s call tests/test_virus.py::TestVirus::test_virus_with_annotated_filter -67.81s call tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter -26.80s call tests/test_search.py::TestSearch::test_search_gene_two_sw_limit -24.23s call tests/test_virus.py::TestVirus::test_virus_with_host_filter +172.43s call tests/test_virus.py::TestVirus::test_virus_with_lab_passaged_filter +131.36s call tests/test_virus.py::TestVirus::test_virus_integer_virus_id +129.67s call tests/test_virus.py::TestVirus::test_virus_with_max_ambiguous_chars_filter +127.42s call tests/test_virus.py::TestVirus::test_virus_with_source_database_filter +88.80s call tests/test_blast.py::TestBlast::test_blast_nt +57.26s call tests/test_virus.py::TestVirus::test_virus_with_has_proteins_filter +33.59s call tests/test_8cube.py::TestSpecificity::test_specificity_basic +26.88s call tests/test_virus.py::TestVirus::test_virus_with_protein_count_filters +24.73s call tests/test_virus.py::TestVirus::test_virus_with_annotated_filter +23.33s call tests/test_virus.py::TestVirus::test_virus_with_host_filter =========================== short test summary info ============================ SKIPPED [1] tests/test_cellxgene.py:45: cellxgene-census is not installed SKIPPED [1] tests/test_cellxgene.py:55: cellxgene-census is not installed SKIPPED [1] tests/test_cellxgene.py:65: cellxgene-census is not installed -========== 419 passed, 3 skipped, 185 warnings in 1294.55s (0:21:34) =========== +========== 419 passed, 3 skipped, 185 warnings in 1455.99s (0:24:15) =========== From 3440f609edb716ac7a36b7f354998d295348e9b5 Mon Sep 17 00:00:00 2001 From: Laura Luebbert Date: Sun, 28 Jun 2026 16:28:42 -0400 Subject: [PATCH 34/34] fix(ci): clear dev-wide pre-commit failures (ruff D205 + pin mypy stubs) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two pre-commit.ci failures were hitting every PR (it runs --all-files), unrelated to the PRs themselves: 1. ruff D205 in gget_g2p.py — the g2p() docstring summary spanned two lines with no blank line before the body. Collapsed to a single-line summary. (#258 reintroduced this; ruff now passes on all of gget/.) 2. mypy exit 4 on pre-commit.ci while passing locally — the mypy hook's stub dependencies (pandas-stubs, types-*) and mypy-baseline were unpinned, so pre-commit.ci installed newer stubs that inferred different types and surfaced "new" errors absent from the baseline. Pinned all type-affecting deps (mypy 1.13.0, mypy-baseline 0.7.4, and the four stub packages) in both the pre-commit hook and the test dependency group so the baseline is reproducible. Verified the pinned set reproduces exactly the 553 baselined errors (0 new) in a fresh hook env. Co-Authored-By: Claude Opus 4.7 (1M context) --- .pre-commit-config.yaml | 14 +++++++++----- gget/gget_g2p.py | 3 +-- pyproject.toml | 12 ++++++------ 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index bbd239186..598e3b612 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -61,13 +61,17 @@ repos: language: python pass_filenames: false always_run: true + # Pin everything that affects mypy's output so the baseline stays + # reproducible across machines and pre-commit.ci (unpinned stubs drift + # and surface "new" errors that aren't real). Bump deliberately and + # re-sync the baseline when you do. additional_dependencies: - mypy==1.13.0 - - mypy-baseline - - pandas-stubs - - types-requests - - types-tqdm - - types-beautifulsoup4 + - mypy-baseline==0.7.4 + - pandas-stubs==3.0.3.260530 + - types-requests==2.33.0.20260518 + - types-tqdm==4.68.0.20260608 + - types-beautifulsoup4==4.12.0.20250516 - repo: https://github.com/pre-commit/pre-commit-hooks rev: v6.0.0 hooks: diff --git a/gget/gget_g2p.py b/gget/gget_g2p.py index 179c51aea..9d060af6b 100644 --- a/gget/gget_g2p.py +++ b/gget/gget_g2p.py @@ -183,8 +183,7 @@ def g2p( out: str | None = None, verbose: bool = True, ) -> pd.DataFrame | None: - """Query the Genomics 2 Proteins (G2P) portal to link genes/proteins to per-residue - structural and functional annotations. + """Query the Genomics 2 Proteins (G2P) portal for residue-level structural/functional annotations. Portal: https://g2p.broadinstitute.org/ diff --git a/pyproject.toml b/pyproject.toml index dedfc0c9d..f5deb8f88 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -59,16 +59,16 @@ dev = [ "pre-commit" ] test = [ "bravado==11.0.3", "coverage>=7", - "mypy>=1.13", - "mypy-baseline", + "mypy==1.13", + "mypy-baseline==0.7.4", "openai<=0.28.1", - "pandas-stubs", + "pandas-stubs==3.0.3.260530", "parameterized==0.9", "pytest>=7", "pytest-cov>=6.2.1", - "types-beautifulsoup4", - "types-requests", - "types-tqdm", + "types-beautifulsoup4==4.12.0.20250516", + "types-requests==2.33.0.20260518", + "types-tqdm==4.68.0.20260608", ] [tool.hatch]