diff --git a/Cargo.lock b/Cargo.lock index 7a0ac8a..17b0e5b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -15,22 +15,31 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.7.18" +version = "0.7.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e" dependencies = [ "memchr", ] +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "assert_cmd" -version = "1.0.8" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c98233c6673d8601ab23e77eb38f999c51100d46c5703b17288c57fddf3a1ffe" +checksum = "93ae1ddd39efd67689deb1979d80bad3bf7f2b09c6e6117c8d1f2443b5e2f83e" dependencies = [ "bstr", "doc-comment", - "predicates 2.1.1", + "predicates", "predicates-core", "predicates-tree", "wait-timeout", @@ -79,6 +88,12 @@ dependencies = [ "regex-automata", ] +[[package]] +name = "bumpalo" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d" + [[package]] name = "cc" version = "1.0.73" @@ -93,15 +108,17 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.19" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +checksum = "bfd4d1b31faaa3a89d7934dbded3111da0d2ef28e3ebccdb4f0179f5929d1ef1" dependencies = [ - "libc", + "iana-time-zone", + "js-sys", "num-integer", "num-traits", "serde", "time", + "wasm-bindgen", "winapi", ] @@ -132,37 +149,29 @@ dependencies = [ [[package]] name = "console" -version = "0.14.1" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3993e6445baa160675931ec041a5e03ca84b9c6e32a056150d3aa2bdda0a1f45" +checksum = "89eab4d20ce20cea182308bca13088fecea9c05f6776cf287205d41a0ed3c847" dependencies = [ "encode_unicode", - "lazy_static", "libc", - "regex", + "once_cell", "terminal_size 0.1.17", "unicode-width", "winapi", ] [[package]] -name = "console" -version = "0.15.0" +name = "core-foundation-sys" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28b32d32ca44b70c3e4acd7db1babf555fa026e385fb95f18028f88848b3c31" -dependencies = [ - "encode_unicode", - "libc", - "once_cell", - "terminal_size 0.1.17", - "winapi", -] +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" [[package]] name = "crossbeam-channel" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c02a4d71819009c192cf4872265391563fd6a84c81ff2c0f2a7026ca4c1d85c" +checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" dependencies = [ "cfg-if", "crossbeam-utils", @@ -170,9 +179,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" +checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" dependencies = [ "cfg-if", "crossbeam-epoch", @@ -181,9 +190,9 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07db9d94cbd326813772c968ccd25999e5f8ae22f4f8d1b11effa37ef6ce281d" +checksum = "045ebe27666471bb549370b4b0b3e51b07f56325befa4284db65fc89c02511b1" dependencies = [ "autocfg", "cfg-if", @@ -195,9 +204,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d82ee10ce34d7bc12c2122495e7593a9c41347ecdd64185af4ecf72cb1a7f83" +checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc" dependencies = [ "cfg-if", "once_cell", @@ -205,9 +214,9 @@ dependencies = [ [[package]] name = "ctor" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f877be4f7c9f246b183111634f75baa039715e3f46ce860677d3b19a69fb229c" +checksum = "cdffe87e1d521a10f9696f833fe502293ea446d7f256c06128293a4119bdf4cb" dependencies = [ "quote", "syn", @@ -219,12 +228,6 @@ version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" -[[package]] -name = "difference" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" - [[package]] name = "difflib" version = "0.4.0" @@ -239,9 +242,9 @@ checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" [[package]] name = "either" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f107b87b6afc2a64fd13cac55fe06d6c8859f12d4b14cbcdd2c67d0976781be" +checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" [[package]] name = "encode_unicode" @@ -251,9 +254,9 @@ checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" [[package]] name = "env_logger" -version = "0.8.4" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3" +checksum = "c90bf5f19754d10198ccb95b70664fc925bd1fc090a0fd9a6ebc54acc8cd6272" dependencies = [ "atty", "humantime", @@ -285,9 +288,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" +checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" dependencies = [ "instant", ] @@ -300,15 +303,17 @@ dependencies = [ "bincode", "chrono", "clap", - "console 0.14.1", + "console", "env_logger", "float-cmp", "hash_hasher", - "hashbrown 0.11.2", + "hashbrown", "indicatif", "itertools", - "predicates 1.0.8", + "ordered-float", + "predicates", "pretty_assertions", + "priority-queue", "rayon", "serde", "serde_json", @@ -320,9 +325,9 @@ dependencies = [ [[package]] name = "float-cmp" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1267f4ac4f343772758f7b1bdcbe767c218bbab93bb432acbf5162bbf85a6c4" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" dependencies = [ "num-traits", ] @@ -346,21 +351,15 @@ checksum = "74721d007512d0cb3338cd20f0654ac913920061a4c4d0d8708edb3f2a698c0c" [[package]] name = "hashbrown" -version = "0.11.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ "ahash", "rayon", "serde", ] -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - [[package]] name = "hermit-abi" version = "0.1.19" @@ -376,6 +375,19 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +[[package]] +name = "iana-time-zone" +version = "0.1.49" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bbaead50122b06e9a973ac20bc7445074d99ad9a0a0654934876908a9cec82c" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "js-sys", + "wasm-bindgen", + "winapi", +] + [[package]] name = "indexmap" version = "1.9.1" @@ -383,20 +395,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" dependencies = [ "autocfg", - "hashbrown 0.12.3", + "hashbrown", ] [[package]] name = "indicatif" -version = "0.16.2" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d207dc617c7a380ab07ff572a6e52fa202a2a8f355860ac9c38e23f8196be1b" +checksum = "bfddc9561e8baf264e0e45e197fd7696320026eb10a8180340debc27b18f535b" dependencies = [ - "console 0.15.0", - "lazy_static", + "console", "number_prefix", "rayon", - "regex", + "unicode-width", ] [[package]] @@ -416,18 +427,27 @@ checksum = "1ea37f355c05dde75b84bba2d767906ad522e97cd9e2eef2be7a4ab7fb442c06" [[package]] name = "itertools" -version = "0.10.3" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" +checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754" + +[[package]] +name = "js-sys" +version = "0.3.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" +dependencies = [ + "wasm-bindgen", +] [[package]] name = "lazy_static" @@ -437,15 +457,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.126" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" - -[[package]] -name = "linked-hash-map" -version = "0.5.6" +version = "0.2.133" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" +checksum = "c0f80d65747a3e43d1596c7c5492d95d5edddaabd45a7fcdb02b95f644164966" [[package]] name = "linux-raw-sys" @@ -520,9 +534,18 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "once_cell" -version = "1.13.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1" +checksum = "e82dad04139b71a90c080c8463fe0dc7902db5192d939bd0950f074d014339e1" + +[[package]] +name = "ordered-float" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98ffdb14730ed2ef599c65810c15b000896e21e8776b512de0db0c3d7335cc2a" +dependencies = [ + "num-traits", +] [[package]] name = "os_str_bytes" @@ -539,19 +562,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "predicates" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f49cfaf7fdaa3bfacc6fa3e7054e65148878354a5cfddcf661df4c851f8021df" -dependencies = [ - "difference", - "float-cmp", - "normalize-line-endings", - "predicates-core", - "regex", -] - [[package]] name = "predicates" version = "2.1.1" @@ -559,8 +569,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a5aab5be6e4732b473071984b3164dbbfb7a3674d30ea5ff44410b6bcd960c3c" dependencies = [ "difflib", + "float-cmp", "itertools", + "normalize-line-endings", "predicates-core", + "regex", ] [[package]] @@ -591,20 +604,30 @@ dependencies = [ "yansi", ] +[[package]] +name = "priority-queue" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "815082d99af3acc75a3e67efd2a07f72e67b4e81b4344eb8ca34c6ebf3dfa9c5" +dependencies = [ + "autocfg", + "indexmap", +] + [[package]] name = "proc-macro2" -version = "1.0.40" +version = "1.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7" +checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" dependencies = [ "proc-macro2", ] @@ -635,9 +658,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.13" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ "bitflags", ] @@ -676,9 +699,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.35.9" +version = "0.35.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c825b8aa8010eb9ee99b75f05e10180b9278d161583034d7574c9d617aeada" +checksum = "af895b90e5c071badc3136fc10ff0bcfc98747eadbaf43ed8f214e07ba8f8477" dependencies = [ "bitflags", "errno", @@ -690,9 +713,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" +checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" [[package]] name = "same-file" @@ -711,18 +734,18 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "serde" -version = "1.0.139" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0171ebb889e45aa68b44aee0859b3eede84c6f5f5c228e6f140c0b2a0a46cad6" +checksum = "728eb6351430bccb993660dfffc5a72f91ccc1295abaa8ce19b27ebe4f75568b" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.139" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1d3230c1de7932af58ad8ffbe1d784bd55efd5a9d84ac24f69c72d83543dfb" +checksum = "81fa1584d3d1bcacd84c277a0dfe21f5b0f6accf4a23d04d4c6d61f1af522b4c" dependencies = [ "proc-macro2", "quote", @@ -731,9 +754,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.82" +version = "1.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82c2c1fdcd807d1098552c5b9a36e425e42e9fbd7c6a37a8425f390f781f7fa7" +checksum = "e55a28e3aaef9d5ce0506d0a14dbba8054ddc7e499ef522dd8b26859ec9d4a44" dependencies = [ "itoa", "ryu", @@ -742,23 +765,24 @@ dependencies = [ [[package]] name = "serde_test" -version = "1.0.139" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc933653ac6800dd970d54829f0646dcfd078bcaae7fbd19c6e58a584564a5de" +checksum = "9c17d2112159132660b4c5399e274f676fb75a2f8d70b7468f18f045b71138ed" dependencies = [ "serde", ] [[package]] name = "serde_yaml" -version = "0.8.26" +version = "0.9.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b" +checksum = "8613d593412a0deb7bbd8de9d908efff5a0cb9ccd8f62c641e7b2ed2f57291d1" dependencies = [ "indexmap", + "itoa", "ryu", "serde", - "yaml-rust", + "unsafe-libyaml", ] [[package]] @@ -769,9 +793,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" -version = "1.0.98" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" +checksum = "52205623b1b0f064a4e71182c3b18ae902267282930c6d5462c91b859668426e" dependencies = [ "proc-macro2", "quote", @@ -849,15 +873,21 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15c61ba63f9235225a22310255a29b806b907c9b8c964bcbd0a2c70f3f2deea7" +checksum = "dcc811dc4066ac62f84f11307873c4850cb653bfa9b1719cee2bd2204a4bc5dd" [[package]] name = "unicode-width" -version = "0.1.9" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" + +[[package]] +name = "unsafe-libyaml" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" +checksum = "c1e5fa573d8ac5f1a856f8d7be41d390ee973daf97c806b2c1a465e4e1406e68" [[package]] name = "version_check" @@ -897,6 +927,60 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasm-bindgen" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" + [[package]] name = "winapi" version = "0.3.9" @@ -971,15 +1055,6 @@ version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" -[[package]] -name = "yaml-rust" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" -dependencies = [ - "linked-hash-map", -] - [[package]] name = "yansi" version = "0.5.1" diff --git a/Cargo.toml b/Cargo.toml index da8048b..b2b8af0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,11 +7,7 @@ homepage = "https://github.com/erwinvaneijk/fbhash" repository = "https://github.com/erwinvaneijk/fbhash" description = "A Similarity Hashing Scheme for Digital Forensics" readme = "README.md" -keywords = [ - "filesystem", - "tool", - "forensics", -] +keywords = ["filesystem", "tool", "forensics"] license = "MIT" categories = ["command-line-utilities", "filesystem", "science"] @@ -31,15 +27,17 @@ codegen-units = 1 panic = "abort" [dependencies] -env_logger = "0.8.3" +env_logger = "0.9.1" itertools = "0.10.0" walkdir = "2" -serde_yaml = "0.8.17" +serde_yaml = "0.9.13" serde_json = "1.0" bincode = "~1.3.3" hash_hasher = "2.0" -console = "0.14.1" +console = "0.15.1" rayon = "1.5.0" +priority-queue = "1.2.3" +ordered-float = "3.1.0" [dependencies.chrono] version = "0.4.19" @@ -54,17 +52,17 @@ version = "1.0" features = ["derive"] [dependencies.indicatif] -version = "0.16.0" +version = "0.17.1" features = ["rayon"] [dependencies.hashbrown] -version = "0.11.2" +version = "0.12.3" features = ["serde", "rayon"] [dev-dependencies] pretty_assertions = "1.3.0" -float-cmp = "0.8.0" +float-cmp = "0.9.0" serde_test = "1.0" tempfile = "3" -assert_cmd = "1.0.3" -predicates = "1" +assert_cmd = "2.0.4" +predicates = "2.1.1" diff --git a/src/fbhash/chunker.rs b/src/fbhash/chunker.rs index 6c2ddc7..e49cc93 100644 --- a/src/fbhash/chunker.rs +++ b/src/fbhash/chunker.rs @@ -129,7 +129,7 @@ impl Iterator for ChunkIterator { } } } - Some(_) => { + Some(_) => { let mut b: Vec = vec![1]; match self.file.read(&mut b) { Ok(0) => None, diff --git a/src/fbhash/heap.rs b/src/fbhash/heap.rs deleted file mode 100644 index 3a97e9c..0000000 --- a/src/fbhash/heap.rs +++ /dev/null @@ -1,185 +0,0 @@ -// Copyright 2018, Abhishek N V -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the "Software"), -// to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, -// and/or sell copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -pub struct Heap<'a, T> { - data: Vec>, - capacity: usize, -} - -impl<'a, T> Heap<'a, T> { - pub fn new(capacity: usize) -> Self { - Self { - data: vec![None], - capacity, - } - } - - pub fn len(&self) -> usize { - self.data.len() - 1 - } - - pub fn insert(&mut self, f: f64, item: &'a T) { - if self.len() == 0 { - self.data.push(Some((f, item))); - return; - } else if self.len() < self.capacity { - self.data.push(Some((f, item))); - self.heapify(); - return; - } - if let Some(m) = self.get_max() { - if m > f { - self.extract_max(); - self.data.push(Some((f, item))); - self.heapify(); - } - } - } - - pub fn get_elements(&self) -> Vec<(f64, &T)> { - // let mut sorted = self.data[1..].to_vec().clone(); - let mut sorted = Vec::new(); - for i in 1..self.len() + 1 { - sorted.push(self.data[i].unwrap()) - } - sorted.sort_by(|a, b| a.0.partial_cmp(&b.0).unwrap()); - sorted - } - - pub fn get_max(&self) -> Option { - if self.len() == 0 { - None - } else { - Some(self.data[1].unwrap().0) - } - } - - fn at_idx(&self, idx: usize) -> f64 { - self.data[idx].unwrap().0 - } - - fn heapify(&mut self) { - let parent = |x: usize| -> usize { x / 2 }; - let mut l = self.data.len() - 1; - let mut p = parent(l); - while p > 0 && self.at_idx(p) < self.at_idx(l) { - self.data.swap(l, p); - l = p; - p = parent(l); - } - } - fn extract_max(&mut self) -> Option { - let m = self.get_max(); - if self.data.len() <= 2 { - self.data.pop(); - return m; - } - - // send the last element to the top - if let Some(x) = self.data.pop() { - self.data[1] = x; - } - // now rebalance - let mut idx = 1; - let mut child = idx * 2; - while (child < self.len() && self.at_idx(idx) < self.at_idx(child)) - || (child + 1 < self.len() && self.at_idx(idx) < self.at_idx(child + 1)) - { - if (child + 1 < self.len()) && (self.at_idx(child + 1) > self.at_idx(child)) { - child += 1; - } - self.data.swap(idx, child); - idx = child; - child = idx * 2; - } - m - } -} - -#[cfg(test)] -mod tests { - use super::*; - use pretty_assertions::assert_eq; - - #[test] - fn test_insert() { - let mut h = Heap::new(10); - for i in 0..6 { - h.insert(i as f64, &0); - } - - assert_eq!(h.len(), 6); - } - - #[test] - fn test_get_elements() { - let mut h = Heap::new(10); - h.insert(7.8, &0); - h.insert(98.78, &0); - h.insert(0.0, &0); - h.insert(1.0, &0); - - assert_eq!( - h.get_elements(), - vec![(0.0, &0), (1.0, &0), (7.8, &0), (98.78, &0)] - ); - } - - #[test] - fn test_extract_max() { - let mut h = Heap::new(10); - - h.insert(42.0, &0); - assert_eq!(h.len(), 1); - match h.extract_max() { - Some(x) => assert!(approx_eq!(f64, x, 42.0, epsilon = 0.0)), - None => panic!(), - } - assert_eq!(h.len(), 0); - - let v = vec![69.42, 34.26, 72.53, 14.69, 29.24, 89.00, 1.72, 94.44, 30.46]; - for i in v { - h.insert(i, &0); - } - - assert_eq!(h.len(), 9); - match h.extract_max() { - Some(x) => assert!(approx_eq!(f64, x, 94.44, epsilon = 0.0_f64)), - None => panic!(), - } - assert_eq!(h.len(), 8); - } - - #[test] - fn test_get_max() { - let mut h = Heap::new(10); - let v: Vec = vec![ - 69.42, 34.26, 72.53, 14.69, 29.24, 89.00, 1.72, 94.44, 30.46, 81.18, - ]; - for i in v { - h.insert(i, &0); - } - - match h.get_max() { - Some(x) => assert!(approx_eq!(f64, x, 94.44, ulps = 2)), - None => panic!(), - } - } -} diff --git a/src/fbhash/mod.rs b/src/fbhash/mod.rs index 40cd182..156fc19 100644 --- a/src/fbhash/mod.rs +++ b/src/fbhash/mod.rs @@ -1,11 +1,9 @@ pub mod chunker; -pub mod heap; - pub mod similarities; pub mod index; pub mod query; -pub mod utils; \ No newline at end of file +pub mod utils; diff --git a/src/fbhash/similarities.rs b/src/fbhash/similarities.rs index 997d113..9d6901c 100644 --- a/src/fbhash/similarities.rs +++ b/src/fbhash/similarities.rs @@ -18,16 +18,16 @@ // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +use crate::fbhash::chunker::ChunkIterator; use hashbrown::HashMap; use indicatif::ProgressBar; +use ordered_float::OrderedFloat; +use priority_queue::PriorityQueue; use serde::{Deserialize, Serialize}; use std::collections::{BTreeMap, BTreeSet}; use std::fs::File; use std::io; -use crate::fbhash::chunker::ChunkIterator; -use crate::fbhash::heap::Heap; - pub fn file_to_chunks(file: File) -> Vec { let chunk_iterator = ChunkIterator::new(file); let chunks: Vec = chunk_iterator.into_iter().map(|e| e.digest).collect(); @@ -260,22 +260,25 @@ pub fn ranked_search( k: usize, progress: &ProgressBar, ) -> Vec<(f64, Document)> { - let mut queue = Heap::new(k); + let mut queue = PriorityQueue::with_capacity(k); documents .iter() .map(|other_doc| { (other_doc, { progress.inc(1); - cosine_distance(&other_doc.digest, doc) + OrderedFloat(cosine_distance(&other_doc.digest, doc)) }) }) .for_each(|(d, score)| { - queue.insert(score, d); + queue.push(d, score); }); let mut result = Vec::new(); - for (similarity, doc) in queue.get_elements() { - result.push((similarity, doc.clone())); - } + queue + .into_sorted_iter() + .into_iter() + .for_each(|(doc, similarity)| { + result.push((similarity.into_inner(), doc.clone())); + }); result } diff --git a/src/fbhash/utils.rs b/src/fbhash/utils.rs index 915eccf..22dc07e 100644 --- a/src/fbhash/utils.rs +++ b/src/fbhash/utils.rs @@ -19,6 +19,7 @@ // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. use indicatif::{ProgressBar, ProgressStyle}; +use std::time::Duration; pub enum OutputFormat { Json, @@ -31,9 +32,10 @@ pub fn create_progress_bar(size: u64) -> ProgressBar { } else { ProgressBar::hidden() }; - let style = ProgressStyle::default_bar() - .template("[{elapsed_precise} {eta}] {bar:40.cyan/blue} {pos:>7}/{len:7} {msg}"); + //let style = ProgressStyle::default_bar() + // .template("[{elapsed_precise} {eta}] {bar:40.cyan/blue} {pos:>7}/{len:7} {msg}"); + let style = ProgressStyle::default_bar(); pb.set_style(style); - pb.set_draw_delta(size / 100); + pb.enable_steady_tick(Duration::from_secs(1)); pb }