├── src ├── utils │ └── mod.rs ├── lib.rs ├── isin_parsing │ └── mod.rs ├── url_parsing │ └── mod.rs ├── iban_parsing │ └── mod.rs └── cusip_parsing │ └── mod.rs ├── rust-toolchain.toml ├── tests ├── requirements-test.txt └── test_correctness.py ├── requirements.txt ├── python └── polars_istr │ ├── __init__.py │ ├── type_alias.py │ ├── isin.py │ ├── _utils.py │ ├── url.py │ ├── iban.py │ └── cusip.py ├── .pre-commit-config.yaml ├── Makefile ├── Cargo.toml ├── README.md ├── LICENSE.txt ├── pyproject.toml ├── .gitignore ├── CONTRIBUTING.md ├── .github └── workflows │ └── CI.yml ├── examples └── basics.ipynb └── Cargo.lock /src/utils/mod.rs: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /rust-toolchain.toml: -------------------------------------------------------------------------------- 1 | [toolchain] 2 | channel = "nightly-2025-01-05" -------------------------------------------------------------------------------- /tests/requirements-test.txt: -------------------------------------------------------------------------------- 1 | # requirements for testing 2 | polars 3 | memray 4 | pytest-memray 5 | pytest-benchmark -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | maturin[patchelf]>=1.7; sys_platform == "linux" 2 | maturin>=1.7; sys_platform != "linux" 3 | polars 4 | pytest 5 | ipykernel 6 | pre-commit 7 | -------------------------------------------------------------------------------- /python/polars_istr/__init__.py: -------------------------------------------------------------------------------- 1 | from .iban import * # noqa: E402, F403 2 | from .isin import * # noqa: E402, F403 3 | from .cusip import * # noqa: E402, F403 4 | from .url import * # noqa: E402, F403 5 | 6 | __version__ = "0.1.2" 7 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | repos: 2 | - repo: https://github.com/astral-sh/ruff-pre-commit 3 | # Ruff version. 4 | rev: v0.2.2 5 | hooks: 6 | # Run the linter. 7 | - id: ruff 8 | types_or: [ python, pyi] 9 | args: [ --fix ] 10 | # Run the formatter. 11 | - id: ruff-format 12 | types_or: [ python, pyi] -------------------------------------------------------------------------------- /python/polars_istr/type_alias.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | from typing import Union 3 | import sys 4 | import polars as pl 5 | 6 | if sys.version_info >= (3, 10): 7 | from typing import TypeAlias # noqa 8 | else: # 3.9, 3.8 9 | from typing_extensions import TypeAlias # noqa 10 | 11 | StrOrExpr: TypeAlias = Union[str, pl.Expr] -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | SHELL=/bin/bash 2 | 3 | venv: ## Set up virtual environment 4 | python3 -m venv .venv 5 | .venv/bin/pip install -r requirements.txt 6 | 7 | install: venv 8 | unset CONDA_PREFIX && \ 9 | source .venv/bin/activate && maturin develop -m Cargo.toml 10 | 11 | dev-release: venv 12 | unset CONDA_PREFIX && \ 13 | source .venv/bin/activate && maturin develop --release -m Cargo.toml 14 | 15 | pre-commit: venv 16 | cargo fmt 17 | pre-commit run --all-files -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | mod cusip_parsing; 2 | mod iban_parsing; 3 | mod isin_parsing; 4 | mod url_parsing; 5 | mod utils; 6 | use pyo3::{pymodule, types::{PyModule, PyModuleMethods}, Bound, PyResult, Python}; 7 | 8 | use pyo3_polars::PolarsAllocator; 9 | #[global_allocator] 10 | static ALLOC: PolarsAllocator = PolarsAllocator::new(); 11 | 12 | #[pymodule] 13 | #[pyo3(name = "_polars_istr")] 14 | fn _polars_istr(_py: Python<'_>, _m: &Bound<'_, PyModule>) -> PyResult<()> { 15 | Ok(()) 16 | } 17 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "polars_istr" 3 | version = "0.1.2" 4 | edition = "2021" 5 | 6 | [lib] 7 | name = "_polars_istr" 8 | crate-type = ["cdylib"] 9 | 10 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 11 | 12 | [dependencies] 13 | pyo3 = {version = "0.23", features = ["extension-module", "abi3-py38"]} 14 | pyo3-polars = {version = "0.20", features = ["derive"]} 15 | polars = {version = "0.46", features = ["performant", "lazy", "nightly", "parquet"]} 16 | iban_validate = "4.0.1" 17 | isin = "0.1.18" 18 | cusip = "0.3.0" 19 | url = "2.5.0" 20 | polars-arrow = "0.46.0" 21 | 22 | [profile.release] 23 | codegen-units = 1 24 | strip = "symbols" 25 | lto = "fat" 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | Polars for Identifiers and Standard Format Strings 3 |
4 |

5 | 6 | 13 | 14 | # The Project 15 | 16 | Processing IBAN, ISINs, URLs, etc., and other standard format data in Polars. 17 | 18 | # Acknowledgements 19 | 20 | 1. Iban is powered by [iban_validate](https://crates.io/crates/iban_validate) 21 | 2. Isin is powered by [isin_rs](https://docs.rs/isin/latest/isin/) 22 | 3. URL is powered by [url](https://crates.io/crates/url) 23 | 4. CUSIP is powered by [cusip](https://crates.io/crates/cusip) -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 T. Qin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | requires = ["maturin>=1.7.4,<2.0"] 3 | build-backend = "maturin" 4 | 5 | [project] 6 | name = "polars_istr" 7 | requires-python = ">=3.8" 8 | version = "0.1.3" 9 | 10 | license = {file = "LICENSE.txt"} 11 | classifiers = [ 12 | "Development Status :: 4 - Beta", 13 | "Programming Language :: Rust", 14 | "Programming Language :: Python :: Implementation :: CPython", 15 | "Programming Language :: Python :: Implementation :: PyPy", 16 | "License :: OSI Approved :: MIT License", 17 | ] 18 | authors = [ 19 | {name = "Tianren Qin", email = "tq9695@gmail.com"}, 20 | {name = "Connor Duncan", email = "connor@connorduncan.xyz"}, 21 | ] 22 | dependencies = [ 23 | "polars >= 1.4", 24 | 'typing-extensions; python_version <= "3.11"', 25 | ] 26 | 27 | keywords = ["polars-extension", "string-processing", "data-processing", "parsing"] 28 | 29 | [tool.maturin] 30 | python-source = "python" 31 | features = ["pyo3/extension-module"] 32 | module-name = "polars_istr._polars_istr" 33 | 34 | [project.optional-dependencies] 35 | dev = [ 36 | "pytest >= 7.4.1", 37 | "pre-commit", 38 | ] 39 | 40 | [tool.ruff] 41 | line-length = 100 42 | fix = true 43 | src = ["python"] 44 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .ipynb_checkpoints 2 | 3 | # Local, quick adhoc test only purpose 4 | tests/*.ipynb 5 | tests/test.ipynb 6 | tests/sample.csv 7 | 8 | /target 9 | 10 | # Mkdocs 11 | site/ 12 | 13 | # Ruff 14 | .ruff_cache/ 15 | 16 | # Memray 17 | tests/*.bin 18 | 19 | # Byte-compiled / optimized / DLL files 20 | __pycache__/ 21 | .pytest_cache/ 22 | *.py[cod] 23 | 24 | # C extensions 25 | *.so 26 | 27 | # Distribution / packaging 28 | .Python 29 | .venv/ 30 | env/ 31 | bin/ 32 | build/ 33 | develop-eggs/ 34 | dist/ 35 | eggs/ 36 | lib/ 37 | lib64/ 38 | parts/ 39 | sdist/ 40 | var/ 41 | include/ 42 | man/ 43 | venv/ 44 | *.egg-info/ 45 | .installed.cfg 46 | *.egg 47 | 48 | # Installer logs 49 | pip-log.txt 50 | pip-delete-this-directory.txt 51 | pip-selfcheck.json 52 | 53 | # Unit test / coverage reports 54 | htmlcov/ 55 | .tox/ 56 | .coverage 57 | .cache 58 | nosetests.xml 59 | coverage.xml 60 | 61 | # Translations 62 | *.mo 63 | 64 | # Mr Developer 65 | .mr.developer.cfg 66 | .project 67 | .pydevproject 68 | 69 | # Rope 70 | .ropeproject 71 | 72 | # Django stuff: 73 | *.log 74 | *.pot 75 | 76 | .DS_Store 77 | 78 | # Sphinx documentation 79 | docs/_build/ 80 | 81 | # PyCharm 82 | .idea/ 83 | 84 | # VSCode 85 | .vscode/ 86 | 87 | # Pyenv 88 | .python-version 89 | 90 | # Polars Extension 91 | .so 92 | .dll 93 | 94 | _test 95 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Simple Guidelines 2 | 3 | For all feature related work, it would be great to ask yourself the following questions before submitting a PR: 4 | 5 | 1. Is your code correct? Proof of correctness and at least one Python side test. It is ok to test against well-known packages. Don't forget to add to requirements-test.txt if more packages need to be downloaded for tests. 6 | 2. Are you using a lot of unwraps in your code? Are these unwraps justified? Same for unsafe code. 7 | 3. If an additional dependency is needed, how much of it is really used? Will it bloat the package? What other features can we write with the additional dependency? I would discourage add an dependency if we are using 1 or 2 function out of that package. 8 | 4. Everything can be discussed. 9 | 10 | 11 | ## Remember to run these before committing: 12 | 1. pre-commit. We use ruff. 13 | 2. cargo fmt 14 | 15 | ## How to get started? 16 | 17 | Take a look at the Makefile. Set up your environment first. Then take a look at the tutorial here, and grasp the basics of maturin here. 18 | 19 | Then find a issue/feature that you want to improve/implement! 20 | 21 | ## A word on Doc, Typo related PRs 22 | 23 | For docs and typo fix PRs, we welcome changes that: 24 | 25 | 1. Fix actual typos and please do not open a PR for each typo. 26 | 27 | 2. Add explanations, docstrings for previously undocumented features/code. 28 | 29 | 3. Improve clarification for terms, explanations, docs, or docstrings. 30 | 31 | 4. Fix actual broken UI/style components in doc/readme. 32 | 33 | Simple stylistic change/reformatting that doesn't register any significant change in looks, or doesn't fix any previously noted problems will not be approved. 34 | 35 | Please understand, and thank you for your time. -------------------------------------------------------------------------------- /python/polars_istr/isin.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | import polars as pl 3 | from ._utils import pl_plugin 4 | 5 | 6 | def isin_country_code(x: pl.Expr | pl.Series) -> pl.Expr: 7 | """ 8 | Returns country code from the ISIN, or null if it cannot be parsed. 9 | """ 10 | return pl_plugin( 11 | args=[x], 12 | symbol="pl_isin_country_code", 13 | is_elementwise=True, 14 | ) 15 | 16 | 17 | def isin_check_digit(x: pl.Expr | pl.Series) -> pl.Expr: 18 | """ 19 | Returns check digits from the ISIN, or null if it cannot be parsed. 20 | """ 21 | return pl_plugin( 22 | args=[x], 23 | symbol="pl_isin_check_digit", 24 | is_elementwise=True, 25 | ) 26 | 27 | 28 | def isin_security_id(x: pl.Expr | pl.Series) -> pl.Expr: 29 | """ 30 | Returns the 9-digit security identifier of the ISIN, or null if it cannot 31 | be parsed. 32 | """ 33 | return pl_plugin( 34 | args=[x], 35 | symbol="pl_isin_security_id", 36 | is_elementwise=True, 37 | ) 38 | 39 | 40 | def isin_is_valid(x: pl.Expr | pl.Series) -> pl.Expr: 41 | """ 42 | Returns a boolean indicating whether the string is a valid ISIN string. 43 | """ 44 | return pl_plugin( 45 | args=[x], 46 | symbol="pl_isin_is_valid", 47 | is_elementwise=True, 48 | ) 49 | 50 | 51 | def isin_extract_all(x: pl.Expr | pl.Series) -> pl.Expr: 52 | """ 53 | Returns all information from ISIN and return as a struct. Empty string means the part cannot 54 | be extracted. Running this can be faster than running the corresponding single queries together. 55 | """ 56 | return pl_plugin( 57 | args=[x], 58 | symbol="pl_isin_full", 59 | is_elementwise=True, 60 | ) 61 | -------------------------------------------------------------------------------- /python/polars_istr/_utils.py: -------------------------------------------------------------------------------- 1 | import os 2 | import re 3 | from pathlib import Path 4 | from typing import Any, Dict, List, Optional, Union 5 | 6 | import polars as pl 7 | 8 | from .type_alias import StrOrExpr 9 | 10 | _POLARS_LEGACY_SUPPORT = tuple(int(re.sub("[^0-9]", "", x)) for x in pl.__version__.split(".")) < ( 11 | 0, 12 | 20, 13 | 16, 14 | ) 15 | _IS_POLARS_V1 = pl.__version__.startswith("1") 16 | 17 | _PLUGIN_PATH = Path(__file__).parent 18 | 19 | _PLUGIN_LIB_LEGACY = os.path.join( 20 | os.path.dirname(__file__), 21 | next( 22 | filter( 23 | lambda file: file.endswith((".so", ".dll", ".pyd")), 24 | os.listdir(os.path.dirname(__file__)), 25 | ) 26 | ), 27 | ) 28 | 29 | 30 | def str_to_expr(x: StrOrExpr) -> pl.Expr: 31 | if isinstance(x, str): 32 | return pl.col(x) 33 | elif isinstance(x, pl.Expr): 34 | return x 35 | else: 36 | raise ValueError("Can only parse str (column name) or Polars expressions.") 37 | 38 | 39 | def pl_plugin( 40 | *, 41 | symbol: str, 42 | args: List[Union[pl.Series, pl.Expr]], 43 | kwargs: Optional[Dict[str, Any]] = None, 44 | is_elementwise: bool = False, 45 | returns_scalar: bool = False, 46 | changes_length: bool = False, 47 | cast_to_supertype: bool = False, 48 | ) -> pl.Expr: 49 | if _POLARS_LEGACY_SUPPORT: 50 | # This will eventually be deprecated, yes 51 | return args[0].register_plugin( 52 | lib=_PLUGIN_LIB_LEGACY, 53 | symbol=symbol, 54 | args=args[1:], 55 | kwargs=kwargs, 56 | is_elementwise=is_elementwise, 57 | returns_scalar=returns_scalar, 58 | changes_length=changes_length, 59 | cast_to_supertypes=cast_to_supertype, 60 | ) 61 | 62 | from polars.plugins import register_plugin_function 63 | 64 | return register_plugin_function( 65 | plugin_path=_PLUGIN_PATH, 66 | args=args, 67 | function_name=symbol, 68 | kwargs=kwargs, 69 | is_elementwise=is_elementwise, 70 | returns_scalar=returns_scalar, 71 | changes_length=changes_length, 72 | cast_to_supertype=cast_to_supertype, 73 | ) 74 | -------------------------------------------------------------------------------- /python/polars_istr/url.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | import polars as pl 3 | from ._utils import pl_plugin 4 | 5 | 6 | def url_is_special(x: pl.Expr | pl.Series) -> pl.Expr: 7 | """ 8 | Returns a boolean indicating whether the URL has a special scheme or not. 9 | """ 10 | return pl_plugin( 11 | args=[x], 12 | symbol="pl_url_is_special", 13 | is_elementwise=True, 14 | ) 15 | 16 | 17 | def url_host(x: pl.Expr | pl.Series) -> pl.Expr: 18 | """ 19 | Returns the host of the URL, if possible. 20 | """ 21 | return pl_plugin( 22 | args=[x], 23 | symbol="pl_url_host", 24 | is_elementwise=True, 25 | ) 26 | 27 | 28 | def url_path(x: pl.Expr | pl.Series) -> pl.Expr: 29 | """ 30 | Returns the path part of the URL, if possible. 31 | """ 32 | return pl_plugin( 33 | args=[x], 34 | symbol="pl_url_path", 35 | is_elementwise=True, 36 | ) 37 | 38 | 39 | def url_domain(x: pl.Expr | pl.Series) -> pl.Expr: 40 | """ 41 | Returns the domain of the URL, if possible. 42 | """ 43 | return pl_plugin( 44 | args=[x], 45 | symbol="pl_url_domain", 46 | is_elementwise=True, 47 | ) 48 | 49 | 50 | def url_fragment(x: pl.Expr | pl.Series) -> pl.Expr: 51 | """ 52 | Returns the fragment of the URL, if possible. 53 | """ 54 | return pl_plugin( 55 | args=[x], 56 | symbol="pl_url_fragment", 57 | is_elementwise=True, 58 | ) 59 | 60 | 61 | def url_query(x: pl.Expr | pl.Series) -> pl.Expr: 62 | """ 63 | Returns the query part of the URL, if possible. 64 | """ 65 | return pl_plugin( 66 | args=[x], 67 | symbol="pl_url_query", 68 | is_elementwise=True, 69 | ) 70 | 71 | 72 | def url_is_valid(x: pl.Expr | pl.Series) -> pl.Expr: 73 | """ 74 | Returns a boolean indicating whether the string is a valid URL string. 75 | """ 76 | return pl_plugin( 77 | args=[x], 78 | symbol="pl_url_is_valid", 79 | is_elementwise=True, 80 | ) 81 | 82 | 83 | def url_check(x: pl.Expr | pl.Series) -> pl.Expr: 84 | """ 85 | Returns a string that explains whether the URL string is valid or not. 86 | """ 87 | return pl_plugin( 88 | args=[x], 89 | symbol="pl_url_check", 90 | is_elementwise=True, 91 | ) 92 | -------------------------------------------------------------------------------- /python/polars_istr/iban.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | import polars as pl 3 | from ._utils import pl_plugin 4 | 5 | 6 | def iban_country_code(x: pl.Series | pl.Expr) -> pl.Expr: 7 | """ 8 | Returns country code from the IBAN, or null if it cannot be parsed. 9 | """ 10 | return pl_plugin( 11 | args=[x], 12 | symbol="pl_iban_country_code", 13 | is_elementwise=True, 14 | ) 15 | 16 | 17 | def iban_check_digits(x: pl.Series | pl.Expr) -> pl.Expr: 18 | """ 19 | Returns check digits from the IBAN, or null if it cannot be parsed. 20 | """ 21 | return pl_plugin( 22 | args=[x], 23 | symbol="pl_iban_check_digits", 24 | is_elementwise=True, 25 | ) 26 | 27 | 28 | def iban_bban(x: pl.Series | pl.Expr) -> pl.Expr: 29 | """ 30 | Returns BBAN string from the IBAN, or null if it cannot be parsed. 31 | """ 32 | return pl_plugin( 33 | args=[x], 34 | symbol="pl_iban_bban", 35 | is_elementwise=True, 36 | ) 37 | 38 | 39 | def iban_bank_id(x: pl.Series | pl.Expr) -> pl.Expr: 40 | """ 41 | Returns bank identifier from the BBAN portion of the IBAN string, 42 | or null if it cannot be parsed. 43 | """ 44 | return pl_plugin( 45 | args=[x], 46 | symbol="pl_iban_bank_identifier", 47 | is_elementwise=True, 48 | ) 49 | 50 | 51 | def iban_branch_id(x: pl.Series | pl.Expr) -> pl.Expr: 52 | """ 53 | Returns branch identifier from the BBAN portion of the IBAN string, 54 | or null if it cannot be parsed. 55 | """ 56 | return pl_plugin( 57 | args=[x], 58 | symbol="pl_iban_branch_identifier", 59 | is_elementwise=True, 60 | ) 61 | 62 | 63 | def iban_is_valid(x: pl.Series | pl.Expr) -> pl.Expr: 64 | """ 65 | Returns a boolean indicating whether the string is a valid IBAN string. 66 | """ 67 | return pl_plugin( 68 | args=[x], 69 | symbol="pl_iban_is_valid", 70 | is_elementwise=True, 71 | ) 72 | 73 | 74 | def iban_check(x: pl.Series | pl.Expr) -> pl.Expr: 75 | """ 76 | Returns a string that explains whether the IBAN string is valid or not. 77 | """ 78 | return pl_plugin( 79 | args=[x], 80 | symbol="pl_iban_check", 81 | is_elementwise=True, 82 | ) 83 | 84 | 85 | def iban_extract_all(x: pl.Series | pl.Expr) -> pl.Expr: 86 | """ 87 | Returns all information from IBAN and return as a struct. Running this can be 88 | faster than running the corresponding single queries together. 89 | """ 90 | return pl_plugin( 91 | args=[x], 92 | symbol="pl_iban_extract_all", 93 | is_elementwise=True, 94 | ) 95 | -------------------------------------------------------------------------------- /python/polars_istr/cusip.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | import polars as pl 3 | from ._utils import pl_plugin 4 | 5 | 6 | def cusip_extract_all(x: pl.Series | pl.Expr) -> pl.Expr: 7 | """ 8 | Returns a struct containing country_code, issue_num, issuer_num, check_digit, 9 | or null, if it cannot be parsed. 10 | 11 | Country Code is null for valid CUSIPs which are not (extended) CINS 12 | """ 13 | return pl_plugin( 14 | args=[x], 15 | symbol="pl_cusip_full", 16 | is_elementwise=True, 17 | ) 18 | 19 | 20 | def cusip_issue_num(x: pl.Series | pl.Expr) -> pl.Expr: 21 | """ 22 | Returns the issue number from the CUSIP, or null if it cannot be parsed. 23 | """ 24 | return pl_plugin( 25 | args=[x], 26 | symbol="pl_cusip_issue_num", 27 | is_elementwise=True, 28 | ) 29 | 30 | 31 | def cusip_issuer_num(x: pl.Series | pl.Expr) -> pl.Expr: 32 | """ 33 | Returns the issuer number from the CUSIP, or null if it cannot be parsed. 34 | """ 35 | return pl_plugin( 36 | args=[x], 37 | symbol="pl_cusip_issuer_num", 38 | is_elementwise=True, 39 | ) 40 | 41 | 42 | def cusip_check_digit(x: pl.Series | pl.Expr) -> pl.Expr: 43 | """ 44 | Returns check digit from the CUSIP, or null if it cannot be parsed. 45 | """ 46 | return pl_plugin( 47 | args=[x], 48 | symbol="pl_cusip_check_digit", 49 | is_elementwise=True, 50 | ) 51 | 52 | 53 | def cusip_country_code(x: pl.Series | pl.Expr) -> pl.Expr: 54 | """ 55 | Returns the country code from the CUSIP, or null if it cannot be parsed. 56 | """ 57 | return pl_plugin( 58 | args=[x], 59 | symbol="pl_cusip_country_code", 60 | is_elementwise=True, 61 | ) 62 | 63 | 64 | def cusip_payload(x: pl.Series | pl.Expr) -> pl.Expr: 65 | """ 66 | Returns the payload (CUSIP ex. check digit) from the CUSIP, or null if it 67 | cannot be parsed. 68 | """ 69 | return pl_plugin( 70 | args=[x], 71 | symbol="pl_cusip_payload", 72 | is_elementwise=True, 73 | ) 74 | 75 | 76 | def cusip_is_private_issue(x: pl.Series | pl.Expr) -> pl.Expr: 77 | """ 78 | Returns true if the issue number is reserved for private use. 79 | """ 80 | return pl_plugin( 81 | args=[x], 82 | symbol="pl_cusip_is_private_issue", 83 | is_elementwise=True, 84 | ) 85 | 86 | 87 | def cusip_has_private_issuer(x: pl.Series | pl.Expr) -> pl.Expr: 88 | """ 89 | Returns true if the issuer is reserved for private use. 90 | """ 91 | return pl_plugin( 92 | args=[x], 93 | symbol="pl_cusip_has_private_issuer", 94 | is_elementwise=True, 95 | ) 96 | 97 | 98 | def cusip_is_private_use(x: pl.Series | pl.Expr) -> pl.Expr: 99 | """ 100 | Returns True if either the issuer or issue number is reserved for 101 | private use. 102 | """ 103 | return pl_plugin(args=[x], symbol="pl_cusip_is_private_use", is_elementwise=True) 104 | 105 | 106 | def cusip_is_cins(x: pl.Series | pl.Expr) -> pl.Expr: 107 | """ 108 | Returns true if this CUSIP number is actually a 109 | CUSIP International Numbering System (CINS) number, 110 | false otherwise (i.e., that it has a letter as the first character of its issuer number). 111 | See also is_cins_base() and is_cins_extended(). 112 | 113 | Null if unable to parse. 114 | """ 115 | return pl_plugin(args=[x], symbol="pl_cusip_is_cins", is_elementwise=True) 116 | 117 | 118 | def cusip_is_cins_base(x: pl.Series | pl.Expr) -> pl.Expr: 119 | """ 120 | Returns true if this CUSIP identifier is actually a CUSIP International 121 | Numbering System (CINS) identifier (with the further restriction that 122 | it does not use `I`, `O` or `Z` as its country code), false otherwise. 123 | See also is_cins() and is_cins_extended(). 124 | 125 | Null if unable to parse. 126 | """ 127 | return pl_plugin(args=[x], symbol="pl_cusip_is_cins_base", is_elementwise=True) 128 | 129 | 130 | def cusip_is_cins_extended(x: pl.Series | pl.Expr) -> pl.Expr: 131 | """ 132 | Returns true if this CUSIP identifier is actually a CUSIP International 133 | Numbering System (CINS) identifier (with the further restriction that 134 | it does not use `I`, `O` or `Z` as its country code), false otherwise. 135 | See also is_cins() and is_cins_extended(). 136 | 137 | Null if unable to parse. 138 | """ 139 | return pl_plugin(args=[x], symbol="pl_cusip_is_cins_extended", is_elementwise=True) 140 | -------------------------------------------------------------------------------- /src/isin_parsing/mod.rs: -------------------------------------------------------------------------------- 1 | use polars::prelude::*; 2 | use pyo3_polars::derive::polars_expr; 3 | 4 | fn isin_full_output(_: &[Field]) -> PolarsResult { 5 | let cc = Field::new("country_code".into(), DataType::String); 6 | let id = Field::new("security_id".into(), DataType::String); 7 | let cd = Field::new("check_digit".into(), DataType::String); 8 | 9 | let v: Vec = vec![cc, id, cd]; 10 | Ok(Field::new("".into(), DataType::Struct(v))) 11 | } 12 | 13 | #[polars_expr(output_type_func=isin_full_output)] 14 | fn pl_isin_full(inputs: &[Series]) -> PolarsResult { 15 | let ca = inputs[0].str()?; 16 | let mut cc_builder = StringChunkedBuilder::new("country_code".into(), ca.len()); 17 | let mut id_builder = StringChunkedBuilder::new("security_id".into(), ca.len()); 18 | let mut cd_builder = StringChunkedBuilder::new("check_digit".into(), ca.len()); 19 | 20 | ca.into_iter().for_each(|op_s| { 21 | if let Some(s) = op_s { 22 | if let Ok(isin) = isin::parse(s) { 23 | cc_builder.append_value(isin.prefix()); 24 | id_builder.append_value(isin.basic_code()); 25 | cd_builder.append_value(isin.check_digit().to_string()); 26 | } else { 27 | cc_builder.append_null(); 28 | id_builder.append_null(); 29 | cd_builder.append_null(); 30 | } 31 | } else { 32 | cc_builder.append_null(); 33 | id_builder.append_null(); 34 | cd_builder.append_null(); 35 | } 36 | }); 37 | 38 | let cc = cc_builder.finish().into_series().into_column(); 39 | let id = id_builder.finish().into_series().into_column(); 40 | let cd = cd_builder.finish().into_series().into_column(); 41 | 42 | let out = StructChunked::from_columns("isin".into(), cc.len(), &[cc, id, cd])?; 43 | Ok(out.into_series()) 44 | } 45 | 46 | #[polars_expr(output_type=String)] 47 | fn pl_isin_country_code(inputs: &[Series]) -> PolarsResult { 48 | let ca = inputs[0].str()?; 49 | 50 | let mut builder = StringChunkedBuilder::new("country_code".into(), ca.len()); 51 | 52 | ca.into_iter().for_each(|op_s| { 53 | if let Some(s) = op_s { 54 | if let Ok(isin) = isin::parse(s) { 55 | builder.append_value(isin.prefix()); 56 | } else { 57 | builder.append_null(); 58 | } 59 | } else { 60 | builder.append_null(); 61 | } 62 | }); 63 | 64 | let out = builder.finish(); 65 | Ok(out.into_series()) 66 | } 67 | 68 | #[polars_expr(output_type=String)] 69 | fn pl_isin_security_id(inputs: &[Series]) -> PolarsResult { 70 | let ca = inputs[0].str()?; 71 | 72 | let mut builder = StringChunkedBuilder::new("security_id".into(), ca.len()); 73 | 74 | ca.into_iter().for_each(|op_s| { 75 | if let Some(s) = op_s { 76 | if let Ok(isin) = isin::parse(s) { 77 | builder.append_value(isin.basic_code()); 78 | } else { 79 | builder.append_null(); 80 | } 81 | } else { 82 | builder.append_null(); 83 | } 84 | }); 85 | 86 | let out = builder.finish(); 87 | Ok(out.into_series()) 88 | } 89 | 90 | #[polars_expr(output_type=String)] 91 | fn pl_isin_check_digit(inputs: &[Series]) -> PolarsResult { 92 | let ca = inputs[0].str()?; 93 | 94 | let mut builder = StringChunkedBuilder::new("check_digit".into(), ca.len()); 95 | 96 | ca.into_iter().for_each(|op_s| { 97 | if let Some(s) = op_s { 98 | if let Ok(isin) = isin::parse(s) { 99 | builder.append_value(isin.check_digit().to_string()); 100 | } else { 101 | builder.append_null(); 102 | } 103 | } else { 104 | builder.append_null(); 105 | } 106 | }); 107 | 108 | let out = builder.finish(); 109 | Ok(out.into_series()) 110 | } 111 | 112 | #[polars_expr(output_type=Boolean)] 113 | fn pl_isin_is_valid(inputs: &[Series]) -> PolarsResult { 114 | let ca = inputs[0].str()?; 115 | 116 | let mut builder = BooleanChunkedBuilder::new("isin_valid".into(), ca.len()); 117 | 118 | ca.into_iter().for_each(|op_s| { 119 | if let Some(s) = op_s { 120 | builder.append_value(match isin::validate(s) { 121 | Ok(_) => true, 122 | Err(_) => false, 123 | }); 124 | } else { 125 | builder.append_value(false); 126 | } 127 | }); 128 | 129 | let out = builder.finish(); 130 | Ok(out.into_series()) 131 | } 132 | -------------------------------------------------------------------------------- /.github/workflows/CI.yml: -------------------------------------------------------------------------------- 1 | 2 | name: CI 3 | 4 | on: 5 | push: 6 | branches: 7 | - main 8 | tags: 9 | - "*" 10 | pull_request: 11 | workflow_dispatch: 12 | 13 | permissions: 14 | contents: read 15 | 16 | jobs: 17 | linux: 18 | runs-on: ubuntu-latest 19 | strategy: 20 | matrix: 21 | package: [polars_istr] 22 | os: [ubuntu-latest] 23 | target: [x86_64, aarch64] 24 | steps: 25 | - uses: actions/checkout@v4 26 | - uses: actions/setup-python@v4 27 | with: 28 | python-version: "3.9" 29 | 30 | - name: Test 31 | run: | 32 | python -m pip install --upgrade pip 33 | pip install pytest 34 | pip install . 35 | pip install -r tests/requirements-test.txt 36 | pytest tests/test_correctness.py 37 | 38 | - name: Build wheels 39 | uses: PyO3/maturin-action@v1 40 | with: 41 | target: ${{ matrix.target }} 42 | args: --release --out dist --find-interpreter 43 | sccache: "true" 44 | manylinux: auto 45 | maturin-version: 1.7.4 46 | 47 | - name: Upload wheels 48 | uses: actions/upload-artifact@v4 49 | with: 50 | name: wheel-${{ matrix.package }}-${{ matrix.os }}-${{ matrix.target }} 51 | path: dist/*.whl 52 | 53 | windows: 54 | runs-on: windows-latest 55 | strategy: 56 | matrix: 57 | package: [polars_istr] 58 | os: [windows-latest] 59 | target: [x86_64] 60 | steps: 61 | - uses: actions/checkout@v4 62 | - uses: actions/setup-python@v4 63 | with: 64 | python-version: "3.9" 65 | 66 | - name: Test 67 | run: | 68 | python -m pip install --upgrade pip 69 | pip install pytest 70 | pip install . 71 | pip install -r tests/requirements-test.txt 72 | pytest tests/test_correctness.py 73 | 74 | - name: Build wheels 75 | uses: PyO3/maturin-action@v1 76 | with: 77 | target: ${{ matrix.target }} 78 | args: --release --out dist --find-interpreter 79 | sccache: "true" 80 | maturin-version: 1.7.4 81 | 82 | - name: Upload wheels 83 | uses: actions/upload-artifact@v4 84 | with: 85 | name: wheel-${{ matrix.package }}-${{ matrix.os }}-${{ matrix.target }} 86 | path: dist/*.whl 87 | 88 | macos: 89 | runs-on: macos-13 90 | strategy: 91 | matrix: 92 | package: [polars_istr] 93 | os: [macos-13] 94 | target: [x86_64, aarch64] 95 | steps: 96 | - uses: actions/checkout@v4 97 | - uses: actions/setup-python@v4 98 | with: 99 | python-version: "3.9" 100 | 101 | - name: Test 102 | run: | 103 | python -m pip install --upgrade pip 104 | pip install pytest 105 | pip install . 106 | pip install -r tests/requirements-test.txt 107 | pytest tests/test_correctness.py 108 | 109 | - name: Build wheels 110 | uses: PyO3/maturin-action@v1 111 | with: 112 | target: ${{ matrix.target }} 113 | args: --release --out dist --find-interpreter 114 | sccache: "true" 115 | maturin-version: 1.7.4 116 | 117 | - name: Upload wheels 118 | uses: actions/upload-artifact@v4 119 | with: 120 | name: wheel-${{ matrix.package }}-${{ matrix.os }}-${{ matrix.target }} 121 | path: dist/*.whl 122 | 123 | sdist: 124 | runs-on: ubuntu-latest 125 | steps: 126 | - uses: actions/checkout@v4 127 | - name: Build sdist 128 | uses: PyO3/maturin-action@v1 129 | with: 130 | command: sdist 131 | args: --out dist 132 | - name: Upload sdist 133 | uses: actions/upload-artifact@v4 134 | with: 135 | name: wheels 136 | path: dist 137 | 138 | release: 139 | name: Release 140 | runs-on: ubuntu-latest 141 | if: "startsWith(github.ref, 'refs/tags/')" 142 | needs: [linux, windows, macos, sdist] 143 | permissions: 144 | id-token: write 145 | environment: release 146 | steps: 147 | - uses: actions/download-artifact@v4 148 | with: 149 | pattern: wheel-* 150 | merge-multiple: true 151 | - uses: actions/download-artifact@v4 152 | with: 153 | pattern: sdist-* 154 | merge-multiple: true 155 | - name: Publish to PyPI 156 | uses: PyO3/maturin-action@v1 157 | with: 158 | command: upload 159 | args: --non-interactive --skip-existing * 160 | -------------------------------------------------------------------------------- /src/url_parsing/mod.rs: -------------------------------------------------------------------------------- 1 | use polars::prelude::*; 2 | use pyo3_polars::derive::polars_expr; 3 | use url::Url; 4 | 5 | #[polars_expr(output_type=String)] 6 | fn pl_url_host(inputs: &[Series]) -> PolarsResult { 7 | let ca = inputs[0].str()?; 8 | let mut builder = StringChunkedBuilder::new("host".into(), ca.len()); 9 | 10 | ca.into_iter().for_each(|op_s| { 11 | if let Some(s) = op_s { 12 | if let Ok(u) = Url::parse(s) { 13 | builder.append_option(u.host_str()) 14 | } else { 15 | builder.append_null(); 16 | } 17 | } else { 18 | builder.append_null(); 19 | } 20 | }); 21 | let out = builder.finish(); 22 | Ok(out.into_series()) 23 | } 24 | 25 | #[polars_expr(output_type=String)] 26 | fn pl_url_domain(inputs: &[Series]) -> PolarsResult { 27 | let ca = inputs[0].str()?; 28 | let mut builder = StringChunkedBuilder::new("domain".into(), ca.len()); 29 | 30 | ca.into_iter().for_each(|op_s| { 31 | if let Some(s) = op_s { 32 | if let Ok(u) = Url::parse(s) { 33 | builder.append_option(u.domain()) 34 | } else { 35 | builder.append_null(); 36 | } 37 | } else { 38 | builder.append_null(); 39 | } 40 | }); 41 | let out = builder.finish(); 42 | Ok(out.into_series()) 43 | } 44 | 45 | #[polars_expr(output_type=String)] 46 | fn pl_url_fragment(inputs: &[Series]) -> PolarsResult { 47 | let ca = inputs[0].str()?; 48 | let mut builder = StringChunkedBuilder::new("fragment".into(), ca.len()); 49 | 50 | ca.into_iter().for_each(|op_s| { 51 | if let Some(s) = op_s { 52 | if let Ok(u) = Url::parse(s) { 53 | builder.append_option(u.fragment()) 54 | } else { 55 | builder.append_null(); 56 | } 57 | } else { 58 | builder.append_null(); 59 | } 60 | }); 61 | let out = builder.finish(); 62 | Ok(out.into_series()) 63 | } 64 | 65 | #[polars_expr(output_type=String)] 66 | fn pl_url_path(inputs: &[Series]) -> PolarsResult { 67 | let ca = inputs[0].str()?; 68 | let mut builder = StringChunkedBuilder::new("path".into(), ca.len()); 69 | 70 | ca.into_iter().for_each(|op_s| { 71 | if let Some(s) = op_s { 72 | if let Ok(u) = Url::parse(s) { 73 | builder.append_value(u.path()) 74 | } else { 75 | builder.append_null(); 76 | } 77 | } else { 78 | builder.append_null(); 79 | } 80 | }); 81 | let out = builder.finish(); 82 | Ok(out.into_series()) 83 | } 84 | 85 | #[polars_expr(output_type=String)] 86 | fn pl_url_query(inputs: &[Series]) -> PolarsResult { 87 | let ca = inputs[0].str()?; 88 | let mut builder = StringChunkedBuilder::new("query".into(), ca.len()); 89 | 90 | ca.into_iter().for_each(|op_s| { 91 | if let Some(s) = op_s { 92 | if let Ok(u) = Url::parse(s) { 93 | builder.append_option(u.query()) 94 | } else { 95 | builder.append_null(); 96 | } 97 | } else { 98 | builder.append_null(); 99 | } 100 | }); 101 | let out = builder.finish(); 102 | Ok(out.into_series()) 103 | } 104 | 105 | #[polars_expr(output_type=Boolean)] 106 | fn pl_url_is_special(inputs: &[Series]) -> PolarsResult { 107 | let ca = inputs[0].str()?; 108 | let mut builder = BooleanChunkedBuilder::new("is_special".into(), ca.len()); 109 | 110 | ca.into_iter().for_each(|op_s| { 111 | if let Some(s) = op_s { 112 | if let Ok(u) = Url::parse(s) { 113 | builder.append_value(u.is_special()); 114 | } else { 115 | builder.append_null(); 116 | } 117 | } else { 118 | builder.append_null(); 119 | } 120 | }); 121 | let out = builder.finish(); 122 | Ok(out.into_series()) 123 | } 124 | 125 | #[polars_expr(output_type=Boolean)] 126 | fn pl_url_is_valid(inputs: &[Series]) -> PolarsResult { 127 | let ca = inputs[0].str()?; 128 | let out: BooleanChunked = ca.apply_nonnull_values_generic(DataType::Boolean, |s| s.parse::().is_ok()); 129 | Ok(out.into_series()) 130 | } 131 | 132 | #[polars_expr(output_type=String)] 133 | fn pl_url_check(inputs: &[Series]) -> PolarsResult { 134 | let ca = inputs[0].str()?; 135 | 136 | let out = ca.apply_values(|s| 137 | match Url::parse(s) { 138 | Ok(_) => "ok".into(), 139 | Err(e) => match e { 140 | url::ParseError::EmptyHost => "empty host".into(), 141 | url::ParseError::IdnaError => "invalid international domain name".into(), 142 | url::ParseError::InvalidPort => "invalid port number".into(), 143 | url::ParseError::InvalidIpv4Address => "invalid IPv4 address".into(), 144 | url::ParseError::InvalidIpv6Address => "invalid IPv6 address".into(), 145 | url::ParseError::InvalidDomainCharacter => "invalid domain character".into(), 146 | url::ParseError::RelativeUrlWithoutBase => "relative URL without a base".into(), 147 | url::ParseError::RelativeUrlWithCannotBeABaseBase => "relative URL with a cannot-be-a-base base".into(), 148 | url::ParseError::SetHostOnCannotBeABaseUrl => "a cannot-be-a-base URL doesn’t have a host to set".into(), 149 | url::ParseError::Overflow => "URLs more than 4 GB are not supported".into(), 150 | _ => "unknown error".into() 151 | }, 152 | } 153 | ); 154 | Ok(out.into_series()) 155 | } 156 | -------------------------------------------------------------------------------- /src/iban_parsing/mod.rs: -------------------------------------------------------------------------------- 1 | use iban::{Iban, IbanLike}; 2 | use polars::prelude::*; 3 | use pyo3_polars::derive::polars_expr; 4 | use std::str::FromStr; 5 | 6 | // Using Builder seems to be the fastest way. 7 | fn iban_full_output(_: &[Field]) -> PolarsResult { 8 | let cc = Field::new("country_code".into(), DataType::String); 9 | let cd = Field::new("check_digits".into(), DataType::String); 10 | let bban = Field::new("bban".into(), DataType::String); 11 | let bank = Field::new("bank_id".into(), DataType::String); 12 | let branch = Field::new("branch_id".into(), DataType::String); 13 | let v: Vec = vec![cc, cd, bban, bank, branch]; 14 | Ok(Field::new("".into(), DataType::Struct(v))) 15 | } 16 | 17 | #[polars_expr(output_type_func=iban_full_output)] 18 | fn pl_iban_extract_all(inputs: &[Series]) -> PolarsResult { 19 | let ca = inputs[0].str()?; 20 | 21 | let mut cc_builder = StringChunkedBuilder::new("country_code".into(), ca.len()); 22 | let mut cd_builder = StringChunkedBuilder::new("check_digits".into(), ca.len()); 23 | let mut bban_builder = StringChunkedBuilder::new("bban".into(), ca.len()); 24 | let mut bank_builder = StringChunkedBuilder::new("bank_id".into(), ca.len()); 25 | let mut branch_builder = StringChunkedBuilder::new("branch_id".into(), ca.len()); 26 | 27 | ca.into_iter().for_each(|op_s| { 28 | if let Some(s) = op_s { 29 | if let Ok(iban) = Iban::from_str(s) { 30 | cc_builder.append_value(iban.country_code()); 31 | cd_builder.append_value(iban.check_digits_str()); 32 | bban_builder.append_value(iban.bban()); 33 | bank_builder.append_option(iban.bank_identifier()); 34 | branch_builder.append_option(iban.branch_identifier()); 35 | } else { 36 | cc_builder.append_null(); 37 | cd_builder.append_null(); 38 | bban_builder.append_null(); 39 | bank_builder.append_null(); 40 | branch_builder.append_null(); 41 | } 42 | } else { 43 | cc_builder.append_null(); 44 | cd_builder.append_null(); 45 | bban_builder.append_null(); 46 | bank_builder.append_null(); 47 | branch_builder.append_null(); 48 | } 49 | }); 50 | 51 | let cc = cc_builder.finish().into_series().into_column(); 52 | let cd = cd_builder.finish().into_series().into_column(); 53 | let bban = bban_builder.finish().into_series().into_column(); 54 | let bank = bank_builder.finish().into_series().into_column(); 55 | let branch = branch_builder.finish().into_series().into_column(); 56 | 57 | let out = StructChunked::from_columns( 58 | "iban".into(), 59 | cc.len(), 60 | &[cc, cd, bban, bank, branch] 61 | )?; 62 | Ok(out.into_series()) 63 | } 64 | 65 | #[polars_expr(output_type=String)] 66 | fn pl_iban_country_code(inputs: &[Series]) -> PolarsResult { 67 | let ca = inputs[0].str()?; 68 | let mut cc_builder = StringChunkedBuilder::new("country_code".into(), ca.len()); 69 | 70 | ca.into_iter().for_each(|op_s| { 71 | if let Some(s) = op_s { 72 | if let Ok(iban) = Iban::from_str(s) { 73 | cc_builder.append_value(iban.country_code()); 74 | } else { 75 | cc_builder.append_null(); 76 | } 77 | } else { 78 | cc_builder.append_null(); 79 | } 80 | }); 81 | let out = cc_builder.finish(); 82 | Ok(out.into_series()) 83 | } 84 | 85 | #[polars_expr(output_type=String)] 86 | fn pl_iban_check_digits(inputs: &[Series]) -> PolarsResult { 87 | let ca = inputs[0].str()?; 88 | let mut cc_builder = StringChunkedBuilder::new("check_digits".into(), ca.len()); 89 | 90 | ca.into_iter().for_each(|op_s| { 91 | if let Some(s) = op_s { 92 | if let Ok(iban) = Iban::from_str(s) { 93 | cc_builder.append_value(iban.check_digits_str()); 94 | } else { 95 | cc_builder.append_null(); 96 | } 97 | } else { 98 | cc_builder.append_null(); 99 | } 100 | }); 101 | let out = cc_builder.finish(); 102 | Ok(out.into_series()) 103 | } 104 | 105 | #[polars_expr(output_type=String)] 106 | fn pl_iban_bank_identifier(inputs: &[Series]) -> PolarsResult { 107 | let ca = inputs[0].str()?; 108 | let mut ba_builder = StringChunkedBuilder::new("bank_id".into(), ca.len()); 109 | 110 | ca.into_iter().for_each(|op_s| { 111 | if let Some(s) = op_s { 112 | if let Ok(iban) = Iban::from_str(s) { 113 | ba_builder.append_option(iban.bank_identifier()); 114 | } else { 115 | ba_builder.append_null(); 116 | } 117 | } else { 118 | ba_builder.append_null(); 119 | } 120 | }); 121 | let out = ba_builder.finish(); 122 | Ok(out.into_series()) 123 | } 124 | 125 | #[polars_expr(output_type=String)] 126 | fn pl_iban_branch_identifier(inputs: &[Series]) -> PolarsResult { 127 | let ca = inputs[0].str()?; 128 | let mut br_builder = StringChunkedBuilder::new("branch_id".into(), ca.len()); 129 | 130 | ca.into_iter().for_each(|op_s| { 131 | if let Some(s) = op_s { 132 | if let Ok(iban) = Iban::from_str(s) { 133 | br_builder.append_option(iban.branch_identifier()); 134 | } else { 135 | br_builder.append_null(); 136 | } 137 | } else { 138 | br_builder.append_null(); 139 | } 140 | }); 141 | let out = br_builder.finish(); 142 | Ok(out.into_series()) 143 | } 144 | 145 | #[polars_expr(output_type=Boolean)] 146 | fn pl_iban_bban(inputs: &[Series]) -> PolarsResult { 147 | let ca = inputs[0].str()?; 148 | let mut cc_builder = StringChunkedBuilder::new("bban".into(), ca.len()); 149 | 150 | ca.into_iter().for_each(|op_s| { 151 | if let Some(s) = op_s { 152 | if let Ok(iban) = Iban::from_str(s) { 153 | cc_builder.append_value(iban.bban()); 154 | } else { 155 | cc_builder.append_null(); 156 | } 157 | } else { 158 | cc_builder.append_null(); 159 | } 160 | }); 161 | let out = cc_builder.finish(); 162 | Ok(out.into_series()) 163 | } 164 | 165 | #[polars_expr(output_type=Boolean)] 166 | fn pl_iban_is_valid(inputs: &[Series]) -> PolarsResult { 167 | let ca = inputs[0].str()?; 168 | let out: BooleanChunked = ca.apply_nonnull_values_generic( 169 | DataType::Boolean, 170 | |s| s.parse::().is_ok() 171 | ); 172 | Ok(out.into_series()) 173 | } 174 | 175 | #[polars_expr(output_type=String)] 176 | fn pl_iban_check(inputs: &[Series]) -> PolarsResult { 177 | let ca = inputs[0].str()?; 178 | let out = ca.apply_values(|s| { 179 | match Iban::from_str(s) { 180 | Ok(_) => "ok".into(), 181 | Err(e) => match e { 182 | iban::ParseIbanError::InvalidBaseIban { source } => match source { 183 | iban::ParseBaseIbanError::InvalidFormat => { 184 | "Invalid format (len/char)".into() 185 | } 186 | iban::ParseBaseIbanError::InvalidChecksum => "Invalid checksum".into(), 187 | }, 188 | iban::ParseIbanError::InvalidBban(_) => "Invalid Bban".into(), 189 | iban::ParseIbanError::UnknownCountry(_) => "Invalid country code".into(), 190 | }, 191 | } 192 | 193 | }); 194 | Ok(out.into_series()) 195 | } 196 | -------------------------------------------------------------------------------- /src/cusip_parsing/mod.rs: -------------------------------------------------------------------------------- 1 | use cusip::CUSIP; 2 | use polars::prelude::*; 3 | use pyo3_polars::derive::polars_expr; 4 | 5 | fn cusip_full_output(_: &[Field]) -> PolarsResult { 6 | let cc = Field::new("country_code".into(), DataType::String); 7 | let issuer = Field::new("issuer".into(), DataType::String); 8 | let issue = Field::new("issue".into(), DataType::String); 9 | let cd = Field::new("check_digit".into(), DataType::String); 10 | 11 | let v: Vec = vec![cc, issuer, issue, cd]; 12 | Ok(Field::new("".into(), DataType::Struct(v))) 13 | } 14 | 15 | #[polars_expr(output_type_func=cusip_full_output)] 16 | fn pl_cusip_full(inputs: &[Series]) -> PolarsResult { 17 | let ca = inputs[0].str()?; 18 | 19 | let mut cc_builder = StringChunkedBuilder::new("country_code".into(), ca.len()); 20 | let mut ir_builder = StringChunkedBuilder::new("issuer".into(), ca.len()); 21 | let mut is_builder = StringChunkedBuilder::new("issue".into(), ca.len()); 22 | let mut cd_builder = StringChunkedBuilder::new("check_digit".into(), ca.len()); 23 | 24 | ca.into_iter().for_each(|op_s| { 25 | if let Some(s) = op_s { 26 | if let Ok(cusip) = CUSIP::parse(s) { 27 | if let Some(cins) = cusip.as_cins() { 28 | cc_builder.append_value(cins.country_code().to_string()); 29 | ir_builder.append_value(cusip.issuer_num()); 30 | is_builder.append_value(cusip.issue_num()); 31 | cd_builder.append_value(cusip.check_digit().to_string()); 32 | } else { 33 | cc_builder.append_null(); 34 | ir_builder.append_value(cusip.issuer_num()); 35 | is_builder.append_value(cusip.issue_num()); 36 | cd_builder.append_value(cusip.check_digit().to_string()); 37 | } 38 | } else { 39 | cc_builder.append_null(); 40 | ir_builder.append_null(); 41 | is_builder.append_null(); 42 | cd_builder.append_null(); 43 | } 44 | } else { 45 | cc_builder.append_null(); 46 | ir_builder.append_null(); 47 | is_builder.append_null(); 48 | cd_builder.append_null(); 49 | } 50 | }); 51 | let cc = cc_builder.finish().into_series().into_column(); 52 | let ir = ir_builder.finish().into_series().into_column(); 53 | let is = is_builder.finish().into_series().into_column(); 54 | let cd = cd_builder.finish().into_series().into_column(); 55 | 56 | let out = StructChunked::from_columns("cusip".into(), cc.len(), &[cc, ir, is, cd])?; 57 | Ok(out.into_series()) 58 | } 59 | 60 | #[polars_expr(output_type=String)] 61 | fn pl_cusip_issue_num(inputs: &[Series]) -> PolarsResult { 62 | let ca = inputs[0].str()?; 63 | 64 | let mut s_builder = StringChunkedBuilder::new("issue_num".into(), ca.len()); 65 | 66 | ca.into_iter().for_each(|op_s| { 67 | if let Some(s) = op_s { 68 | if let Ok(cusip) = CUSIP::parse(s) { 69 | s_builder.append_value(cusip.issue_num()); 70 | } else { 71 | s_builder.append_null(); 72 | } 73 | } else { 74 | s_builder.append_null(); 75 | } 76 | }); 77 | 78 | let out = s_builder.finish(); 79 | Ok(out.into_series()) 80 | } 81 | 82 | #[polars_expr(output_type=String)] 83 | fn pl_cusip_issuer_num(inputs: &[Series]) -> PolarsResult { 84 | let ca = inputs[0].str()?; 85 | 86 | let mut s_builder = StringChunkedBuilder::new("issuer_num".into(), ca.len()); 87 | 88 | ca.into_iter().for_each(|op_s| { 89 | if let Some(s) = op_s { 90 | if let Ok(cusip) = CUSIP::parse(s) { 91 | if let Some(cins) = cusip.as_cins() { 92 | s_builder.append_value(cins.issuer_num()); 93 | } else { 94 | s_builder.append_value(cusip.issuer_num()); 95 | } 96 | } else { 97 | s_builder.append_null(); 98 | } 99 | } else { 100 | s_builder.append_null(); 101 | } 102 | }); 103 | 104 | let out = s_builder.finish(); 105 | Ok(out.into_series()) 106 | } 107 | 108 | #[polars_expr(output_type=String)] 109 | fn pl_cusip_country_code(inputs: &[Series]) -> PolarsResult { 110 | let ca = inputs[0].str()?; 111 | 112 | let mut s_builder = StringChunkedBuilder::new("country_code".into(), ca.len()); 113 | 114 | ca.into_iter().for_each(|op_s| { 115 | if let Some(s) = op_s { 116 | if let Ok(cusip) = CUSIP::parse(s) { 117 | if let Some(cins) = cusip.as_cins() { 118 | s_builder.append_value(cins.country_code().to_string()); 119 | } else { 120 | s_builder.append_null(); 121 | } 122 | } else { 123 | s_builder.append_null(); 124 | } 125 | } else { 126 | s_builder.append_null(); 127 | } 128 | }); 129 | 130 | let out = s_builder.finish(); 131 | Ok(out.into_series()) 132 | } 133 | 134 | #[polars_expr(output_type=String)] 135 | fn pl_cusip_check_digit(inputs: &[Series]) -> PolarsResult { 136 | let ca = inputs[0].str()?; 137 | 138 | let mut s_builder = StringChunkedBuilder::new("check_digit".into(), ca.len()); 139 | 140 | ca.into_iter().for_each(|op_s| { 141 | if let Some(s) = op_s { 142 | if let Ok(cusip) = CUSIP::parse(s) { 143 | s_builder.append_value(cusip.check_digit().to_string()); 144 | } else { 145 | s_builder.append_null(); 146 | } 147 | } else { 148 | s_builder.append_null(); 149 | } 150 | }); 151 | 152 | let out = s_builder.finish(); 153 | Ok(out.into_series()) 154 | } 155 | 156 | #[polars_expr(output_type=String)] 157 | fn pl_cusip_payload(inputs: &[Series]) -> PolarsResult { 158 | let ca = inputs[0].str()?; 159 | 160 | let mut s_builder = StringChunkedBuilder::new("check_digit".into(), ca.len()); 161 | 162 | ca.into_iter().for_each(|op_s| { 163 | if let Some(s) = op_s { 164 | if let Ok(cusip) = CUSIP::parse(s) { 165 | s_builder.append_value(cusip.payload()); 166 | } else { 167 | s_builder.append_null(); 168 | } 169 | } else { 170 | s_builder.append_null(); 171 | } 172 | }); 173 | 174 | let out = s_builder.finish(); 175 | Ok(out.into_series()) 176 | } 177 | 178 | #[polars_expr(output_type=Boolean)] 179 | fn pl_cusip_is_private_issue(inputs: &[Series]) -> PolarsResult { 180 | let ca = inputs[0].str()?; 181 | 182 | let mut b_builder = BooleanChunkedBuilder::new("is_private_issue".into(), ca.len()); 183 | 184 | ca.into_iter().for_each(|op_s| { 185 | if let Some(s) = op_s { 186 | if let Ok(cusip) = CUSIP::parse(s) { 187 | b_builder.append_value(cusip.is_private_issue()); 188 | } else { 189 | b_builder.append_null() 190 | } 191 | } else { 192 | b_builder.append_null(); 193 | } 194 | }); 195 | 196 | let out = b_builder.finish(); 197 | Ok(out.into_series()) 198 | } 199 | 200 | #[polars_expr(output_type=Boolean)] 201 | fn pl_cusip_has_private_issuer(inputs: &[Series]) -> PolarsResult { 202 | let ca = inputs[0].str()?; 203 | 204 | let mut b_builder = BooleanChunkedBuilder::new("has_private_issuer".into(), ca.len()); 205 | 206 | ca.into_iter().for_each(|op_s| { 207 | if let Some(s) = op_s { 208 | if let Ok(cusip) = CUSIP::parse(s) { 209 | b_builder.append_value(cusip.has_private_issuer()); 210 | } else { 211 | b_builder.append_null() 212 | } 213 | } else { 214 | b_builder.append_null(); 215 | } 216 | }); 217 | 218 | let out = b_builder.finish(); 219 | Ok(out.into_series()) 220 | } 221 | 222 | #[polars_expr(output_type=Boolean)] 223 | fn pl_cusip_is_private_use(inputs: &[Series]) -> PolarsResult { 224 | let ca = inputs[0].str()?; 225 | 226 | let mut b_builder = BooleanChunkedBuilder::new("is_private_use".into(), ca.len()); 227 | 228 | ca.into_iter().for_each(|op_s| { 229 | if let Some(s) = op_s { 230 | if let Ok(cusip) = CUSIP::parse(s) { 231 | b_builder.append_value(cusip.is_private_use()); 232 | } else { 233 | b_builder.append_null() 234 | } 235 | } else { 236 | b_builder.append_null(); 237 | } 238 | }); 239 | 240 | let out = b_builder.finish(); 241 | Ok(out.into_series()) 242 | } 243 | 244 | #[polars_expr(output_type=Boolean)] 245 | fn pl_cusip_is_cins(inputs: &[Series]) -> PolarsResult { 246 | let ca = inputs[0].str()?; 247 | 248 | let mut b_builder = BooleanChunkedBuilder::new("is_cins".into(), ca.len()); 249 | 250 | ca.into_iter().for_each(|op_s| { 251 | if let Some(s) = op_s { 252 | if let Ok(cusip) = CUSIP::parse(s) { 253 | b_builder.append_value(cusip.is_cins()); 254 | } else { 255 | b_builder.append_null() 256 | } 257 | } else { 258 | b_builder.append_null(); 259 | } 260 | }); 261 | 262 | let out = b_builder.finish(); 263 | Ok(out.into_series()) 264 | } 265 | 266 | #[polars_expr(output_type=Boolean)] 267 | fn pl_cusip_is_cins_base(inputs: &[Series]) -> PolarsResult { 268 | let ca = inputs[0].str()?; 269 | 270 | let mut b_builder = BooleanChunkedBuilder::new("is_cins_base".into(), ca.len()); 271 | 272 | ca.into_iter().for_each(|op_s| { 273 | if let Some(s) = op_s { 274 | if let Ok(cusip) = CUSIP::parse(s) { 275 | if let Some(cins) = cusip.as_cins() { 276 | b_builder.append_value(cins.is_base()); 277 | } else { 278 | b_builder.append_null(); 279 | } 280 | } else { 281 | b_builder.append_null(); 282 | } 283 | } else { 284 | b_builder.append_null(); 285 | } 286 | }); 287 | 288 | let out = b_builder.finish(); 289 | Ok(out.into_series()) 290 | } 291 | 292 | #[polars_expr(output_type=Boolean)] 293 | fn pl_cusip_is_cins_extended(inputs: &[Series]) -> PolarsResult { 294 | let ca = inputs[0].str()?; 295 | 296 | let mut b_builder = BooleanChunkedBuilder::new("is_cins_extended".into(), ca.len()); 297 | 298 | ca.into_iter().for_each(|op_s| { 299 | if let Some(s) = op_s { 300 | if let Ok(cusip) = CUSIP::parse(s) { 301 | if let Some(cins) = cusip.as_cins() { 302 | b_builder.append_value(cins.is_extended()); 303 | } else { 304 | b_builder.append_null(); 305 | } 306 | } else { 307 | b_builder.append_null() 308 | } 309 | } else { 310 | b_builder.append_null(); 311 | } 312 | }); 313 | 314 | let out = b_builder.finish(); 315 | Ok(out.into_series()) 316 | } 317 | -------------------------------------------------------------------------------- /tests/test_correctness.py: -------------------------------------------------------------------------------- 1 | import polars as pl 2 | from polars.testing import assert_frame_equal 3 | from typing import List 4 | import pytest 5 | from typing import Optional 6 | from polars_istr import * # noqa: F403 7 | 8 | 9 | # There are no valid test cases for Extended CINS or Private Issue(r) since I could not 10 | # find any existing cusips readily available (including in the cusip crate). 11 | # If anyone has encountered one and would like it added to the tests, please raise an 12 | # issue. 13 | @pytest.mark.parametrize( 14 | """df,issue_num, issuer_num,check_digit,country_code, 15 | payload,is_private_issue,has_private_issuer,is_private_use,is_cins, 16 | is_cins_base,is_cins_extended""", 17 | [ 18 | ( 19 | pl.DataFrame( 20 | { 21 | "cusip": [ 22 | "303075105", # regular cusip (FactSet - Common Stock) 23 | "30307510", # regular cusip ex. check digit 24 | "G0052B105", # regular CINS (Abingdon Capital PLC - Shares) 25 | "HELLOWORLD", # Invalid 26 | ] 27 | } 28 | ), 29 | ["10", None, "10", None], 30 | ["303075", None, "0052B", None], 31 | ["5", None, "5", None], 32 | [None, None, "G", None], 33 | ["30307510", None, "G0052B10", None], 34 | [False, None, False, None], 35 | [False, None, False, None], 36 | [False, None, False, None], 37 | [False, None, True, None], 38 | [ 39 | None, 40 | None, 41 | True, 42 | None, 43 | ], # TODO for these last 2, should regular cusips return False or None? 44 | [None, None, False, None], 45 | ) 46 | ], 47 | ) 48 | def test_cusip( 49 | df: pl.DataFrame, 50 | issue_num: List[str], 51 | issuer_num: List[str], 52 | check_digit: List[str], 53 | country_code: List[str], 54 | payload: List[str], 55 | is_private_issue: List[str], 56 | has_private_issuer: List[str], 57 | is_private_use: List[str], 58 | is_cins: List[str], 59 | is_cins_base: List[str], 60 | is_cins_extended: List[str], 61 | ): 62 | test1 = df.select( 63 | cusip_issue_num(pl.col("cusip")).alias("issue_num"), 64 | cusip_issuer_num(pl.col("cusip")).alias("issuer_num"), 65 | cusip_check_digit(pl.col("cusip")).alias("check_digit"), 66 | cusip_country_code(pl.col("cusip")).alias("country_code"), 67 | cusip_payload(pl.col("cusip")).alias("payload"), 68 | cusip_is_private_issue(pl.col("cusip")).alias("is_private_issue"), 69 | cusip_has_private_issuer(pl.col("cusip")).alias("has_private_issuer"), 70 | cusip_is_private_use(pl.col("cusip")).alias("is_private_use"), 71 | cusip_is_cins(pl.col("cusip")).alias("is_cins"), 72 | cusip_is_cins_base(pl.col("cusip")).alias("is_cins_base"), 73 | cusip_is_cins_extended(pl.col("cusip")).alias("is_cins_extended"), 74 | ) 75 | 76 | test2 = ( 77 | df.lazy() 78 | .select( 79 | cusip_issue_num(pl.col("cusip")).alias("issue_num"), 80 | cusip_issuer_num(pl.col("cusip")).alias("issuer_num"), 81 | cusip_check_digit(pl.col("cusip")).alias("check_digit"), 82 | cusip_country_code(pl.col("cusip")).alias("country_code"), 83 | cusip_payload(pl.col("cusip")).alias("payload"), 84 | cusip_is_private_issue(pl.col("cusip")).alias("is_private_issue"), 85 | cusip_has_private_issuer(pl.col("cusip")).alias("has_private_issuer"), 86 | cusip_is_private_use(pl.col("cusip")).alias("is_private_use"), 87 | cusip_is_cins(pl.col("cusip")).alias("is_cins"), 88 | cusip_is_cins_base(pl.col("cusip")).alias("is_cins_base"), 89 | cusip_is_cins_extended(pl.col("cusip")).alias("is_cins_extended"), 90 | ) 91 | .collect() 92 | ) 93 | ans = pl.DataFrame( 94 | { 95 | "issue_num": issue_num, 96 | "issuer_num": issuer_num, 97 | "check_digit": check_digit, 98 | "country_code": country_code, 99 | "payload": payload, 100 | "is_private_issue": is_private_issue, 101 | "has_private_issuer": has_private_issuer, 102 | "is_private_use": is_private_use, 103 | "is_cins": is_cins, 104 | "is_cins_base": is_cins_base, 105 | "is_cins_extended": is_cins_extended, 106 | } 107 | ) 108 | 109 | assert_frame_equal(test1, ans) 110 | assert_frame_equal(test2, ans) 111 | 112 | 113 | @pytest.mark.parametrize( 114 | "df, cc, cd, reason, is_valid, bban, bank_id, branch_id", 115 | [ 116 | ( 117 | pl.DataFrame( 118 | { 119 | "iban": [ 120 | "AA110011123Z5678", 121 | "DE44500105175407324931", 122 | "AD1200012030200359100100", 123 | "MR0000020001010000123456754", 124 | ] 125 | } 126 | ), 127 | [None, "DE", "AD", None], 128 | [None, "44", "12", None], 129 | ["Invalid country code", "ok", "ok", "Invalid checksum"], 130 | [False, True, True, False], 131 | [None, "500105175407324931", "00012030200359100100", None], 132 | [None, "50010517", "0001", None], 133 | [None, None, "2030", None], 134 | ) 135 | ], 136 | ) 137 | def test_iban1( 138 | df: pl.DataFrame, 139 | cc: List[Optional[str]], 140 | cd: List[Optional[str]], 141 | reason: List[Optional[str]], 142 | is_valid: List[Optional[bool]], 143 | bban: List[Optional[str]], 144 | bank_id: List[Optional[str]], 145 | branch_id: List[Optional[str]], 146 | ): 147 | test1 = df.select( 148 | iban_country_code(pl.col("iban")).alias("country_code"), 149 | iban_check_digits(pl.col("iban")).alias("check_digits"), 150 | iban_check(pl.col("iban")).alias("reason"), 151 | iban_is_valid(pl.col("iban")).alias("is_valid"), 152 | iban_bban(pl.col("iban")).alias("bban"), 153 | iban_bank_id(pl.col("iban")).alias("bank_id"), 154 | iban_branch_id(pl.col("iban")).alias("branch_id"), 155 | ) 156 | 157 | test2 = ( 158 | df.lazy() 159 | .select( 160 | iban_country_code(pl.col("iban")).alias("country_code"), 161 | iban_check_digits(pl.col("iban")).alias("check_digits"), 162 | iban_check(pl.col("iban")).alias("reason"), 163 | iban_is_valid(pl.col("iban")).alias("is_valid"), 164 | iban_bban(pl.col("iban")).alias("bban"), 165 | iban_bank_id(pl.col("iban")).alias("bank_id"), 166 | iban_branch_id(pl.col("iban")).alias("branch_id"), 167 | ) 168 | .collect() 169 | ) 170 | 171 | ans = pl.DataFrame( 172 | { 173 | "country_code": cc, 174 | "check_digits": cd, 175 | "reason": reason, 176 | "is_valid": is_valid, 177 | "bban": bban, 178 | "bank_id": bank_id, 179 | "branch_id": branch_id, 180 | } 181 | ) 182 | 183 | assert_frame_equal(test1, ans) 184 | assert_frame_equal(test2, ans) 185 | 186 | 187 | @pytest.mark.parametrize( 188 | "df, host, domain, fragment, path, query, check, is_valid, is_special", 189 | [ 190 | ( 191 | pl.DataFrame( 192 | { 193 | "url": [ 194 | "https://example.com/data.csv#row=4", 195 | "google.com", 196 | "ww.google.com", 197 | "abc123@email.com", 198 | "https://127.0.0.1/", 199 | "https://test.com/", 200 | "file:///tmp/foo", 201 | "https://example.com/products?page=2&sort=desc", 202 | None, 203 | ] 204 | } 205 | ), 206 | ["example.com", None, None, None, "127.0.0.1", "test.com", None, "example.com", None], 207 | ["example.com", None, None, None, None, "test.com", None, "example.com", None], 208 | ["row=4", None, None, None, None, None, None, None, None], 209 | ["/data.csv", None, None, None, "/", "/", "/tmp/foo", "/products", None], 210 | [None, None, None, None, None, None, None, "page=2&sort=desc", None], 211 | [ 212 | "ok", 213 | "relative URL without a base", 214 | "relative URL without a base", 215 | "relative URL without a base", 216 | "ok", 217 | "ok", 218 | "ok", 219 | "ok", 220 | None, 221 | ], 222 | [True, False, False, False, True, True, True, True, None], 223 | [True, None, None, None, True, True, True, True, None], 224 | ) 225 | ], 226 | ) 227 | def test_url1( 228 | df: pl.DataFrame, 229 | host: List[Optional[str]], 230 | domain: List[Optional[str]], 231 | fragment: List[Optional[str]], 232 | path: List[Optional[str]], 233 | query: List[Optional[str]], 234 | check: List[Optional[str]], 235 | is_valid: List[Optional[bool]], 236 | is_special: List[Optional[bool]], 237 | ): 238 | test1 = df.select( 239 | url_host(pl.col("url")).alias("host"), 240 | url_domain(pl.col("url")).alias("domain"), 241 | url_fragment(pl.col("url")).alias("fragment"), 242 | url_path(pl.col("url")).alias("path"), 243 | url_query(pl.col("url")).alias("query"), 244 | url_check(pl.col("url")).alias("check"), 245 | url_is_valid(pl.col("url")).alias("is_valid"), 246 | url_is_special(pl.col("url")).alias("is_special"), 247 | ) 248 | 249 | test2 = ( 250 | df.lazy() 251 | .select( 252 | url_host(pl.col("url")).alias("host"), 253 | url_domain(pl.col("url")).alias("domain"), 254 | url_fragment(pl.col("url")).alias("fragment"), 255 | url_path(pl.col("url")).alias("path"), 256 | url_query(pl.col("url")).alias("query"), 257 | url_check(pl.col("url")).alias("check"), 258 | url_is_valid(pl.col("url")).alias("is_valid"), 259 | url_is_special(pl.col("url")).alias("is_special"), 260 | ) 261 | .collect() 262 | ) 263 | 264 | ans = pl.DataFrame( 265 | { 266 | "host": host, 267 | "domain": domain, 268 | "fragment": fragment, 269 | "path": path, 270 | "query": query, 271 | "check": check, 272 | "is_valid": is_valid, 273 | "is_special": is_special, 274 | } 275 | ) 276 | 277 | assert_frame_equal(test1, ans) 278 | assert_frame_equal(test2, ans) 279 | 280 | 281 | @pytest.mark.parametrize( 282 | "df, cc, cd, sec_id, is_valid", 283 | [ 284 | ( 285 | pl.DataFrame( 286 | { 287 | "isin": [ 288 | "US0378331005", # AAPL 289 | "US0378331008", # AAPL w/ bad check digit 290 | "US037833100", # AAPL w/o check digit 291 | "CA00206RGB20", # Canadian 292 | "XS1550212416", # Other 293 | None, 294 | ] 295 | } 296 | ), 297 | ["US", None, None, "CA", "XS", None], 298 | ["5", None, None, "0", "6", None], 299 | ["037833100", None, None, "00206RGB2", "155021241", None], 300 | [True, False, False, True, True, False], 301 | ) 302 | ], 303 | ) 304 | def test_isin1( 305 | df: pl.DataFrame, 306 | cc: List[Optional[str]], 307 | cd: List[Optional[str]], 308 | sec_id: List[Optional[str]], 309 | is_valid: List[Optional[str]], 310 | ): 311 | test1 = df.select( 312 | isin_country_code(pl.col("isin")).alias("country_code"), 313 | isin_check_digit(pl.col("isin")).alias("check_digit"), 314 | isin_security_id(pl.col("isin")).alias("security_id"), 315 | isin_is_valid(pl.col("isin")).alias("is_valid"), 316 | ) 317 | test2 = ( 318 | df.lazy() 319 | .select( 320 | isin_country_code(pl.col("isin")).alias("country_code"), 321 | isin_check_digit(pl.col("isin")).alias("check_digit"), 322 | isin_security_id(pl.col("isin")).alias("security_id"), 323 | isin_is_valid(pl.col("isin")).alias("is_valid"), 324 | ) 325 | .collect() 326 | ) 327 | 328 | ans = pl.DataFrame( 329 | { 330 | "country_code": cc, 331 | "check_digit": cd, 332 | "security_id": sec_id, 333 | "is_valid": is_valid, 334 | } 335 | ) 336 | 337 | assert_frame_equal(test1, ans) 338 | assert_frame_equal(test2, ans) 339 | -------------------------------------------------------------------------------- /examples/basics.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "id": "529f4422-5c3a-4bd6-abe0-a15edfc62abb", 7 | "metadata": {}, 8 | "outputs": [], 9 | "source": [ 10 | "import polars as pl\n", 11 | "import polars_istr as istr" 12 | ] 13 | }, 14 | { 15 | "cell_type": "markdown", 16 | "id": "069a796e", 17 | "metadata": {}, 18 | "source": [ 19 | "# IBAN" 20 | ] 21 | }, 22 | { 23 | "cell_type": "code", 24 | "execution_count": 2, 25 | "id": "c324a101", 26 | "metadata": {}, 27 | "outputs": [ 28 | { 29 | "data": { 30 | "text/html": [ 31 | "
\n", 38 | "shape: (4, 1)
iban
str
"AA110011123Z5678"
"DE44500105175407324931"
"AD1200012030200359100100"
"MR0000020001010000123456754"
" 39 | ], 40 | "text/plain": [ 41 | "shape: (4, 1)\n", 42 | "┌─────────────────────────────┐\n", 43 | "│ iban │\n", 44 | "│ --- │\n", 45 | "│ str │\n", 46 | "╞═════════════════════════════╡\n", 47 | "│ AA110011123Z5678 │\n", 48 | "│ DE44500105175407324931 │\n", 49 | "│ AD1200012030200359100100 │\n", 50 | "│ MR0000020001010000123456754 │\n", 51 | "└─────────────────────────────┘" 52 | ] 53 | }, 54 | "execution_count": 2, 55 | "metadata": {}, 56 | "output_type": "execute_result" 57 | } 58 | ], 59 | "source": [ 60 | "# First str does not have a valid country code. So not an iban. Second and third are valid.\n", 61 | "# Last one has invalid checksum\n", 62 | "df = pl.DataFrame({\n", 63 | " \"iban\": [\"AA110011123Z5678\", \"DE44500105175407324931\", \"AD1200012030200359100100\", \"MR0000020001010000123456754\"]\n", 64 | "})\n", 65 | "df.head()" 66 | ] 67 | }, 68 | { 69 | "cell_type": "code", 70 | "execution_count": 3, 71 | "id": "32d3bedf", 72 | "metadata": {}, 73 | "outputs": [ 74 | { 75 | "data": { 76 | "text/html": [ 77 | "
\n", 84 | "shape: (4, 6)
country_codereasonis_validbbanbank_idbranch_id
strstrboolstrstrstr
null"Invalid country code"falsenullnullnull
"DE""ok"true"500105175407324931""50010517"null
"AD""ok"true"00012030200359100100""0001""2030"
null"Invalid checksum"falsenullnullnull
" 85 | ], 86 | "text/plain": [ 87 | "shape: (4, 6)\n", 88 | "┌──────────────┬──────────────────────┬──────────┬──────────────────────┬──────────┬───────────┐\n", 89 | "│ country_code ┆ reason ┆ is_valid ┆ bban ┆ bank_id ┆ branch_id │\n", 90 | "│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │\n", 91 | "│ str ┆ str ┆ bool ┆ str ┆ str ┆ str │\n", 92 | "╞══════════════╪══════════════════════╪══════════╪══════════════════════╪══════════╪═══════════╡\n", 93 | "│ null ┆ Invalid country code ┆ false ┆ null ┆ null ┆ null │\n", 94 | "│ DE ┆ ok ┆ true ┆ 500105175407324931 ┆ 50010517 ┆ null │\n", 95 | "│ AD ┆ ok ┆ true ┆ 00012030200359100100 ┆ 0001 ┆ 2030 │\n", 96 | "│ null ┆ Invalid checksum ┆ false ┆ null ┆ null ┆ null │\n", 97 | "└──────────────┴──────────────────────┴──────────┴──────────────────────┴──────────┴───────────┘" 98 | ] 99 | }, 100 | "execution_count": 3, 101 | "metadata": {}, 102 | "output_type": "execute_result" 103 | } 104 | ], 105 | "source": [ 106 | "df.select(\n", 107 | " istr.iban_country_code(\"iban\").alias(\"country_code\"),\n", 108 | " istr.iban_check(\"iban\").alias(\"reason\"),\n", 109 | " istr.iban_is_valid(\"iban\").alias(\"is_valid\"),\n", 110 | " istr.iban_bban(\"iban\").alias(\"bban\"),\n", 111 | " istr.iban_bank_id(\"iban\").alias(\"bank_id\"),\n", 112 | " istr.iban_branch_id(\"iban\").alias(\"branch_id\"),\n", 113 | ") " 114 | ] 115 | }, 116 | { 117 | "cell_type": "code", 118 | "execution_count": 4, 119 | "id": "4b92b4a3", 120 | "metadata": {}, 121 | "outputs": [ 122 | { 123 | "data": { 124 | "text/html": [ 125 | "
\n", 132 | "shape: (4, 5)
country_codecheck_digitsbbanbank_idbranch_id
strstrstrstrstr
nullnullnullnullnull
"DE""44""500105175407324931""50010517"null
"AD""12""00012030200359100100""0001""2030"
nullnullnullnullnull
" 133 | ], 134 | "text/plain": [ 135 | "shape: (4, 5)\n", 136 | "┌──────────────┬──────────────┬──────────────────────┬──────────┬───────────┐\n", 137 | "│ country_code ┆ check_digits ┆ bban ┆ bank_id ┆ branch_id │\n", 138 | "│ --- ┆ --- ┆ --- ┆ --- ┆ --- │\n", 139 | "│ str ┆ str ┆ str ┆ str ┆ str │\n", 140 | "╞══════════════╪══════════════╪══════════════════════╪══════════╪═══════════╡\n", 141 | "│ null ┆ null ┆ null ┆ null ┆ null │\n", 142 | "│ DE ┆ 44 ┆ 500105175407324931 ┆ 50010517 ┆ null │\n", 143 | "│ AD ┆ 12 ┆ 00012030200359100100 ┆ 0001 ┆ 2030 │\n", 144 | "│ null ┆ null ┆ null ┆ null ┆ null │\n", 145 | "└──────────────┴──────────────┴──────────────────────┴──────────┴───────────┘" 146 | ] 147 | }, 148 | "execution_count": 4, 149 | "metadata": {}, 150 | "output_type": "execute_result" 151 | } 152 | ], 153 | "source": [ 154 | "df.select(\n", 155 | " istr.iban_extract_all(\"iban\").alias(\"ib\")\n", 156 | ").unnest(\"ib\")" 157 | ] 158 | }, 159 | { 160 | "cell_type": "markdown", 161 | "id": "4a6b3620", 162 | "metadata": {}, 163 | "source": [ 164 | "# ISIN" 165 | ] 166 | }, 167 | { 168 | "cell_type": "code", 169 | "execution_count": 5, 170 | "id": "787f6807", 171 | "metadata": {}, 172 | "outputs": [ 173 | { 174 | "data": { 175 | "text/html": [ 176 | "
\n", 183 | "shape: (5, 1)
isin
str
"US0378331005"
"US0378331008"
"US037833100"
"CA00206RGB20"
"XS1550212416"
" 184 | ], 185 | "text/plain": [ 186 | "shape: (5, 1)\n", 187 | "┌──────────────┐\n", 188 | "│ isin │\n", 189 | "│ --- │\n", 190 | "│ str │\n", 191 | "╞══════════════╡\n", 192 | "│ US0378331005 │\n", 193 | "│ US0378331008 │\n", 194 | "│ US037833100 │\n", 195 | "│ CA00206RGB20 │\n", 196 | "│ XS1550212416 │\n", 197 | "└──────────────┘" 198 | ] 199 | }, 200 | "execution_count": 5, 201 | "metadata": {}, 202 | "output_type": "execute_result" 203 | } 204 | ], 205 | "source": [ 206 | "df = pl.DataFrame(\n", 207 | " {\n", 208 | " \"isin\": [\n", 209 | " \"US0378331005\", # AAPL\n", 210 | " \"US0378331008\", # AAPL w/ bad check digit\n", 211 | " \"US037833100\", # AAPL w/o check digit\n", 212 | " \"CA00206RGB20\", # Canadian\n", 213 | " \"XS1550212416\", # Other\n", 214 | " None,\n", 215 | " ]\n", 216 | " }\n", 217 | ")\n", 218 | "df.head()" 219 | ] 220 | }, 221 | { 222 | "cell_type": "code", 223 | "execution_count": 6, 224 | "id": "f4cb10f0", 225 | "metadata": {}, 226 | "outputs": [ 227 | { 228 | "data": { 229 | "text/html": [ 230 | "
\n", 237 | "shape: (6, 4)
country_codecheck_digitsecurity_idis_valid
strstrstrbool
"US""5""037833100"true
nullnullnullfalse
nullnullnullfalse
"CA""0""00206RGB2"true
"XS""6""155021241"true
nullnullnullfalse
" 238 | ], 239 | "text/plain": [ 240 | "shape: (6, 4)\n", 241 | "┌──────────────┬─────────────┬─────────────┬──────────┐\n", 242 | "│ country_code ┆ check_digit ┆ security_id ┆ is_valid │\n", 243 | "│ --- ┆ --- ┆ --- ┆ --- │\n", 244 | "│ str ┆ str ┆ str ┆ bool │\n", 245 | "╞══════════════╪═════════════╪═════════════╪══════════╡\n", 246 | "│ US ┆ 5 ┆ 037833100 ┆ true │\n", 247 | "│ null ┆ null ┆ null ┆ false │\n", 248 | "│ null ┆ null ┆ null ┆ false │\n", 249 | "│ CA ┆ 0 ┆ 00206RGB2 ┆ true │\n", 250 | "│ XS ┆ 6 ┆ 155021241 ┆ true │\n", 251 | "│ null ┆ null ┆ null ┆ false │\n", 252 | "└──────────────┴─────────────┴─────────────┴──────────┘" 253 | ] 254 | }, 255 | "execution_count": 6, 256 | "metadata": {}, 257 | "output_type": "execute_result" 258 | } 259 | ], 260 | "source": [ 261 | "df.select(\n", 262 | " istr.isin_country_code(\"isin\").alias(\"country_code\"),\n", 263 | " istr.isin_check_digit(\"isin\").alias(\"check_digit\"),\n", 264 | " istr.isin_security_id(\"isin\").alias(\"security_id\"),\n", 265 | " istr.isin_is_valid(\"isin\").alias(\"is_valid\"),\n", 266 | ")" 267 | ] 268 | }, 269 | { 270 | "cell_type": "markdown", 271 | "id": "ba5a84bb", 272 | "metadata": {}, 273 | "source": [ 274 | "# URL" 275 | ] 276 | }, 277 | { 278 | "cell_type": "code", 279 | "execution_count": 7, 280 | "id": "86bd1835", 281 | "metadata": {}, 282 | "outputs": [], 283 | "source": [ 284 | "df = pl.DataFrame(\n", 285 | " {\n", 286 | " \"url\": [\n", 287 | " \"https://example.com/data.csv#row=4\",\n", 288 | " \"google.com\", \n", 289 | " \"ww.google.com\", \n", 290 | " \"abc123@email.com\", \n", 291 | " \"https://127.0.0.1/\", \n", 292 | " \"https://test.com/\",\n", 293 | " \"file:///tmp/foo\",\n", 294 | " \"https://example.com/products?page=2&sort=desc\",\n", 295 | " None,\n", 296 | " ]\n", 297 | " }\n", 298 | ")" 299 | ] 300 | }, 301 | { 302 | "cell_type": "code", 303 | "execution_count": 8, 304 | "id": "6d9a2823", 305 | "metadata": {}, 306 | "outputs": [ 307 | { 308 | "data": { 309 | "text/html": [ 310 | "
\n", 317 | "shape: (9, 8)
hostdomainfragmentpathquerycheckis_validis_special
strstrstrstrstrstrboolbool
"example.com""example.com""row=4""/data.csv"null"ok"truetrue
nullnullnullnullnull"relative URL without a base"falsenull
nullnullnullnullnull"relative URL without a base"falsenull
nullnullnullnullnull"relative URL without a base"falsenull
"127.0.0.1"nullnull"/"null"ok"truetrue
"test.com""test.com"null"/"null"ok"truetrue
nullnullnull"/tmp/foo"null"ok"truetrue
"example.com""example.com"null"/products""page=2&sort=desc""ok"truetrue
nullnullnullnullnullnullnullnull
" 318 | ], 319 | "text/plain": [ 320 | "shape: (9, 8)\n", 321 | "┌────────────┬────────────┬──────────┬───────────┬────────────┬────────────┬──────────┬────────────┐\n", 322 | "│ host ┆ domain ┆ fragment ┆ path ┆ query ┆ check ┆ is_valid ┆ is_special │\n", 323 | "│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │\n", 324 | "│ str ┆ str ┆ str ┆ str ┆ str ┆ str ┆ bool ┆ bool │\n", 325 | "╞════════════╪════════════╪══════════╪═══════════╪════════════╪════════════╪══════════╪════════════╡\n", 326 | "│ example.co ┆ example.co ┆ row=4 ┆ /data.csv ┆ null ┆ ok ┆ true ┆ true │\n", 327 | "│ m ┆ m ┆ ┆ ┆ ┆ ┆ ┆ │\n", 328 | "│ null ┆ null ┆ null ┆ null ┆ null ┆ relative ┆ false ┆ null │\n", 329 | "│ ┆ ┆ ┆ ┆ ┆ URL ┆ ┆ │\n", 330 | "│ ┆ ┆ ┆ ┆ ┆ without a ┆ ┆ │\n", 331 | "│ ┆ ┆ ┆ ┆ ┆ base ┆ ┆ │\n", 332 | "│ null ┆ null ┆ null ┆ null ┆ null ┆ relative ┆ false ┆ null │\n", 333 | "│ ┆ ┆ ┆ ┆ ┆ URL ┆ ┆ │\n", 334 | "│ ┆ ┆ ┆ ┆ ┆ without a ┆ ┆ │\n", 335 | "│ ┆ ┆ ┆ ┆ ┆ base ┆ ┆ │\n", 336 | "│ null ┆ null ┆ null ┆ null ┆ null ┆ relative ┆ false ┆ null │\n", 337 | "│ ┆ ┆ ┆ ┆ ┆ URL ┆ ┆ │\n", 338 | "│ ┆ ┆ ┆ ┆ ┆ without a ┆ ┆ │\n", 339 | "│ ┆ ┆ ┆ ┆ ┆ base ┆ ┆ │\n", 340 | "│ 127.0.0.1 ┆ null ┆ null ┆ / ┆ null ┆ ok ┆ true ┆ true │\n", 341 | "│ test.com ┆ test.com ┆ null ┆ / ┆ null ┆ ok ┆ true ┆ true │\n", 342 | "│ null ┆ null ┆ null ┆ /tmp/foo ┆ null ┆ ok ┆ true ┆ true │\n", 343 | "│ example.co ┆ example.co ┆ null ┆ /products ┆ page=2&sor ┆ ok ┆ true ┆ true │\n", 344 | "│ m ┆ m ┆ ┆ ┆ t=desc ┆ ┆ ┆ │\n", 345 | "│ null ┆ null ┆ null ┆ null ┆ null ┆ null ┆ null ┆ null │\n", 346 | "└────────────┴────────────┴──────────┴───────────┴────────────┴────────────┴──────────┴────────────┘" 347 | ] 348 | }, 349 | "execution_count": 8, 350 | "metadata": {}, 351 | "output_type": "execute_result" 352 | } 353 | ], 354 | "source": [ 355 | "df.select(\n", 356 | " istr.url_host(\"url\").alias(\"host\"),\n", 357 | " istr.url_domain(\"url\").alias(\"domain\"),\n", 358 | " istr.url_fragment(\"url\").alias(\"fragment\"),\n", 359 | " istr.url_path(\"url\").alias(\"path\"),\n", 360 | " istr.url_query(\"url\").alias(\"query\"),\n", 361 | " istr.url_check(\"url\").alias(\"check\"),\n", 362 | " istr.url_is_valid(\"url\").alias(\"is_valid\"),\n", 363 | " istr.url_is_special(\"url\").alias(\"is_special\"),\n", 364 | ")" 365 | ] 366 | }, 367 | { 368 | "cell_type": "markdown", 369 | "id": "f716217c", 370 | "metadata": {}, 371 | "source": [ 372 | "# CUSIP" 373 | ] 374 | }, 375 | { 376 | "cell_type": "code", 377 | "execution_count": 9, 378 | "id": "f0aa4db1", 379 | "metadata": {}, 380 | "outputs": [], 381 | "source": [ 382 | "df = pl.DataFrame({\n", 383 | " \"cusip\": [\n", 384 | " \"303075105\", # regular cusip (FactSet - Common Stock)\n", 385 | " \"30307510\", # regular cusip ex. check digit\n", 386 | " \"G0052B105\", # regular CINS (Abingdon Capital PLC - Shares)\n", 387 | " \"HELLOWORLD\", # Invalid\n", 388 | " ]\n", 389 | "})" 390 | ] 391 | }, 392 | { 393 | "cell_type": "code", 394 | "execution_count": 10, 395 | "id": "711de472", 396 | "metadata": {}, 397 | "outputs": [ 398 | { 399 | "data": { 400 | "text/html": [ 401 | "
\n", 408 | "shape: (4, 11)
issue_numissuer_numcheck_digitcountry_codepayloadis_private_issuehas_private_issueris_private_useis_cinsis_cins_baseis_cins_extended
strstrstrstrstrboolboolboolboolboolbool
"10""303075""5"null"30307510"falsefalsefalsefalsenullnull
nullnullnullnullnullnullnullnullnullnullnull
"10""0052B""5""G""G0052B10"falsefalsefalsetruetruefalse
nullnullnullnullnullnullnullnullnullnullnull
" 409 | ], 410 | "text/plain": [ 411 | "shape: (4, 11)\n", 412 | "┌───────────┬────────────┬───────────┬───────────┬───┬───────────┬─────────┬───────────┬───────────┐\n", 413 | "│ issue_num ┆ issuer_num ┆ check_dig ┆ country_c ┆ … ┆ is_privat ┆ is_cins ┆ is_cins_b ┆ is_cins_e │\n", 414 | "│ --- ┆ --- ┆ it ┆ ode ┆ ┆ e_use ┆ --- ┆ ase ┆ xtended │\n", 415 | "│ str ┆ str ┆ --- ┆ --- ┆ ┆ --- ┆ bool ┆ --- ┆ --- │\n", 416 | "│ ┆ ┆ str ┆ str ┆ ┆ bool ┆ ┆ bool ┆ bool │\n", 417 | "╞═══════════╪════════════╪═══════════╪═══════════╪═══╪═══════════╪═════════╪═══════════╪═══════════╡\n", 418 | "│ 10 ┆ 303075 ┆ 5 ┆ null ┆ … ┆ false ┆ false ┆ null ┆ null │\n", 419 | "│ null ┆ null ┆ null ┆ null ┆ … ┆ null ┆ null ┆ null ┆ null │\n", 420 | "│ 10 ┆ 0052B ┆ 5 ┆ G ┆ … ┆ false ┆ true ┆ true ┆ false │\n", 421 | "│ null ┆ null ┆ null ┆ null ┆ … ┆ null ┆ null ┆ null ┆ null │\n", 422 | "└───────────┴────────────┴───────────┴───────────┴───┴───────────┴─────────┴───────────┴───────────┘" 423 | ] 424 | }, 425 | "execution_count": 10, 426 | "metadata": {}, 427 | "output_type": "execute_result" 428 | } 429 | ], 430 | "source": [ 431 | "df.select(\n", 432 | " istr.cusip_issue_num(\"cusip\").alias(\"issue_num\"),\n", 433 | " istr.cusip_issuer_num(\"cusip\").alias(\"issuer_num\"),\n", 434 | " istr.cusip_check_digit(\"cusip\").alias(\"check_digit\"),\n", 435 | " istr.cusip_country_code(\"cusip\").alias(\"country_code\"),\n", 436 | " istr.cusip_payload(\"cusip\").alias(\"payload\"),\n", 437 | " istr.cusip_is_private_issue(\"cusip\").alias(\"is_private_issue\"),\n", 438 | " istr.cusip_has_private_issuer(\"cusip\").alias(\"has_private_issuer\"),\n", 439 | " istr.cusip_is_private_use(\"cusip\").alias(\"is_private_use\"),\n", 440 | " istr.cusip_is_cins(\"cusip\").alias(\"is_cins\"),\n", 441 | " istr.cusip_is_cins_base(\"cusip\").alias(\"is_cins_base\"),\n", 442 | " istr.cusip_is_cins_extended(\"cusip\").alias(\"is_cins_extended\"),\n", 443 | " )" 444 | ] 445 | }, 446 | { 447 | "cell_type": "code", 448 | "execution_count": null, 449 | "id": "cd30b6da", 450 | "metadata": {}, 451 | "outputs": [], 452 | "source": [] 453 | }, 454 | { 455 | "cell_type": "code", 456 | "execution_count": null, 457 | "id": "8a7fa410", 458 | "metadata": {}, 459 | "outputs": [], 460 | "source": [] 461 | } 462 | ], 463 | "metadata": { 464 | "kernelspec": { 465 | "display_name": ".venv", 466 | "language": "python", 467 | "name": "python3" 468 | }, 469 | "language_info": { 470 | "codemirror_mode": { 471 | "name": "ipython", 472 | "version": 3 473 | }, 474 | "file_extension": ".py", 475 | "mimetype": "text/x-python", 476 | "name": "python", 477 | "nbconvert_exporter": "python", 478 | "pygments_lexer": "ipython3", 479 | "version": "3.13.1" 480 | } 481 | }, 482 | "nbformat": 4, 483 | "nbformat_minor": 5 484 | } 485 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.24.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler2" 16 | version = "2.0.1" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" 19 | 20 | [[package]] 21 | name = "ahash" 22 | version = "0.8.12" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" 25 | dependencies = [ 26 | "cfg-if", 27 | "getrandom 0.3.3", 28 | "once_cell", 29 | "version_check", 30 | "zerocopy", 31 | ] 32 | 33 | [[package]] 34 | name = "aho-corasick" 35 | version = "1.1.3" 36 | source = "registry+https://github.com/rust-lang/crates.io-index" 37 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 38 | dependencies = [ 39 | "memchr", 40 | ] 41 | 42 | [[package]] 43 | name = "alloc-no-stdlib" 44 | version = "2.0.4" 45 | source = "registry+https://github.com/rust-lang/crates.io-index" 46 | checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" 47 | 48 | [[package]] 49 | name = "alloc-stdlib" 50 | version = "0.2.2" 51 | source = "registry+https://github.com/rust-lang/crates.io-index" 52 | checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" 53 | dependencies = [ 54 | "alloc-no-stdlib", 55 | ] 56 | 57 | [[package]] 58 | name = "allocator-api2" 59 | version = "0.2.21" 60 | source = "registry+https://github.com/rust-lang/crates.io-index" 61 | checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" 62 | 63 | [[package]] 64 | name = "android-tzdata" 65 | version = "0.1.1" 66 | source = "registry+https://github.com/rust-lang/crates.io-index" 67 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 68 | 69 | [[package]] 70 | name = "android_system_properties" 71 | version = "0.1.5" 72 | source = "registry+https://github.com/rust-lang/crates.io-index" 73 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 74 | dependencies = [ 75 | "libc", 76 | ] 77 | 78 | [[package]] 79 | name = "argminmax" 80 | version = "0.6.3" 81 | source = "registry+https://github.com/rust-lang/crates.io-index" 82 | checksum = "70f13d10a41ac8d2ec79ee34178d61e6f47a29c2edfe7ef1721c7383b0359e65" 83 | dependencies = [ 84 | "num-traits", 85 | ] 86 | 87 | [[package]] 88 | name = "array-init-cursor" 89 | version = "0.2.1" 90 | source = "registry+https://github.com/rust-lang/crates.io-index" 91 | checksum = "ed51fe0f224d1d4ea768be38c51f9f831dee9d05c163c11fba0b8c44387b1fc3" 92 | 93 | [[package]] 94 | name = "arrayvec" 95 | version = "0.7.6" 96 | source = "registry+https://github.com/rust-lang/crates.io-index" 97 | checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" 98 | 99 | [[package]] 100 | name = "async-stream" 101 | version = "0.3.6" 102 | source = "registry+https://github.com/rust-lang/crates.io-index" 103 | checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" 104 | dependencies = [ 105 | "async-stream-impl", 106 | "futures-core", 107 | "pin-project-lite", 108 | ] 109 | 110 | [[package]] 111 | name = "async-stream-impl" 112 | version = "0.3.6" 113 | source = "registry+https://github.com/rust-lang/crates.io-index" 114 | checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" 115 | dependencies = [ 116 | "proc-macro2", 117 | "quote", 118 | "syn", 119 | ] 120 | 121 | [[package]] 122 | name = "async-trait" 123 | version = "0.1.89" 124 | source = "registry+https://github.com/rust-lang/crates.io-index" 125 | checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" 126 | dependencies = [ 127 | "proc-macro2", 128 | "quote", 129 | "syn", 130 | ] 131 | 132 | [[package]] 133 | name = "atoi_simd" 134 | version = "0.16.1" 135 | source = "registry+https://github.com/rust-lang/crates.io-index" 136 | checksum = "c2a49e05797ca52e312a0c658938b7d00693ef037799ef7187678f212d7684cf" 137 | dependencies = [ 138 | "debug_unsafe", 139 | ] 140 | 141 | [[package]] 142 | name = "atomic-waker" 143 | version = "1.1.2" 144 | source = "registry+https://github.com/rust-lang/crates.io-index" 145 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 146 | 147 | [[package]] 148 | name = "autocfg" 149 | version = "1.5.0" 150 | source = "registry+https://github.com/rust-lang/crates.io-index" 151 | checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 152 | 153 | [[package]] 154 | name = "backtrace" 155 | version = "0.3.75" 156 | source = "registry+https://github.com/rust-lang/crates.io-index" 157 | checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" 158 | dependencies = [ 159 | "addr2line", 160 | "cfg-if", 161 | "libc", 162 | "miniz_oxide", 163 | "object", 164 | "rustc-demangle", 165 | "windows-targets 0.52.6", 166 | ] 167 | 168 | [[package]] 169 | name = "base64" 170 | version = "0.22.1" 171 | source = "registry+https://github.com/rust-lang/crates.io-index" 172 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 173 | 174 | [[package]] 175 | name = "bitflags" 176 | version = "2.9.3" 177 | source = "registry+https://github.com/rust-lang/crates.io-index" 178 | checksum = "34efbcccd345379ca2868b2b2c9d3782e9cc58ba87bc7d79d5b53d9c9ae6f25d" 179 | 180 | [[package]] 181 | name = "brotli" 182 | version = "7.0.0" 183 | source = "registry+https://github.com/rust-lang/crates.io-index" 184 | checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" 185 | dependencies = [ 186 | "alloc-no-stdlib", 187 | "alloc-stdlib", 188 | "brotli-decompressor", 189 | ] 190 | 191 | [[package]] 192 | name = "brotli-decompressor" 193 | version = "4.0.3" 194 | source = "registry+https://github.com/rust-lang/crates.io-index" 195 | checksum = "a334ef7c9e23abf0ce748e8cd309037da93e606ad52eb372e4ce327a0dcfbdfd" 196 | dependencies = [ 197 | "alloc-no-stdlib", 198 | "alloc-stdlib", 199 | ] 200 | 201 | [[package]] 202 | name = "bumpalo" 203 | version = "3.19.0" 204 | source = "registry+https://github.com/rust-lang/crates.io-index" 205 | checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" 206 | 207 | [[package]] 208 | name = "bytemuck" 209 | version = "1.23.2" 210 | source = "registry+https://github.com/rust-lang/crates.io-index" 211 | checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" 212 | dependencies = [ 213 | "bytemuck_derive", 214 | ] 215 | 216 | [[package]] 217 | name = "bytemuck_derive" 218 | version = "1.10.1" 219 | source = "registry+https://github.com/rust-lang/crates.io-index" 220 | checksum = "4f154e572231cb6ba2bd1176980827e3d5dc04cc183a75dea38109fbdd672d29" 221 | dependencies = [ 222 | "proc-macro2", 223 | "quote", 224 | "syn", 225 | ] 226 | 227 | [[package]] 228 | name = "byteorder" 229 | version = "1.5.0" 230 | source = "registry+https://github.com/rust-lang/crates.io-index" 231 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 232 | 233 | [[package]] 234 | name = "bytes" 235 | version = "1.10.1" 236 | source = "registry+https://github.com/rust-lang/crates.io-index" 237 | checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 238 | dependencies = [ 239 | "serde", 240 | ] 241 | 242 | [[package]] 243 | name = "castaway" 244 | version = "0.2.4" 245 | source = "registry+https://github.com/rust-lang/crates.io-index" 246 | checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" 247 | dependencies = [ 248 | "rustversion", 249 | ] 250 | 251 | [[package]] 252 | name = "cc" 253 | version = "1.2.34" 254 | source = "registry+https://github.com/rust-lang/crates.io-index" 255 | checksum = "42bc4aea80032b7bf409b0bc7ccad88853858911b7713a8062fdc0623867bedc" 256 | dependencies = [ 257 | "jobserver", 258 | "libc", 259 | "shlex", 260 | ] 261 | 262 | [[package]] 263 | name = "cfg-if" 264 | version = "1.0.3" 265 | source = "registry+https://github.com/rust-lang/crates.io-index" 266 | checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" 267 | 268 | [[package]] 269 | name = "chrono" 270 | version = "0.4.41" 271 | source = "registry+https://github.com/rust-lang/crates.io-index" 272 | checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" 273 | dependencies = [ 274 | "android-tzdata", 275 | "iana-time-zone", 276 | "num-traits", 277 | "windows-link", 278 | ] 279 | 280 | [[package]] 281 | name = "chrono-tz" 282 | version = "0.10.4" 283 | source = "registry+https://github.com/rust-lang/crates.io-index" 284 | checksum = "a6139a8597ed92cf816dfb33f5dd6cf0bb93a6adc938f11039f371bc5bcd26c3" 285 | dependencies = [ 286 | "chrono", 287 | "phf", 288 | ] 289 | 290 | [[package]] 291 | name = "comfy-table" 292 | version = "7.1.4" 293 | source = "registry+https://github.com/rust-lang/crates.io-index" 294 | checksum = "4a65ebfec4fb190b6f90e944a817d60499ee0744e582530e2c9900a22e591d9a" 295 | dependencies = [ 296 | "crossterm", 297 | "unicode-segmentation", 298 | "unicode-width", 299 | ] 300 | 301 | [[package]] 302 | name = "compact_str" 303 | version = "0.8.1" 304 | source = "registry+https://github.com/rust-lang/crates.io-index" 305 | checksum = "3b79c4069c6cad78e2e0cdfcbd26275770669fb39fd308a752dc110e83b9af32" 306 | dependencies = [ 307 | "castaway", 308 | "cfg-if", 309 | "itoa", 310 | "rustversion", 311 | "ryu", 312 | "serde", 313 | "static_assertions", 314 | ] 315 | 316 | [[package]] 317 | name = "core-foundation-sys" 318 | version = "0.8.7" 319 | source = "registry+https://github.com/rust-lang/crates.io-index" 320 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 321 | 322 | [[package]] 323 | name = "crc32fast" 324 | version = "1.5.0" 325 | source = "registry+https://github.com/rust-lang/crates.io-index" 326 | checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" 327 | dependencies = [ 328 | "cfg-if", 329 | ] 330 | 331 | [[package]] 332 | name = "crossbeam-channel" 333 | version = "0.5.15" 334 | source = "registry+https://github.com/rust-lang/crates.io-index" 335 | checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" 336 | dependencies = [ 337 | "crossbeam-utils", 338 | ] 339 | 340 | [[package]] 341 | name = "crossbeam-deque" 342 | version = "0.8.6" 343 | source = "registry+https://github.com/rust-lang/crates.io-index" 344 | checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" 345 | dependencies = [ 346 | "crossbeam-epoch", 347 | "crossbeam-utils", 348 | ] 349 | 350 | [[package]] 351 | name = "crossbeam-epoch" 352 | version = "0.9.18" 353 | source = "registry+https://github.com/rust-lang/crates.io-index" 354 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 355 | dependencies = [ 356 | "crossbeam-utils", 357 | ] 358 | 359 | [[package]] 360 | name = "crossbeam-queue" 361 | version = "0.3.12" 362 | source = "registry+https://github.com/rust-lang/crates.io-index" 363 | checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" 364 | dependencies = [ 365 | "crossbeam-utils", 366 | ] 367 | 368 | [[package]] 369 | name = "crossbeam-utils" 370 | version = "0.8.21" 371 | source = "registry+https://github.com/rust-lang/crates.io-index" 372 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 373 | 374 | [[package]] 375 | name = "crossterm" 376 | version = "0.28.1" 377 | source = "registry+https://github.com/rust-lang/crates.io-index" 378 | checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" 379 | dependencies = [ 380 | "bitflags", 381 | "crossterm_winapi", 382 | "parking_lot", 383 | "rustix", 384 | "winapi", 385 | ] 386 | 387 | [[package]] 388 | name = "crossterm_winapi" 389 | version = "0.9.1" 390 | source = "registry+https://github.com/rust-lang/crates.io-index" 391 | checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" 392 | dependencies = [ 393 | "winapi", 394 | ] 395 | 396 | [[package]] 397 | name = "cusip" 398 | version = "0.3.3" 399 | source = "registry+https://github.com/rust-lang/crates.io-index" 400 | checksum = "0a2886232ca12740cfe59cb42a79e6983ba9b3004d2e07439d9b7027cc5a8e59" 401 | 402 | [[package]] 403 | name = "debug_unsafe" 404 | version = "0.1.3" 405 | source = "registry+https://github.com/rust-lang/crates.io-index" 406 | checksum = "85d3cef41d236720ed453e102153a53e4cc3d2fde848c0078a50cf249e8e3e5b" 407 | 408 | [[package]] 409 | name = "displaydoc" 410 | version = "0.2.5" 411 | source = "registry+https://github.com/rust-lang/crates.io-index" 412 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 413 | dependencies = [ 414 | "proc-macro2", 415 | "quote", 416 | "syn", 417 | ] 418 | 419 | [[package]] 420 | name = "dyn-clone" 421 | version = "1.0.20" 422 | source = "registry+https://github.com/rust-lang/crates.io-index" 423 | checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" 424 | 425 | [[package]] 426 | name = "either" 427 | version = "1.15.0" 428 | source = "registry+https://github.com/rust-lang/crates.io-index" 429 | checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 430 | 431 | [[package]] 432 | name = "enum_dispatch" 433 | version = "0.3.13" 434 | source = "registry+https://github.com/rust-lang/crates.io-index" 435 | checksum = "aa18ce2bc66555b3218614519ac839ddb759a7d6720732f979ef8d13be147ecd" 436 | dependencies = [ 437 | "once_cell", 438 | "proc-macro2", 439 | "quote", 440 | "syn", 441 | ] 442 | 443 | [[package]] 444 | name = "equivalent" 445 | version = "1.0.2" 446 | source = "registry+https://github.com/rust-lang/crates.io-index" 447 | checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 448 | 449 | [[package]] 450 | name = "errno" 451 | version = "0.3.13" 452 | source = "registry+https://github.com/rust-lang/crates.io-index" 453 | checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" 454 | dependencies = [ 455 | "libc", 456 | "windows-sys 0.60.2", 457 | ] 458 | 459 | [[package]] 460 | name = "ethnum" 461 | version = "1.5.2" 462 | source = "registry+https://github.com/rust-lang/crates.io-index" 463 | checksum = "ca81e6b4777c89fd810c25a4be2b1bd93ea034fbe58e6a75216a34c6b82c539b" 464 | 465 | [[package]] 466 | name = "fallible-streaming-iterator" 467 | version = "0.1.9" 468 | source = "registry+https://github.com/rust-lang/crates.io-index" 469 | checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" 470 | 471 | [[package]] 472 | name = "fast-float2" 473 | version = "0.2.3" 474 | source = "registry+https://github.com/rust-lang/crates.io-index" 475 | checksum = "f8eb564c5c7423d25c886fb561d1e4ee69f72354d16918afa32c08811f6b6a55" 476 | 477 | [[package]] 478 | name = "flate2" 479 | version = "1.1.2" 480 | source = "registry+https://github.com/rust-lang/crates.io-index" 481 | checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" 482 | dependencies = [ 483 | "crc32fast", 484 | "libz-rs-sys", 485 | "miniz_oxide", 486 | ] 487 | 488 | [[package]] 489 | name = "foldhash" 490 | version = "0.1.5" 491 | source = "registry+https://github.com/rust-lang/crates.io-index" 492 | checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" 493 | 494 | [[package]] 495 | name = "form_urlencoded" 496 | version = "1.2.2" 497 | source = "registry+https://github.com/rust-lang/crates.io-index" 498 | checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" 499 | dependencies = [ 500 | "percent-encoding", 501 | ] 502 | 503 | [[package]] 504 | name = "futures" 505 | version = "0.3.31" 506 | source = "registry+https://github.com/rust-lang/crates.io-index" 507 | checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" 508 | dependencies = [ 509 | "futures-channel", 510 | "futures-core", 511 | "futures-executor", 512 | "futures-io", 513 | "futures-sink", 514 | "futures-task", 515 | "futures-util", 516 | ] 517 | 518 | [[package]] 519 | name = "futures-channel" 520 | version = "0.3.31" 521 | source = "registry+https://github.com/rust-lang/crates.io-index" 522 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 523 | dependencies = [ 524 | "futures-core", 525 | "futures-sink", 526 | ] 527 | 528 | [[package]] 529 | name = "futures-core" 530 | version = "0.3.31" 531 | source = "registry+https://github.com/rust-lang/crates.io-index" 532 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 533 | 534 | [[package]] 535 | name = "futures-executor" 536 | version = "0.3.31" 537 | source = "registry+https://github.com/rust-lang/crates.io-index" 538 | checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 539 | dependencies = [ 540 | "futures-core", 541 | "futures-task", 542 | "futures-util", 543 | ] 544 | 545 | [[package]] 546 | name = "futures-io" 547 | version = "0.3.31" 548 | source = "registry+https://github.com/rust-lang/crates.io-index" 549 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 550 | 551 | [[package]] 552 | name = "futures-macro" 553 | version = "0.3.31" 554 | source = "registry+https://github.com/rust-lang/crates.io-index" 555 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 556 | dependencies = [ 557 | "proc-macro2", 558 | "quote", 559 | "syn", 560 | ] 561 | 562 | [[package]] 563 | name = "futures-sink" 564 | version = "0.3.31" 565 | source = "registry+https://github.com/rust-lang/crates.io-index" 566 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 567 | 568 | [[package]] 569 | name = "futures-task" 570 | version = "0.3.31" 571 | source = "registry+https://github.com/rust-lang/crates.io-index" 572 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 573 | 574 | [[package]] 575 | name = "futures-util" 576 | version = "0.3.31" 577 | source = "registry+https://github.com/rust-lang/crates.io-index" 578 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 579 | dependencies = [ 580 | "futures-channel", 581 | "futures-core", 582 | "futures-io", 583 | "futures-macro", 584 | "futures-sink", 585 | "futures-task", 586 | "memchr", 587 | "pin-project-lite", 588 | "pin-utils", 589 | "slab", 590 | ] 591 | 592 | [[package]] 593 | name = "getrandom" 594 | version = "0.2.16" 595 | source = "registry+https://github.com/rust-lang/crates.io-index" 596 | checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" 597 | dependencies = [ 598 | "cfg-if", 599 | "js-sys", 600 | "libc", 601 | "wasi 0.11.1+wasi-snapshot-preview1", 602 | "wasm-bindgen", 603 | ] 604 | 605 | [[package]] 606 | name = "getrandom" 607 | version = "0.3.3" 608 | source = "registry+https://github.com/rust-lang/crates.io-index" 609 | checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 610 | dependencies = [ 611 | "cfg-if", 612 | "libc", 613 | "r-efi", 614 | "wasi 0.14.3+wasi-0.2.4", 615 | ] 616 | 617 | [[package]] 618 | name = "gimli" 619 | version = "0.31.1" 620 | source = "registry+https://github.com/rust-lang/crates.io-index" 621 | checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 622 | 623 | [[package]] 624 | name = "glob" 625 | version = "0.3.3" 626 | source = "registry+https://github.com/rust-lang/crates.io-index" 627 | checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" 628 | 629 | [[package]] 630 | name = "hashbrown" 631 | version = "0.14.5" 632 | source = "registry+https://github.com/rust-lang/crates.io-index" 633 | checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 634 | dependencies = [ 635 | "ahash", 636 | "allocator-api2", 637 | "rayon", 638 | "serde", 639 | ] 640 | 641 | [[package]] 642 | name = "hashbrown" 643 | version = "0.15.5" 644 | source = "registry+https://github.com/rust-lang/crates.io-index" 645 | checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" 646 | dependencies = [ 647 | "allocator-api2", 648 | "equivalent", 649 | "foldhash", 650 | "rayon", 651 | "serde", 652 | ] 653 | 654 | [[package]] 655 | name = "heck" 656 | version = "0.5.0" 657 | source = "registry+https://github.com/rust-lang/crates.io-index" 658 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 659 | 660 | [[package]] 661 | name = "hex" 662 | version = "0.4.3" 663 | source = "registry+https://github.com/rust-lang/crates.io-index" 664 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 665 | 666 | [[package]] 667 | name = "home" 668 | version = "0.5.11" 669 | source = "registry+https://github.com/rust-lang/crates.io-index" 670 | checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" 671 | dependencies = [ 672 | "windows-sys 0.59.0", 673 | ] 674 | 675 | [[package]] 676 | name = "iana-time-zone" 677 | version = "0.1.63" 678 | source = "registry+https://github.com/rust-lang/crates.io-index" 679 | checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" 680 | dependencies = [ 681 | "android_system_properties", 682 | "core-foundation-sys", 683 | "iana-time-zone-haiku", 684 | "js-sys", 685 | "log", 686 | "wasm-bindgen", 687 | "windows-core 0.61.2", 688 | ] 689 | 690 | [[package]] 691 | name = "iana-time-zone-haiku" 692 | version = "0.1.2" 693 | source = "registry+https://github.com/rust-lang/crates.io-index" 694 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 695 | dependencies = [ 696 | "cc", 697 | ] 698 | 699 | [[package]] 700 | name = "iban_validate" 701 | version = "4.0.1" 702 | source = "registry+https://github.com/rust-lang/crates.io-index" 703 | checksum = "cc1d358f7ae89819e8656f1b495c9d760a9ca315998b12d589dc516c9f81ed08" 704 | dependencies = [ 705 | "arrayvec", 706 | ] 707 | 708 | [[package]] 709 | name = "icu_collections" 710 | version = "2.0.0" 711 | source = "registry+https://github.com/rust-lang/crates.io-index" 712 | checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 713 | dependencies = [ 714 | "displaydoc", 715 | "potential_utf", 716 | "yoke", 717 | "zerofrom", 718 | "zerovec", 719 | ] 720 | 721 | [[package]] 722 | name = "icu_locale_core" 723 | version = "2.0.0" 724 | source = "registry+https://github.com/rust-lang/crates.io-index" 725 | checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 726 | dependencies = [ 727 | "displaydoc", 728 | "litemap", 729 | "tinystr", 730 | "writeable", 731 | "zerovec", 732 | ] 733 | 734 | [[package]] 735 | name = "icu_normalizer" 736 | version = "2.0.0" 737 | source = "registry+https://github.com/rust-lang/crates.io-index" 738 | checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 739 | dependencies = [ 740 | "displaydoc", 741 | "icu_collections", 742 | "icu_normalizer_data", 743 | "icu_properties", 744 | "icu_provider", 745 | "smallvec", 746 | "zerovec", 747 | ] 748 | 749 | [[package]] 750 | name = "icu_normalizer_data" 751 | version = "2.0.0" 752 | source = "registry+https://github.com/rust-lang/crates.io-index" 753 | checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 754 | 755 | [[package]] 756 | name = "icu_properties" 757 | version = "2.0.1" 758 | source = "registry+https://github.com/rust-lang/crates.io-index" 759 | checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" 760 | dependencies = [ 761 | "displaydoc", 762 | "icu_collections", 763 | "icu_locale_core", 764 | "icu_properties_data", 765 | "icu_provider", 766 | "potential_utf", 767 | "zerotrie", 768 | "zerovec", 769 | ] 770 | 771 | [[package]] 772 | name = "icu_properties_data" 773 | version = "2.0.1" 774 | source = "registry+https://github.com/rust-lang/crates.io-index" 775 | checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" 776 | 777 | [[package]] 778 | name = "icu_provider" 779 | version = "2.0.0" 780 | source = "registry+https://github.com/rust-lang/crates.io-index" 781 | checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 782 | dependencies = [ 783 | "displaydoc", 784 | "icu_locale_core", 785 | "stable_deref_trait", 786 | "tinystr", 787 | "writeable", 788 | "yoke", 789 | "zerofrom", 790 | "zerotrie", 791 | "zerovec", 792 | ] 793 | 794 | [[package]] 795 | name = "idna" 796 | version = "1.1.0" 797 | source = "registry+https://github.com/rust-lang/crates.io-index" 798 | checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" 799 | dependencies = [ 800 | "idna_adapter", 801 | "smallvec", 802 | "utf8_iter", 803 | ] 804 | 805 | [[package]] 806 | name = "idna_adapter" 807 | version = "1.2.1" 808 | source = "registry+https://github.com/rust-lang/crates.io-index" 809 | checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" 810 | dependencies = [ 811 | "icu_normalizer", 812 | "icu_properties", 813 | ] 814 | 815 | [[package]] 816 | name = "indexmap" 817 | version = "2.11.0" 818 | source = "registry+https://github.com/rust-lang/crates.io-index" 819 | checksum = "f2481980430f9f78649238835720ddccc57e52df14ffce1c6f37391d61b563e9" 820 | dependencies = [ 821 | "equivalent", 822 | "hashbrown 0.15.5", 823 | "serde", 824 | ] 825 | 826 | [[package]] 827 | name = "indoc" 828 | version = "2.0.6" 829 | source = "registry+https://github.com/rust-lang/crates.io-index" 830 | checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" 831 | 832 | [[package]] 833 | name = "io-uring" 834 | version = "0.7.10" 835 | source = "registry+https://github.com/rust-lang/crates.io-index" 836 | checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" 837 | dependencies = [ 838 | "bitflags", 839 | "cfg-if", 840 | "libc", 841 | ] 842 | 843 | [[package]] 844 | name = "isin" 845 | version = "0.1.19" 846 | source = "registry+https://github.com/rust-lang/crates.io-index" 847 | checksum = "19bcf2544150282ebe712b4615813c1986bb014564928b1c4a4a567402d6bf02" 848 | 849 | [[package]] 850 | name = "iter-read" 851 | version = "1.1.0" 852 | source = "registry+https://github.com/rust-lang/crates.io-index" 853 | checksum = "071ed4cc1afd86650602c7b11aa2e1ce30762a1c27193201cb5cee9c6ebb1294" 854 | 855 | [[package]] 856 | name = "itoa" 857 | version = "1.0.15" 858 | source = "registry+https://github.com/rust-lang/crates.io-index" 859 | checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 860 | 861 | [[package]] 862 | name = "jobserver" 863 | version = "0.1.34" 864 | source = "registry+https://github.com/rust-lang/crates.io-index" 865 | checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" 866 | dependencies = [ 867 | "getrandom 0.3.3", 868 | "libc", 869 | ] 870 | 871 | [[package]] 872 | name = "js-sys" 873 | version = "0.3.77" 874 | source = "registry+https://github.com/rust-lang/crates.io-index" 875 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 876 | dependencies = [ 877 | "once_cell", 878 | "wasm-bindgen", 879 | ] 880 | 881 | [[package]] 882 | name = "libc" 883 | version = "0.2.175" 884 | source = "registry+https://github.com/rust-lang/crates.io-index" 885 | checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" 886 | 887 | [[package]] 888 | name = "libm" 889 | version = "0.2.15" 890 | source = "registry+https://github.com/rust-lang/crates.io-index" 891 | checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" 892 | 893 | [[package]] 894 | name = "libz-rs-sys" 895 | version = "0.5.1" 896 | source = "registry+https://github.com/rust-lang/crates.io-index" 897 | checksum = "172a788537a2221661b480fee8dc5f96c580eb34fa88764d3205dc356c7e4221" 898 | dependencies = [ 899 | "zlib-rs", 900 | ] 901 | 902 | [[package]] 903 | name = "linux-raw-sys" 904 | version = "0.4.15" 905 | source = "registry+https://github.com/rust-lang/crates.io-index" 906 | checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 907 | 908 | [[package]] 909 | name = "litemap" 910 | version = "0.8.0" 911 | source = "registry+https://github.com/rust-lang/crates.io-index" 912 | checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 913 | 914 | [[package]] 915 | name = "lock_api" 916 | version = "0.4.13" 917 | source = "registry+https://github.com/rust-lang/crates.io-index" 918 | checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" 919 | dependencies = [ 920 | "autocfg", 921 | "scopeguard", 922 | ] 923 | 924 | [[package]] 925 | name = "log" 926 | version = "0.4.27" 927 | source = "registry+https://github.com/rust-lang/crates.io-index" 928 | checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 929 | 930 | [[package]] 931 | name = "lz4" 932 | version = "1.28.1" 933 | source = "registry+https://github.com/rust-lang/crates.io-index" 934 | checksum = "a20b523e860d03443e98350ceaac5e71c6ba89aea7d960769ec3ce37f4de5af4" 935 | dependencies = [ 936 | "lz4-sys", 937 | ] 938 | 939 | [[package]] 940 | name = "lz4-sys" 941 | version = "1.11.1+lz4-1.10.0" 942 | source = "registry+https://github.com/rust-lang/crates.io-index" 943 | checksum = "6bd8c0d6c6ed0cd30b3652886bb8711dc4bb01d637a68105a3d5158039b418e6" 944 | dependencies = [ 945 | "cc", 946 | "libc", 947 | ] 948 | 949 | [[package]] 950 | name = "memchr" 951 | version = "2.7.5" 952 | source = "registry+https://github.com/rust-lang/crates.io-index" 953 | checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" 954 | 955 | [[package]] 956 | name = "memmap2" 957 | version = "0.9.8" 958 | source = "registry+https://github.com/rust-lang/crates.io-index" 959 | checksum = "843a98750cd611cc2965a8213b53b43e715f13c37a9e096c6408e69990961db7" 960 | dependencies = [ 961 | "libc", 962 | ] 963 | 964 | [[package]] 965 | name = "memoffset" 966 | version = "0.9.1" 967 | source = "registry+https://github.com/rust-lang/crates.io-index" 968 | checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" 969 | dependencies = [ 970 | "autocfg", 971 | ] 972 | 973 | [[package]] 974 | name = "miniz_oxide" 975 | version = "0.8.9" 976 | source = "registry+https://github.com/rust-lang/crates.io-index" 977 | checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" 978 | dependencies = [ 979 | "adler2", 980 | ] 981 | 982 | [[package]] 983 | name = "mio" 984 | version = "1.0.4" 985 | source = "registry+https://github.com/rust-lang/crates.io-index" 986 | checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" 987 | dependencies = [ 988 | "libc", 989 | "wasi 0.11.1+wasi-snapshot-preview1", 990 | "windows-sys 0.59.0", 991 | ] 992 | 993 | [[package]] 994 | name = "now" 995 | version = "0.1.3" 996 | source = "registry+https://github.com/rust-lang/crates.io-index" 997 | checksum = "6d89e9874397a1f0a52fc1f197a8effd9735223cb2390e9dcc83ac6cd02923d0" 998 | dependencies = [ 999 | "chrono", 1000 | ] 1001 | 1002 | [[package]] 1003 | name = "ntapi" 1004 | version = "0.4.1" 1005 | source = "registry+https://github.com/rust-lang/crates.io-index" 1006 | checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" 1007 | dependencies = [ 1008 | "winapi", 1009 | ] 1010 | 1011 | [[package]] 1012 | name = "num-bigint" 1013 | version = "0.4.6" 1014 | source = "registry+https://github.com/rust-lang/crates.io-index" 1015 | checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" 1016 | dependencies = [ 1017 | "num-integer", 1018 | "num-traits", 1019 | ] 1020 | 1021 | [[package]] 1022 | name = "num-integer" 1023 | version = "0.1.46" 1024 | source = "registry+https://github.com/rust-lang/crates.io-index" 1025 | checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 1026 | dependencies = [ 1027 | "num-traits", 1028 | ] 1029 | 1030 | [[package]] 1031 | name = "num-traits" 1032 | version = "0.2.19" 1033 | source = "registry+https://github.com/rust-lang/crates.io-index" 1034 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1035 | dependencies = [ 1036 | "autocfg", 1037 | "libm", 1038 | ] 1039 | 1040 | [[package]] 1041 | name = "object" 1042 | version = "0.36.7" 1043 | source = "registry+https://github.com/rust-lang/crates.io-index" 1044 | checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 1045 | dependencies = [ 1046 | "memchr", 1047 | ] 1048 | 1049 | [[package]] 1050 | name = "once_cell" 1051 | version = "1.21.3" 1052 | source = "registry+https://github.com/rust-lang/crates.io-index" 1053 | checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 1054 | 1055 | [[package]] 1056 | name = "parking_lot" 1057 | version = "0.12.4" 1058 | source = "registry+https://github.com/rust-lang/crates.io-index" 1059 | checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" 1060 | dependencies = [ 1061 | "lock_api", 1062 | "parking_lot_core", 1063 | ] 1064 | 1065 | [[package]] 1066 | name = "parking_lot_core" 1067 | version = "0.9.11" 1068 | source = "registry+https://github.com/rust-lang/crates.io-index" 1069 | checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" 1070 | dependencies = [ 1071 | "cfg-if", 1072 | "libc", 1073 | "redox_syscall", 1074 | "smallvec", 1075 | "windows-targets 0.52.6", 1076 | ] 1077 | 1078 | [[package]] 1079 | name = "percent-encoding" 1080 | version = "2.3.2" 1081 | source = "registry+https://github.com/rust-lang/crates.io-index" 1082 | checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" 1083 | 1084 | [[package]] 1085 | name = "phf" 1086 | version = "0.12.1" 1087 | source = "registry+https://github.com/rust-lang/crates.io-index" 1088 | checksum = "913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7" 1089 | dependencies = [ 1090 | "phf_shared", 1091 | ] 1092 | 1093 | [[package]] 1094 | name = "phf_shared" 1095 | version = "0.12.1" 1096 | source = "registry+https://github.com/rust-lang/crates.io-index" 1097 | checksum = "06005508882fb681fd97892ecff4b7fd0fee13ef1aa569f8695dae7ab9099981" 1098 | dependencies = [ 1099 | "siphasher", 1100 | ] 1101 | 1102 | [[package]] 1103 | name = "pin-project-lite" 1104 | version = "0.2.16" 1105 | source = "registry+https://github.com/rust-lang/crates.io-index" 1106 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 1107 | 1108 | [[package]] 1109 | name = "pin-utils" 1110 | version = "0.1.0" 1111 | source = "registry+https://github.com/rust-lang/crates.io-index" 1112 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1113 | 1114 | [[package]] 1115 | name = "pkg-config" 1116 | version = "0.3.32" 1117 | source = "registry+https://github.com/rust-lang/crates.io-index" 1118 | checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 1119 | 1120 | [[package]] 1121 | name = "planus" 1122 | version = "0.3.1" 1123 | source = "registry+https://github.com/rust-lang/crates.io-index" 1124 | checksum = "fc1691dd09e82f428ce8d6310bd6d5da2557c82ff17694d2a32cad7242aea89f" 1125 | dependencies = [ 1126 | "array-init-cursor", 1127 | ] 1128 | 1129 | [[package]] 1130 | name = "polars" 1131 | version = "0.46.0" 1132 | source = "registry+https://github.com/rust-lang/crates.io-index" 1133 | checksum = "72571dde488ecccbe799798bf99ab7308ebdb7cf5d95bcc498dbd5a132f0da4d" 1134 | dependencies = [ 1135 | "getrandom 0.2.16", 1136 | "polars-arrow", 1137 | "polars-core", 1138 | "polars-error", 1139 | "polars-io", 1140 | "polars-lazy", 1141 | "polars-ops", 1142 | "polars-parquet", 1143 | "polars-sql", 1144 | "polars-time", 1145 | "polars-utils", 1146 | "version_check", 1147 | ] 1148 | 1149 | [[package]] 1150 | name = "polars-arrow" 1151 | version = "0.46.0" 1152 | source = "registry+https://github.com/rust-lang/crates.io-index" 1153 | checksum = "6611c758d52e799761cc25900666b71552e6c929d88052811bc9daad4b3321a8" 1154 | dependencies = [ 1155 | "ahash", 1156 | "atoi_simd", 1157 | "bytemuck", 1158 | "chrono", 1159 | "chrono-tz", 1160 | "dyn-clone", 1161 | "either", 1162 | "ethnum", 1163 | "getrandom 0.2.16", 1164 | "hashbrown 0.15.5", 1165 | "itoa", 1166 | "lz4", 1167 | "num-traits", 1168 | "parking_lot", 1169 | "polars-arrow-format", 1170 | "polars-error", 1171 | "polars-schema", 1172 | "polars-utils", 1173 | "simdutf8", 1174 | "streaming-iterator", 1175 | "strength_reduce", 1176 | "strum_macros", 1177 | "version_check", 1178 | "zstd", 1179 | ] 1180 | 1181 | [[package]] 1182 | name = "polars-arrow-format" 1183 | version = "0.1.0" 1184 | source = "registry+https://github.com/rust-lang/crates.io-index" 1185 | checksum = "19b0ef2474af9396b19025b189d96e992311e6a47f90c53cd998b36c4c64b84c" 1186 | dependencies = [ 1187 | "planus", 1188 | "serde", 1189 | ] 1190 | 1191 | [[package]] 1192 | name = "polars-compute" 1193 | version = "0.46.0" 1194 | source = "registry+https://github.com/rust-lang/crates.io-index" 1195 | checksum = "332f2547dbb27599a8ffe68e56159f5996ba03d1dad0382ccb62c109ceacdeb6" 1196 | dependencies = [ 1197 | "atoi_simd", 1198 | "bytemuck", 1199 | "chrono", 1200 | "either", 1201 | "fast-float2", 1202 | "itoa", 1203 | "num-traits", 1204 | "polars-arrow", 1205 | "polars-error", 1206 | "polars-utils", 1207 | "ryu", 1208 | "strength_reduce", 1209 | "version_check", 1210 | ] 1211 | 1212 | [[package]] 1213 | name = "polars-core" 1214 | version = "0.46.0" 1215 | source = "registry+https://github.com/rust-lang/crates.io-index" 1216 | checksum = "796d06eae7e6e74ed28ea54a8fccc584ebac84e6cf0e1e9ba41ffc807b169a01" 1217 | dependencies = [ 1218 | "ahash", 1219 | "bitflags", 1220 | "bytemuck", 1221 | "chrono", 1222 | "chrono-tz", 1223 | "comfy-table", 1224 | "either", 1225 | "hashbrown 0.14.5", 1226 | "hashbrown 0.15.5", 1227 | "indexmap", 1228 | "itoa", 1229 | "num-traits", 1230 | "once_cell", 1231 | "polars-arrow", 1232 | "polars-compute", 1233 | "polars-error", 1234 | "polars-row", 1235 | "polars-schema", 1236 | "polars-utils", 1237 | "rand", 1238 | "rand_distr", 1239 | "rayon", 1240 | "regex", 1241 | "strum_macros", 1242 | "thiserror 2.0.16", 1243 | "version_check", 1244 | "xxhash-rust", 1245 | ] 1246 | 1247 | [[package]] 1248 | name = "polars-error" 1249 | version = "0.46.0" 1250 | source = "registry+https://github.com/rust-lang/crates.io-index" 1251 | checksum = "19d6529cae0d1db5ed690e47de41fac9b35ae0c26d476830c2079f130887b847" 1252 | dependencies = [ 1253 | "polars-arrow-format", 1254 | "regex", 1255 | "simdutf8", 1256 | "thiserror 2.0.16", 1257 | ] 1258 | 1259 | [[package]] 1260 | name = "polars-expr" 1261 | version = "0.46.0" 1262 | source = "registry+https://github.com/rust-lang/crates.io-index" 1263 | checksum = "c8e639991a8ad4fb12880ab44bcc3cf44a5703df003142334d9caf86d77d77e7" 1264 | dependencies = [ 1265 | "ahash", 1266 | "bitflags", 1267 | "hashbrown 0.15.5", 1268 | "num-traits", 1269 | "once_cell", 1270 | "polars-arrow", 1271 | "polars-compute", 1272 | "polars-core", 1273 | "polars-io", 1274 | "polars-ops", 1275 | "polars-plan", 1276 | "polars-row", 1277 | "polars-time", 1278 | "polars-utils", 1279 | "rand", 1280 | "rayon", 1281 | ] 1282 | 1283 | [[package]] 1284 | name = "polars-ffi" 1285 | version = "0.46.0" 1286 | source = "registry+https://github.com/rust-lang/crates.io-index" 1287 | checksum = "a657a2cd278a9f9b40d5eedc5816d5fd0c65619ed2f53f0ff5ff4ef20916d3a8" 1288 | dependencies = [ 1289 | "polars-arrow", 1290 | "polars-core", 1291 | ] 1292 | 1293 | [[package]] 1294 | name = "polars-io" 1295 | version = "0.46.0" 1296 | source = "registry+https://github.com/rust-lang/crates.io-index" 1297 | checksum = "719a77e94480f6be090512da196e378cbcbeb3584c6fe1134c600aee906e38ab" 1298 | dependencies = [ 1299 | "ahash", 1300 | "async-trait", 1301 | "atoi_simd", 1302 | "bytes", 1303 | "chrono", 1304 | "fast-float2", 1305 | "futures", 1306 | "glob", 1307 | "hashbrown 0.15.5", 1308 | "home", 1309 | "itoa", 1310 | "memchr", 1311 | "memmap2", 1312 | "num-traits", 1313 | "once_cell", 1314 | "percent-encoding", 1315 | "polars-arrow", 1316 | "polars-core", 1317 | "polars-error", 1318 | "polars-parquet", 1319 | "polars-schema", 1320 | "polars-time", 1321 | "polars-utils", 1322 | "rayon", 1323 | "regex", 1324 | "ryu", 1325 | "simdutf8", 1326 | "tokio", 1327 | "tokio-util", 1328 | ] 1329 | 1330 | [[package]] 1331 | name = "polars-lazy" 1332 | version = "0.46.0" 1333 | source = "registry+https://github.com/rust-lang/crates.io-index" 1334 | checksum = "a0a731a672dfc8ac38c1f73c9a4b2ae38d2fc8ac363bfb64c5f3a3e072ffc5ad" 1335 | dependencies = [ 1336 | "ahash", 1337 | "bitflags", 1338 | "chrono", 1339 | "memchr", 1340 | "once_cell", 1341 | "polars-arrow", 1342 | "polars-core", 1343 | "polars-expr", 1344 | "polars-io", 1345 | "polars-mem-engine", 1346 | "polars-ops", 1347 | "polars-pipe", 1348 | "polars-plan", 1349 | "polars-stream", 1350 | "polars-time", 1351 | "polars-utils", 1352 | "rayon", 1353 | "version_check", 1354 | ] 1355 | 1356 | [[package]] 1357 | name = "polars-mem-engine" 1358 | version = "0.46.0" 1359 | source = "registry+https://github.com/rust-lang/crates.io-index" 1360 | checksum = "33442189bcbf2e2559aa7914db3835429030a13f4f18e43af5fba9d1b018cf12" 1361 | dependencies = [ 1362 | "memmap2", 1363 | "polars-arrow", 1364 | "polars-core", 1365 | "polars-error", 1366 | "polars-expr", 1367 | "polars-io", 1368 | "polars-ops", 1369 | "polars-plan", 1370 | "polars-time", 1371 | "polars-utils", 1372 | "rayon", 1373 | ] 1374 | 1375 | [[package]] 1376 | name = "polars-ops" 1377 | version = "0.46.0" 1378 | source = "registry+https://github.com/rust-lang/crates.io-index" 1379 | checksum = "cbb83218b0c216104f0076cd1a005128be078f958125f3d59b094ee73d78c18e" 1380 | dependencies = [ 1381 | "ahash", 1382 | "argminmax", 1383 | "base64", 1384 | "bytemuck", 1385 | "chrono", 1386 | "chrono-tz", 1387 | "either", 1388 | "hashbrown 0.15.5", 1389 | "hex", 1390 | "indexmap", 1391 | "memchr", 1392 | "num-traits", 1393 | "once_cell", 1394 | "polars-arrow", 1395 | "polars-compute", 1396 | "polars-core", 1397 | "polars-error", 1398 | "polars-schema", 1399 | "polars-utils", 1400 | "rayon", 1401 | "regex", 1402 | "regex-syntax", 1403 | "strum_macros", 1404 | "unicode-normalization", 1405 | "unicode-reverse", 1406 | "version_check", 1407 | ] 1408 | 1409 | [[package]] 1410 | name = "polars-parquet" 1411 | version = "0.46.0" 1412 | source = "registry+https://github.com/rust-lang/crates.io-index" 1413 | checksum = "5c60ee85535590a38db6c703a21be4cb25342e40f573f070d1e16f9d84a53ac7" 1414 | dependencies = [ 1415 | "ahash", 1416 | "async-stream", 1417 | "base64", 1418 | "brotli", 1419 | "bytemuck", 1420 | "ethnum", 1421 | "flate2", 1422 | "futures", 1423 | "hashbrown 0.15.5", 1424 | "lz4", 1425 | "num-traits", 1426 | "polars-arrow", 1427 | "polars-compute", 1428 | "polars-error", 1429 | "polars-parquet-format", 1430 | "polars-utils", 1431 | "simdutf8", 1432 | "snap", 1433 | "streaming-decompression", 1434 | "zstd", 1435 | ] 1436 | 1437 | [[package]] 1438 | name = "polars-parquet-format" 1439 | version = "0.1.0" 1440 | source = "registry+https://github.com/rust-lang/crates.io-index" 1441 | checksum = "c025243dcfe8dbc57e94d9f82eb3bef10b565ab180d5b99bed87fd8aea319ce1" 1442 | dependencies = [ 1443 | "async-trait", 1444 | "futures", 1445 | ] 1446 | 1447 | [[package]] 1448 | name = "polars-pipe" 1449 | version = "0.46.0" 1450 | source = "registry+https://github.com/rust-lang/crates.io-index" 1451 | checksum = "42d238fb76698f56e51ddfa89b135e4eda56a4767c6e8859eed0ab78386fcd52" 1452 | dependencies = [ 1453 | "crossbeam-channel", 1454 | "crossbeam-queue", 1455 | "enum_dispatch", 1456 | "futures", 1457 | "hashbrown 0.15.5", 1458 | "num-traits", 1459 | "once_cell", 1460 | "polars-arrow", 1461 | "polars-compute", 1462 | "polars-core", 1463 | "polars-expr", 1464 | "polars-io", 1465 | "polars-ops", 1466 | "polars-plan", 1467 | "polars-row", 1468 | "polars-utils", 1469 | "rayon", 1470 | "uuid", 1471 | "version_check", 1472 | ] 1473 | 1474 | [[package]] 1475 | name = "polars-plan" 1476 | version = "0.46.0" 1477 | source = "registry+https://github.com/rust-lang/crates.io-index" 1478 | checksum = "4f03533a93aa66127fcb909a87153a3c7cfee6f0ae59f497e73d7736208da54c" 1479 | dependencies = [ 1480 | "ahash", 1481 | "bitflags", 1482 | "bytemuck", 1483 | "bytes", 1484 | "chrono", 1485 | "chrono-tz", 1486 | "either", 1487 | "hashbrown 0.15.5", 1488 | "memmap2", 1489 | "num-traits", 1490 | "once_cell", 1491 | "percent-encoding", 1492 | "polars-arrow", 1493 | "polars-compute", 1494 | "polars-core", 1495 | "polars-io", 1496 | "polars-ops", 1497 | "polars-parquet", 1498 | "polars-time", 1499 | "polars-utils", 1500 | "rayon", 1501 | "recursive", 1502 | "regex", 1503 | "strum_macros", 1504 | "version_check", 1505 | ] 1506 | 1507 | [[package]] 1508 | name = "polars-row" 1509 | version = "0.46.0" 1510 | source = "registry+https://github.com/rust-lang/crates.io-index" 1511 | checksum = "6bf47f7409f8e75328d7d034be390842924eb276716d0458607be0bddb8cc839" 1512 | dependencies = [ 1513 | "bitflags", 1514 | "bytemuck", 1515 | "polars-arrow", 1516 | "polars-compute", 1517 | "polars-error", 1518 | "polars-utils", 1519 | ] 1520 | 1521 | [[package]] 1522 | name = "polars-schema" 1523 | version = "0.46.0" 1524 | source = "registry+https://github.com/rust-lang/crates.io-index" 1525 | checksum = "416621ae82b84466cf4ff36838a9b0aeb4a67e76bd3065edc8c9cb7da19b1bc7" 1526 | dependencies = [ 1527 | "indexmap", 1528 | "polars-error", 1529 | "polars-utils", 1530 | "version_check", 1531 | ] 1532 | 1533 | [[package]] 1534 | name = "polars-sql" 1535 | version = "0.46.0" 1536 | source = "registry+https://github.com/rust-lang/crates.io-index" 1537 | checksum = "edaab553b90aa4d6743bb538978e1982368acb58a94408d7dd3299cad49c7083" 1538 | dependencies = [ 1539 | "hex", 1540 | "polars-core", 1541 | "polars-error", 1542 | "polars-lazy", 1543 | "polars-ops", 1544 | "polars-plan", 1545 | "polars-time", 1546 | "polars-utils", 1547 | "rand", 1548 | "regex", 1549 | "serde", 1550 | "sqlparser", 1551 | ] 1552 | 1553 | [[package]] 1554 | name = "polars-stream" 1555 | version = "0.46.0" 1556 | source = "registry+https://github.com/rust-lang/crates.io-index" 1557 | checksum = "498997b656c779610c1496b3d96a59fe569ef22a5b81ccfe5325cb3df8dff2fd" 1558 | dependencies = [ 1559 | "atomic-waker", 1560 | "crossbeam-deque", 1561 | "crossbeam-utils", 1562 | "futures", 1563 | "memmap2", 1564 | "parking_lot", 1565 | "pin-project-lite", 1566 | "polars-core", 1567 | "polars-error", 1568 | "polars-expr", 1569 | "polars-io", 1570 | "polars-mem-engine", 1571 | "polars-ops", 1572 | "polars-parquet", 1573 | "polars-plan", 1574 | "polars-utils", 1575 | "rand", 1576 | "rayon", 1577 | "recursive", 1578 | "slotmap", 1579 | "tokio", 1580 | "version_check", 1581 | ] 1582 | 1583 | [[package]] 1584 | name = "polars-time" 1585 | version = "0.46.0" 1586 | source = "registry+https://github.com/rust-lang/crates.io-index" 1587 | checksum = "d192efbdab516d28b3fab1709a969e3385bd5cda050b7c9aa9e2502a01fda879" 1588 | dependencies = [ 1589 | "atoi_simd", 1590 | "bytemuck", 1591 | "chrono", 1592 | "chrono-tz", 1593 | "now", 1594 | "num-traits", 1595 | "once_cell", 1596 | "polars-arrow", 1597 | "polars-compute", 1598 | "polars-core", 1599 | "polars-error", 1600 | "polars-ops", 1601 | "polars-utils", 1602 | "rayon", 1603 | "regex", 1604 | "strum_macros", 1605 | ] 1606 | 1607 | [[package]] 1608 | name = "polars-utils" 1609 | version = "0.46.0" 1610 | source = "registry+https://github.com/rust-lang/crates.io-index" 1611 | checksum = "a8f6c8166a4a7fbc15b87c81645ed9e1f0651ff2e8c96cafc40ac5bf43441a10" 1612 | dependencies = [ 1613 | "ahash", 1614 | "bytemuck", 1615 | "bytes", 1616 | "compact_str", 1617 | "hashbrown 0.15.5", 1618 | "indexmap", 1619 | "libc", 1620 | "memmap2", 1621 | "num-traits", 1622 | "once_cell", 1623 | "polars-error", 1624 | "rand", 1625 | "raw-cpuid", 1626 | "rayon", 1627 | "stacker", 1628 | "sysinfo", 1629 | "version_check", 1630 | ] 1631 | 1632 | [[package]] 1633 | name = "polars_istr" 1634 | version = "0.1.2" 1635 | dependencies = [ 1636 | "cusip", 1637 | "iban_validate", 1638 | "isin", 1639 | "polars", 1640 | "polars-arrow", 1641 | "pyo3", 1642 | "pyo3-polars", 1643 | "url", 1644 | ] 1645 | 1646 | [[package]] 1647 | name = "portable-atomic" 1648 | version = "1.11.1" 1649 | source = "registry+https://github.com/rust-lang/crates.io-index" 1650 | checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" 1651 | 1652 | [[package]] 1653 | name = "potential_utf" 1654 | version = "0.1.2" 1655 | source = "registry+https://github.com/rust-lang/crates.io-index" 1656 | checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" 1657 | dependencies = [ 1658 | "zerovec", 1659 | ] 1660 | 1661 | [[package]] 1662 | name = "ppv-lite86" 1663 | version = "0.2.21" 1664 | source = "registry+https://github.com/rust-lang/crates.io-index" 1665 | checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" 1666 | dependencies = [ 1667 | "zerocopy", 1668 | ] 1669 | 1670 | [[package]] 1671 | name = "proc-macro2" 1672 | version = "1.0.101" 1673 | source = "registry+https://github.com/rust-lang/crates.io-index" 1674 | checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" 1675 | dependencies = [ 1676 | "unicode-ident", 1677 | ] 1678 | 1679 | [[package]] 1680 | name = "psm" 1681 | version = "0.1.26" 1682 | source = "registry+https://github.com/rust-lang/crates.io-index" 1683 | checksum = "6e944464ec8536cd1beb0bbfd96987eb5e3b72f2ecdafdc5c769a37f1fa2ae1f" 1684 | dependencies = [ 1685 | "cc", 1686 | ] 1687 | 1688 | [[package]] 1689 | name = "pyo3" 1690 | version = "0.23.5" 1691 | source = "registry+https://github.com/rust-lang/crates.io-index" 1692 | checksum = "7778bffd85cf38175ac1f545509665d0b9b92a198ca7941f131f85f7a4f9a872" 1693 | dependencies = [ 1694 | "cfg-if", 1695 | "indoc", 1696 | "libc", 1697 | "memoffset", 1698 | "once_cell", 1699 | "portable-atomic", 1700 | "pyo3-build-config", 1701 | "pyo3-ffi", 1702 | "pyo3-macros", 1703 | "unindent", 1704 | ] 1705 | 1706 | [[package]] 1707 | name = "pyo3-build-config" 1708 | version = "0.23.5" 1709 | source = "registry+https://github.com/rust-lang/crates.io-index" 1710 | checksum = "94f6cbe86ef3bf18998d9df6e0f3fc1050a8c5efa409bf712e661a4366e010fb" 1711 | dependencies = [ 1712 | "once_cell", 1713 | "target-lexicon", 1714 | ] 1715 | 1716 | [[package]] 1717 | name = "pyo3-ffi" 1718 | version = "0.23.5" 1719 | source = "registry+https://github.com/rust-lang/crates.io-index" 1720 | checksum = "e9f1b4c431c0bb1c8fb0a338709859eed0d030ff6daa34368d3b152a63dfdd8d" 1721 | dependencies = [ 1722 | "libc", 1723 | "pyo3-build-config", 1724 | ] 1725 | 1726 | [[package]] 1727 | name = "pyo3-macros" 1728 | version = "0.23.5" 1729 | source = "registry+https://github.com/rust-lang/crates.io-index" 1730 | checksum = "fbc2201328f63c4710f68abdf653c89d8dbc2858b88c5d88b0ff38a75288a9da" 1731 | dependencies = [ 1732 | "proc-macro2", 1733 | "pyo3-macros-backend", 1734 | "quote", 1735 | "syn", 1736 | ] 1737 | 1738 | [[package]] 1739 | name = "pyo3-macros-backend" 1740 | version = "0.23.5" 1741 | source = "registry+https://github.com/rust-lang/crates.io-index" 1742 | checksum = "fca6726ad0f3da9c9de093d6f116a93c1a38e417ed73bf138472cf4064f72028" 1743 | dependencies = [ 1744 | "heck", 1745 | "proc-macro2", 1746 | "pyo3-build-config", 1747 | "quote", 1748 | "syn", 1749 | ] 1750 | 1751 | [[package]] 1752 | name = "pyo3-polars" 1753 | version = "0.20.0" 1754 | source = "registry+https://github.com/rust-lang/crates.io-index" 1755 | checksum = "8e7db078e647fbd863d7605d13ef1553c06dd84ba9559f76512d3ca63d5fff20" 1756 | dependencies = [ 1757 | "libc", 1758 | "once_cell", 1759 | "polars", 1760 | "polars-arrow", 1761 | "polars-core", 1762 | "polars-ffi", 1763 | "polars-plan", 1764 | "pyo3", 1765 | "pyo3-polars-derive", 1766 | "serde", 1767 | "serde-pickle", 1768 | "thiserror 1.0.69", 1769 | ] 1770 | 1771 | [[package]] 1772 | name = "pyo3-polars-derive" 1773 | version = "0.14.0" 1774 | source = "registry+https://github.com/rust-lang/crates.io-index" 1775 | checksum = "6a247f5b03316e317f42e9a3fec4ff5b26cfa2b05fc2d9e821b7a182c82ef08f" 1776 | dependencies = [ 1777 | "polars-arrow", 1778 | "polars-core", 1779 | "polars-ffi", 1780 | "polars-plan", 1781 | "proc-macro2", 1782 | "quote", 1783 | "syn", 1784 | ] 1785 | 1786 | [[package]] 1787 | name = "quote" 1788 | version = "1.0.40" 1789 | source = "registry+https://github.com/rust-lang/crates.io-index" 1790 | checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 1791 | dependencies = [ 1792 | "proc-macro2", 1793 | ] 1794 | 1795 | [[package]] 1796 | name = "r-efi" 1797 | version = "5.3.0" 1798 | source = "registry+https://github.com/rust-lang/crates.io-index" 1799 | checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" 1800 | 1801 | [[package]] 1802 | name = "rand" 1803 | version = "0.8.5" 1804 | source = "registry+https://github.com/rust-lang/crates.io-index" 1805 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1806 | dependencies = [ 1807 | "libc", 1808 | "rand_chacha", 1809 | "rand_core", 1810 | ] 1811 | 1812 | [[package]] 1813 | name = "rand_chacha" 1814 | version = "0.3.1" 1815 | source = "registry+https://github.com/rust-lang/crates.io-index" 1816 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1817 | dependencies = [ 1818 | "ppv-lite86", 1819 | "rand_core", 1820 | ] 1821 | 1822 | [[package]] 1823 | name = "rand_core" 1824 | version = "0.6.4" 1825 | source = "registry+https://github.com/rust-lang/crates.io-index" 1826 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1827 | dependencies = [ 1828 | "getrandom 0.2.16", 1829 | ] 1830 | 1831 | [[package]] 1832 | name = "rand_distr" 1833 | version = "0.4.3" 1834 | source = "registry+https://github.com/rust-lang/crates.io-index" 1835 | checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" 1836 | dependencies = [ 1837 | "num-traits", 1838 | "rand", 1839 | ] 1840 | 1841 | [[package]] 1842 | name = "raw-cpuid" 1843 | version = "11.5.0" 1844 | source = "registry+https://github.com/rust-lang/crates.io-index" 1845 | checksum = "c6df7ab838ed27997ba19a4664507e6f82b41fe6e20be42929332156e5e85146" 1846 | dependencies = [ 1847 | "bitflags", 1848 | ] 1849 | 1850 | [[package]] 1851 | name = "rayon" 1852 | version = "1.11.0" 1853 | source = "registry+https://github.com/rust-lang/crates.io-index" 1854 | checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" 1855 | dependencies = [ 1856 | "either", 1857 | "rayon-core", 1858 | ] 1859 | 1860 | [[package]] 1861 | name = "rayon-core" 1862 | version = "1.13.0" 1863 | source = "registry+https://github.com/rust-lang/crates.io-index" 1864 | checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" 1865 | dependencies = [ 1866 | "crossbeam-deque", 1867 | "crossbeam-utils", 1868 | ] 1869 | 1870 | [[package]] 1871 | name = "recursive" 1872 | version = "0.1.1" 1873 | source = "registry+https://github.com/rust-lang/crates.io-index" 1874 | checksum = "0786a43debb760f491b1bc0269fe5e84155353c67482b9e60d0cfb596054b43e" 1875 | dependencies = [ 1876 | "recursive-proc-macro-impl", 1877 | "stacker", 1878 | ] 1879 | 1880 | [[package]] 1881 | name = "recursive-proc-macro-impl" 1882 | version = "0.1.1" 1883 | source = "registry+https://github.com/rust-lang/crates.io-index" 1884 | checksum = "76009fbe0614077fc1a2ce255e3a1881a2e3a3527097d5dc6d8212c585e7e38b" 1885 | dependencies = [ 1886 | "quote", 1887 | "syn", 1888 | ] 1889 | 1890 | [[package]] 1891 | name = "redox_syscall" 1892 | version = "0.5.17" 1893 | source = "registry+https://github.com/rust-lang/crates.io-index" 1894 | checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" 1895 | dependencies = [ 1896 | "bitflags", 1897 | ] 1898 | 1899 | [[package]] 1900 | name = "regex" 1901 | version = "1.11.2" 1902 | source = "registry+https://github.com/rust-lang/crates.io-index" 1903 | checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" 1904 | dependencies = [ 1905 | "aho-corasick", 1906 | "memchr", 1907 | "regex-automata", 1908 | "regex-syntax", 1909 | ] 1910 | 1911 | [[package]] 1912 | name = "regex-automata" 1913 | version = "0.4.10" 1914 | source = "registry+https://github.com/rust-lang/crates.io-index" 1915 | checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" 1916 | dependencies = [ 1917 | "aho-corasick", 1918 | "memchr", 1919 | "regex-syntax", 1920 | ] 1921 | 1922 | [[package]] 1923 | name = "regex-syntax" 1924 | version = "0.8.6" 1925 | source = "registry+https://github.com/rust-lang/crates.io-index" 1926 | checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" 1927 | 1928 | [[package]] 1929 | name = "rustc-demangle" 1930 | version = "0.1.26" 1931 | source = "registry+https://github.com/rust-lang/crates.io-index" 1932 | checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" 1933 | 1934 | [[package]] 1935 | name = "rustix" 1936 | version = "0.38.44" 1937 | source = "registry+https://github.com/rust-lang/crates.io-index" 1938 | checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" 1939 | dependencies = [ 1940 | "bitflags", 1941 | "errno", 1942 | "libc", 1943 | "linux-raw-sys", 1944 | "windows-sys 0.59.0", 1945 | ] 1946 | 1947 | [[package]] 1948 | name = "rustversion" 1949 | version = "1.0.22" 1950 | source = "registry+https://github.com/rust-lang/crates.io-index" 1951 | checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" 1952 | 1953 | [[package]] 1954 | name = "ryu" 1955 | version = "1.0.20" 1956 | source = "registry+https://github.com/rust-lang/crates.io-index" 1957 | checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 1958 | 1959 | [[package]] 1960 | name = "scopeguard" 1961 | version = "1.2.0" 1962 | source = "registry+https://github.com/rust-lang/crates.io-index" 1963 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1964 | 1965 | [[package]] 1966 | name = "serde" 1967 | version = "1.0.219" 1968 | source = "registry+https://github.com/rust-lang/crates.io-index" 1969 | checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 1970 | dependencies = [ 1971 | "serde_derive", 1972 | ] 1973 | 1974 | [[package]] 1975 | name = "serde-pickle" 1976 | version = "1.2.0" 1977 | source = "registry+https://github.com/rust-lang/crates.io-index" 1978 | checksum = "b641fdc8bcf2781ee78b30c599700d64ad4f412976143e4c5d0b9df906bb4843" 1979 | dependencies = [ 1980 | "byteorder", 1981 | "iter-read", 1982 | "num-bigint", 1983 | "num-traits", 1984 | "serde", 1985 | ] 1986 | 1987 | [[package]] 1988 | name = "serde_derive" 1989 | version = "1.0.219" 1990 | source = "registry+https://github.com/rust-lang/crates.io-index" 1991 | checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 1992 | dependencies = [ 1993 | "proc-macro2", 1994 | "quote", 1995 | "syn", 1996 | ] 1997 | 1998 | [[package]] 1999 | name = "shlex" 2000 | version = "1.3.0" 2001 | source = "registry+https://github.com/rust-lang/crates.io-index" 2002 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 2003 | 2004 | [[package]] 2005 | name = "simdutf8" 2006 | version = "0.1.5" 2007 | source = "registry+https://github.com/rust-lang/crates.io-index" 2008 | checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" 2009 | 2010 | [[package]] 2011 | name = "siphasher" 2012 | version = "1.0.1" 2013 | source = "registry+https://github.com/rust-lang/crates.io-index" 2014 | checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" 2015 | 2016 | [[package]] 2017 | name = "slab" 2018 | version = "0.4.11" 2019 | source = "registry+https://github.com/rust-lang/crates.io-index" 2020 | checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" 2021 | 2022 | [[package]] 2023 | name = "slotmap" 2024 | version = "1.0.7" 2025 | source = "registry+https://github.com/rust-lang/crates.io-index" 2026 | checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" 2027 | dependencies = [ 2028 | "version_check", 2029 | ] 2030 | 2031 | [[package]] 2032 | name = "smallvec" 2033 | version = "1.15.1" 2034 | source = "registry+https://github.com/rust-lang/crates.io-index" 2035 | checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 2036 | 2037 | [[package]] 2038 | name = "snap" 2039 | version = "1.1.1" 2040 | source = "registry+https://github.com/rust-lang/crates.io-index" 2041 | checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" 2042 | 2043 | [[package]] 2044 | name = "socket2" 2045 | version = "0.6.0" 2046 | source = "registry+https://github.com/rust-lang/crates.io-index" 2047 | checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" 2048 | dependencies = [ 2049 | "libc", 2050 | "windows-sys 0.59.0", 2051 | ] 2052 | 2053 | [[package]] 2054 | name = "sqlparser" 2055 | version = "0.53.0" 2056 | source = "registry+https://github.com/rust-lang/crates.io-index" 2057 | checksum = "05a528114c392209b3264855ad491fcce534b94a38771b0a0b97a79379275ce8" 2058 | dependencies = [ 2059 | "log", 2060 | ] 2061 | 2062 | [[package]] 2063 | name = "stable_deref_trait" 2064 | version = "1.2.0" 2065 | source = "registry+https://github.com/rust-lang/crates.io-index" 2066 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 2067 | 2068 | [[package]] 2069 | name = "stacker" 2070 | version = "0.1.21" 2071 | source = "registry+https://github.com/rust-lang/crates.io-index" 2072 | checksum = "cddb07e32ddb770749da91081d8d0ac3a16f1a569a18b20348cd371f5dead06b" 2073 | dependencies = [ 2074 | "cc", 2075 | "cfg-if", 2076 | "libc", 2077 | "psm", 2078 | "windows-sys 0.59.0", 2079 | ] 2080 | 2081 | [[package]] 2082 | name = "static_assertions" 2083 | version = "1.1.0" 2084 | source = "registry+https://github.com/rust-lang/crates.io-index" 2085 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 2086 | 2087 | [[package]] 2088 | name = "streaming-decompression" 2089 | version = "0.1.2" 2090 | source = "registry+https://github.com/rust-lang/crates.io-index" 2091 | checksum = "bf6cc3b19bfb128a8ad11026086e31d3ce9ad23f8ea37354b31383a187c44cf3" 2092 | dependencies = [ 2093 | "fallible-streaming-iterator", 2094 | ] 2095 | 2096 | [[package]] 2097 | name = "streaming-iterator" 2098 | version = "0.1.9" 2099 | source = "registry+https://github.com/rust-lang/crates.io-index" 2100 | checksum = "2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520" 2101 | 2102 | [[package]] 2103 | name = "strength_reduce" 2104 | version = "0.2.4" 2105 | source = "registry+https://github.com/rust-lang/crates.io-index" 2106 | checksum = "fe895eb47f22e2ddd4dabc02bce419d2e643c8e3b585c78158b349195bc24d82" 2107 | 2108 | [[package]] 2109 | name = "strum_macros" 2110 | version = "0.26.4" 2111 | source = "registry+https://github.com/rust-lang/crates.io-index" 2112 | checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" 2113 | dependencies = [ 2114 | "heck", 2115 | "proc-macro2", 2116 | "quote", 2117 | "rustversion", 2118 | "syn", 2119 | ] 2120 | 2121 | [[package]] 2122 | name = "syn" 2123 | version = "2.0.106" 2124 | source = "registry+https://github.com/rust-lang/crates.io-index" 2125 | checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" 2126 | dependencies = [ 2127 | "proc-macro2", 2128 | "quote", 2129 | "unicode-ident", 2130 | ] 2131 | 2132 | [[package]] 2133 | name = "synstructure" 2134 | version = "0.13.2" 2135 | source = "registry+https://github.com/rust-lang/crates.io-index" 2136 | checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" 2137 | dependencies = [ 2138 | "proc-macro2", 2139 | "quote", 2140 | "syn", 2141 | ] 2142 | 2143 | [[package]] 2144 | name = "sysinfo" 2145 | version = "0.33.1" 2146 | source = "registry+https://github.com/rust-lang/crates.io-index" 2147 | checksum = "4fc858248ea01b66f19d8e8a6d55f41deaf91e9d495246fd01368d99935c6c01" 2148 | dependencies = [ 2149 | "core-foundation-sys", 2150 | "libc", 2151 | "memchr", 2152 | "ntapi", 2153 | "windows", 2154 | ] 2155 | 2156 | [[package]] 2157 | name = "target-lexicon" 2158 | version = "0.12.16" 2159 | source = "registry+https://github.com/rust-lang/crates.io-index" 2160 | checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" 2161 | 2162 | [[package]] 2163 | name = "thiserror" 2164 | version = "1.0.69" 2165 | source = "registry+https://github.com/rust-lang/crates.io-index" 2166 | checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 2167 | dependencies = [ 2168 | "thiserror-impl 1.0.69", 2169 | ] 2170 | 2171 | [[package]] 2172 | name = "thiserror" 2173 | version = "2.0.16" 2174 | source = "registry+https://github.com/rust-lang/crates.io-index" 2175 | checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" 2176 | dependencies = [ 2177 | "thiserror-impl 2.0.16", 2178 | ] 2179 | 2180 | [[package]] 2181 | name = "thiserror-impl" 2182 | version = "1.0.69" 2183 | source = "registry+https://github.com/rust-lang/crates.io-index" 2184 | checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 2185 | dependencies = [ 2186 | "proc-macro2", 2187 | "quote", 2188 | "syn", 2189 | ] 2190 | 2191 | [[package]] 2192 | name = "thiserror-impl" 2193 | version = "2.0.16" 2194 | source = "registry+https://github.com/rust-lang/crates.io-index" 2195 | checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" 2196 | dependencies = [ 2197 | "proc-macro2", 2198 | "quote", 2199 | "syn", 2200 | ] 2201 | 2202 | [[package]] 2203 | name = "tinystr" 2204 | version = "0.8.1" 2205 | source = "registry+https://github.com/rust-lang/crates.io-index" 2206 | checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 2207 | dependencies = [ 2208 | "displaydoc", 2209 | "zerovec", 2210 | ] 2211 | 2212 | [[package]] 2213 | name = "tinyvec" 2214 | version = "1.10.0" 2215 | source = "registry+https://github.com/rust-lang/crates.io-index" 2216 | checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" 2217 | dependencies = [ 2218 | "tinyvec_macros", 2219 | ] 2220 | 2221 | [[package]] 2222 | name = "tinyvec_macros" 2223 | version = "0.1.1" 2224 | source = "registry+https://github.com/rust-lang/crates.io-index" 2225 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 2226 | 2227 | [[package]] 2228 | name = "tokio" 2229 | version = "1.47.1" 2230 | source = "registry+https://github.com/rust-lang/crates.io-index" 2231 | checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" 2232 | dependencies = [ 2233 | "backtrace", 2234 | "bytes", 2235 | "io-uring", 2236 | "libc", 2237 | "mio", 2238 | "pin-project-lite", 2239 | "slab", 2240 | "socket2", 2241 | "windows-sys 0.59.0", 2242 | ] 2243 | 2244 | [[package]] 2245 | name = "tokio-util" 2246 | version = "0.7.16" 2247 | source = "registry+https://github.com/rust-lang/crates.io-index" 2248 | checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" 2249 | dependencies = [ 2250 | "bytes", 2251 | "futures-core", 2252 | "futures-sink", 2253 | "pin-project-lite", 2254 | "tokio", 2255 | ] 2256 | 2257 | [[package]] 2258 | name = "unicode-ident" 2259 | version = "1.0.18" 2260 | source = "registry+https://github.com/rust-lang/crates.io-index" 2261 | checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 2262 | 2263 | [[package]] 2264 | name = "unicode-normalization" 2265 | version = "0.1.24" 2266 | source = "registry+https://github.com/rust-lang/crates.io-index" 2267 | checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" 2268 | dependencies = [ 2269 | "tinyvec", 2270 | ] 2271 | 2272 | [[package]] 2273 | name = "unicode-reverse" 2274 | version = "1.0.9" 2275 | source = "registry+https://github.com/rust-lang/crates.io-index" 2276 | checksum = "4b6f4888ebc23094adfb574fdca9fdc891826287a6397d2cd28802ffd6f20c76" 2277 | dependencies = [ 2278 | "unicode-segmentation", 2279 | ] 2280 | 2281 | [[package]] 2282 | name = "unicode-segmentation" 2283 | version = "1.12.0" 2284 | source = "registry+https://github.com/rust-lang/crates.io-index" 2285 | checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" 2286 | 2287 | [[package]] 2288 | name = "unicode-width" 2289 | version = "0.2.1" 2290 | source = "registry+https://github.com/rust-lang/crates.io-index" 2291 | checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" 2292 | 2293 | [[package]] 2294 | name = "unindent" 2295 | version = "0.2.4" 2296 | source = "registry+https://github.com/rust-lang/crates.io-index" 2297 | checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3" 2298 | 2299 | [[package]] 2300 | name = "url" 2301 | version = "2.5.7" 2302 | source = "registry+https://github.com/rust-lang/crates.io-index" 2303 | checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" 2304 | dependencies = [ 2305 | "form_urlencoded", 2306 | "idna", 2307 | "percent-encoding", 2308 | "serde", 2309 | ] 2310 | 2311 | [[package]] 2312 | name = "utf8_iter" 2313 | version = "1.0.4" 2314 | source = "registry+https://github.com/rust-lang/crates.io-index" 2315 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 2316 | 2317 | [[package]] 2318 | name = "uuid" 2319 | version = "1.18.0" 2320 | source = "registry+https://github.com/rust-lang/crates.io-index" 2321 | checksum = "f33196643e165781c20a5ead5582283a7dacbb87855d867fbc2df3f81eddc1be" 2322 | dependencies = [ 2323 | "getrandom 0.3.3", 2324 | "js-sys", 2325 | "wasm-bindgen", 2326 | ] 2327 | 2328 | [[package]] 2329 | name = "version_check" 2330 | version = "0.9.5" 2331 | source = "registry+https://github.com/rust-lang/crates.io-index" 2332 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 2333 | 2334 | [[package]] 2335 | name = "wasi" 2336 | version = "0.11.1+wasi-snapshot-preview1" 2337 | source = "registry+https://github.com/rust-lang/crates.io-index" 2338 | checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 2339 | 2340 | [[package]] 2341 | name = "wasi" 2342 | version = "0.14.3+wasi-0.2.4" 2343 | source = "registry+https://github.com/rust-lang/crates.io-index" 2344 | checksum = "6a51ae83037bdd272a9e28ce236db8c07016dd0d50c27038b3f407533c030c95" 2345 | dependencies = [ 2346 | "wit-bindgen", 2347 | ] 2348 | 2349 | [[package]] 2350 | name = "wasm-bindgen" 2351 | version = "0.2.100" 2352 | source = "registry+https://github.com/rust-lang/crates.io-index" 2353 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 2354 | dependencies = [ 2355 | "cfg-if", 2356 | "once_cell", 2357 | "rustversion", 2358 | "wasm-bindgen-macro", 2359 | ] 2360 | 2361 | [[package]] 2362 | name = "wasm-bindgen-backend" 2363 | version = "0.2.100" 2364 | source = "registry+https://github.com/rust-lang/crates.io-index" 2365 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 2366 | dependencies = [ 2367 | "bumpalo", 2368 | "log", 2369 | "proc-macro2", 2370 | "quote", 2371 | "syn", 2372 | "wasm-bindgen-shared", 2373 | ] 2374 | 2375 | [[package]] 2376 | name = "wasm-bindgen-macro" 2377 | version = "0.2.100" 2378 | source = "registry+https://github.com/rust-lang/crates.io-index" 2379 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 2380 | dependencies = [ 2381 | "quote", 2382 | "wasm-bindgen-macro-support", 2383 | ] 2384 | 2385 | [[package]] 2386 | name = "wasm-bindgen-macro-support" 2387 | version = "0.2.100" 2388 | source = "registry+https://github.com/rust-lang/crates.io-index" 2389 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 2390 | dependencies = [ 2391 | "proc-macro2", 2392 | "quote", 2393 | "syn", 2394 | "wasm-bindgen-backend", 2395 | "wasm-bindgen-shared", 2396 | ] 2397 | 2398 | [[package]] 2399 | name = "wasm-bindgen-shared" 2400 | version = "0.2.100" 2401 | source = "registry+https://github.com/rust-lang/crates.io-index" 2402 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 2403 | dependencies = [ 2404 | "unicode-ident", 2405 | ] 2406 | 2407 | [[package]] 2408 | name = "winapi" 2409 | version = "0.3.9" 2410 | source = "registry+https://github.com/rust-lang/crates.io-index" 2411 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2412 | dependencies = [ 2413 | "winapi-i686-pc-windows-gnu", 2414 | "winapi-x86_64-pc-windows-gnu", 2415 | ] 2416 | 2417 | [[package]] 2418 | name = "winapi-i686-pc-windows-gnu" 2419 | version = "0.4.0" 2420 | source = "registry+https://github.com/rust-lang/crates.io-index" 2421 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2422 | 2423 | [[package]] 2424 | name = "winapi-x86_64-pc-windows-gnu" 2425 | version = "0.4.0" 2426 | source = "registry+https://github.com/rust-lang/crates.io-index" 2427 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2428 | 2429 | [[package]] 2430 | name = "windows" 2431 | version = "0.57.0" 2432 | source = "registry+https://github.com/rust-lang/crates.io-index" 2433 | checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" 2434 | dependencies = [ 2435 | "windows-core 0.57.0", 2436 | "windows-targets 0.52.6", 2437 | ] 2438 | 2439 | [[package]] 2440 | name = "windows-core" 2441 | version = "0.57.0" 2442 | source = "registry+https://github.com/rust-lang/crates.io-index" 2443 | checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" 2444 | dependencies = [ 2445 | "windows-implement 0.57.0", 2446 | "windows-interface 0.57.0", 2447 | "windows-result 0.1.2", 2448 | "windows-targets 0.52.6", 2449 | ] 2450 | 2451 | [[package]] 2452 | name = "windows-core" 2453 | version = "0.61.2" 2454 | source = "registry+https://github.com/rust-lang/crates.io-index" 2455 | checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" 2456 | dependencies = [ 2457 | "windows-implement 0.60.0", 2458 | "windows-interface 0.59.1", 2459 | "windows-link", 2460 | "windows-result 0.3.4", 2461 | "windows-strings", 2462 | ] 2463 | 2464 | [[package]] 2465 | name = "windows-implement" 2466 | version = "0.57.0" 2467 | source = "registry+https://github.com/rust-lang/crates.io-index" 2468 | checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" 2469 | dependencies = [ 2470 | "proc-macro2", 2471 | "quote", 2472 | "syn", 2473 | ] 2474 | 2475 | [[package]] 2476 | name = "windows-implement" 2477 | version = "0.60.0" 2478 | source = "registry+https://github.com/rust-lang/crates.io-index" 2479 | checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" 2480 | dependencies = [ 2481 | "proc-macro2", 2482 | "quote", 2483 | "syn", 2484 | ] 2485 | 2486 | [[package]] 2487 | name = "windows-interface" 2488 | version = "0.57.0" 2489 | source = "registry+https://github.com/rust-lang/crates.io-index" 2490 | checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" 2491 | dependencies = [ 2492 | "proc-macro2", 2493 | "quote", 2494 | "syn", 2495 | ] 2496 | 2497 | [[package]] 2498 | name = "windows-interface" 2499 | version = "0.59.1" 2500 | source = "registry+https://github.com/rust-lang/crates.io-index" 2501 | checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" 2502 | dependencies = [ 2503 | "proc-macro2", 2504 | "quote", 2505 | "syn", 2506 | ] 2507 | 2508 | [[package]] 2509 | name = "windows-link" 2510 | version = "0.1.3" 2511 | source = "registry+https://github.com/rust-lang/crates.io-index" 2512 | checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" 2513 | 2514 | [[package]] 2515 | name = "windows-result" 2516 | version = "0.1.2" 2517 | source = "registry+https://github.com/rust-lang/crates.io-index" 2518 | checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" 2519 | dependencies = [ 2520 | "windows-targets 0.52.6", 2521 | ] 2522 | 2523 | [[package]] 2524 | name = "windows-result" 2525 | version = "0.3.4" 2526 | source = "registry+https://github.com/rust-lang/crates.io-index" 2527 | checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" 2528 | dependencies = [ 2529 | "windows-link", 2530 | ] 2531 | 2532 | [[package]] 2533 | name = "windows-strings" 2534 | version = "0.4.2" 2535 | source = "registry+https://github.com/rust-lang/crates.io-index" 2536 | checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" 2537 | dependencies = [ 2538 | "windows-link", 2539 | ] 2540 | 2541 | [[package]] 2542 | name = "windows-sys" 2543 | version = "0.59.0" 2544 | source = "registry+https://github.com/rust-lang/crates.io-index" 2545 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 2546 | dependencies = [ 2547 | "windows-targets 0.52.6", 2548 | ] 2549 | 2550 | [[package]] 2551 | name = "windows-sys" 2552 | version = "0.60.2" 2553 | source = "registry+https://github.com/rust-lang/crates.io-index" 2554 | checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 2555 | dependencies = [ 2556 | "windows-targets 0.53.3", 2557 | ] 2558 | 2559 | [[package]] 2560 | name = "windows-targets" 2561 | version = "0.52.6" 2562 | source = "registry+https://github.com/rust-lang/crates.io-index" 2563 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 2564 | dependencies = [ 2565 | "windows_aarch64_gnullvm 0.52.6", 2566 | "windows_aarch64_msvc 0.52.6", 2567 | "windows_i686_gnu 0.52.6", 2568 | "windows_i686_gnullvm 0.52.6", 2569 | "windows_i686_msvc 0.52.6", 2570 | "windows_x86_64_gnu 0.52.6", 2571 | "windows_x86_64_gnullvm 0.52.6", 2572 | "windows_x86_64_msvc 0.52.6", 2573 | ] 2574 | 2575 | [[package]] 2576 | name = "windows-targets" 2577 | version = "0.53.3" 2578 | source = "registry+https://github.com/rust-lang/crates.io-index" 2579 | checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" 2580 | dependencies = [ 2581 | "windows-link", 2582 | "windows_aarch64_gnullvm 0.53.0", 2583 | "windows_aarch64_msvc 0.53.0", 2584 | "windows_i686_gnu 0.53.0", 2585 | "windows_i686_gnullvm 0.53.0", 2586 | "windows_i686_msvc 0.53.0", 2587 | "windows_x86_64_gnu 0.53.0", 2588 | "windows_x86_64_gnullvm 0.53.0", 2589 | "windows_x86_64_msvc 0.53.0", 2590 | ] 2591 | 2592 | [[package]] 2593 | name = "windows_aarch64_gnullvm" 2594 | version = "0.52.6" 2595 | source = "registry+https://github.com/rust-lang/crates.io-index" 2596 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 2597 | 2598 | [[package]] 2599 | name = "windows_aarch64_gnullvm" 2600 | version = "0.53.0" 2601 | source = "registry+https://github.com/rust-lang/crates.io-index" 2602 | checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" 2603 | 2604 | [[package]] 2605 | name = "windows_aarch64_msvc" 2606 | version = "0.52.6" 2607 | source = "registry+https://github.com/rust-lang/crates.io-index" 2608 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 2609 | 2610 | [[package]] 2611 | name = "windows_aarch64_msvc" 2612 | version = "0.53.0" 2613 | source = "registry+https://github.com/rust-lang/crates.io-index" 2614 | checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" 2615 | 2616 | [[package]] 2617 | name = "windows_i686_gnu" 2618 | version = "0.52.6" 2619 | source = "registry+https://github.com/rust-lang/crates.io-index" 2620 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 2621 | 2622 | [[package]] 2623 | name = "windows_i686_gnu" 2624 | version = "0.53.0" 2625 | source = "registry+https://github.com/rust-lang/crates.io-index" 2626 | checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" 2627 | 2628 | [[package]] 2629 | name = "windows_i686_gnullvm" 2630 | version = "0.52.6" 2631 | source = "registry+https://github.com/rust-lang/crates.io-index" 2632 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 2633 | 2634 | [[package]] 2635 | name = "windows_i686_gnullvm" 2636 | version = "0.53.0" 2637 | source = "registry+https://github.com/rust-lang/crates.io-index" 2638 | checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" 2639 | 2640 | [[package]] 2641 | name = "windows_i686_msvc" 2642 | version = "0.52.6" 2643 | source = "registry+https://github.com/rust-lang/crates.io-index" 2644 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 2645 | 2646 | [[package]] 2647 | name = "windows_i686_msvc" 2648 | version = "0.53.0" 2649 | source = "registry+https://github.com/rust-lang/crates.io-index" 2650 | checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" 2651 | 2652 | [[package]] 2653 | name = "windows_x86_64_gnu" 2654 | version = "0.52.6" 2655 | source = "registry+https://github.com/rust-lang/crates.io-index" 2656 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 2657 | 2658 | [[package]] 2659 | name = "windows_x86_64_gnu" 2660 | version = "0.53.0" 2661 | source = "registry+https://github.com/rust-lang/crates.io-index" 2662 | checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" 2663 | 2664 | [[package]] 2665 | name = "windows_x86_64_gnullvm" 2666 | version = "0.52.6" 2667 | source = "registry+https://github.com/rust-lang/crates.io-index" 2668 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 2669 | 2670 | [[package]] 2671 | name = "windows_x86_64_gnullvm" 2672 | version = "0.53.0" 2673 | source = "registry+https://github.com/rust-lang/crates.io-index" 2674 | checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" 2675 | 2676 | [[package]] 2677 | name = "windows_x86_64_msvc" 2678 | version = "0.52.6" 2679 | source = "registry+https://github.com/rust-lang/crates.io-index" 2680 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 2681 | 2682 | [[package]] 2683 | name = "windows_x86_64_msvc" 2684 | version = "0.53.0" 2685 | source = "registry+https://github.com/rust-lang/crates.io-index" 2686 | checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" 2687 | 2688 | [[package]] 2689 | name = "wit-bindgen" 2690 | version = "0.45.0" 2691 | source = "registry+https://github.com/rust-lang/crates.io-index" 2692 | checksum = "052283831dbae3d879dc7f51f3d92703a316ca49f91540417d38591826127814" 2693 | 2694 | [[package]] 2695 | name = "writeable" 2696 | version = "0.6.1" 2697 | source = "registry+https://github.com/rust-lang/crates.io-index" 2698 | checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 2699 | 2700 | [[package]] 2701 | name = "xxhash-rust" 2702 | version = "0.8.15" 2703 | source = "registry+https://github.com/rust-lang/crates.io-index" 2704 | checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" 2705 | 2706 | [[package]] 2707 | name = "yoke" 2708 | version = "0.8.0" 2709 | source = "registry+https://github.com/rust-lang/crates.io-index" 2710 | checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 2711 | dependencies = [ 2712 | "serde", 2713 | "stable_deref_trait", 2714 | "yoke-derive", 2715 | "zerofrom", 2716 | ] 2717 | 2718 | [[package]] 2719 | name = "yoke-derive" 2720 | version = "0.8.0" 2721 | source = "registry+https://github.com/rust-lang/crates.io-index" 2722 | checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 2723 | dependencies = [ 2724 | "proc-macro2", 2725 | "quote", 2726 | "syn", 2727 | "synstructure", 2728 | ] 2729 | 2730 | [[package]] 2731 | name = "zerocopy" 2732 | version = "0.8.26" 2733 | source = "registry+https://github.com/rust-lang/crates.io-index" 2734 | checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" 2735 | dependencies = [ 2736 | "zerocopy-derive", 2737 | ] 2738 | 2739 | [[package]] 2740 | name = "zerocopy-derive" 2741 | version = "0.8.26" 2742 | source = "registry+https://github.com/rust-lang/crates.io-index" 2743 | checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" 2744 | dependencies = [ 2745 | "proc-macro2", 2746 | "quote", 2747 | "syn", 2748 | ] 2749 | 2750 | [[package]] 2751 | name = "zerofrom" 2752 | version = "0.1.6" 2753 | source = "registry+https://github.com/rust-lang/crates.io-index" 2754 | checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 2755 | dependencies = [ 2756 | "zerofrom-derive", 2757 | ] 2758 | 2759 | [[package]] 2760 | name = "zerofrom-derive" 2761 | version = "0.1.6" 2762 | source = "registry+https://github.com/rust-lang/crates.io-index" 2763 | checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 2764 | dependencies = [ 2765 | "proc-macro2", 2766 | "quote", 2767 | "syn", 2768 | "synstructure", 2769 | ] 2770 | 2771 | [[package]] 2772 | name = "zerotrie" 2773 | version = "0.2.2" 2774 | source = "registry+https://github.com/rust-lang/crates.io-index" 2775 | checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 2776 | dependencies = [ 2777 | "displaydoc", 2778 | "yoke", 2779 | "zerofrom", 2780 | ] 2781 | 2782 | [[package]] 2783 | name = "zerovec" 2784 | version = "0.11.4" 2785 | source = "registry+https://github.com/rust-lang/crates.io-index" 2786 | checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" 2787 | dependencies = [ 2788 | "yoke", 2789 | "zerofrom", 2790 | "zerovec-derive", 2791 | ] 2792 | 2793 | [[package]] 2794 | name = "zerovec-derive" 2795 | version = "0.11.1" 2796 | source = "registry+https://github.com/rust-lang/crates.io-index" 2797 | checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 2798 | dependencies = [ 2799 | "proc-macro2", 2800 | "quote", 2801 | "syn", 2802 | ] 2803 | 2804 | [[package]] 2805 | name = "zlib-rs" 2806 | version = "0.5.1" 2807 | source = "registry+https://github.com/rust-lang/crates.io-index" 2808 | checksum = "626bd9fa9734751fc50d6060752170984d7053f5a39061f524cda68023d4db8a" 2809 | 2810 | [[package]] 2811 | name = "zstd" 2812 | version = "0.13.3" 2813 | source = "registry+https://github.com/rust-lang/crates.io-index" 2814 | checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" 2815 | dependencies = [ 2816 | "zstd-safe", 2817 | ] 2818 | 2819 | [[package]] 2820 | name = "zstd-safe" 2821 | version = "7.2.4" 2822 | source = "registry+https://github.com/rust-lang/crates.io-index" 2823 | checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" 2824 | dependencies = [ 2825 | "zstd-sys", 2826 | ] 2827 | 2828 | [[package]] 2829 | name = "zstd-sys" 2830 | version = "2.0.15+zstd.1.5.7" 2831 | source = "registry+https://github.com/rust-lang/crates.io-index" 2832 | checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" 2833 | dependencies = [ 2834 | "cc", 2835 | "pkg-config", 2836 | ] 2837 | --------------------------------------------------------------------------------