diff --git a/.gitignore b/.gitignore index fe5bedc..1b36483 100644 --- a/.gitignore +++ b/.gitignore @@ -91,3 +91,4 @@ docs/_build/ .so .dll +_test diff --git a/Cargo.lock b/Cargo.lock index 04924ac..9c15d4f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.8.6" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", "getrandom", @@ -77,9 +77,9 @@ dependencies = [ [[package]] name = "argminmax" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "202108b46429b765ef483f8a24d5c46f48c14acfdacc086dd4ab6dddf6bcdbd2" +checksum = "52424b59d69d69d5056d508b260553afd91c57e21849579cd1f50ee8b8b88eaa" dependencies = [ "num-traits", ] @@ -115,7 +115,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.52", ] [[package]] @@ -126,7 +126,7 @@ checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.52", ] [[package]] @@ -179,9 +179,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" [[package]] name = "brotli" @@ -206,28 +206,28 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" [[package]] name = "bytemuck" -version = "1.14.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" +checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" +checksum = "4da9a32f3fed317401fa3c862968128267c3106685286e15d5aaa3d7389c2f60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.52", ] [[package]] @@ -244,9 +244,9 @@ checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "cc" -version = "1.0.83" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" dependencies = [ "jobserver", "libc", @@ -260,21 +260,21 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "8eaf5903dcbc0a39312feb77df2ff4c76387d591b9fc7b04a238dcf8bb62639a" dependencies = [ "android-tzdata", "iana-time-zone", "num-traits", - "windows-targets 0.48.5", + "windows-targets 0.52.4", ] [[package]] name = "chrono-tz" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91d7b79e99bfaa0d47da0687c43aa3b7381938a62ad3a6498599039321f660b7" +checksum = "d59ae0466b83e838b81a54256c39d5d7c20b9d7daa10510a242d9b75abd5936e" dependencies = [ "chrono", "chrono-tz-build", @@ -306,9 +306,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "crc32fast" @@ -321,56 +321,46 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.8" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.15" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", - "memoffset", - "scopeguard", ] [[package]] name = "crossbeam-queue" -version = "0.3.8" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.16" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" [[package]] name = "crossterm" @@ -378,7 +368,7 @@ version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "crossterm_winapi", "libc", "parking_lot", @@ -394,17 +384,23 @@ dependencies = [ "winapi", ] +[[package]] +name = "cusip" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12a2525debe63fd4756220e103a8200bf74d02b2367451964868aa48ad1d3376" + [[package]] name = "dyn-clone" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" [[package]] name = "either" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" [[package]] name = "enum_dispatch" @@ -415,7 +411,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.52", ] [[package]] @@ -523,7 +519,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.52", ] [[package]] @@ -558,9 +554,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "js-sys", @@ -583,9 +579,9 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "hashbrown" -version = "0.14.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ "ahash", "allocator-api2", @@ -600,9 +596,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.3.6" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hex" @@ -612,25 +608,25 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "home" -version = "0.5.5" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" dependencies = [ - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "iana-time-zone" -version = "0.1.58" +version = "0.1.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows-core 0.51.1", + "windows-core", ] [[package]] @@ -663,9 +659,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.1.0" +version = "2.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" dependencies = [ "equivalent", "hashbrown", @@ -691,9 +687,9 @@ checksum = "c397ca3ea05ad509c4ec451fea28b4771236a376ca1c69fd5143aae0cf8f93c4" [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "itoap" @@ -723,27 +719,27 @@ dependencies = [ [[package]] name = "jobserver" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.65" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] [[package]] name = "libc" -version = "0.2.150" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libm" @@ -773,9 +769,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "lz4" @@ -799,9 +795,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.6.4" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "memmap2" @@ -841,20 +837,20 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "wasi", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "multiversion" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2c7b9d7fe61760ce5ea19532ead98541f6b4c495d87247aff9826445cf6872a" +checksum = "c4851161a11d3ad0bf9402d90ffc3967bf231768bfd7aeb61755ad06dbf1a142" dependencies = [ "multiversion-macros", "target-features", @@ -862,9 +858,9 @@ dependencies = [ [[package]] name = "multiversion-macros" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26a83d8500ed06d68877e9de1dde76c1dbb83885dcdbda4ef44ccbc3fbda2ac8" +checksum = "79a74ddee9e0c27d2578323c13905793e91622148f138ba29738f9dddb835e90" dependencies = [ "proc-macro2", "quote", @@ -903,19 +899,18 @@ dependencies = [ [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", "num-traits", ] [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", "libm", @@ -942,9 +937,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "parking_lot" @@ -1046,9 +1041,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.27" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "planus" @@ -1061,9 +1056,9 @@ dependencies = [ [[package]] name = "polars" -version = "0.38.1" +version = "0.38.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a26ef94cfedd5915da990a0b4740cca17b5854bd44a8e8c741fe732c02aac37" +checksum = "d87445e8bc147ecd69f9c2347eb04d9ffddecddbd745e14df983a76ab16a344d" dependencies = [ "getrandom", "polars-arrow", @@ -1081,9 +1076,9 @@ dependencies = [ [[package]] name = "polars-arrow" -version = "0.38.1" +version = "0.38.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e71d30a9fa503bc3baaff3b4c48f08d402c442a50ea7fb9d475ce7b575425a" +checksum = "9d43b8f7aa78c9c158b9ca61246c425b4145b44ba96c948b8aea539b308c97e6" dependencies = [ "ahash", "atoi", @@ -1127,9 +1122,9 @@ dependencies = [ [[package]] name = "polars-compute" -version = "0.38.1" +version = "0.38.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26342dea46502e8a3322f484062869c2fa49185d512bce4fb44f350b559b4eae" +checksum = "2f6ac10fd22183c1ff65e4e423499dac1136416af16d608f26519ef29252a1fe" dependencies = [ "bytemuck", "either", @@ -1143,12 +1138,12 @@ dependencies = [ [[package]] name = "polars-core" -version = "0.38.1" +version = "0.38.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99e0885a8f1bd1f4d928f5eaa852825bf647b6b5e21e171b6af838f77b6565f3" +checksum = "bbd8653734085eaa028976b97d57ff9bbf78e582438b31f1916f828323e27211" dependencies = [ "ahash", - "bitflags 2.4.1", + "bitflags 2.4.2", "bytemuck", "chrono", "chrono-tz", @@ -1175,9 +1170,9 @@ dependencies = [ [[package]] name = "polars-error" -version = "0.38.1" +version = "0.38.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d259d905c17d8e8b2de1eadc94dc4186bf1d325f1be81b4087afea22a6f753d6" +checksum = "402eb509a2feca529eca47c2b6fbb1c50133149ee7b872be4111e8998f872060" dependencies = [ "polars-arrow-format", "regex", @@ -1187,9 +1182,9 @@ dependencies = [ [[package]] name = "polars-ffi" -version = "0.38.0" +version = "0.38.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9969f2e241140ae666ebabf56cb035666afc62aedd0de09edb933f771b0ff37" +checksum = "d56ff5c91a901f33e549593cb95fc60cbd8b342f0f2dbfc9e61882e785600360" dependencies = [ "polars-arrow", "polars-core", @@ -1197,9 +1192,9 @@ dependencies = [ [[package]] name = "polars-io" -version = "0.38.1" +version = "0.38.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45f694b918ba2ee7e6f13e8415598f94009c390a9e61c95e6b9c26c8fe1a1a54" +checksum = "6e4d3a2256f03a14aaf7abcb1c0c3c4bebec35d7a8e4f6582b37aa7608fa3d46" dependencies = [ "ahash", "async-trait", @@ -1232,12 +1227,12 @@ dependencies = [ [[package]] name = "polars-lazy" -version = "0.38.1" +version = "0.38.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e3b40272d24142bcecb2979b19ec8d8c1a14036cb3cea09ce8fb8a4a43bcde" +checksum = "72cbad937091f85e73c72aac845ed9388560eb7110ffbd8c4ffcb39f57dcf933" dependencies = [ "ahash", - "bitflags 2.4.1", + "bitflags 2.4.2", "glob", "once_cell", "polars-arrow", @@ -1255,9 +1250,9 @@ dependencies = [ [[package]] name = "polars-ops" -version = "0.38.1" +version = "0.38.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd5bad61c2fa1977eb65bb719f12d4f68b908edf1106b91b3ab9615f9df8843e" +checksum = "15ba4d4ffd2b84308c62b786f42d176be1d94c56a42a37336fd373a4dd835830" dependencies = [ "ahash", "argminmax", @@ -1285,9 +1280,9 @@ dependencies = [ [[package]] name = "polars-parquet" -version = "0.38.1" +version = "0.38.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06d84fb9b005a19ca523406df371d9329466ae87df48922d0d3d8955072502a4" +checksum = "0d60f130159e45a01e3be04e091447d25b99eaf54047dcc35e1e272dae51d3fa" dependencies = [ "ahash", "async-stream", @@ -1311,9 +1306,9 @@ dependencies = [ [[package]] name = "polars-pipe" -version = "0.38.1" +version = "0.38.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58097bef7208a5b833c4d832d948026854917b4a219d55ab1779eb36b59fac0f" +checksum = "ff3fc341a7dc9892560798756caed5e61299de26266b4fd1aab9a4f7dde55a11" dependencies = [ "crossbeam-channel", "crossbeam-queue", @@ -1336,9 +1331,9 @@ dependencies = [ [[package]] name = "polars-plan" -version = "0.38.1" +version = "0.38.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56493c0e13aaccfcae59985db34da30cd4893e57edc9715d8688c96d7e911d47" +checksum = "b6d488369d49b1e5ed47d80fc1063a1aee6488d3d2e95b03034c26125e6c4734" dependencies = [ "ahash", "bytemuck", @@ -1361,9 +1356,9 @@ dependencies = [ [[package]] name = "polars-row" -version = "0.38.1" +version = "0.38.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7def6f9fc14fbfc0550bad615a757f3e1d86c00983c5ff23166fcdf205438d51" +checksum = "d65278c78db5e2b12acab42b1362a8541bd73c716bb71799fb525a88c4839254" dependencies = [ "bytemuck", "polars-arrow", @@ -1373,9 +1368,9 @@ dependencies = [ [[package]] name = "polars-sql" -version = "0.38.1" +version = "0.38.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f9d7de9dca8170a20b6c4cb7bafaf724abe88e807646bc3c2e98f13a34a7c4c" +checksum = "fa0c3899dc60dbdb45c23198116fa254441062450dfcecc030761798de539afd" dependencies = [ "hex", "polars-arrow", @@ -1391,9 +1386,9 @@ dependencies = [ [[package]] name = "polars-time" -version = "0.38.1" +version = "0.38.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162c815c3cb0f859da40f056c8a0a9c4247900e1275702ae399192ea60acac2a" +checksum = "1bae6e6012718991ed0d192a85b7b568bef636c5e1027a05dc428892d270e33a" dependencies = [ "atoi", "chrono", @@ -1411,9 +1406,9 @@ dependencies = [ [[package]] name = "polars-utils" -version = "0.38.1" +version = "0.38.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fca7938ee789314ac92a0bf6c1c4e5eaeb5e428241df2519fd70f21dba49194" +checksum = "38411c9dce645036c796f473389a0368b2affa4d8d270d663146a02fbcbf9952" dependencies = [ "ahash", "bytemuck", @@ -1433,6 +1428,7 @@ dependencies = [ name = "polars_istr" version = "0.1.0" dependencies = [ + "cusip", "iban_validate", "isin", "jemallocator", @@ -1443,6 +1439,12 @@ dependencies = [ "url", ] +[[package]] +name = "portable-atomic" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -1451,24 +1453,25 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" -version = "0.20.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04e8453b658fe480c3e70c8ed4e3d3ec33eb74988bd186561b0cc66b85c3bc4b" +checksum = "53bdbb96d49157e65d45cc287af5f32ffadd5f4761438b527b055fb0d4bb8233" dependencies = [ "cfg-if", "indoc", "libc", "memoffset", "parking_lot", + "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", @@ -1477,9 +1480,9 @@ dependencies = [ [[package]] name = "pyo3-build-config" -version = "0.20.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a96fe70b176a89cff78f2fa7b3c930081e163d5379b4dcdf993e3ae29ca662e5" +checksum = "deaa5745de3f5231ce10517a1f5dd97d53e5a2fd77aa6b5842292085831d48d7" dependencies = [ "once_cell", "target-lexicon", @@ -1487,9 +1490,9 @@ dependencies = [ [[package]] name = "pyo3-ffi" -version = "0.20.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "214929900fd25e6604661ed9cf349727c8920d47deff196c4e28165a6ef2a96b" +checksum = "62b42531d03e08d4ef1f6e85a2ed422eb678b8cd62b762e53891c05faf0d4afa" dependencies = [ "libc", "pyo3-build-config", @@ -1497,26 +1500,27 @@ dependencies = [ [[package]] name = "pyo3-macros" -version = "0.20.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac53072f717aa1bfa4db832b39de8c875b7c7af4f4a6fe93cdbf9264cf8383b" +checksum = "7305c720fa01b8055ec95e484a6eca7a83c841267f0dd5280f0c8b8551d2c158" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", - "syn 2.0.48", + "syn 2.0.52", ] [[package]] name = "pyo3-macros-backend" -version = "0.20.0" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7774b5a8282bd4f25f803b1f0d945120be959a36c72e08e7cd031c792fdfd424" +checksum = "7c7e9b68bb9c3149c5b0cade5d07f953d6d125eb4337723c4ccdb665f1f96185" dependencies = [ "heck", "proc-macro2", + "pyo3-build-config", "quote", - "syn 2.0.48", + "syn 2.0.52", ] [[package]] @@ -1547,7 +1551,7 @@ dependencies = [ "polars-plan", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.52", ] [[package]] @@ -1605,7 +1609,7 @@ version = "11.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d86a7c4638d42c44551f4791a20e687dbb4c3de1f33c43dd71e355cd429def1" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", ] [[package]] @@ -1639,9 +1643,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.2" +version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick", "memchr", @@ -1651,9 +1655,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", @@ -1680,9 +1684,9 @@ checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "scopeguard" @@ -1698,9 +1702,9 @@ checksum = "a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4" [[package]] name = "serde" -version = "1.0.191" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a834c4821019838224821468552240d4d95d14e751986442c816572d39a080c9" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] @@ -1720,20 +1724,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.191" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46fa52d5646bce91b680189fe5b1c049d2ea38dabb4e2e7c8d00ca12cfbfbcfd" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.52", ] [[package]] name = "serde_json" -version = "1.0.108" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ "itoa", "ryu", @@ -1763,9 +1767,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.2" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "smartstring" @@ -1786,12 +1790,12 @@ checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" [[package]] name = "socket2" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -1846,7 +1850,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.48", + "syn 2.0.52", ] [[package]] @@ -1862,9 +1866,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.48" +version = "2.0.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" dependencies = [ "proc-macro2", "quote", @@ -1873,9 +1877,9 @@ dependencies = [ [[package]] name = "sysinfo" -version = "0.30.3" +version = "0.30.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba2dbd2894d23b2d78dae768d85e323b557ac3ac71a5d917a31536d8f77ebada" +checksum = "0c385888ef380a852a16209afc8cfad22795dd8873d69c9a14d2e2088f118d18" dependencies = [ "cfg-if", "core-foundation-sys", @@ -1887,34 +1891,34 @@ dependencies = [ [[package]] name = "target-features" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfb5fa503293557c5158bd215fdc225695e567a77e453f5d4452a50a193969bd" +checksum = "c1bbb9f3c5c463a01705937a24fdabc5047929ac764b2d5b9cf681c1f5041ed5" [[package]] name = "target-lexicon" -version = "0.12.12" +version = "0.12.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c39fd04924ca3a864207c66fc2cd7d22d7c016007f9ce846cbb9326331930a" +checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" [[package]] name = "thiserror" -version = "1.0.56" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.56" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.52", ] [[package]] @@ -1945,7 +1949,7 @@ dependencies = [ "num_cpus", "pin-project-lite", "socket2", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1984,18 +1988,18 @@ dependencies = [ [[package]] name = "unicode-reverse" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bea5dacebb0d2d0a69a6700a05b59b3908bf801bf563a49bd27a1b60122962c" +checksum = "4b6f4888ebc23094adfb574fdca9fdc891826287a6397d2cd28802ffd6f20c76" dependencies = [ "unicode-segmentation", ] [[package]] name = "unicode-segmentation" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" [[package]] name = "unicode-width" @@ -2043,9 +2047,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.88" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2053,24 +2057,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.88" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.52", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.88" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2078,22 +2082,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.88" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.52", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.88" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "winapi" @@ -2123,17 +2127,8 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" dependencies = [ - "windows-core 0.52.0", - "windows-targets 0.52.0", -] - -[[package]] -name = "windows-core" -version = "0.51.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" -dependencies = [ - "windows-targets 0.48.5", + "windows-core", + "windows-targets 0.52.4", ] [[package]] @@ -2142,7 +2137,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.4", ] [[package]] @@ -2154,6 +2149,15 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.4", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -2171,17 +2175,17 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "windows_aarch64_gnullvm 0.52.4", + "windows_aarch64_msvc 0.52.4", + "windows_i686_gnu 0.52.4", + "windows_i686_msvc 0.52.4", + "windows_x86_64_gnu 0.52.4", + "windows_x86_64_gnullvm 0.52.4", + "windows_x86_64_msvc 0.52.4", ] [[package]] @@ -2192,9 +2196,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" [[package]] name = "windows_aarch64_msvc" @@ -2204,9 +2208,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" [[package]] name = "windows_i686_gnu" @@ -2216,9 +2220,9 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" [[package]] name = "windows_i686_msvc" @@ -2228,9 +2232,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" [[package]] name = "windows_x86_64_gnu" @@ -2240,9 +2244,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" [[package]] name = "windows_x86_64_gnullvm" @@ -2252,9 +2256,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" [[package]] name = "windows_x86_64_msvc" @@ -2264,34 +2268,34 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" [[package]] name = "xxhash-rust" -version = "0.8.7" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9828b178da53440fa9c766a3d2f73f7cf5d0ac1fe3980c1e5018d899fd19e07b" +checksum = "927da81e25be1e1a2901d59b81b37dd2efd1fc9c9345a55007f09bf5a2d3ee03" [[package]] name = "zerocopy" -version = "0.7.25" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd369a67c0edfef15010f980c3cbe45d7f651deac2cd67ce097cd801de16557" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.25" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2f140bda219a26ccc0cdb03dba58af72590c53b22642577d88a927bc5c87d6b" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.52", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index f78bf1d..4ef5c8d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,6 +15,7 @@ pyo3-polars = {version = "0.12", features = ["derive"]} polars = {version = "0.38.1", features = ["performant", "lazy", "nightly", "parquet"]} iban_validate = "4.0.1" isin = "0.1.18" +cusip = "0.3.0" url = "2.5.0" [target.'cfg(any(not(target_os = "linux"), use_mimalloc))'.dependencies] diff --git a/python/polars_istr/__init__.py b/python/polars_istr/__init__.py index f2b0d5f..f560028 100644 --- a/python/polars_istr/__init__.py +++ b/python/polars_istr/__init__.py @@ -1,6 +1,7 @@ from .iban import IbanExt # noqa: E402 from .isin import IsinExt # noqa: E402 +from .cusip import CusipExt # noqa: E402 from .url import UrlExt # noqa: E402 __version__ = "0.1.0" -__all__ = ["IbanExt", "IsinExt", "UrlExt"] +__all__ = ["IbanExt", "IsinExt", "CusipExt", "UrlExt"] diff --git a/python/polars_istr/cusip.py b/python/polars_istr/cusip.py new file mode 100644 index 0000000..cdd3b57 --- /dev/null +++ b/python/polars_istr/cusip.py @@ -0,0 +1,149 @@ +from __future__ import annotations +import polars as pl +from polars.utils.udfs import _get_shared_lib_location + +_lib = _get_shared_lib_location(__file__) + + +@pl.api.register_expr_namespace("cusip") +class CusipExt: + """ + This class contains tools for parsing CUSIP/CINS and Extended CINS format data. + + Polars Namespace: cusip + + Example: pl.col("cusip_cins_string").cusip.country_code() + """ + + def __init__(self, expr: pl.Expr): + self._expr: pl.Expr = expr + + def extract_all(self) -> pl.Expr: + """ + Returns a struct containing country_code, issue_num, issuer_num, check_digit, + or null, if it cannot be parsed. + + Country Code is null for valid CUSIPs which are not (extended) CINS + """ + return self._expr.register_plugin( + lib=_lib, + symbol="pl_cusip_full", + is_elementwise=True, + ) + + def issue_num(self) -> pl.Expr: + """ + Returns the issue number from the CUSIP, or null if it cannot be parsed. + """ + return self._expr.register_plugin( + lib=_lib, + symbol="pl_cusip_issue_num", + is_elementwise=True, + ) + + def issuer_num(self) -> pl.Expr: + """ + Returns the issuer number from the CUSIP, or null if it cannot be parsed. + """ + return self._expr.register_plugin( + lib=_lib, + symbol="pl_cusip_issuer_num", + is_elementwise=True, + ) + + def check_digit(self) -> pl.Expr: + """ + Returns check digit from the CUSIP, or null if it cannot be parsed. + """ + return self._expr.register_plugin( + lib=_lib, + symbol="pl_cusip_check_digit", + is_elementwise=True, + ) + + def country_code(self) -> pl.Expr: + """ + Returns the country code from the CUSIP, or null if it cannot be parsed. + """ + return self._expr.register_plugin( + lib=_lib, + symbol="pl_cusip_country_code", + is_elementwise=True, + ) + + def payload(self) -> pl.Expr: + """ + Returns the payload (CUSIP ex. check digit) from the CUSIP, or null if it + cannot be parsed. + """ + return self._expr.register_plugin( + lib=_lib, + symbol="pl_cusip_payload", + is_elementwise=True, + ) + + def is_private_issue(self) -> pl.Expr: + """ + Returns true if the issue number is reserved for private use. + """ + return self._expr.register_plugin( + lib=_lib, + symbol="pl_cusip_is_private_issue", + is_elementwise=True, + ) + + def has_private_issuer(self) -> pl.Expr: + """ + Returns true if the issuer is reserved for private use. + """ + return self._expr.register_plugin( + lib=_lib, + symbol="pl_cusip_has_private_issuer", + is_elementwise=True, + ) + + def is_private_use(self) -> pl.Expr: + """ + Returns True if either the issuer or issue number is reserved for + private use. + """ + return self._expr.register_plugin( + lib=_lib, symbol="pl_cusip_is_private_use", is_elementwise=True + ) + + def is_cins(self) -> pl.Expr: + """ + Returns true if this CUSIP number is actually a + CUSIP International Numbering System (CINS) number, + false otherwise (i.e., that it has a letter as the first character of its issuer number). + See also is_cins_base() and is_cins_extended(). + + Null if unable to parse. + """ + return self._expr.register_plugin(lib=_lib, symbol="pl_cusip_is_cins", is_elementwise=True) + + def is_cins_base(self) -> pl.Expr: + """ + Returns true if this CUSIP identifier is actually a CUSIP International + Numbering System (CINS) identifier (with the further restriction that + it does not use ‘I’, ‘O’ or ‘Z’ as its country code), false otherwise. + See also is_cins() and is_cins_extended(). + + Null if unable to parse. + """ + return self._expr.register_plugin( + lib=_lib, symbol="pl_cusip_is_cins_base", is_elementwise=True + ) + + def is_cins_extended(self) -> pl.Expr: + """ + Returns true if this CUSIP identifier is actually a CUSIP International + Numbering System (CINS) identifier (with the further restriction that + it does not use ‘I’, ‘O’ or ‘Z’ as its country code), false otherwise. + See also is_cins() and is_cins_extended(). + + Null if unable to parse. + """ + return self._expr.register_plugin( + lib=_lib, symbol="pl_cusip_is_cins_extended", is_elementwise=True + ) diff --git a/python/polars_istr/iban.py b/python/polars_istr/iban.py index 029aae6..1bf1da3 100644 --- a/python/polars_istr/iban.py +++ b/python/polars_istr/iban.py @@ -7,7 +7,6 @@ @pl.api.register_expr_namespace("iban") class IbanExt: - """ This class contains tools for parsing IBAN format data. diff --git a/python/polars_istr/isin.py b/python/polars_istr/isin.py index 3457be4..9bc1c9b 100644 --- a/python/polars_istr/isin.py +++ b/python/polars_istr/isin.py @@ -7,7 +7,6 @@ @pl.api.register_expr_namespace("isin") class IsinExt: - """ This class contains tools for parsing ISIN format data. diff --git a/python/polars_istr/url.py b/python/polars_istr/url.py index b27ec6e..3fb001d 100644 --- a/python/polars_istr/url.py +++ b/python/polars_istr/url.py @@ -7,7 +7,6 @@ @pl.api.register_expr_namespace("url") class UrlExt: - """ This class contains tools for parsing URL strings. diff --git a/rust-toolchain.toml b/rust-toolchain.toml index f91e9de..5d56faf 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,2 +1,2 @@ [toolchain] -channel = "nightly-2024-01-24" \ No newline at end of file +channel = "nightly" diff --git a/src/cusip_parsing/mod.rs b/src/cusip_parsing/mod.rs new file mode 100644 index 0000000..1355bfa --- /dev/null +++ b/src/cusip_parsing/mod.rs @@ -0,0 +1,316 @@ +use cusip::CUSIP; +use polars::prelude::*; +use pyo3_polars::derive::polars_expr; + +fn cusip_full_output(_: &[Field]) -> PolarsResult { + let cc = Field::new("country_code", DataType::String); + let issuer = Field::new("issuer", DataType::String); + let issue = Field::new("issue", DataType::String); + let cd = Field::new("check_digit", DataType::String); + + let v: Vec = vec![cc, issuer, issue, cd]; + Ok(Field::new("", DataType::Struct(v))) +} + +#[polars_expr(output_type_func=cusip_full_output)] +fn pl_cusip_full(inputs: &[Series]) -> PolarsResult { + let ca = inputs[0].str()?; + + let mut cc_builder = StringChunkedBuilder::new("country_code", ca.len()); + let mut ir_builder = StringChunkedBuilder::new("issuer", ca.len()); + let mut is_builder = StringChunkedBuilder::new("issue", ca.len()); + let mut cd_builder = StringChunkedBuilder::new("check_digit", ca.len()); + + ca.into_iter().for_each(|op_s| { + if let Some(s) = op_s { + if let Ok(cusip) = CUSIP::parse(s) { + if let Some(cins) = cusip.as_cins() { + cc_builder.append_value(cins.country_code().to_string()); + ir_builder.append_value(cusip.issuer_num()); + is_builder.append_value(cusip.issue_num()); + cd_builder.append_value(cusip.check_digit().to_string()); + } else { + cc_builder.append_null(); + ir_builder.append_value(cusip.issuer_num()); + is_builder.append_value(cusip.issue_num()); + cd_builder.append_value(cusip.check_digit().to_string()); + } + } else { + cc_builder.append_null(); + ir_builder.append_null(); + is_builder.append_null(); + cd_builder.append_null(); + } + } else { + cc_builder.append_null(); + ir_builder.append_null(); + is_builder.append_null(); + cd_builder.append_null(); + } + }); + let cc = cc_builder.finish().into_series(); + let ir = ir_builder.finish().into_series(); + let is = is_builder.finish().into_series(); + let cd = cd_builder.finish().into_series(); + + let out = StructChunked::new("cusip", &[cc, ir, is, cd])?; + Ok(out.into_series()) +} + +#[polars_expr(output_type=String)] +fn pl_cusip_issue_num(inputs: &[Series]) -> PolarsResult { + let ca = inputs[0].str()?; + + let mut s_builder = StringChunkedBuilder::new("issue_num", ca.len()); + + ca.into_iter().for_each(|op_s| { + if let Some(s) = op_s { + if let Ok(cusip) = CUSIP::parse(s) { + s_builder.append_value(cusip.issue_num()); + } else { + s_builder.append_null(); + } + } else { + s_builder.append_null(); + } + }); + + let out = s_builder.finish(); + Ok(out.into_series()) +} + +#[polars_expr(output_type=String)] +fn pl_cusip_issuer_num(inputs: &[Series]) -> PolarsResult { + let ca = inputs[0].str()?; + + let mut s_builder = StringChunkedBuilder::new("issuer_num", ca.len()); + + ca.into_iter().for_each(|op_s| { + if let Some(s) = op_s { + if let Ok(cusip) = CUSIP::parse(s) { + if let Some(cins) = cusip.as_cins() { + s_builder.append_value(cins.issuer_num()); + } else { + s_builder.append_value(cusip.issuer_num()); + } + } else { + s_builder.append_null(); + } + } else { + s_builder.append_null(); + } + }); + + let out = s_builder.finish(); + Ok(out.into_series()) +} + +#[polars_expr(output_type=String)] +fn pl_cusip_country_code(inputs: &[Series]) -> PolarsResult { + let ca = inputs[0].str()?; + + let mut s_builder = StringChunkedBuilder::new("country_code", ca.len()); + + ca.into_iter().for_each(|op_s| { + if let Some(s) = op_s { + if let Ok(cusip) = CUSIP::parse(s) { + if let Some(cins) = cusip.as_cins(){ + s_builder.append_value(cins.country_code().to_string()); + } else { + s_builder.append_null(); + } + } else { + s_builder.append_null(); + } + } else { + s_builder.append_null(); + } + }); + + let out = s_builder.finish(); + Ok(out.into_series()) +} + +#[polars_expr(output_type=String)] +fn pl_cusip_check_digit(inputs: &[Series]) -> PolarsResult { + let ca = inputs[0].str()?; + + let mut s_builder = StringChunkedBuilder::new("check_digit", ca.len()); + + ca.into_iter().for_each(|op_s| { + if let Some(s) = op_s { + if let Ok(cusip) = CUSIP::parse(s) { + s_builder.append_value(cusip.check_digit().to_string()); + } else { + s_builder.append_null(); + } + } else { + s_builder.append_null(); + } + }); + + let out = s_builder.finish(); + Ok(out.into_series()) +} + +#[polars_expr(output_type=String)] +fn pl_cusip_payload(inputs: &[Series]) -> PolarsResult { + let ca = inputs[0].str()?; + + let mut s_builder = StringChunkedBuilder::new("check_digit", ca.len()); + + ca.into_iter().for_each(|op_s| { + if let Some(s) = op_s { + if let Ok(cusip) = CUSIP::parse(s) { + s_builder.append_value(cusip.payload()); + } else { + s_builder.append_null(); + } + } else { + s_builder.append_null(); + } + }); + + let out = s_builder.finish(); + Ok(out.into_series()) +} + +#[polars_expr(output_type=Boolean)] +fn pl_cusip_is_private_issue(inputs: &[Series]) -> PolarsResult { + let ca = inputs[0].str()?; + + let mut b_builder = BooleanChunkedBuilder::new("is_private_issue", ca.len()); + + ca.into_iter().for_each(|op_s| { + if let Some(s) = op_s { + if let Ok(cusip) = CUSIP::parse(s) { + b_builder.append_value(cusip.is_private_issue()); + } else { + b_builder.append_null() + } + } else { + b_builder.append_null(); + } + }); + + let out = b_builder.finish(); + Ok(out.into_series()) +} + +#[polars_expr(output_type=Boolean)] +fn pl_cusip_has_private_issuer(inputs: &[Series]) -> PolarsResult { + let ca = inputs[0].str()?; + + let mut b_builder = BooleanChunkedBuilder::new("has_private_issuer", ca.len()); + + ca.into_iter().for_each(|op_s| { + if let Some(s) = op_s { + if let Ok(cusip) = CUSIP::parse(s) { + b_builder.append_value(cusip.has_private_issuer()); + } else { + b_builder.append_null() + } + } else { + b_builder.append_null(); + } + }); + + let out = b_builder.finish(); + Ok(out.into_series()) +} + +#[polars_expr(output_type=Boolean)] +fn pl_cusip_is_private_use(inputs: &[Series]) -> PolarsResult { + let ca = inputs[0].str()?; + + let mut b_builder = BooleanChunkedBuilder::new("is_private_use", ca.len()); + + ca.into_iter().for_each(|op_s| { + if let Some(s) = op_s { + if let Ok(cusip) = CUSIP::parse(s) { + b_builder.append_value(cusip.is_private_use()); + } else { + b_builder.append_null() + } + } else { + b_builder.append_null(); + } + }); + + let out = b_builder.finish(); + Ok(out.into_series()) +} + +#[polars_expr(output_type=Boolean)] +fn pl_cusip_is_cins(inputs: &[Series]) -> PolarsResult { + let ca = inputs[0].str()?; + + let mut b_builder = BooleanChunkedBuilder::new("is_cins", ca.len()); + + ca.into_iter().for_each(|op_s| { + if let Some(s) = op_s { + if let Ok(cusip) = CUSIP::parse(s) { + b_builder.append_value(cusip.is_cins()); + } else { + b_builder.append_null() + } + } else { + b_builder.append_null(); + } + }); + + let out = b_builder.finish(); + Ok(out.into_series()) +} + +#[polars_expr(output_type=Boolean)] +fn pl_cusip_is_cins_base(inputs: &[Series]) -> PolarsResult { + let ca = inputs[0].str()?; + + let mut b_builder = BooleanChunkedBuilder::new("is_cins_base", ca.len()); + + ca.into_iter().for_each(|op_s| { + if let Some(s) = op_s { + if let Ok(cusip) = CUSIP::parse(s) { + if let Some(cins) = cusip.as_cins() { + b_builder.append_value(cins.is_base()); + } else { + b_builder.append_null(); + } + } else { + b_builder.append_null(); + } + } else { + b_builder.append_null(); + } + }); + + let out = b_builder.finish(); + Ok(out.into_series()) +} + +#[polars_expr(output_type=Boolean)] +fn pl_cusip_is_cins_extended(inputs: &[Series]) -> PolarsResult { + let ca = inputs[0].str()?; + + let mut b_builder = BooleanChunkedBuilder::new("is_cins_extended", ca.len()); + + ca.into_iter().for_each(|op_s| { + if let Some(s) = op_s { + if let Ok(cusip) = CUSIP::parse(s) { + if let Some(cins) = cusip.as_cins() { + b_builder.append_value(cins.is_extended()); + } else { + b_builder.append_null(); + } + } else { + b_builder.append_null() + } + } else { + b_builder.append_null(); + } + }); + + let out = b_builder.finish(); + Ok(out.into_series()) +} diff --git a/src/isin_parsing/mod.rs b/src/isin_parsing/mod.rs index 553a7f5..31c4d08 100644 --- a/src/isin_parsing/mod.rs +++ b/src/isin_parsing/mod.rs @@ -1,4 +1,3 @@ -use isin; use polars::prelude::*; use pyo3_polars::derive::polars_expr; diff --git a/src/lib.rs b/src/lib.rs index 9dab5b2..a6fb197 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,4 @@ +mod cusip_parsing; mod iban_parsing; mod isin_parsing; mod url_parsing; diff --git a/tests/test_correctness.py b/tests/test_correctness.py index e0b15bc..68c812b 100644 --- a/tests/test_correctness.py +++ b/tests/test_correctness.py @@ -1,4 +1,11 @@ -from __future__ import annotations +import polars as pl + + +from polars.testing import assert_frame_equal + +from typing import List + +import pytest import pytest import polars as pl @@ -9,6 +16,107 @@ from typing import List, Optional +# There are no valid test cases for Extended CINS or Private Issue(r) since I could not +# find any existing cusips readily available (including in the cusip crate). +# If anyone has encountered one and would like it added to the tests, please raise an +# issue. +@pytest.mark.parametrize( + """df, issue_num, issuer_num, check_digit, country_code, + payload, is_private_issue, has_private_issuer, is_private_use, is_cins, + is_cins_base, is_cins_extended""", + [ + ( + pl.DataFrame( + { + "cusip": [ + "303075105", # regular cusip (FactSet - Common Stock) + "30307510", # regular cusip ex. check digit + "G0052B105", # regular CINS (Abingdon Capital PLC - Shares) + "HELLOWORLD", # Invalid + ] + } + ), + ["10", None, "10", None], + ["303075", None, "0052B", None], + ["5", None, "5", None], + [None, None, "G", None], + ["30307510", None, "G0052B10", None], + [False, None, False, None], + [False, None, False, None], + [False, None, False, None], + [False, None, True, None], + [ + None, + None, + True, + None, + ], # TODO for these last 2, should regular cusips return False or None? + [None, None, False, None], + ) + ], +) +def test_cusip( + df: pl.DataFrame, + issue_num: List[str], + issuer_num: List[str], + check_digit: List[str], + country_code: List[str], + payload: List[str], + is_private_issue: List[str], + has_private_issuer: List[str], + is_private_use: List[str], + is_cins: List[str], + is_cins_base: List[str], + is_cins_extended: List[str], +): + test1 = df.select( + pl.col("cusip").cusip.issue_num().alias("issue_num"), + pl.col("cusip").cusip.issuer_num().alias("issuer_num"), + pl.col("cusip").cusip.check_digit().alias("check_digit"), + pl.col("cusip").cusip.country_code().alias("country_code"), + pl.col("cusip").cusip.payload().alias("payload"), + pl.col("cusip").cusip.is_private_issue().alias("is_private_issue"), + pl.col("cusip").cusip.has_private_issuer().alias("has_private_issuer"), + pl.col("cusip").cusip.is_private_use().alias("is_private_use"), + pl.col("cusip").cusip.is_cins().alias("is_cins"), + pl.col("cusip").cusip.is_cins_base().alias("is_cins_base"), + pl.col("cusip").cusip.is_cins_extended().alias("is_cins_extended"), + ) + + test2 = ( + df.lazy() + .select( + pl.col("cusip").cusip.issue_num().alias("issue_num"), + pl.col("cusip").cusip.issuer_num().alias("issuer_num"), + pl.col("cusip").cusip.check_digit().alias("check_digit"), + pl.col("cusip").cusip.country_code().alias("country_code"), + pl.col("cusip").cusip.payload().alias("payload"), + pl.col("cusip").cusip.is_private_issue().alias("is_private_issue"), + pl.col("cusip").cusip.has_private_issuer().alias("has_private_issuer"), + pl.col("cusip").cusip.is_private_use().alias("is_private_use"), + pl.col("cusip").cusip.is_cins().alias("is_cins"), + pl.col("cusip").cusip.is_cins_base().alias("is_cins_base"), + pl.col("cusip").cusip.is_cins_extended().alias("is_cins_extended"), + ) + .collect() + ) + ans = pl.DataFrame( + { + "issue_num": issue_num, + "issuer_num": issuer_num, + "check_digit": check_digit, + "country_code": country_code, + "payload": payload, + "is_private_issue": is_private_issue, + "has_private_issuer": has_private_issuer, + "is_private_use": is_private_use, + "is_cins": is_cins, + "is_cins_base": is_cins_base, + "is_cins_extended": is_cins_extended, + } + ) + + @pytest.mark.parametrize( "df, cc, cd, reason, is_valid, bban, bank_id, branch_id", [