diff --git a/.benchmarks/Darwin-CPython-3.12-64bit/0001_f2137eaf44442f4bc1c79ab517528d6e70ce22fc_20240920_165136_uncommited-changes.json b/.benchmarks/Darwin-CPython-3.12-64bit/0001_f2137eaf44442f4bc1c79ab517528d6e70ce22fc_20240920_165136_uncommited-changes.json new file mode 100644 index 0000000..118eae6 --- /dev/null +++ b/.benchmarks/Darwin-CPython-3.12-64bit/0001_f2137eaf44442f4bc1c79ab517528d6e70ce22fc_20240920_165136_uncommited-changes.json @@ -0,0 +1,643 @@ +{ + "machine_info": { + "node": "MacBook-Pro-4.local", + "processor": "arm", + "machine": "arm64", + "python_compiler": "Clang 15.0.0 (clang-1500.3.9.4)", + "python_implementation": "CPython", + "python_implementation_version": "3.12.5", + "python_version": "3.12.5", + "python_build": [ + "main", + "Aug 6 2024 19:08:49" + ], + "release": "23.2.0", + "system": "Darwin", + "cpu": { + "python_version": "3.12.5.final.0 (64 bit)", + "cpuinfo_version": [ + 9, + 0, + 0 + ], + "cpuinfo_version_string": "9.0.0", + "arch": "ARM_8", + "bits": 64, + "count": 12, + "arch_string_raw": "arm64", + "brand_raw": "Apple M3 Pro" + } + }, + "commit_info": { + "id": "f2137eaf44442f4bc1c79ab517528d6e70ce22fc", + "time": "2024-09-20T05:50:37-06:00", + "author_time": "2024-09-20T05:50:37-06:00", + "dirty": true, + "project": "polars-finance", + "branch": "feat/pandas-triple-barrier" + }, + "benchmarks": [ + { + "group": "daily_vol", + "name": "test__daily_vol__polars_benchmark[trade_data0]", + "fullname": "tests/labels/test_dynamic_labels.py::test__daily_vol__polars_benchmark[trade_data0]", + "params": { + "trade_data": { + "n_rows": 10000, + "n_companies": 3 + } + }, + "param": "trade_data0", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": false + }, + "stats": { + "min": 0.0008518749382346869, + "max": 0.0015520418528467417, + "mean": 0.0011004127622504837, + "stddev": 9.694317081710826e-05, + "rounds": 362, + "median": 0.0010951249860227108, + "iqr": 0.00013275002129375935, + "q1": 0.001035457942634821, + "q3": 0.0011682079639285803, + "iqr_outliers": 1, + "stddev_outliers": 106, + "outliers": "106;1", + "ld15iqr": 0.0008518749382346869, + "hd15iqr": 0.0015520418528467417, + "ops": 908.7499112195619, + "total": 0.3983494199346751, + "iterations": 1 + } + }, + { + "group": "daily_vol", + "name": "test__daily_vol__polars_benchmark[trade_data1]", + "fullname": "tests/labels/test_dynamic_labels.py::test__daily_vol__polars_benchmark[trade_data1]", + "params": { + "trade_data": { + "n_rows": 100000, + "n_companies": 5 + } + }, + "param": "trade_data1", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": false + }, + "stats": { + "min": 0.004835666157305241, + "max": 0.006815832806751132, + "mean": 0.0054197329263300145, + "stddev": 0.00026706212076531386, + "rounds": 134, + "median": 0.005401999922469258, + "iqr": 0.00025116605684161186, + "q1": 0.0052685418631881475, + "q3": 0.005519707920029759, + "iqr_outliers": 8, + "stddev_outliers": 33, + "outliers": "33;8", + "ld15iqr": 0.004964167019352317, + "hd15iqr": 0.005952165927737951, + "ops": 184.51093690278063, + "total": 0.726244212128222, + "iterations": 1 + } + }, + { + "group": "daily_vol", + "name": "test__daily_vol__polars_benchmark[trade_data2]", + "fullname": "tests/labels/test_dynamic_labels.py::test__daily_vol__polars_benchmark[trade_data2]", + "params": { + "trade_data": { + "n_rows": 1000000, + "n_companies": 10 + } + }, + "param": "trade_data2", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": false + }, + "stats": { + "min": 0.06569054210558534, + "max": 0.07898629107512534, + "mean": 0.07163801177271775, + "stddev": 0.004717184630955575, + "rounds": 7, + "median": 0.07001666608266532, + "iqr": 0.0071938763139769435, + "q1": 0.06812085350975394, + "q3": 0.07531472982373089, + "iqr_outliers": 0, + "stddev_outliers": 2, + "outliers": "2;0", + "ld15iqr": 0.06569054210558534, + "hd15iqr": 0.07898629107512534, + "ops": 13.959069706912704, + "total": 0.5014660824090242, + "iterations": 1 + } + }, + { + "group": "time_bars", + "name": "test__time_bars__polars_benchmark[trade_data0]", + "fullname": "tests/test_bars.py::test__time_bars__polars_benchmark[trade_data0]", + "params": { + "trade_data": { + "n_rows": 1000, + "n_companies": 3 + } + }, + "param": "trade_data0", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": false + }, + "stats": { + "min": 0.0003788750618696213, + "max": 0.0010135411284863949, + "mean": 0.0005729989761879363, + "stddev": 0.00010006917725372432, + "rounds": 849, + "median": 0.0005550829228013754, + "iqr": 0.00014642783207818866, + "q1": 0.0004942601080983877, + "q3": 0.0006406879401765764, + "iqr_outliers": 5, + "stddev_outliers": 263, + "outliers": "263;5", + "ld15iqr": 0.0003788750618696213, + "hd15iqr": 0.0008626659400761127, + "ops": 1745.2038163363366, + "total": 0.4864761307835579, + "iterations": 1 + } + }, + { + "group": "time_bars", + "name": "test__time_bars__polars_benchmark[trade_data1]", + "fullname": "tests/test_bars.py::test__time_bars__polars_benchmark[trade_data1]", + "params": { + "trade_data": { + "n_rows": 10000, + "n_companies": 3 + } + }, + "param": "trade_data1", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": false + }, + "stats": { + "min": 0.0006168750114738941, + "max": 0.0010418749880045652, + "mean": 0.0007620256526985419, + "stddev": 5.687672825014427e-05, + "rounds": 1276, + "median": 0.0007594794733449817, + "iqr": 7.489509880542755e-05, + "q1": 0.000722396420314908, + "q3": 0.0007972915191203356, + "iqr_outliers": 17, + "stddev_outliers": 384, + "outliers": "384;17", + "ld15iqr": 0.0006168750114738941, + "hd15iqr": 0.000910458154976368, + "ops": 1312.29177975666, + "total": 0.9723447328433394, + "iterations": 1 + } + }, + { + "group": "time_bars", + "name": "test__time_bars__polars_benchmark[trade_data2]", + "fullname": "tests/test_bars.py::test__time_bars__polars_benchmark[trade_data2]", + "params": { + "trade_data": { + "n_rows": 1000000, + "n_companies": 20 + } + }, + "param": "trade_data2", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": false + }, + "stats": { + "min": 0.019815375097095966, + "max": 0.02876037498936057, + "mean": 0.021518070207859733, + "stddev": 0.0014444191549200683, + "rounds": 38, + "median": 0.021403937600553036, + "iqr": 0.001104332972317934, + "q1": 0.020702874986454844, + "q3": 0.02180720795877278, + "iqr_outliers": 2, + "stddev_outliers": 4, + "outliers": "4;2", + "ld15iqr": 0.019815375097095966, + "hd15iqr": 0.023794875014573336, + "ops": 46.47256888467341, + "total": 0.8176866678986698, + "iterations": 1 + } + }, + { + "group": "tick_bars", + "name": "test__tick_bars__polars_benchmark[trade_data0]", + "fullname": "tests/test_bars.py::test__tick_bars__polars_benchmark[trade_data0]", + "params": { + "trade_data": { + "n_rows": 1000, + "n_companies": 3 + } + }, + "param": "trade_data0", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": false + }, + "stats": { + "min": 0.0007745828479528427, + "max": 0.001545500010251999, + "mean": 0.0010984447373344113, + "stddev": 0.000113852042941398, + "rounds": 712, + "median": 0.0010957710910588503, + "iqr": 0.00014785502571612597, + "q1": 0.0010244580917060375, + "q3": 0.0011723131174221635, + "iqr_outliers": 5, + "stddev_outliers": 219, + "outliers": "219;5", + "ld15iqr": 0.0008159170392900705, + "hd15iqr": 0.0014616248663514853, + "ops": 910.378070021705, + "total": 0.7820926529821008, + "iterations": 1 + } + }, + { + "group": "tick_bars", + "name": "test__tick_bars__polars_benchmark[trade_data1]", + "fullname": "tests/test_bars.py::test__tick_bars__polars_benchmark[trade_data1]", + "params": { + "trade_data": { + "n_rows": 10000, + "n_companies": 3 + } + }, + "param": "trade_data1", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": false + }, + "stats": { + "min": 0.0013206249568611383, + "max": 0.002115708077326417, + "mean": 0.0017051144155799155, + "stddev": 0.00012526637504000065, + "rounds": 527, + "median": 0.001703500049188733, + "iqr": 0.00015246961265802383, + "q1": 0.0016227704472839832, + "q3": 0.001775240059942007, + "iqr_outliers": 13, + "stddev_outliers": 159, + "outliers": "159;13", + "ld15iqr": 0.001407291041687131, + "hd15iqr": 0.002016040962189436, + "ops": 586.4709082644736, + "total": 0.8985952970106155, + "iterations": 1 + } + }, + { + "group": "tick_bars", + "name": "test__tick_bars__polars_benchmark[trade_data2]", + "fullname": "tests/test_bars.py::test__tick_bars__polars_benchmark[trade_data2]", + "params": { + "trade_data": { + "n_rows": 1000000, + "n_companies": 10 + } + }, + "param": "trade_data2", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": false + }, + "stats": { + "min": 0.033509374829009175, + "max": 0.03557691699825227, + "mean": 0.034498987133325686, + "stddev": 0.0005490550532409403, + "rounds": 29, + "median": 0.034530041040852666, + "iqr": 0.0006634583696722984, + "q1": 0.03415980190038681, + "q3": 0.03482326027005911, + "iqr_outliers": 0, + "stddev_outliers": 10, + "outliers": "10;0", + "ld15iqr": 0.033509374829009175, + "hd15iqr": 0.03557691699825227, + "ops": 28.986358241051363, + "total": 1.000470626866445, + "iterations": 1 + } + }, + { + "group": "volume_bars", + "name": "test__volume_bars__polars_benchmark[trade_data0]", + "fullname": "tests/test_bars.py::test__volume_bars__polars_benchmark[trade_data0]", + "params": { + "trade_data": { + "n_rows": 1000, + "n_companies": 3 + } + }, + "param": "trade_data0", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": false + }, + "stats": { + "min": 0.001798124983906746, + "max": 0.0026017078198492527, + "mean": 0.002103642488957053, + "stddev": 0.00013445729744066096, + "rounds": 322, + "median": 0.002093917108140886, + "iqr": 0.00017579179257154465, + "q1": 0.002007625065743923, + "q3": 0.002183416858315468, + "iqr_outliers": 6, + "stddev_outliers": 96, + "outliers": "96;6", + "ld15iqr": 0.001798124983906746, + "hd15iqr": 0.0024874170776456594, + "ops": 475.3659451401276, + "total": 0.6773728814441711, + "iterations": 1 + } + }, + { + "group": "volume_bars", + "name": "test__volume_bars__polars_benchmark[trade_data1]", + "fullname": "tests/test_bars.py::test__volume_bars__polars_benchmark[trade_data1]", + "params": { + "trade_data": { + "n_rows": 10000, + "n_companies": 3 + } + }, + "param": "trade_data1", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": false + }, + "stats": { + "min": 0.003117708023637533, + "max": 0.0040478750597685575, + "mean": 0.003661660312855538, + "stddev": 0.00016513581523498156, + "rounds": 263, + "median": 0.003661041846498847, + "iqr": 0.00023841665824875236, + "q1": 0.003544145729392767, + "q3": 0.0037825623876415193, + "iqr_outliers": 1, + "stddev_outliers": 92, + "outliers": "92;1", + "ld15iqr": 0.0032709159422665834, + "hd15iqr": 0.0040478750597685575, + "ops": 273.1001552735928, + "total": 0.9630166622810066, + "iterations": 1 + } + }, + { + "group": "volume_bars", + "name": "test__volume_bars__polars_benchmark[trade_data2]", + "fullname": "tests/test_bars.py::test__volume_bars__polars_benchmark[trade_data2]", + "params": { + "trade_data": { + "n_rows": 1000000, + "n_companies": 10 + } + }, + "param": "trade_data2", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": false + }, + "stats": { + "min": 0.1190591671038419, + "max": 0.1266824589110911, + "mean": 0.12282050534849986, + "stddev": 0.0021960235564076037, + "rounds": 8, + "median": 0.12317345850169659, + "iqr": 0.0018020010320469737, + "q1": 0.1217178744263947, + "q3": 0.12351987545844167, + "iqr_outliers": 1, + "stddev_outliers": 2, + "outliers": "2;1", + "ld15iqr": 0.1190591671038419, + "hd15iqr": 0.1266824589110911, + "ops": 8.141962917043266, + "total": 0.9825640427879989, + "iterations": 1 + } + }, + { + "group": "dollar_bars", + "name": "test__dollar_bars__polars_benchmark[trade_data0]", + "fullname": "tests/test_bars.py::test__dollar_bars__polars_benchmark[trade_data0]", + "params": { + "trade_data": { + "n_rows": 1000, + "n_companies": 3 + } + }, + "param": "trade_data0", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": false + }, + "stats": { + "min": 0.001833832822740078, + "max": 0.002633583964779973, + "mean": 0.0021860578263961997, + "stddev": 0.00013788928468163358, + "rounds": 397, + "median": 0.0021704998798668385, + "iqr": 0.0001777080469764769, + "q1": 0.0020923858392052352, + "q3": 0.002270093886181712, + "iqr_outliers": 3, + "stddev_outliers": 130, + "outliers": "130;3", + "ld15iqr": 0.001833832822740078, + "hd15iqr": 0.002547207986935973, + "ops": 457.4444408218324, + "total": 0.8678649570792913, + "iterations": 1 + } + }, + { + "group": "dollar_bars", + "name": "test__dollar_bars__polars_benchmark[trade_data1]", + "fullname": "tests/test_bars.py::test__dollar_bars__polars_benchmark[trade_data1]", + "params": { + "trade_data": { + "n_rows": 10000, + "n_companies": 3 + } + }, + "param": "trade_data1", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": false + }, + "stats": { + "min": 0.003399582812562585, + "max": 0.004201542120426893, + "mean": 0.0037548097376914127, + "stddev": 0.00016368041006722573, + "rounds": 230, + "median": 0.0037463546032086015, + "iqr": 0.00020579202100634575, + "q1": 0.003648167010396719, + "q3": 0.0038539590314030647, + "iqr_outliers": 4, + "stddev_outliers": 73, + "outliers": "73;4", + "ld15iqr": 0.003399582812562585, + "hd15iqr": 0.004166333936154842, + "ops": 266.32507899450445, + "total": 0.8636062396690249, + "iterations": 1 + } + }, + { + "group": "dollar_bars", + "name": "test__dollar_bars__polars_benchmark[trade_data2]", + "fullname": "tests/test_bars.py::test__dollar_bars__polars_benchmark[trade_data2]", + "params": { + "trade_data": { + "n_rows": 1000000, + "n_companies": 10 + } + }, + "param": "trade_data2", + "extra_info": {}, + "options": { + "disable_gc": false, + "timer": "perf_counter", + "min_rounds": 5, + "max_time": 1.0, + "min_time": 5e-06, + "warmup": false + }, + "stats": { + "min": 0.1228118329308927, + "max": 0.1324748748447746, + "mean": 0.12721897393930703, + "stddev": 0.002710620732647333, + "rounds": 8, + "median": 0.12719714548438787, + "iqr": 0.0018838954856619239, + "q1": 0.12607575044967234, + "q3": 0.12795964593533427, + "iqr_outliers": 2, + "stddev_outliers": 2, + "outliers": "2;2", + "ld15iqr": 0.1255003339610994, + "hd15iqr": 0.1324748748447746, + "ops": 7.860462704856233, + "total": 1.0177517915144563, + "iterations": 1 + } + } + ], + "datetime": "2024-09-20T16:52:06.642417", + "version": "4.0.0" +} \ No newline at end of file diff --git a/.github/workflows/codspeed.yml b/.github/workflows/codspeed.yml new file mode 100644 index 0000000..41c32b6 --- /dev/null +++ b/.github/workflows/codspeed.yml @@ -0,0 +1,36 @@ +name: codspeed-benchmarks + +on: + push: + branches: + - "main" # or "master" + pull_request: + # `workflow_dispatch` allows CodSpeed to trigger backtest + # performance analysis in order to generate initial data. + workflow_dispatch: + +env: + UV_SYSTEM_PYTHON: 1 + +jobs: + benchmarks: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install uv + uses: astral-sh/setup-uv@v2 + + - name: "Set up Python" + uses: actions/setup-python@v5 + with: + python-version-file: "pyproject.toml" + + - name: Install the project + run: uv sync --all-extras --dev + + - name: Run benchmarks + uses: CodSpeedHQ/action@v3 + with: + token: ${{ secrets.CODSPEED_TOKEN }} + run: uv run pytest --codspeed diff --git a/.gitignore b/.gitignore index 59f4924..59d3c8f 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ venv __pycache__/ data/ .DS_Store +scratchpad.py diff --git a/README.md b/README.md index c02a842..bdd838b 100644 --- a/README.md +++ b/README.md @@ -1 +1,2 @@ # Polars Trading +[![CodSpeed Badge](https://img.shields.io/endpoint?url=https://codspeed.io/badge.json)](https://codspeed.io/ngriffiths13/polars-trading) diff --git a/polars_trading/_testing/labels.py b/polars_trading/_testing/labels.py index 1ff20f3..d054ed8 100644 --- a/polars_trading/_testing/labels.py +++ b/polars_trading/_testing/labels.py @@ -12,3 +12,12 @@ def get_daily_vol(close: pd.Series, span0: int = 100) -> pd.Series: ) df0 = close.loc[df0.index] / close.loc[df0.values].values - 1 return df0.ewm(span=span0).std().fillna(0.0) + + +def apply_pt_sl_on_t1( + close: pd.Series, events: pd.DataFrame, pt_sl: tuple[float, float] +) -> None: + """Apply stop loss and profit taking. + + AFML pg. 45 + """ diff --git a/polars_trading/labels/dynamic_labels.py b/polars_trading/labels/dynamic_labels.py index 7ba5e84..e1523e7 100644 --- a/polars_trading/labels/dynamic_labels.py +++ b/polars_trading/labels/dynamic_labels.py @@ -22,6 +22,10 @@ def daily_vol( in the last 24 hour period to the current price. It then calculates the exponential weighted standard deviation of the returns. + This currently fails to account for weekend returns when there is no trading. + + Marco Lopez de Prado, Advances in Financial Machine Learning, pg. 44 + Args: ---- df (DataFrame): The DataFrame containing the price series. diff --git a/pyproject.toml b/pyproject.toml index ab2c314..fefe2ca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,6 +12,7 @@ classifiers = [ ] dependencies = ["polars[plot]>=1.3"] + [tool.ruff.format] docstring-code-format = true @@ -83,21 +84,21 @@ ignore_missing_imports = true dev-dependencies = [ "build>=1.2.1", "commitizen>=3.29.0", - "hypothesis>=6.111.2", "marimo>=0.8.8", "maturin>=1.7.1", - "mimesis>=12.1.0", "mkdocs-gen-files>=0.5.0", "mkdocstrings[python]>=0.26.1", - "pandas>=2.2.2", "pip>=24.2", "pre-commit>=3.8.0", - "pyarrow>=17.0.0", - "pytest-benchmark>=4.0.0", - "pytest>=8.3.2", "ruff>=0.6.3", "setuptools>=74.1.0", "wheel>=0.44.0", + "pandas>=2.2.2", + "pyarrow>=17.0.0", + "pytest>=8.3.2", + "pytest-benchmark[histogram]>=4.0.0", + "pytest-codspeed>=2.2.1", + "mimesis>=12.1.0", ] [tool.commitizen] @@ -109,7 +110,9 @@ update_changelog_on_bump = true major_version_zero = true [tool.pytest.ini_options] +markers = ["pandas"] addopts = [ "--benchmark-disable", "--benchmark-columns=min,mean,median,max,stddev", + "-m not pandas", ] diff --git a/tests/labels/test_dynamic_labels.py b/tests/labels/test_dynamic_labels.py index e7ca8b1..d580a2b 100644 --- a/tests/labels/test_dynamic_labels.py +++ b/tests/labels/test_dynamic_labels.py @@ -64,6 +64,7 @@ def test__daily_vol__polars_benchmark(benchmark, trade_data): benchmark(daily_vol(trade_data.lazy(), "ts_event", "price", "symbol", 100).collect) +@pytest.mark.pandas @pytest.mark.benchmark(group="daily_vol") @pytest.mark.parametrize( "trade_data", diff --git a/tests/test_bars.py b/tests/test_bars.py index 12e6e6b..059e7c8 100644 --- a/tests/test_bars.py +++ b/tests/test_bars.py @@ -91,6 +91,7 @@ def test__time_bars__polars_benchmark(benchmark, trade_data): benchmark(time_bars, trade_data, timestamp_col="ts_event", bar_size="1d") +@pytest.mark.pandas @pytest.mark.benchmark(group="time_bars") @pytest.mark.parametrize( "trade_data", @@ -135,6 +136,7 @@ def test__tick_bars__polars_benchmark(benchmark, trade_data): benchmark(tick_bars, trade_data, timestamp_col="ts_event", bar_size=100) +@pytest.mark.pandas @pytest.mark.benchmark(group="tick_bars") @pytest.mark.parametrize( "trade_data", diff --git a/uv.lock b/uv.lock index f82429a..aef8119 100644 --- a/uv.lock +++ b/uv.lock @@ -71,6 +71,75 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e2/03/f3c8ba0a6b6e30d7d18c40faab90807c9bb5e9a1e3b2fe2008af624a9c97/build-1.2.1-py3-none-any.whl", hash = "sha256:75e10f767a433d9a86e50d83f418e83efc18ede923ee5ff7df93b6cb0306c5d4", size = 21911 }, ] +[[package]] +name = "cffi" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/07/f44ca684db4e4f08a3fdc6eeb9a0d15dc6883efc7b8c90357fdbf74e186c/cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", size = 182191 }, + { url = "https://files.pythonhosted.org/packages/08/fd/cc2fedbd887223f9f5d170c96e57cbf655df9831a6546c1727ae13fa977a/cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", size = 178592 }, + { url = "https://files.pythonhosted.org/packages/de/cc/4635c320081c78d6ffc2cab0a76025b691a91204f4aa317d568ff9280a2d/cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", size = 426024 }, + { url = "https://files.pythonhosted.org/packages/b6/7b/3b2b250f3aab91abe5f8a51ada1b717935fdaec53f790ad4100fe2ec64d1/cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", size = 448188 }, + { url = "https://files.pythonhosted.org/packages/d3/48/1b9283ebbf0ec065148d8de05d647a986c5f22586b18120020452fff8f5d/cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", size = 455571 }, + { url = "https://files.pythonhosted.org/packages/40/87/3b8452525437b40f39ca7ff70276679772ee7e8b394934ff60e63b7b090c/cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", size = 436687 }, + { url = "https://files.pythonhosted.org/packages/8d/fb/4da72871d177d63649ac449aec2e8a29efe0274035880c7af59101ca2232/cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", size = 446211 }, + { url = "https://files.pythonhosted.org/packages/ab/a0/62f00bcb411332106c02b663b26f3545a9ef136f80d5df746c05878f8c4b/cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", size = 461325 }, + { url = "https://files.pythonhosted.org/packages/36/83/76127035ed2e7e27b0787604d99da630ac3123bfb02d8e80c633f218a11d/cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", size = 438784 }, + { url = "https://files.pythonhosted.org/packages/21/81/a6cd025db2f08ac88b901b745c163d884641909641f9b826e8cb87645942/cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", size = 461564 }, + { url = "https://files.pythonhosted.org/packages/f8/fe/4d41c2f200c4a457933dbd98d3cf4e911870877bd94d9656cc0fcb390681/cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", size = 171804 }, + { url = "https://files.pythonhosted.org/packages/d1/b6/0b0f5ab93b0df4acc49cae758c81fe4e5ef26c3ae2e10cc69249dfd8b3ab/cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", size = 181299 }, + { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264 }, + { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651 }, + { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259 }, + { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200 }, + { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235 }, + { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721 }, + { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242 }, + { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999 }, + { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242 }, + { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604 }, + { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727 }, + { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400 }, + { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, + { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, + { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, + { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, + { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, + { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 }, + { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, + { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, + { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, + { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, + { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, + { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 }, + { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 }, + { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 }, + { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 }, + { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 }, + { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 }, + { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 }, + { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 }, + { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 }, + { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, + { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, + { url = "https://files.pythonhosted.org/packages/b9/ea/8bb50596b8ffbc49ddd7a1ad305035daa770202a6b782fc164647c2673ad/cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16", size = 182220 }, + { url = "https://files.pythonhosted.org/packages/ae/11/e77c8cd24f58285a82c23af484cf5b124a376b32644e445960d1a4654c3a/cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36", size = 178605 }, + { url = "https://files.pythonhosted.org/packages/ed/65/25a8dc32c53bf5b7b6c2686b42ae2ad58743f7ff644844af7cdb29b49361/cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8", size = 424910 }, + { url = "https://files.pythonhosted.org/packages/42/7a/9d086fab7c66bd7c4d0f27c57a1b6b068ced810afc498cc8c49e0088661c/cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576", size = 447200 }, + { url = "https://files.pythonhosted.org/packages/da/63/1785ced118ce92a993b0ec9e0d0ac8dc3e5dbfbcaa81135be56c69cabbb6/cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87", size = 454565 }, + { url = "https://files.pythonhosted.org/packages/74/06/90b8a44abf3556599cdec107f7290277ae8901a58f75e6fe8f970cd72418/cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0", size = 435635 }, + { url = "https://files.pythonhosted.org/packages/bd/62/a1f468e5708a70b1d86ead5bab5520861d9c7eacce4a885ded9faa7729c3/cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3", size = 445218 }, + { url = "https://files.pythonhosted.org/packages/5b/95/b34462f3ccb09c2594aa782d90a90b045de4ff1f70148ee79c69d37a0a5a/cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595", size = 460486 }, + { url = "https://files.pythonhosted.org/packages/fc/fc/a1e4bebd8d680febd29cf6c8a40067182b64f00c7d105f8f26b5bc54317b/cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a", size = 437911 }, + { url = "https://files.pythonhosted.org/packages/e6/c3/21cab7a6154b6a5ea330ae80de386e7665254835b9e98ecc1340b3a7de9a/cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e", size = 460632 }, + { url = "https://files.pythonhosted.org/packages/cb/b5/fd9f8b5a84010ca169ee49f4e4ad6f8c05f4e3545b72ee041dbbcb159882/cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7", size = 171820 }, + { url = "https://files.pythonhosted.org/packages/8c/52/b08750ce0bce45c143e1b5d7357ee8c55341b52bdef4b0f081af1eb248c2/cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662", size = 181290 }, +] + [[package]] name = "cfgv" version = "3.4.0" @@ -270,20 +339,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, ] -[[package]] -name = "hypothesis" -version = "6.112.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "attrs" }, - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, - { name = "sortedcontainers" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/63/d6/8cc282c41704c3e21058e8eb8cc5512ec23c66d02c8a7490aedea715d8d2/hypothesis-6.112.0.tar.gz", hash = "sha256:06ea8857e1e711a1a6f24154a3c8c4eab04b041993206aaa267f98b859fd6ef5", size = 406683 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/e0/0c92216c73dc12c31a8f9ceae3353bf08cdd8f7c679f8a6413849aed1f02/hypothesis-6.112.0-py3-none-any.whl", hash = "sha256:1e6adbd9534c0d691690b5006904327ea37c851d4e15262a22094aa77879e84d", size = 467482 }, -] - [[package]] name = "identify" version = "2.6.0" @@ -307,7 +362,7 @@ name = "importlib-metadata" version = "8.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "zipp", marker = "python_full_version < '3.11'" }, + { name = "zipp" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c0/bd/fa8ce65b0a7d4b6d143ec23b0f5fd3f7ab80121078c465bc02baeaab22dc/importlib_metadata-8.4.0.tar.gz", hash = "sha256:9a547d3bc3608b025f93d403fdd1aae741c24fbb8314df4b155675742ce303c5", size = 54320 } wheels = [ @@ -813,7 +868,6 @@ dependencies = [ dev = [ { name = "build" }, { name = "commitizen" }, - { name = "hypothesis" }, { name = "marimo" }, { name = "maturin" }, { name = "mimesis" }, @@ -824,7 +878,8 @@ dev = [ { name = "pre-commit" }, { name = "pyarrow" }, { name = "pytest" }, - { name = "pytest-benchmark" }, + { name = "pytest-benchmark", extra = ["histogram"] }, + { name = "pytest-codspeed" }, { name = "ruff" }, { name = "setuptools" }, { name = "wheel" }, @@ -837,7 +892,6 @@ requires-dist = [{ name = "polars", extras = ["plot"], specifier = ">=1.3" }] dev = [ { name = "build", specifier = ">=1.2.1" }, { name = "commitizen", specifier = ">=3.29.0" }, - { name = "hypothesis", specifier = ">=6.111.2" }, { name = "marimo", specifier = ">=0.8.8" }, { name = "maturin", specifier = ">=1.7.1" }, { name = "mimesis", specifier = ">=12.1.0" }, @@ -848,7 +902,8 @@ dev = [ { name = "pre-commit", specifier = ">=3.8.0" }, { name = "pyarrow", specifier = ">=17.0.0" }, { name = "pytest", specifier = ">=8.3.2" }, - { name = "pytest-benchmark", specifier = ">=4.0.0" }, + { name = "pytest-benchmark", extras = ["histogram"], specifier = ">=4.0.0" }, + { name = "pytest-codspeed", specifier = ">=2.2.1" }, { name = "ruff", specifier = ">=0.6.3" }, { name = "setuptools", specifier = ">=74.1.0" }, { name = "wheel", specifier = ">=0.44.0" }, @@ -947,6 +1002,36 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e7/f6/b75d4816c32f1618ed31a005ee635dd1d91d8164495d94f2ea092f594661/pyarrow-17.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:42bf93249a083aca230ba7e2786c5f673507fa97bbd9725a1e2754715151a204", size = 25148611 }, ] +[[package]] +name = "pycparser" +version = "2.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, +] + +[[package]] +name = "pygal" +version = "3.0.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "importlib-metadata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/49/7b/8f50821a0f1585881ef40ae13ecb7603b0d81ef99fedf992ec35e6b6f7d5/pygal-3.0.5.tar.gz", hash = "sha256:c0a0f34e5bc1c01975c2bfb8342ad521e293ad42e525699dd00c4d7a52c14b71", size = 80489 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/7d/b5d656dbeb73f488ce7409a75108a775f6cf8e20624ed8025a9476cbc1bb/pygal-3.0.5-py3-none-any.whl", hash = "sha256:a3268a5667b470c8fbbb0eca7e987561a7321caeba589d40e4c1bc16dbe71393", size = 129548 }, +] + +[[package]] +name = "pygaljs" +version = "1.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/75/19/3a53f34232a9e6ddad665e71c83693c5db9a31f71785105905c5bc9fbbba/pygaljs-1.0.2.tar.gz", hash = "sha256:0b71ee32495dcba5fbb4a0476ddbba07658ad65f5675e4ad409baf154dec5111", size = 89711 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/6f/07dab31ca496feda35cf3455b9e9380c43b5c685bb54ad890831c790da38/pygaljs-1.0.2-py2.py3-none-any.whl", hash = "sha256:d75e18cb21cc2cda40c45c3ee690771e5e3d4652bf57206f20137cf475c0dbe8", size = 91111 }, +] + [[package]] name = "pygments" version = "2.18.0" @@ -1008,6 +1093,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4d/a1/3b70862b5b3f830f0422844f25a823d0470739d994466be9dbbbb414d85a/pytest_benchmark-4.0.0-py3-none-any.whl", hash = "sha256:fdb7db64e31c8b277dff9850d2a2556d8b60bcb0ea6524e36e28ffd7c87f71d6", size = 43951 }, ] +[package.optional-dependencies] +histogram = [ + { name = "pygal" }, + { name = "pygaljs" }, +] + +[[package]] +name = "pytest-codspeed" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, + { name = "filelock" }, + { name = "pytest" }, + { name = "setuptools", marker = "python_full_version >= '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/40/6a/ba0b067dba286443a04c9d32ff75ef3bc169617ee347d1a97972ada62665/pytest_codspeed-2.2.1.tar.gz", hash = "sha256:0adc24baf01c64a6ca0a0b83b3cd704351708997e09ec086b7776c32227d4e0a", size = 9163 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/03/0b/e3541064afcf24ed54bcabfa6eb5f8083eb335d5c58c7b5b95bc31127f86/pytest_codspeed-2.2.1-py3-none-any.whl", hash = "sha256:aad08033015f3e6c8c14c8bf0eca475921a9b088e92c98b626bf8af8f516471e", size = 10126 }, +] + [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -1268,15 +1374,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, ] -[[package]] -name = "sortedcontainers" -version = "2.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575 }, -] - [[package]] name = "starlette" version = "0.38.4"