├── 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_code | reason | is_valid | bban | bank_id | branch_id |
|---|
| str | str | bool | str | str | str |
| null | "Invalid country code" | false | null | null | null |
| "DE" | "ok" | true | "500105175407324931" | "50010517" | null |
| "AD" | "ok" | true | "00012030200359100100" | "0001" | "2030" |
| null | "Invalid checksum" | false | null | null | null |
"
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_code | check_digits | bban | bank_id | branch_id |
|---|
| str | str | str | str | str |
| null | null | null | null | null |
| "DE" | "44" | "500105175407324931" | "50010517" | null |
| "AD" | "12" | "00012030200359100100" | "0001" | "2030" |
| null | null | null | null | null |
"
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_code | check_digit | security_id | is_valid |
|---|
| str | str | str | bool |
| "US" | "5" | "037833100" | true |
| null | null | null | false |
| null | null | null | false |
| "CA" | "0" | "00206RGB2" | true |
| "XS" | "6" | "155021241" | true |
| null | null | null | false |
"
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)| host | domain | fragment | path | query | check | is_valid | is_special |
|---|
| str | str | str | str | str | str | bool | bool |
| "example.com" | "example.com" | "row=4" | "/data.csv" | null | "ok" | true | true |
| null | null | null | null | null | "relative URL without a base" | false | null |
| null | null | null | null | null | "relative URL without a base" | false | null |
| null | null | null | null | null | "relative URL without a base" | false | null |
| "127.0.0.1" | null | null | "/" | null | "ok" | true | true |
| "test.com" | "test.com" | null | "/" | null | "ok" | true | true |
| null | null | null | "/tmp/foo" | null | "ok" | true | true |
| "example.com" | "example.com" | null | "/products" | "page=2&sort=desc" | "ok" | true | true |
| null | null | null | null | null | null | null | null |
"
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_num | issuer_num | check_digit | country_code | payload | is_private_issue | has_private_issuer | is_private_use | is_cins | is_cins_base | is_cins_extended |
|---|
| str | str | str | str | str | bool | bool | bool | bool | bool | bool |
| "10" | "303075" | "5" | null | "30307510" | false | false | false | false | null | null |
| null | null | null | null | null | null | null | null | null | null | null |
| "10" | "0052B" | "5" | "G" | "G0052B10" | false | false | false | true | true | false |
| null | null | null | null | null | null | null | null | null | null | null |
"
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 |
--------------------------------------------------------------------------------