From faffad63b57e42eba76b75d886745ef45cfc2ef0 Mon Sep 17 00:00:00 2001 From: Till Hartmann Date: Tue, 19 Nov 2024 11:26:41 +0100 Subject: [PATCH] fix: refactor csq analysis code (#599) --- .gitattributes | 1 + Cargo.lock | 890 +++++++++------- src/annotate/seqvars/csq.rs | 990 ++++++++++++------ ...snv_brca1_one_variant@17-41197818-G-C.snap | 5 + ...snv_brca1_one_variant@17-41197819-G-C.snap | 5 + ...38-ensembl.disagreement-subset.txs.bin.zst | 3 + .../vep.disagreement-cases.expected.vcf | 3 + .../seqvars/vep.disagreement-cases.vcf | 3 + 8 files changed, 1199 insertions(+), 701 deletions(-) create mode 100644 tests/data/annotate/db/grch38/GRCh38-ensembl.disagreement-subset.txs.bin.zst create mode 100644 tests/data/annotate/seqvars/vep.disagreement-cases.expected.vcf create mode 100644 tests/data/annotate/seqvars/vep.disagreement-cases.vcf diff --git a/.gitattributes b/.gitattributes index 093d1062..1c455953 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4,3 +4,4 @@ tests/data/vars/*.tsv* filter=lfs diff=lfs merge=lfs -text tests/data/** filter=lfs diff=lfs merge=lfs -text *.bin filter=lfs diff=lfs merge=lfs -text src/db/create/snapshots/mehari__db__create__test__run_smoke_brca1_opa1.snap filter=lfs diff=lfs merge=lfs -text +tests/data/annotate/db/grch38/GRCh38-ensembl.disagreement-subset.txs.bin.zst filter=lfs diff=lfs merge=lfs -text diff --git a/Cargo.lock b/Cargo.lock index 1e97afc7..f115b041 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -21,9 +21,9 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.8.0" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae682f693a9cd7b058f2b0b5d9a6d7728a8555779bedbbc35dd88528611d020" +checksum = "d48f96fc3003717aeb9856ca3d02a8c7de502667ad76eeacd830b48d2e91fac4" dependencies = [ "actix-codec", "actix-rt", @@ -65,7 +65,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -182,24 +182,18 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] name = "addr2line" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - [[package]] name = "adler2" version = "2.0.0" @@ -256,9 +250,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.18" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +checksum = "45862d1c77f2228b9e10bc609d5bc203d86ebc9b87ad8d5d5167a6c9abf739d9" [[package]] name = "android-tzdata" @@ -330,9 +324,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.15" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -345,36 +339,36 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.8" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.4" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -394,18 +388,18 @@ dependencies = [ [[package]] name = "arbitrary" -version = "1.3.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" dependencies = [ "derive_arbitrary", ] [[package]] name = "arrayvec" -version = "0.7.4" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "async-attributes" @@ -455,9 +449,9 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7ebdfa2ebdab6b1760375fa7d6f382b9f486eac35fc994625a00e89280bdbb7" +checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" dependencies = [ "async-task", "concurrent-queue", @@ -483,9 +477,9 @@ dependencies = [ [[package]] name = "async-io" -version = "2.3.3" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" dependencies = [ "async-lock", "cfg-if", @@ -497,7 +491,7 @@ dependencies = [ "rustix", "slab", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -546,13 +540,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.81" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -563,23 +557,23 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backtrace" -version = "0.3.73" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", - "miniz_oxide 0.7.4", + "miniz_oxide", "object", "rustc-demangle", + "windows-targets", ] [[package]] @@ -614,9 +608,9 @@ dependencies = [ [[package]] name = "bindgen" -version = "0.69.4" +version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ "bitflags 2.6.0", "cexpr", @@ -629,7 +623,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -773,9 +767,9 @@ checksum = "c057a3e5631e754d98c5a9e3baa56803fce8fe238b009ecd876e57d381d44c00" [[package]] name = "borsh" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6362ed55def622cddc70a4746a68554d7b687713770de539e59a739b249f8ed" +checksum = "f5327f6c99920069d1fe374aa743be1af0031dea9f250852cdf1ae6a0861ee24" dependencies = [ "borsh-derive", "cfg_aliases", @@ -783,16 +777,15 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ef8005764f53cd4dca619f5bf64cafd4664dada50ece25e4d81de54c80cc0b" +checksum = "10aedd8f1a81a8aafbfde924b0e3061cd6fedd6f6bbcfc6a76e6fd426d7bfe26" dependencies = [ "once_cell", "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.85", - "syn_derive", + "syn 2.0.87", ] [[package]] @@ -895,9 +888,9 @@ checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" [[package]] name = "bytemuck" -version = "1.16.3" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "102087e286b4677862ea56cf8fc58bb2cdfa8725c40ffb80fe3a008eb7f2fc83" +checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" [[package]] name = "byteorder" @@ -907,9 +900,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" [[package]] name = "bytestring" @@ -965,7 +958,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -995,12 +988,13 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.1.7" +version = "1.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26a5c3fd7bfa1ce3897a3a3501d362b2d87b7f2583ebcb4a949ec25911025cbc" +checksum = "40545c26d092346d8a8dab71ee48e7685a7a9cba76e634790c215b41a4a7b4cf" dependencies = [ "jobserver", "libc", + "shlex", ] [[package]] @@ -1118,7 +1112,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1129,9 +1123,9 @@ checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" [[package]] name = "colorchoice" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "concurrent-queue" @@ -1183,9 +1177,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "coz" @@ -1199,18 +1193,18 @@ dependencies = [ [[package]] name = "cpp_demangle" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8227005286ec39567949b33df9896bcadfa6051bccca2488129f108ca23119" +checksum = "96e58d342ad113c2b878f16d5d034c03be492ae460cdbc02b7f0f2284d310c7d" dependencies = [ "cfg-if", ] [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "0ca741a962e1b0bff6d724a1a0958b686406e853bb14061f218562e1896f95e6" dependencies = [ "libc", ] @@ -1360,7 +1354,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1371,7 +1365,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1411,7 +1405,7 @@ checksum = "d150dea618e920167e5973d70ae6ece4385b7164e0d799fe7c122dd0a5d912ad" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1422,18 +1416,18 @@ checksum = "2cdc8d50f426189eef89dac62fabfa0abb27d5cc008f25bf4156a0203325becc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] name = "derive_arbitrary" -version = "1.3.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" +checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1454,7 +1448,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1464,7 +1458,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1477,7 +1471,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1521,7 +1515,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1544,9 +1538,9 @@ checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" [[package]] name = "encoding_rs" -version = "0.8.34" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] @@ -1569,7 +1563,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1590,7 +1584,7 @@ checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1689,9 +1683,9 @@ checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" [[package]] name = "fastrand" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" [[package]] name = "feature-probe" @@ -1724,7 +1718,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" dependencies = [ "crc32fast", - "miniz_oxide 0.8.0", + "miniz_oxide", ] [[package]] @@ -1798,9 +1792,9 @@ checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" dependencies = [ "fastrand", "futures-core", @@ -1817,7 +1811,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1888,9 +1882,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.29.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "git2" @@ -1973,9 +1967,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" [[package]] name = "hashlink" @@ -2095,9 +2089,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" @@ -2119,9 +2113,9 @@ checksum = "a17b27f28a7466846baca75f0a5244e546e44178eb7f1c07a3820f413e91c6b0" [[package]] name = "hyper" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" dependencies = [ "bytes", "futures-channel", @@ -2156,9 +2150,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.8" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da62f120a8a37763efb0cf8fdf264b884c7b8b9ac8660b900c8661030c00e6ba" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", @@ -2169,16 +2163,15 @@ dependencies = [ "pin-project-lite", "socket2", "tokio", - "tower", "tower-service", "tracing", ] [[package]] name = "iana-time-zone" -version = "0.1.60" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -2197,6 +2190,124 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -2205,19 +2316,30 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", ] [[package]] name = "impl-more" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206ca75c9c03ba3d4ace2460e57b189f39f43de612c2f85836e65c929701bb2d" +checksum = "aae21c3177a27788957044151cc2800043d127acaa460a47ebb9b84dfa2c6aa0" [[package]] name = "indexmap" @@ -2226,7 +2348,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.15.0", + "hashbrown 0.15.1", "serde", ] @@ -2286,17 +2408,17 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.10.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "187674a687eed5fe42285b40c6291f9a01517d415fad1c3cbc6a9f778af7fcd4" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] name = "is-terminal" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" dependencies = [ - "hermit-abi 0.3.9", + "hermit-abi 0.4.0", "libc", "windows-sys 0.52.0", ] @@ -2360,9 +2482,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.69" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] @@ -2396,7 +2518,7 @@ dependencies = [ "convert_case 0.6.0", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2492,9 +2614,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.158" +version = "0.2.162" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" [[package]] name = "libgit2-sys" @@ -2520,9 +2642,9 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.8" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" [[package]] name = "librocksdb-sys" @@ -2552,9 +2674,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.18" +version = "1.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c15da26e5af7e25c90b37a2d75cdbf940cf4a55316de9d84c679c9b8bfabf82e" +checksum = "d2d16453e800a8cf6dd2fc3eb4bc99b786a9b90c663b8559a5b1a041bf89e472" dependencies = [ "cc", "libc", @@ -2574,6 +2696,12 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "litemap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" + [[package]] name = "local-channel" version = "0.1.5" @@ -2612,9 +2740,9 @@ dependencies = [ [[package]] name = "lz4-sys" -version = "1.10.0" +version = "1.11.1+lz4-1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "109de74d5d2353660401699a4174a4ff23fcc649caf553df71933c7fb45ad868" +checksum = "6bd8c0d6c6ed0cd30b3652886bb8711dc4bb01d637a68105a3d5158039b418e6" dependencies = [ "cc", "libc", @@ -2746,9 +2874,9 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memmap2" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" +checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" dependencies = [ "libc", ] @@ -2775,15 +2903,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" -[[package]] -name = "miniz_oxide" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" -dependencies = [ - "adler", -] - [[package]] name = "miniz_oxide" version = "0.8.0" @@ -2801,9 +2920,9 @@ checksum = "9bec4598fddb13cc7b528819e697852653252b760f1228b7642679bf2ff2cd07" [[package]] name = "mio" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ "hermit-abi 0.3.9", "libc", @@ -2847,19 +2966,21 @@ checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] name = "ndarray" -version = "0.15.6" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32" +checksum = "882ed72dce9365842bf196bdeedf5055305f11fc8c03dee7bb0194a6cad34841" dependencies = [ "matrixmultiply", "num-complex", "num-integer", "num-traits", + "portable-atomic", + "portable-atomic-util", "rawpointer", ] @@ -3230,7 +3351,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -3258,15 +3379,15 @@ dependencies = [ "kinded", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "urlencoding", ] [[package]] name = "object" -version = "0.36.3" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] @@ -3285,9 +3406,9 @@ checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" [[package]] name = "ordered-float" -version = "4.2.2" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a91171844676f8c7990ce64959210cd2eaef32c2612c50f9fae9f8aaa6065a6" +checksum = "c65ee1f9701bf938026630b455d5315f490640234259037edb259798b3bcf85e" dependencies = [ "num-traits", ] @@ -3300,9 +3421,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "parking" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" @@ -3322,7 +3443,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.3", + "redox_syscall", "smallvec", "windows-targets", ] @@ -3335,7 +3456,7 @@ checksum = "287d8d3ebdce117b8539f59411e4ed9ec226e0a4153c7f55495c6070d68e6f72" dependencies = [ "parse-display-derive", "regex", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", ] [[package]] @@ -3347,9 +3468,9 @@ dependencies = [ "proc-macro2", "quote", "regex", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", "structmeta", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -3429,31 +3550,11 @@ dependencies = [ "siphasher", ] -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", -] - [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -3463,9 +3564,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "piper" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" dependencies = [ "atomic-waker", "fastrand", @@ -3474,15 +3575,15 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "plotters" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15b6eccb8484002195a3e44fe65a4ce8e93a625797a063735536fd59cb01cf3" +checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" dependencies = [ "num-traits", "plotters-backend", @@ -3493,24 +3594,24 @@ dependencies = [ [[package]] name = "plotters-backend" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "414cec62c6634ae900ea1c56128dfe87cf63e7caece0852ec76aba307cebadb7" +checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" [[package]] name = "plotters-svg" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81b30686a7d9c3e010b84284bdd26a29f2138574f52f5eb6f794fc0ad924e705" +checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" dependencies = [ "plotters-backend", ] [[package]] name = "polling" -version = "3.7.2" +version = "3.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3ed00ed3fbf728b5816498ecd316d1716eecaced9c0c8d2c5a6740ca214985b" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" dependencies = [ "cfg-if", "concurrent-queue", @@ -3518,20 +3619,29 @@ dependencies = [ "pin-project-lite", "rustix", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "portable-atomic" -version = "1.7.0" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" + +[[package]] +name = "portable-atomic-util" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da544ee218f0d287a911e9c99a39a8c9bc8fcad3cb8db5959940044ecfc67265" +checksum = "90a7d5beecc52a491b54d6dd05c7a45ba1801666a5baad9fdbfc6fef8d2d206c" +dependencies = [ + "portable-atomic", +] [[package]] name = "postgres" -version = "0.19.8" +version = "0.19.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c9ec84ab55b0f9e418675de50052d494ba893fd28c65769a6e68fcdacbee2b8" +checksum = "95c918733159f4d55d2ceb262950f00b0aebd6af4aa97b5a47bb0655120475ed" dependencies = [ "bytes", "fallible-iterator 0.2.0", @@ -3561,9 +3671,9 @@ dependencies = [ [[package]] name = "postgres-types" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02048d9e032fb3cc3413bbf7b83a15d84a5d419778e2628751896d856498eee9" +checksum = "f66ea23a2d0e5734297357705193335e0a957696f34bed2f2faefacb2fec336f" dependencies = [ "bytes", "chrono", @@ -3619,12 +3729,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.20" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" +checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ "proc-macro2", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -3662,9 +3772,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" dependencies = [ "unicode-ident", ] @@ -3721,7 +3831,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn 2.0.85", + "syn 2.0.87", "tempfile", ] @@ -3735,7 +3845,7 @@ dependencies = [ "itertools 0.13.0", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -3825,10 +3935,11 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.5" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b" +checksum = "7d5a626c6807713b15cac82a6acaccd6043c9a5408c24baae07611fec3f243da" dependencies = [ + "cfg_aliases", "libc", "once_cell", "socket2", @@ -3919,32 +4030,23 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.3" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ "bitflags 2.6.0", ] [[package]] name = "regex" -version = "1.10.6" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.7", - "regex-syntax 0.8.4", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", ] [[package]] @@ -3958,13 +4060,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", ] [[package]] @@ -3981,9 +4083,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "relative-path" @@ -4002,9 +4104,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.7" +version = "0.12.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" dependencies = [ "base64 0.22.1", "bytes", @@ -4045,9 +4147,9 @@ dependencies = [ [[package]] name = "rgb" -version = "0.8.47" +version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e12bc8d2f72df26a5d3178022df33720fbede0d31d82c7291662eff89836994d" +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" dependencies = [ "bytemuck", ] @@ -4069,9 +4171,9 @@ dependencies = [ [[package]] name = "rkyv" -version = "0.7.44" +version = "0.7.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cba464629b3394fc4dbc6f940ff8f5b4ff5c7aef40f29166fd4ad12acbc99c0" +checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" dependencies = [ "bitvec", "bytecheck", @@ -4087,9 +4189,9 @@ dependencies = [ [[package]] name = "rkyv_derive" -version = "0.7.44" +version = "0.7.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7dddfff8de25e6f62b9d64e6e432bf1c6736c57d20323e15ee10435fbda7c65" +checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" dependencies = [ "proc-macro2", "quote", @@ -4143,7 +4245,7 @@ dependencies = [ "regex", "relative-path", "rustc_version 0.4.1", - "syn 2.0.85", + "syn 2.0.87", "unicode-ident", ] @@ -4181,7 +4283,7 @@ dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.85", + "syn 2.0.87", "walkdir", ] @@ -4197,9 +4299,9 @@ dependencies = [ [[package]] name = "rust_decimal" -version = "1.35.0" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1790d1c4c0ca81211399e0e0af16333276f375209e71a37b67698a373db5b47a" +checksum = "b082d80e3e3cc52b2ed634388d436fe1f4de6af5786cc2de9ba9737527bdf555" dependencies = [ "arrayvec", "borsh", @@ -4249,9 +4351,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.37" +version = "0.38.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +checksum = "99e4ea3e1cdc4b559b8e5650f9c8e5998e3e5c1343b4eaf034565f32318d63c0" dependencies = [ "bitflags 2.6.0", "errno", @@ -4262,9 +4364,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.12" +version = "0.23.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044" +checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" dependencies = [ "once_cell", "ring", @@ -4276,19 +4378,18 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.1.3" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64 0.22.1", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" [[package]] name = "rustls-webpki" @@ -4303,9 +4404,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" [[package]] name = "ryu" @@ -4388,7 +4489,7 @@ checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -4451,7 +4552,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -4528,9 +4629,9 @@ dependencies = [ [[package]] name = "simdutf8" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" [[package]] name = "similar" @@ -4631,7 +4732,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -4642,7 +4743,7 @@ checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -4664,7 +4765,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -4675,9 +4776,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "symbolic-common" -version = "12.10.0" +version = "12.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16629323a4ec5268ad23a575110a724ad4544aae623451de600c747bf87b36cf" +checksum = "3d4d73159efebfb389d819fd479afb2dbd57dcb3e3f4b7fcfa0e675f5a46c1cb" dependencies = [ "debugid", "memmap2", @@ -4687,9 +4788,9 @@ dependencies = [ [[package]] name = "symbolic-demangle" -version = "12.10.0" +version = "12.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c043a45f08f41187414592b3ceb53fb0687da57209cc77401767fb69d5b596" +checksum = "a767859f6549c665011970874c3f541838b4835d5aaaa493d3ee383918be9f10" dependencies = [ "cpp_demangle", "rustc-demangle", @@ -4709,9 +4810,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.85" +version = "2.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" dependencies = [ "proc-macro2", "quote", @@ -4719,24 +4820,23 @@ dependencies = [ ] [[package]] -name = "syn_derive" -version = "0.1.8" +name = "sync_wrapper" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" dependencies = [ - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.85", + "futures-core", ] [[package]] -name = "sync_wrapper" -version = "1.0.1" +name = "synstructure" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ - "futures-core", + "proc-macro2", + "quote", + "syn 2.0.87", ] [[package]] @@ -4753,9 +4853,9 @@ checksum = "921f1e9c427802414907a48b21a6504ff6b3a15a1a3cf37e699590949ad9befc" [[package]] name = "tempfile" -version = "3.13.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ "cfg-if", "fastrand", @@ -4766,22 +4866,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.63" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.63" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -4831,6 +4931,16 @@ dependencies = [ "time-core", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinytemplate" version = "1.2.1" @@ -4882,14 +4992,14 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] name = "tokio-postgres" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03adcf0147e203b6032c0b2d30be1415ba03bc348901f3ff1cc0df6a733e60c3" +checksum = "3b5d3742945bc7d7f210693b0c58ae542c6fd47b17adbbda0885f3dcb34a6bdb" dependencies = [ "async-trait", "byteorder", @@ -4924,9 +5034,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ "bytes", "futures-core", @@ -4969,27 +5079,6 @@ dependencies = [ "winnow", ] -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - [[package]] name = "tower-service" version = "0.3.3" @@ -5016,7 +5105,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5076,7 +5165,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04659ddb06c87d233c566112c1c9c5b9e98256d9af50ec3bc9c8327f873a7568" dependencies = [ "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5093,9 +5182,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typeid" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "059d83cc991e7a42fc37bd50941885db0888e34209f8cfd9aab07ddec03bc9cf" +checksum = "0e13db2e0ccd5e14a544e8a246ba2312cd25223f616442d7f2cb0e3db614236e" [[package]] name = "typenum" @@ -5105,18 +5194,15 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicase" -version = "2.7.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] +checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" [[package]] name = "unicode-bidi" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" [[package]] name = "unicode-ident" @@ -5126,30 +5212,30 @@ checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-normalization" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] [[package]] name = "unicode-properties" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4259d9d4425d9f0661581b804cb85fe66a4c631cadd8f490d1c13a35d5d9291" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" [[package]] name = "unicode-segmentation" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-width" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unsafe-libyaml" @@ -5165,9 +5251,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.2" +version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada" dependencies = [ "form_urlencoded", "idna", @@ -5180,12 +5266,24 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + [[package]] name = "utf8-width" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -5202,7 +5300,7 @@ dependencies = [ "serde", "serde_json", "serde_yaml", - "utoipa-gen 4.3.0", + "utoipa-gen 4.3.1", ] [[package]] @@ -5230,15 +5328,15 @@ dependencies = [ [[package]] name = "utoipa-gen" -version = "4.3.0" +version = "4.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bf0e16c02bc4bf5322ab65f10ab1149bdbcaa782cba66dc7057370a3f8190be" +checksum = "20c24e8ab68ff9ee746aad22d39b5535601e6416d1b0feeabf78be986a5c4392" dependencies = [ "proc-macro-error", "proc-macro2", "quote", "regex", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5249,7 +5347,7 @@ checksum = "5629efe65599d0ccd5d493688cbf6e03aa7c1da07fe59ff97cf5977ed0637f66" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5289,9 +5387,9 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "value-bag" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a84c137d37ab0142f0f2ddfe332651fdbf252e7b7dbb4e67b6c1f1b2e925101" +checksum = "3ef4c4aa54d5d05a279399bfa921ec387b7aba77caf7a682ae8d86785b8fdad2" [[package]] name = "vcpkg" @@ -5347,34 +5445,35 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.42" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" dependencies = [ "cfg-if", "js-sys", @@ -5384,9 +5483,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5394,28 +5493,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "web-sys" -version = "0.3.69" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" dependencies = [ "js-sys", "wasm-bindgen", @@ -5433,29 +5532,29 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.5" +version = "0.26.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bd24728e5af82c6c4ec1b66ac4844bdf8156257fccda846ec58b42cd0cdbe6a" +checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" dependencies = [ "rustls-pki-types", ] [[package]] name = "whoami" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" +checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" dependencies = [ - "redox_syscall 0.4.1", + "redox_syscall", "wasite", "web-sys", ] [[package]] name = "wide" -version = "0.7.26" +version = "0.7.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "901e8597c777fa042e9e245bd56c0dc4418c5db3f845b6ff94fbac732c6a0692" +checksum = "b828f995bf1e9622031f8009f8481a85406ce1f4d4588ff746d872043e855690" dependencies = [ "bytemuck", "safe_arch", @@ -5622,6 +5721,18 @@ dependencies = [ "memchr", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "wyz" version = "0.5.1" @@ -5646,6 +5757,30 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" +[[package]] +name = "yoke" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.7.35" @@ -5664,7 +5799,28 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", +] + +[[package]] +name = "zerofrom" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", + "synstructure", ] [[package]] @@ -5673,6 +5829,28 @@ version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "zip" version = "1.1.4" diff --git a/src/annotate/seqvars/csq.rs b/src/annotate/seqvars/csq.rs index 46ee1d30..1df50ded 100644 --- a/src/annotate/seqvars/csq.rs +++ b/src/annotate/seqvars/csq.rs @@ -1,9 +1,7 @@ //! Compute molecular consequence of variants. -use std::{collections::HashMap, sync::Arc}; - -use crate::pbs::txs::{Strand, TranscriptBiotype, TranscriptTag}; +use crate::pbs::txs::{GenomeAlignment, Strand, TranscriptBiotype, TranscriptTag}; use enumflags2::BitFlags; -use hgvs::parser::NoRef; +use hgvs::parser::{NoRef, ProteinEdit, UncertainLengthChange}; use hgvs::{ data::interface::{Provider, TxForRegionRecord}, mapper::{assembly, Error}, @@ -12,6 +10,9 @@ use hgvs::{ }, }; use itertools::Itertools; +use std::cmp::Ordering; +use std::ops::Range; +use std::{collections::HashMap, sync::Arc}; use super::{ ann::{Allele, AnnField, Consequence, FeatureBiotype, FeatureType, Pos, Rank, SoFeature}, @@ -100,6 +101,8 @@ pub const PADDING: i32 = 5_000; /// Generally used alternative alignment method. pub const ALT_ALN_METHOD: &str = "splign"; +pub type Consequences = BitFlags; + impl ConsequencePredictor { pub fn new(provider: Arc, config: Config) -> Self { tracing::info!("Building transcript interval trees ..."); @@ -374,7 +377,7 @@ impl ConsequencePredictor { let alignment = tx.genome_alignments.first().unwrap(); let strand = Strand::try_from(alignment.strand).expect("invalid strand"); - let mut consequences: BitFlags = BitFlags::empty(); + let mut consequences = Consequences::empty(); let mut min_start = None; let mut max_end = None; @@ -389,14 +392,6 @@ impl ConsequencePredictor { let mut distance: Option = None; let mut tx_len = 0; - fn overlaps( - var_start: i32, - var_end: i32, - exon_intron_start: i32, - exon_intron_end: i32, - ) -> bool { - (var_start < exon_intron_end) && (var_end > exon_intron_start) - } let var_overlaps = |start: i32, end: i32| -> bool { overlaps(var_start, var_end, start, end) }; @@ -448,109 +443,22 @@ impl ConsequencePredictor { } } - // Check the cases where the variant overlaps with whole exon. - if var_start <= exon_start && var_end >= exon_end { - consequences |= Consequence::ExonLossVariant; - if var_start < exon_start { - if strand == Strand::Plus && !rank.is_first() { - consequences |= Consequence::SpliceAcceptorVariant; - } else if strand == Strand::Minus && !rank.is_last() { - consequences |= Consequence::SpliceDonorVariant; - } - } - if var_end > exon_end { - if strand == Strand::Plus && !rank.is_last() { - consequences |= Consequence::SpliceDonorVariant; - } else if strand == Strand::Minus && !rank.is_last() { - consequences |= Consequence::SpliceAcceptorVariant; - } - } - } - if let Some(intron_start) = intron_start { - // For insertions, we need to consider the case of the insertion being right at - // the exon/intron junction. We can express this with a shift of 1 for using - // "< / >" X +/- shift and meaning <= / >= X. - let ins_shift = if var.reference.is_empty() { 1 } else { 0 }; - - // Check the cases where the variant overlaps with the splice acceptor/donor site. - if var_overlaps(intron_start - ins_shift, intron_start + 2) { - // Left side, is acceptor/donor depending on transcript's strand. - match strand { - Strand::Plus => consequences.insert(Consequence::SpliceDonorVariant), - Strand::Minus => consequences.insert(Consequence::SpliceAcceptorVariant), - _ => unreachable!("invalid strand: {}", alignment.strand), - } - } - // Check the case where the variant overlaps with the splice donor site. - if var_overlaps(intron_end - 2, intron_end + ins_shift) { - // Left side, is acceptor/donor depending on transcript's strand. - match strand { - Strand::Plus => consequences.insert(Consequence::SpliceAcceptorVariant), - Strand::Minus => consequences.insert(Consequence::SpliceDonorVariant), - _ => unreachable!("invalid strand: {}", alignment.strand), - } - } - } - // Check the case where the variant overlaps with the splice region (1-3 bases in exon - // or 3-8 bases in intron). We have to check all cases independently and not with `else` - // because the variant may be larger. - if let Some(intron_start) = intron_start { - if var_overlaps(intron_start + 2, intron_start + 8) - || var_overlaps(intron_end - 8, intron_end - 2) - { - consequences |= Consequence::SpliceRegionVariant; - } - if var_overlaps(exon_end - 3, exon_end) { - if strand == Strand::Plus { - if !rank.is_last() { - consequences |= Consequence::SpliceRegionVariant; - } - } else { - // alignment.strand == Strand::Minus - if !rank.is_first() { - consequences |= Consequence::SpliceRegionVariant; - } - } - } - if var_overlaps(exon_start, exon_start + 3) { - if strand == Strand::Plus { - if !rank.is_first() { - consequences |= Consequence::SpliceRegionVariant; - } - } else { - // alignment.strand == Strand::Minus - if !rank.is_last() { - consequences |= Consequence::SpliceRegionVariant; - } - } - } - } + let consequences_exonic = Self::analyze_exonic_variant( + var, strand, var_start, var_end, exon_start, exon_end, &rank, + ); + consequences |= consequences_exonic; if let Some(intron_start) = intron_start { - // Check the case where the variant overlaps with the polypyrimidine tract. - // (A sequence variant that falls in the polypyrimidine tract at 3' end of intron between 17 and 3 bases from the end (acceptor -3 to acceptor -17)) - if strand == Strand::Plus && var_overlaps(intron_end - 17, intron_end - 2) { - consequences |= Consequence::SplicePolypyrimidineTractVariant; - } - if strand == Strand::Minus && var_overlaps(intron_start + 2, intron_start + 17) { - consequences |= Consequence::SplicePolypyrimidineTractVariant; - } - // Check conditions for splice_donor_region_variant - // (A sequence variant that falls in the region between the 3rd and 6th base after splice junction (5' end of intron)) - if strand == Strand::Plus && var_overlaps(intron_start + 2, intron_start + 6) { - consequences |= Consequence::SpliceDonorRegionVariant; - } - if strand == Strand::Minus && var_overlaps(intron_end - 6, intron_end - 2) { - consequences |= Consequence::SpliceDonorRegionVariant; - } - // Check conditions for splice_donor_5th_base_variant - // (A sequence variant that causes a change at the 5th base pair after the start of the intron in the orientation of the transcript.) - if strand == Strand::Plus && var_overlaps(intron_start + 4, intron_start + 5) { - consequences |= Consequence::SpliceDonorFifthBaseVariant; - } - if strand == Strand::Minus && var_overlaps(intron_end - 5, intron_end - 4) { - consequences |= Consequence::SpliceDonorFifthBaseVariant; - } + let consequences_intronic = Self::analyze_intronic_variant( + var, + alignment, + strand, + var_start, + var_end, + intron_start, + intron_end, + ); + consequences |= consequences_intronic; } min_start = Some(std::cmp::min(min_start.unwrap_or(exon_start), exon_start)); @@ -697,153 +605,26 @@ impl ConsequencePredictor { _ => panic!("Not a protein position: {:?}", &var_n), }; - let conservative = match &var_c { - HgvsVariant::CdsVariant { loc_edit, .. } => { - // Handle the cases where the variant touches the start or stop codon based on `var_c` - // coordinates. The cases where the start/stop codon is touched by the variant - // directly is handled above based on the `var_p` prediction. - let loc = loc_edit.loc.inner(); - let start_base = loc.start.base; - let start_cds_from = loc.start.cds_from; - let end_base = loc.end.base; - let end_cds_from = loc.end.cds_from; - // The variables below mean "VARIANT_{starts,stops}_{left,right}_OF_{start,stop}_CODON". - // - // start codon - let starts_left_of_start = - start_cds_from == CdsFrom::Start && start_base < 0; - let ends_right_of_start = - start_cds_from != CdsFrom::Start || start_base > 0; - if starts_left_of_start && ends_right_of_start { - consequences |= Consequence::StartLost; - } - // stop codon - let starts_left_of_stop = start_cds_from == CdsFrom::Start; - let ends_right_of_stop = end_cds_from == CdsFrom::End; - if starts_left_of_stop && ends_right_of_stop { - consequences |= Consequence::StopLost; - } - - // Detect variants affecting the 5'/3' UTRs. - if start_cds_from == CdsFrom::Start { - if start_base < 0 { - if is_intronic { - consequences |= Consequence::FivePrimeUtrIntronVariant; - } - if is_exonic { - consequences |= Consequence::FivePrimeUtrExonVariant; - } - } - } else if end_cds_from == CdsFrom::End { - if is_intronic { - consequences |= Consequence::ThreePrimeUtrIntronVariant; - } - if is_exonic { - consequences |= Consequence::ThreePrimeUtrExonVariant; - } - } - - // The range is "conservative" (regarding deletions and insertions) if - // it does not start or end within exons. - start_cds_from == CdsFrom::Start - && end_cds_from == CdsFrom::Start - && start_base % 3 == 1 - && (end_base + 1) % 3 == 1 - } - _ => panic!("Must be CDS variant: {}", &var_c), - }; + let conservative = is_conservative_cds_variant(&var_c); - fn is_stop(s: &str) -> bool { - s == "X" || s == "Ter" || s == "*" - } + let consequences_cds = + Self::analyze_cds_variant(&var_c, is_exonic, is_intronic, conservative); // Analyze `var_p` for changes in the protein sequence. - match &var_p { - HgvsVariant::ProtVariant { loc_edit, .. } => match loc_edit { - ProtLocEdit::Ordinary { loc, edit } => { - let loc = loc.inner(); - match edit.inner() { - hgvs::parser::ProteinEdit::Fs { .. } => { - consequences |= Consequence::FrameshiftVariant; - } - hgvs::parser::ProteinEdit::Ext { .. } => { - consequences |= Consequence::StopLost; - consequences |= Consequence::FeatureElongation; - } - hgvs::parser::ProteinEdit::Subst { alternative } => { - if alternative.is_empty() { - consequences |= Consequence::SynonymousVariant; - } else if is_stop(alternative) { - if loc.start == loc.end && is_stop(&loc.start.aa) { - consequences |= Consequence::StopRetainedVariant; - } else { - consequences |= Consequence::StopGained; - // if the substitution happens right before the stop codon - // and if it is a conservative change - // then it is not a stop gained - // cf. 1:43450470:GCCT:G, ENST00000634258.3:c.10294_10296del/p.Leu3432Ter - if let Some(ref p) = protein_pos { - if p.total.is_some_and(|t| p.ord == t - 1) - && conservative - { - consequences &= !Consequence::StopGained; - consequences |= Consequence::ConservativeInframeDeletion; - } - } - } - } else { - consequences |= Consequence::MissenseVariant; - } - } - hgvs::parser::ProteinEdit::DelIns { alternative } => { - if conservative { - consequences |= - Consequence::ConservativeInframeDeletion; - } else { - consequences |= Consequence::DisruptiveInframeDeletion; - } - if alternative.contains('*') - || alternative.contains('X') - || alternative.contains("Ter") - { - consequences |= Consequence::StopGained; - } - } - hgvs::parser::ProteinEdit::Ins { .. } - | hgvs::parser::ProteinEdit::Dup => { - if conservative { - consequences |= - Consequence::ConservativeInframeInsertion; - } else { - consequences |= Consequence::DisruptiveInframeInsertion; - } - consequences |= Consequence::ConservativeInframeInsertion; - } - hgvs::parser::ProteinEdit::Del => { - if conservative { - consequences |= - Consequence::ConservativeInframeDeletion; - } else { - consequences |= Consequence::DisruptiveInframeDeletion; - } - } - hgvs::parser::ProteinEdit::Ident => { - consequences |= Consequence::SynonymousVariant; - } - }; - } - ProtLocEdit::NoChange | ProtLocEdit::NoChangeUncertain => { - consequences |= Consequence::SynonymousVariant; - } - ProtLocEdit::InitiationUncertain => { - consequences |= Consequence::StartLost; - } - ProtLocEdit::NoProtein - | ProtLocEdit::NoProteinUncertain - | ProtLocEdit::Unknown => (), - }, - _ => panic!("Must be protein variant: {}", &var_p), - } + let consequences_protein = + Self::analyze_protein_variant(&var_p, &protein_pos, conservative); + + consequences |= consequences_cds | consequences_protein; + + self.consequences_fix_special_cases( + &mut consequences, + consequences_cds, + consequences_protein, + &var_g, + &var_n, + &var_c, + &var_p, + ); (var_c, Some(var_p), hgvs_p, cds_pos, protein_pos) } @@ -915,6 +696,445 @@ impl ConsequencePredictor { })) } + #[allow(clippy::too_many_arguments, unused_variables)] + fn consequences_fix_special_cases( + &self, + consequences: &mut Consequences, + consequences_cds: Consequences, + consequences_protein: Consequences, + var_g: &HgvsVariant, + var_n: &HgvsVariant, + var_c: &HgvsVariant, + var_p: &HgvsVariant, + ) { + fn is_stop(s: &str) -> bool { + s == "X" || s == "Ter" || s == "*" + } + + // In some cases, we predict a stop lost based on the cds variant + // but the protein translation does not confirm this. + // + // e.g.: + // 20:35511609:CAAGCCGCCTCCAGGTAGCAGCCACAGCCAGGAGCACACAGACAGAAGACTGTGTCATGGGTCATGGCCCCTCCGCACACCTACAGGTTTGCCAAAGGAA:C + if consequences_cds.contains(Consequence::StopLost) + && !consequences_protein.contains(Consequence::StopLost) + { + if let HgvsVariant::ProtVariant { + loc_edit: ProtLocEdit::Ordinary { loc, edit }, + .. + } = var_p + { + match edit.inner() { + // Stop lost due to a deletion in the CDS, but the resulting protein translation + // continues to have a stop codon at the same position. + ProteinEdit::DelIns { alternative } => { + let loc_length = Range::::from(loc.inner().clone()).len(); + match alternative.len().cmp(&loc_length) { + Ordering::Equal => { + *consequences &= !Consequence::StopLost; + *consequences |= Consequence::StopRetainedVariant; + } + Ordering::Greater => { + *consequences |= Consequence::FeatureElongation; + } + _ => {} + } + } + // Detect cases where the frameshift resolves into + // a missense + stop retained variant. + // This is the shortest possible frameshift in hgvsp (fs*2). + ProteinEdit::Fs { + alternative, + terminal, + length, + } => { + if let (Some(alt), Some(terminal), UncertainLengthChange::Known(2)) = + (alternative, terminal, length) + { + if is_stop(terminal) && alt.len() == 1 { + *consequences |= Consequence::MissenseVariant; + *consequences |= Consequence::StopRetainedVariant; + *consequences &= !Consequence::StopLost; + *consequences &= !Consequence::FrameshiftVariant; + } + } + } + _ => {} + } + } + } + + // Similarly, for the start lost case + // + // e.g.: + // 13:32316456:TA:T + // (This case just shortens a poly-A from which the start codon starts) + if consequences_cds.contains(Consequence::StartLost) + && !consequences_protein.contains(Consequence::StartLost) + { + *consequences &= !Consequence::StartLost; + } + if consequences.contains(Consequence::StartLost) { + if let ( + HgvsVariant::TxVariant { + loc_edit: n_loc_edit, + accession, + .. + }, + HgvsVariant::CdsVariant { + loc_edit: c_loc_edit, + .. + }, + ) = (var_n, var_c) + { + let n_loc = n_loc_edit.loc.inner(); + let c_edit = c_loc_edit.edit.inner(); + let c_loc = c_loc_edit.loc.inner(); + + // If edit occurs within the first 3 bases of the CDS, + let (start, end) = (c_loc.start.base, c_loc.end.base); + if start >= 1 + && end <= 3 + && c_loc.start.cds_from == CdsFrom::Start + && c_loc.end.cds_from == CdsFrom::Start + { + // … then we need to check whether this is a start lost or a start retained. + // To that end, extract the first 3 bases plus/minus 3 bases … + if let Ok(first_codon_pm1) = self.provider.get_seq_part( + &accession.value, + Some( + usize::try_from(n_loc.start.base - start + 1) + .unwrap() + .saturating_sub(4), + ), + Some(usize::try_from(n_loc.end.base - start + 1).unwrap() + 5), + ) { + // … and introduce the change into the sequence. + let mut first_codon = first_codon_pm1.clone(); + let (start, end) = (start as usize, end as usize); + let start_retained = match c_edit { + NaEdit::DelRef { .. } => { + first_codon.replace_range(3 + start - 1..=3 + end - 1, ""); + // If the first codon is still a start codon, then it is a start retained. + first_codon[2..5].contains("ATG") + } + // TODO: handle other cases + _ => false, + }; + if start_retained { + *consequences &= !Consequence::StartLost; + *consequences |= Consequence::StartRetainedVariant; + } + } + } + } + } + } + + #[allow(clippy::too_many_arguments, unused_variables)] + fn analyze_exonic_variant( + var: &VcfVariant, + strand: Strand, + var_start: i32, + var_end: i32, + exon_start: i32, + exon_end: i32, + rank: &Rank, + ) -> Consequences { + let mut consequences: Consequences = Consequences::empty(); + + let var_overlaps = + |start: i32, end: i32| -> bool { overlaps(var_start, var_end, start, end) }; + + // Check the cases where the variant overlaps with whole exon. + if var_start <= exon_start && var_end >= exon_end { + consequences |= Consequence::ExonLossVariant; + if var_start < exon_start { + if strand == Strand::Plus && !rank.is_first() { + consequences |= Consequence::SpliceAcceptorVariant; + } else if strand == Strand::Minus && !rank.is_last() { + consequences |= Consequence::SpliceDonorVariant; + } + } + if var_end > exon_end { + if strand == Strand::Plus && !rank.is_last() { + consequences |= Consequence::SpliceDonorVariant; + } else if strand == Strand::Minus && !rank.is_last() { + consequences |= Consequence::SpliceAcceptorVariant; + } + } + } + + // Check splice region variants + if var_overlaps(exon_end - 3, exon_end) { + if strand == Strand::Plus { + if !rank.is_last() { + consequences |= Consequence::SpliceRegionVariant; + } + } else { + // alignment.strand == Strand::Minus + if !rank.is_first() { + consequences |= Consequence::SpliceRegionVariant; + } + } + } + if var_overlaps(exon_start, exon_start + 3) { + if strand == Strand::Plus { + if !rank.is_first() { + consequences |= Consequence::SpliceRegionVariant; + } + } else { + // alignment.strand == Strand::Minus + if !rank.is_last() { + consequences |= Consequence::SpliceRegionVariant; + } + } + } + consequences + } + + #[allow(clippy::too_many_arguments)] + fn analyze_intronic_variant( + var: &VcfVariant, + alignment: &GenomeAlignment, + strand: Strand, + var_start: i32, + var_end: i32, + intron_start: i32, + intron_end: i32, + ) -> Consequences { + let mut consequences: Consequences = Consequences::empty(); + + let var_overlaps = + |start: i32, end: i32| -> bool { overlaps(var_start, var_end, start, end) }; + + // For insertions, we need to consider the case of the insertion being right at + // the exon/intron junction. We can express this with a shift of 1 for using + // "< / >" X +/- shift and meaning <= / >= X. + let ins_shift = if var.reference.is_empty() { 1 } else { 0 }; + + // Check the cases where the variant overlaps with the splice acceptor/donor site. + if var_overlaps(intron_start - ins_shift, intron_start + 2) { + // Left side, is acceptor/donor depending on transcript's strand. + match strand { + Strand::Plus => { + consequences |= Consequence::SpliceDonorVariant; + } + Strand::Minus => { + consequences |= Consequence::SpliceAcceptorVariant; + } + _ => unreachable!("invalid strand: {}", alignment.strand), + } + } + + // Check the case where the variant overlaps with the splice donor site. + if var_overlaps(intron_end - 2, intron_end + ins_shift) { + // Left side, is acceptor/donor depending on transcript's strand. + match strand { + Strand::Plus => { + consequences |= Consequence::SpliceAcceptorVariant; + } + Strand::Minus => { + consequences |= Consequence::SpliceDonorVariant; + } + _ => unreachable!("invalid strand: {}", alignment.strand), + } + } + + // Check the case where the variant overlaps with the splice region (1-3 bases in exon + // or 3-8 bases in intron). + // We have to check all cases independently and not with `else` + // because the variant may be larger. + if var_overlaps(intron_start + 2, intron_start + 8) + || var_overlaps(intron_end - 8, intron_end - 2) + { + consequences |= Consequence::SpliceRegionVariant; + } + + // Check the case where the variant overlaps with the polypyrimidine tract. + // (A sequence variant that falls in the polypyrimidine tract at 3' end of intron between 17 and 3 bases from the end (acceptor -3 to acceptor -17)) + if strand == Strand::Plus && var_overlaps(intron_end - 17, intron_end - 2) { + consequences |= Consequence::SplicePolypyrimidineTractVariant; + } + if strand == Strand::Minus && var_overlaps(intron_start + 2, intron_start + 17) { + consequences |= Consequence::SplicePolypyrimidineTractVariant; + } + + // Check conditions for splice_donor_region_variant + // (A sequence variant that falls in the region between the 3rd and 6th base after splice junction (5' end of intron)) + if strand == Strand::Plus && var_overlaps(intron_start + 2, intron_start + 6) { + consequences |= Consequence::SpliceDonorRegionVariant; + } + if strand == Strand::Minus && var_overlaps(intron_end - 6, intron_end - 2) { + consequences |= Consequence::SpliceDonorRegionVariant; + } + + // Check conditions for splice_donor_5th_base_variant + // (A sequence variant that causes a change at the 5th base pair after the start of the intron in the orientation of the transcript.) + if strand == Strand::Plus && var_overlaps(intron_start + 4, intron_start + 5) { + consequences |= Consequence::SpliceDonorFifthBaseVariant; + } + if strand == Strand::Minus && var_overlaps(intron_end - 5, intron_end - 4) { + consequences |= Consequence::SpliceDonorFifthBaseVariant; + } + + consequences + } + + fn analyze_cds_variant( + var_c: &HgvsVariant, + is_exonic: bool, + is_intronic: bool, + _conservative: bool, + ) -> Consequences { + let mut consequences: Consequences = Consequences::empty(); + + if let HgvsVariant::CdsVariant { loc_edit, .. } = &var_c { + // Handle the cases where the variant touches the start or stop codon based on `var_c` + // coordinates. The cases where the start/stop codon is touched by the variant + // directly is handled above based on the `var_p` prediction. + let loc = loc_edit.loc.inner(); + let _edit = loc_edit.edit.inner(); + let start_base = loc.start.base; + let start_cds_from = loc.start.cds_from; + // let end_base = loc.end.base; + let end_cds_from = loc.end.cds_from; + + // The variables below mean "VARIANT_{starts,stops}_{left,right}_OF_{start,stop}_CODON". + // + // start codon + let starts_left_of_start = start_cds_from == CdsFrom::Start && start_base < 0; + let ends_right_of_start = start_cds_from != CdsFrom::Start || start_base > 0; + if starts_left_of_start && ends_right_of_start { + consequences |= Consequence::StartLost; + } + // stop codon + let starts_left_of_stop = start_cds_from == CdsFrom::Start; + let ends_right_of_stop = end_cds_from == CdsFrom::End; + if starts_left_of_stop && ends_right_of_stop { + consequences |= Consequence::StopLost; + } + + // Detect variants affecting the 5'/3' UTRs. + if start_cds_from == CdsFrom::Start { + if start_base < 0 { + if is_intronic { + consequences |= Consequence::FivePrimeUtrIntronVariant; + } + if is_exonic { + consequences |= Consequence::FivePrimeUtrExonVariant; + } + } + } else if end_cds_from == CdsFrom::End { + if is_intronic { + consequences |= Consequence::ThreePrimeUtrIntronVariant; + } + if is_exonic { + consequences |= Consequence::ThreePrimeUtrExonVariant; + } + } + } else { + panic!("Must be CDS variant: {}", &var_c) + }; + consequences + } + + fn analyze_protein_variant( + var_p: &HgvsVariant, + protein_pos: &Option, + conservative: bool, + ) -> Consequences { + let mut consequences: Consequences = Consequences::empty(); + + // TODO move to hgvs-rs library as method of `ProtPos` or similar + fn is_stop(s: &str) -> bool { + s == "X" || s == "Ter" || s == "*" + } + + fn has_stop(s: &str) -> bool { + s.contains('*') || s.contains('X') || s.contains("Ter") + } + + match var_p { + HgvsVariant::ProtVariant { loc_edit, .. } => match loc_edit { + ProtLocEdit::Ordinary { loc, edit } => { + let loc = loc.inner(); + match edit.inner() { + ProteinEdit::Fs { .. } => { + consequences |= Consequence::FrameshiftVariant; + } + ProteinEdit::Ext { .. } => { + consequences |= Consequence::StopLost; + consequences |= Consequence::FeatureElongation; + } + ProteinEdit::Subst { alternative } => { + if alternative.is_empty() { + consequences |= Consequence::SynonymousVariant; + } else if is_stop(alternative) { + if loc.start == loc.end && is_stop(&loc.start.aa) { + consequences |= Consequence::StopRetainedVariant; + } else { + consequences |= Consequence::StopGained; + // if the substitution happens right before the stop codon + // and if it is a conservative change + // then it is not a stop gained + // cf. 1:43450470:GCCT:G, ENST00000634258.3:c.10294_10296del/p.Leu3432Ter + if let Some(ref p) = protein_pos { + if p.total.is_some_and(|t| p.ord == t - 1) && conservative { + consequences &= !Consequence::StopGained; + consequences |= + Consequence::ConservativeInframeDeletion; + } + } + } + } else { + consequences |= Consequence::MissenseVariant; + } + } + ProteinEdit::DelIns { alternative } => { + if conservative { + consequences |= Consequence::ConservativeInframeDeletion; + } else { + consequences |= Consequence::DisruptiveInframeDeletion; + } + + if has_stop(alternative) { + consequences |= Consequence::StopGained; + } + } + ProteinEdit::Ins { .. } | ProteinEdit::Dup => { + if conservative { + consequences |= Consequence::ConservativeInframeInsertion; + } else { + consequences |= Consequence::DisruptiveInframeInsertion; + } + } + ProteinEdit::Del => { + if conservative { + consequences |= Consequence::ConservativeInframeDeletion; + } else { + consequences |= Consequence::DisruptiveInframeDeletion; + } + } + ProteinEdit::Ident => { + consequences |= Consequence::SynonymousVariant; + } + }; + } + ProtLocEdit::NoChange | ProtLocEdit::NoChangeUncertain => { + consequences |= Consequence::SynonymousVariant; + } + ProtLocEdit::InitiationUncertain => { + consequences |= Consequence::StartLost; + } + ProtLocEdit::NoProtein | ProtLocEdit::NoProteinUncertain | ProtLocEdit::Unknown => { + } + }, + _ => panic!("Must be protein variant: {}", &var_p), + } + consequences + } + fn get_var_g(var: &VcfVariant, chrom_acc: &str) -> HgvsVariant { let chrom_acc = chrom_acc.to_string(); HgvsVariant::GenomeVariant { @@ -991,6 +1211,32 @@ impl ConsequencePredictor { } } +fn is_conservative_cds_variant(var_c: &HgvsVariant) -> bool { + match var_c { + HgvsVariant::CdsVariant { loc_edit, .. } => { + // Handle the cases where the variant touches the start or stop codon based on `var_c` + // coordinates. The cases where the start/stop codon is touched by the variant + // directly is handled elsewhere based on the `var_p` prediction. + let loc = loc_edit.loc.inner(); + let start_base = loc.start.base; + let start_cds_from = loc.start.cds_from; + let end_base = loc.end.base; + let end_cds_from = loc.end.cds_from; + // The range is "conservative" (regarding deletions and insertions) if + // it does not start or end within codons. + start_cds_from == CdsFrom::Start + && end_cds_from == CdsFrom::Start + && start_base % 3 == 1 + && (end_base + 1) % 3 == 1 + } + _ => panic!("Expected CdsVariant, got {:#?}", var_c), + } +} + +fn overlaps(var_start: i32, var_end: i32, exon_intron_start: i32, exon_intron_end: i32) -> bool { + (var_start < exon_intron_end) && (var_end > exon_intron_start) +} + impl ConsequencePredictor { /// Return data version string (if set). pub fn data_version(&self) -> Option { @@ -1000,16 +1246,20 @@ impl ConsequencePredictor { #[cfg(test)] mod test { - use std::{fs::File, io::BufReader}; - + use super::*; + use crate::annotate::seqvars::provider::ConfigBuilder as MehariProviderConfigBuilder; + use crate::annotate::seqvars::{ + load_tx_db, run_with_writer, Args, AsyncAnnotatedVariantWriter, PathOutput, + TranscriptPickType, + }; + use crate::common::noodles::{open_variant_reader, open_variant_writer, NoodlesVariantReader}; use csv::ReaderBuilder; + use futures::TryStreamExt; use pretty_assertions::assert_eq; use serde::Deserialize; - - use crate::annotate::seqvars::provider::ConfigBuilder as MehariProviderConfigBuilder; - use crate::annotate::seqvars::{load_tx_db, TranscriptPickType}; - - use super::*; + use std::path::Path; + use std::{fs::File, io::BufReader}; + use tempfile::NamedTempFile; #[test] fn test_sync() { @@ -1456,6 +1706,65 @@ mod test { Ok(()) } + /// This is a set of variants where VEP and mehari to disagree, + /// i.e. interesting/edge cases that are not as clear-cut as others. + /// + /// This test ensures we do not regress on these cases. + #[tokio::test] + async fn annotate_vep_disagreement_cases() -> Result<(), anyhow::Error> { + let tx_path = + "tests/data/annotate/db/grch38/GRCh38-ensembl.disagreement-subset.txs.bin.zst"; + + let path_input_vcf = "tests/data/annotate/seqvars/vep.disagreement-cases.vcf"; + let expected_vcf = "tests/data/annotate/seqvars/vep.disagreement-cases.expected.vcf"; + let output = NamedTempFile::new()?; + let mut writer = open_variant_writer(output.as_ref()).await?; + run_with_writer( + &mut writer, + &Args { + genome_release: None, + path_input_ped: None, + path_input_vcf: path_input_vcf.into(), + output: PathOutput { + path_output_vcf: Some(output.as_ref().to_str().unwrap().into()), + path_output_tsv: None, + }, + transcript_source: Default::default(), + report_most_severe_consequence_by: Some(ConsequenceBy::Allele), + pick_transcript: vec![TranscriptPickType::ManeSelect], + pick_transcript_mode: Default::default(), + max_var_count: None, + hgnc: None, + sources: crate::annotate::seqvars::Sources { + transcripts: Some(vec![tx_path.into()]), + frequencies: None, + clinvar: None, + }, + }, + ) + .await?; + writer.shutdown().await?; + + let records_written = read_vcf(output).await?; + let records_expected = read_vcf(expected_vcf).await?; + assert_eq!(records_written, records_expected); + + Ok(()) + } + + async fn read_vcf( + path: impl AsRef, + ) -> Result, anyhow::Error> { + let mut output_reader = open_variant_reader(path.as_ref()).await?; + let header = output_reader.read_header().await?; + let mut record_iter = output_reader.records(&header).await; + let mut records = Vec::new(); + while let Some(record) = record_iter.try_next().await? { + records.push(record); + } + Ok(records) + } + #[derive(Debug, Deserialize)] struct Record { pub var: String, @@ -1603,117 +1912,111 @@ mod test { for ann in anns.iter().filter(|ann| ann.feature_id == record.tx) { // We perform a comparison based on strings because we may not be able to parse out // all consequences from the other tool. - let record_csqs = record - .csq - .split('&') - .map(|s| s.to_string()) - .collect::>(); + let record_csqs = record.csq.split('&').collect::>(); let highest_impact = ann.consequences.first().unwrap().impact(); - let mut expected_one_of = ann + let expected_one_of = ann .consequences .iter() .filter(|csq| csq.impact() == highest_impact) .map(|csq| csq.to_string()) .collect::>(); + let mut expected_one_of = expected_one_of + .iter() + .map(|s| s.as_str()) + .collect::>(); // Map effects a bit for VEP. - if path_tsv.ends_with(".vep.tsv") - && (expected_one_of.contains(&String::from("disruptive_inframe_deletion")) - || expected_one_of - .contains(&String::from("conservative_inframe_deletion"))) + if path_tsv.contains(".vep") + && (expected_one_of.contains(&"disruptive_inframe_deletion") + || expected_one_of.contains(&"conservative_inframe_deletion")) { - expected_one_of.push(String::from("inframe_deletion")); + expected_one_of.push("inframe_deletion"); } // Try to find a direct match. let found_one = record_csqs.iter().any(|csq| expected_one_of.contains(csq)); + + // vep sometimes only reports a coding_sequence_variant, so we accept anything + let found_one = found_one + || path_tsv.contains(".vep") + && (record_csqs == ["coding_sequence_variant"] + && !expected_one_of.is_empty()); + // It is common that the other tool predicts a frameshift variant while the actual prediction // is stop_gained or stop_lost. We thus also check for this case and allow it. let found_one = found_one - || (record_csqs.contains(&String::from("frameshift_variant")) - && (expected_one_of.contains(&String::from("stop_gained"))) - || expected_one_of.contains(&String::from("stop_lost"))); + || (record_csqs.contains(&"frameshift_variant") + && (expected_one_of.contains(&"stop_gained")) + || expected_one_of.contains(&"stop_lost")); // VEP does not differentiate between disruptive and conservative inframe deletions and insertions. let found_one = found_one - || (record_csqs.contains(&String::from("inframe_deletion")) - && (expected_one_of - .contains(&String::from("disruptive_inframe_deletion"))) - || expected_one_of - .contains(&String::from("conservative_inframe_deletion"))) - || (record_csqs.contains(&String::from("inframe_insertion")) - && (expected_one_of - .contains(&String::from("disruptive_inframe_insertion"))) - || expected_one_of - .contains(&String::from("conservative_inframe_insertion"))); + || (record_csqs.contains(&"inframe_deletion") + && (expected_one_of.contains(&"disruptive_inframe_deletion") + || expected_one_of.contains(&"conservative_inframe_deletion"))) + || (record_csqs.contains(&"inframe_insertion") + && (expected_one_of.contains(&"disruptive_inframe_insertion") + || expected_one_of.contains(&"conservative_inframe_insertion"))); // NB: We cannot predict 5_prime_UTR_premature_start_codon_gain_variant yet. For now, we // also accept 5_prime_UTR_variant. let found_one = found_one - || ((expected_one_of.contains(&String::from("5_prime_UTR_exon_variant")) - || expected_one_of - .contains(&String::from("5_prime_UTR_intron_variant"))) - && (record_csqs.contains(&String::from( - "5_prime_UTR_premature_start_codon_gain_variant", - )))); + || ((expected_one_of.contains(&"5_prime_UTR_exon_variant") + || expected_one_of.contains(&"5_prime_UTR_intron_variant")) + && (record_csqs + .contains(&"5_prime_UTR_premature_start_codon_gain_variant"))); // VEP predicts `splice_donor_5th_base_variant` rather than `splice_region_variant`. // Same for `splice_donor_region_variant`. let found_one = found_one - || (expected_one_of.contains(&String::from("splice_region_variant")) - && (record_csqs - .contains(&String::from("splice_donor_5th_base_variant")) - || record_csqs - .contains(&String::from("splice_donor_region_variant")))); + || (expected_one_of.contains(&"splice_region_variant") + && (record_csqs.contains(&"splice_donor_5th_base_variant") + || record_csqs.contains(&"splice_donor_region_variant"))); // In the case of insertions at the end of an exon, VEP predicts `splice_region_variant` // while we predict `splice_donor_variant`, same for start. let found_one = found_one - || (expected_one_of.contains(&String::from("splice_donor_variant")) - || expected_one_of.contains(&String::from("splice_acceptor_variant"))) - && (record_csqs.contains(&String::from("splice_region_variant"))); + || (expected_one_of.contains(&"splice_donor_variant") + || expected_one_of.contains(&"splice_acceptor_variant")) + && (record_csqs.contains(&"splice_region_variant")); // VEP sometimes mispredicts disruptive inframe deletion as missense... // cf. https://github.com/Ensembl/ensembl-vep/issues/1388 let found_one = found_one - || expected_one_of.contains(&String::from("disruptive_inframe_deletion")) - && (record_csqs.contains(&String::from("missense_variant"))); + || expected_one_of.contains(&"disruptive_inframe_deletion") + && (record_csqs.contains(&"missense_variant")); // VEP does not provide `exon_loss_variant`, so we also accept `inframe_deletion` and // `splice_region_variant` (BRA1 test case). let found_one = found_one - || expected_one_of.contains(&String::from("exon_loss_variant")) - && (record_csqs.contains(&String::from("inframe_deletion")) - || record_csqs.contains(&String::from("splice_region_variant"))); + || expected_one_of.contains(&"exon_loss_variant") + && (record_csqs.contains(&"inframe_deletion") + || record_csqs.contains(&"splice_region_variant")); // On BRCA1, there is a case where VEP predicts `protein_altering_variant` rather than // `disruptive_inframe_deletion`. We accept this as well. let found_one = found_one - || (expected_one_of.contains(&String::from("disruptive_inframe_deletion")) - || expected_one_of.contains(&String::from("inframe_indel"))) - && (record_csqs.contains(&String::from("protein_altering_variant"))); + || (expected_one_of.contains(&"disruptive_inframe_deletion") + || expected_one_of.contains(&"inframe_indel")) + && (record_csqs.contains(&"protein_altering_variant")); // In the case of `GRCh37:17:41258543:T:TA`, the `hgvs` prediction is `c.-1_1insT` and // `p.Met1?` which leads to `start_lost` while VEP predicts `5_prime_UTR_variant`. // This may be a bug in `hgvs` and we don't change this for now. We accept the call // by VEP, of course. let found_one = found_one - || expected_one_of.contains(&String::from("start_lost")) - && (record_csqs.contains(&String::from("5_prime_UTR_variant"))); + || expected_one_of.contains(&"start_lost") + && (record_csqs.contains(&"5_prime_UTR_variant")); // We have specialized {5,3}_prime_UTR_{exon,intron}_variant handling, while // vep and snpEff do not let found_one = found_one - || record_csqs.contains(&String::from("5_prime_UTR_variant")) - && (expected_one_of - .contains(&String::from("5_prime_UTR_exon_variant")) - || expected_one_of - .contains(&String::from("5_prime_UTR_intron_variant"))); + || record_csqs.contains(&"5_prime_UTR_variant") + && (expected_one_of.contains(&"5_prime_UTR_exon_variant") + || expected_one_of.contains(&"5_prime_UTR_intron_variant")); let found_one = found_one - || record_csqs.contains(&String::from("3_prime_UTR_variant")) - && (expected_one_of - .contains(&String::from("3_prime_UTR_exon_variant")) - || expected_one_of - .contains(&String::from("3_prime_UTR_intron_variant"))); + || record_csqs.contains(&"3_prime_UTR_variant") + && (expected_one_of.contains(&"3_prime_UTR_exon_variant") + || expected_one_of.contains(&"3_prime_UTR_intron_variant")); // an inframe_indel can be a missense_variant if it is an MNV (which we do not explicitly check here) let found_one = found_one - || expected_one_of.contains(&String::from("inframe_indel")) - && (record_csqs.contains(&String::from("missense_variant"))); + || expected_one_of.contains(&"inframe_indel") + && (record_csqs.contains(&"missense_variant")); // inframe_indel also is a superclass of *_inframe_{deletion, insertion} let found_one = found_one - || expected_one_of.contains(&String::from("inframe_indel")) + || expected_one_of.contains(&"inframe_indel") && [ "disruptive_inframe_deletion", "conservative_inframe_deletion", @@ -1723,45 +2026,42 @@ mod test { "inframe_insertion", ] .iter() - .any(|c| record_csqs.contains(&String::from(*c))); + .any(|c| record_csqs.contains(c)); // SnpEff has a different interpretation of disruptive/conservative inframe deletions. // We thus allow both. let found_one = found_one - || expected_one_of.contains(&String::from("disruptive_inframe_deletion")) - && (record_csqs - .contains(&String::from("conservative_inframe_deletion"))) - || expected_one_of.contains(&String::from("disruptive_inframe_insertion")) - && (record_csqs - .contains(&String::from("conservative_inframe_insertion"))); + || expected_one_of.contains(&"disruptive_inframe_deletion") + && (record_csqs.contains(&"conservative_inframe_deletion")) + || expected_one_of.contains(&"disruptive_inframe_insertion") + && (record_csqs.contains(&"conservative_inframe_insertion")); // SnpEff may not predict `splice_region_variant` for 5' UTR correctly, so we // allow this. let found_one = found_one - || expected_one_of.contains(&String::from("splice_region_variant")) - && (record_csqs.contains(&String::from("5_prime_UTR_variant"))); + || expected_one_of.contains(&"splice_region_variant") + && (record_csqs.contains(&"5_prime_UTR_variant")); // SnpEff does not predict `splice_polypyrimidine_tract_variant` let found_one = found_one - || expected_one_of - .contains(&String::from("splice_polypyrimidine_tract_variant")) - && (record_csqs.contains(&String::from("splice_region_variant")) - || record_csqs.contains(&String::from("intron_variant"))); + || expected_one_of.contains(&"splice_polypyrimidine_tract_variant") + && (record_csqs.contains(&"splice_region_variant") + || record_csqs.contains(&"intron_variant")); // For `GRCh37:3:193366573:A:ATATTGCCTAGAATGAACT`, SnpEff predicts // `stop_gained` while this rather is a intron variant. We skip this variant. let found_one = found_one - || record_csqs.contains(&String::from("stop_gained")) + || record_csqs.contains(&"stop_gained") && record.var == "3-193366573-A-ATATTGCCTAGAATGAACT"; // For `GRCh37:3:193409913:ATAAAT:A`, there appears to be a model error // in SnpEff as it predicts `exon_loss`. We skip this variant. let found_one = found_one - || record_csqs.contains(&String::from("exon_loss_variant")) + || record_csqs.contains(&"exon_loss_variant") && record.var == "3-193409913-ATAAAT-A"; // SnpEff may predict `pMet1.?` as `initiator_codon_variant` rather than `start_lost`. let found_one = found_one - || expected_one_of.contains(&String::from("start_lost")) - && (record_csqs.contains(&String::from("initiator_codon_variant"))); + || expected_one_of.contains(&"start_lost") + && (record_csqs.contains(&"initiator_codon_variant")); // Similarly, SnpEff may predict `c.-1_1` as `start_retained` rather than `start_lost`. let found_one = found_one - || expected_one_of.contains(&String::from("start_lost")) - && (record_csqs.contains(&String::from("start_retained_variant"))); + || expected_one_of.contains(&"start_lost") + && (record_csqs.contains(&"start_retained_variant")); assert!( found_one, diff --git a/src/annotate/seqvars/snapshots/mehari__annotate__seqvars__csq__test__annotate_snv_brca1_one_variant@17-41197818-G-C.snap b/src/annotate/seqvars/snapshots/mehari__annotate__seqvars__csq__test__annotate_snv_brca1_one_variant@17-41197818-G-C.snap index 80f398d7..4a50aa78 100644 --- a/src/annotate/seqvars/snapshots/mehari__annotate__seqvars__csq__test__annotate_snv_brca1_one_variant@17-41197818-G-C.snap +++ b/src/annotate/seqvars/snapshots/mehari__annotate__seqvars__csq__test__annotate_snv_brca1_one_variant@17-41197818-G-C.snap @@ -6,6 +6,7 @@ expression: res Alt: alternative: C consequences: + - splice_region_variant - synonymous_variant putative_impact: low gene_symbol: BRCA1 @@ -38,6 +39,7 @@ expression: res Alt: alternative: C consequences: + - splice_region_variant - synonymous_variant putative_impact: low gene_symbol: BRCA1 @@ -69,6 +71,7 @@ expression: res Alt: alternative: C consequences: + - splice_region_variant - synonymous_variant putative_impact: low gene_symbol: BRCA1 @@ -101,6 +104,7 @@ expression: res alternative: C consequences: - missense_variant + - splice_region_variant putative_impact: moderate gene_symbol: BRCA1 gene_id: "HGNC:1100" @@ -131,6 +135,7 @@ expression: res Alt: alternative: C consequences: + - splice_region_variant - synonymous_variant putative_impact: low gene_symbol: BRCA1 diff --git a/src/annotate/seqvars/snapshots/mehari__annotate__seqvars__csq__test__annotate_snv_brca1_one_variant@17-41197819-G-C.snap b/src/annotate/seqvars/snapshots/mehari__annotate__seqvars__csq__test__annotate_snv_brca1_one_variant@17-41197819-G-C.snap index 61a05ee5..1528da32 100644 --- a/src/annotate/seqvars/snapshots/mehari__annotate__seqvars__csq__test__annotate_snv_brca1_one_variant@17-41197819-G-C.snap +++ b/src/annotate/seqvars/snapshots/mehari__annotate__seqvars__csq__test__annotate_snv_brca1_one_variant@17-41197819-G-C.snap @@ -7,6 +7,7 @@ expression: res alternative: C consequences: - missense_variant + - splice_region_variant putative_impact: moderate gene_symbol: BRCA1 gene_id: "HGNC:1100" @@ -39,6 +40,7 @@ expression: res alternative: C consequences: - missense_variant + - splice_region_variant putative_impact: moderate gene_symbol: BRCA1 gene_id: "HGNC:1100" @@ -70,6 +72,7 @@ expression: res alternative: C consequences: - missense_variant + - splice_region_variant putative_impact: moderate gene_symbol: BRCA1 gene_id: "HGNC:1100" @@ -101,6 +104,7 @@ expression: res alternative: C consequences: - missense_variant + - splice_region_variant putative_impact: moderate gene_symbol: BRCA1 gene_id: "HGNC:1100" @@ -132,6 +136,7 @@ expression: res alternative: C consequences: - missense_variant + - splice_region_variant putative_impact: moderate gene_symbol: BRCA1 gene_id: "HGNC:1100" diff --git a/tests/data/annotate/db/grch38/GRCh38-ensembl.disagreement-subset.txs.bin.zst b/tests/data/annotate/db/grch38/GRCh38-ensembl.disagreement-subset.txs.bin.zst new file mode 100644 index 00000000..88aa2b7a --- /dev/null +++ b/tests/data/annotate/db/grch38/GRCh38-ensembl.disagreement-subset.txs.bin.zst @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aa87b2b8288870534d39df2827e7cbade04f6573cf87d78437fdba9c90cefe3d +size 263383 diff --git a/tests/data/annotate/seqvars/vep.disagreement-cases.expected.vcf b/tests/data/annotate/seqvars/vep.disagreement-cases.expected.vcf new file mode 100644 index 00000000..b4bc1e47 --- /dev/null +++ b/tests/data/annotate/seqvars/vep.disagreement-cases.expected.vcf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fc20efc1a7d9c7f75972c5a730b69d5c9cba1049ecf857e7630e54c87c9438c6 +size 17979 diff --git a/tests/data/annotate/seqvars/vep.disagreement-cases.vcf b/tests/data/annotate/seqvars/vep.disagreement-cases.vcf new file mode 100644 index 00000000..105969ab --- /dev/null +++ b/tests/data/annotate/seqvars/vep.disagreement-cases.vcf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e20b895794a14c9a8ef6d634db73496a9f5efd2c43a910aff179612fa33fddf +size 6663