diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 3106b9c..be3adde 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -25,8 +25,5 @@ jobs: - name: 🔨 Install dependencies run: uv sync --no-default-groups - - name: 🤡 Create mock database - run: uv run python -m testing.setup - - name: ✅ Run unit tests run: uv run sqlmesh -p billiam_database test diff --git a/.gitignore b/.gitignore index a471e12..de39f4b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,8 @@ ### SQLMesh artifacts logs/ -### Raw data and sensitive seeds +### Raw data billiam_database/models/raw/data/ -billiam_database/models/seeds/data/counterparty_exclusions.csv ### Data objects *.db @@ -143,6 +142,7 @@ celerybeat.pid ### Environments .env +.envrc .venv env/ venv/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 85ee231..d1b1aff 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -2,7 +2,8 @@ --- ci: autoupdate_schedule: quarterly - skip: ["identity", "uv-lock", "sqlmesh-test"] + skip: ["identity", "uv-lock"] +# skip: ["identity", "uv-lock", "sqlmesh-test"] default_install_hook_types: ["pre-commit", "pre-push"] default_stages: ["pre-commit"] @@ -55,12 +56,13 @@ repos: - id: tidy-gitkeep name: Remove redundant .gitkeep files - - repo: local - hooks: - - id: sqlmesh-test - name: Run unit tests - entry: sqlmesh -p billiam_database test - stages: ["pre-push"] - language: system - pass_filenames: false - always_run: true + # This is trying to talk with MotherDuck and is generating a browser popup +# - repo: local +# hooks: +# - id: sqlmesh-test +# name: Run unit tests +# entry: sqlmesh -p billiam_database test +# stages: ["pre-push"] +# language: system +# pass_filenames: false +# always_run: true diff --git a/README.md b/README.md index 86de72a..4bac7b0 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -
+ [![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv) [![Docker](https://img.shields.io/badge/Docker-28.4-blue.svg)](https://www.docker.com/) @@ -7,10 +7,10 @@ [![GitHub last commit](https://img.shields.io/github/last-commit/billwallis/billiam-database)](https://shields.io/badges/git-hub-last-commit) [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/billwallis/billiam-database/main.svg)](https://results.pre-commit.ci/latest/github/billwallis/billiam-database/main) -[![DuckDB](https://img.shields.io/badge/DuckDB-1.4-teal.svg)](https://duckdb.org/) +[![DuckDB](https://img.shields.io/badge/DuckDB-1.3-teal.svg)](https://duckdb.org/) [![Metabase](https://img.shields.io/badge/Metabase-0.47-teal.svg)](https://www.metabase.com/) -
+ --- diff --git a/billiam_database/config.yaml b/billiam_database/config.yaml index 596bd0e..455264b 100644 --- a/billiam_database/config.yaml +++ b/billiam_database/config.yaml @@ -1,24 +1,29 @@ --- project: billiam_database -default_gateway: local -gateways: - local: - connection: - type: duckdb - database: billiam_database/billiam.duckdb - # catalogs: - # dev: billiam_database/billiam-dev.duckdb - # prod: billiam_database/billiam.duckdb - +ignore_patterns: ["__*.sql"] +default_target_environment: dev model_defaults: dialect: duckdb start: 2018-01-01 -ignore_patterns: ["__*.sql"] - plan: enable_preview: true -#environment_catalog_mapping: -# '^prod$': prod -# '^dev$': dev + +default_gateway: local +gateways: + local: + connection: + type: duckdb + catalogs: + billiam: "billiam_database/billiam.duckdb" + ods: + type: motherduck + path: "md:ods?motherduck_token={{ env_var('MOTHERDUCK_TOKEN') }}" + motherduck: + connection: + type: motherduck + token: "{{ env_var('MOTHERDUCK_TOKEN') }}" + catalogs: + warehouse: warehouse + ods: ods diff --git a/billiam_database/models/domain/career/working_hours.sql b/billiam_database/models/domain/career/working_hours.sql index 3d41838..c014ba4 100644 --- a/billiam_database/models/domain/career/working_hours.sql +++ b/billiam_database/models/domain/career/working_hours.sql @@ -23,7 +23,7 @@ model ( with recursive weeks(week_starting) as ( - select date_trunc('week', (select min(from_date) from seeds.work_hours)) + select date_trunc('week', (select min(from_date) from raw.work_hours)) union all select week_starting + interval '1 week' from weeks @@ -43,14 +43,14 @@ weekly_quota as ( + friday + saturday ) as weekly_quota - from seeds.work_hours + from raw.work_hours ), absence_hours as ( select date_trunc('week', absence_date) as week_starting, sum(hours) as absence_hours - from seeds.work_absences + from raw.work_absences group by all ), diff --git a/billiam_database/models/raw/counterparty_exclusions.sql b/billiam_database/models/raw/counterparty_exclusions.sql new file mode 100644 index 0000000..0a0f2d4 --- /dev/null +++ b/billiam_database/models/raw/counterparty_exclusions.sql @@ -0,0 +1,13 @@ +model ( + name raw.counterparty_exclusions, + kind full, + grain (counterparty), + tags (finances), + columns ( + counterparty varchar, + ), +); + +select * +from ods.finances.counterparty_exclusions +; diff --git a/billiam_database/models/raw/finances.sql b/billiam_database/models/raw/finances.sql index d584990..ffb66eb 100644 --- a/billiam_database/models/raw/finances.sql +++ b/billiam_database/models/raw/finances.sql @@ -4,8 +4,9 @@ model ( grain (row_id), tags (finances), depends_on ( + raw.amex_transactions, raw.monzo_transactions, - seeds.counterparty_exclusions, + raw.counterparty_exclusions, ), columns ( row_id int, @@ -115,7 +116,7 @@ monzo_txns as ( and cost != 0 and category not in ('Savings') and counterparty not in ('Transport for London') - and counterparty not in (from seeds.counterparty_exclusions) + and counterparty not in (from raw.counterparty_exclusions) ), joined as ( diff --git a/billiam_database/models/seeds/work_absences.sql b/billiam_database/models/raw/work_absences.sql similarity index 64% rename from billiam_database/models/seeds/work_absences.sql rename to billiam_database/models/raw/work_absences.sql index e924d78..007c732 100644 --- a/billiam_database/models/seeds/work_absences.sql +++ b/billiam_database/models/raw/work_absences.sql @@ -1,8 +1,6 @@ model ( - name seeds.work_absences, - kind seed ( - path 'data/work_absences.csv', - ), + name raw.work_absences, + kind full, grain (absence_date), tags (daily-tracker), columns ( @@ -11,3 +9,7 @@ model ( hours decimal(4, 2), ), ); + +select * +from ods.daily_tracker.work_absences +; diff --git a/billiam_database/models/seeds/work_hours.sql b/billiam_database/models/raw/work_hours.sql similarity index 80% rename from billiam_database/models/seeds/work_hours.sql rename to billiam_database/models/raw/work_hours.sql index 30f2ed1..f180fd4 100644 --- a/billiam_database/models/seeds/work_hours.sql +++ b/billiam_database/models/raw/work_hours.sql @@ -1,8 +1,6 @@ model ( - name seeds.work_hours, - kind seed ( - path 'data/work_hours.csv', - ), + name raw.work_hours, + kind full, grain (company, from_date), tags (daily-tracker), columns ( @@ -18,3 +16,7 @@ model ( saturday decimal(4, 2), ), ); + +select * +from ods.daily_tracker.work_hours +; diff --git a/billiam_database/models/seeds/counterparty_exclusions.sql b/billiam_database/models/seeds/counterparty_exclusions.sql deleted file mode 100644 index 99af9ec..0000000 --- a/billiam_database/models/seeds/counterparty_exclusions.sql +++ /dev/null @@ -1,11 +0,0 @@ -model ( - name seeds.counterparty_exclusions, - kind seed ( - path 'data/counterparty_exclusions.csv', - ), - grain (counterparty), - tags (finances), - columns ( - counterparty varchar, - ), -); diff --git a/billiam_database/models/seeds/data/work_absences.csv b/billiam_database/models/seeds/data/work_absences.csv deleted file mode 100644 index 6ca59a1..0000000 --- a/billiam_database/models/seeds/data/work_absences.csv +++ /dev/null @@ -1,96 +0,0 @@ -absence_date,absence_reason,hours -2023-04-10,Annual leave,7.4000 -2023-07-07,Annual leave,7.4000 -2023-07-10,Annual leave,7.4000 -2023-07-11,Annual leave,7.4000 -2023-07-12,Annual leave,7.4000 -2023-07-13,Annual leave,7.4000 -2023-07-14,Annual leave,7.4000 -2023-07-17,Annual leave,7.4000 -2023-07-18,Annual leave,7.4000 -2023-07-19,Annual leave,7.4000 -2023-07-20,Annual leave,7.4000 -2023-07-21,Annual leave,7.4000 -2023-08-09,Non-working day,0.0000 -2023-08-23,Non-working day,0.0000 -2023-09-06,Non-working day,0.0000 -2023-09-20,Non-working day,0.0000 -2023-10-25,Non-working day,0.0000 -2023-11-01,Non-working day,0.0000 -2023-11-22,Non-working day,0.0000 -2023-11-29,Non-working day,0.0000 -2023-12-06,Non-working day,0.0000 -2023-12-13,Non-working day,0.0000 -2023-12-20,Non-working day,0.0000 -2023-12-21,Store working,0.0000 -2023-12-22,Store working,0.0000 -2023-12-25,Annual leave,7.4000 -2023-12-26,Annual leave,7.4000 -2024-01-10,Non-working day,0.0000 -2024-01-11,Sick day,0.0000 -2024-01-17,Non-working day,0.0000 -2024-01-22,Non-working day,0.0000 -2024-01-31,Non-working day,0.0000 -2024-02-05,Annual leave,7.4000 -2024-02-06,Annual leave,7.4000 -2024-02-07,Annual leave,7.4000 -2024-02-08,Annual leave,7.4000 -2024-02-09,Annual leave,7.4000 -2024-02-12,Annual leave,7.4000 -2024-02-13,Annual leave,7.4000 -2024-02-14,Annual leave,7.4000 -2024-02-15,Annual leave,7.4000 -2024-02-16,Annual leave,7.4000 -2024-02-19,Annual leave,7.4000 -2024-02-20,Annual leave,7.4000 -2024-02-21,Annual leave,7.4000 -2024-02-22,Annual leave,7.4000 -2024-02-23,Annual leave,7.4000 -2024-02-26,Annual leave,7.4000 -2024-02-27,Annual leave,7.4000 -2024-02-28,Annual leave,7.4000 -2024-02-29,Annual leave,7.4000 -2024-03-01,Annual leave,7.4000 -2024-03-06,Non-working day,0.0000 -2024-03-20,Non-working day,0.0000 -2024-03-28,Store working,0.0000 -2024-03-29,Non-working day,0.0000 -2024-04-03,Non-working day,0.0000 -2024-04-10,Non-working day,0.0000 -2024-04-19,Non-working day,0.0000 -2024-04-24,Non-working day,0.0000 -2024-05-08,Non-working day,0.0000 -2024-05-17,Non-working day,0.0000 -2024-05-22,Non-working day,0.0000 -2024-05-31,Non-working day,0.0000 -2024-06-05,Non-working day,0.0000 -2024-06-12,Non-working day,0.0000 -2024-06-28,Non-working day,0.0000 -2024-07-03,Non-working day,0.0000 -2024-07-10,Non-working day,0.0000 -2024-07-11,Annual leave,7.4000 -2024-07-12,Annual leave,7.4000 -2024-07-15,Annual leave,7.4000 -2024-07-16,Annual leave,7.4000 -2024-07-17,Annual leave,7.4000 -2024-07-18,Annual leave,7.4000 -2024-07-19,Annual leave,7.4000 -2024-07-22,Annual leave,7.4000 -2024-08-07,Sick day,0.0000 -2024-08-08,Sick day,0.0000 -2024-08-09,Sick day,0.0000 -2024-09-13,Sick day,0.0000 -2024-09-18,Annual leave,7.4000 -2024-09-19,Annual leave,7.4000 -2024-09-20,Annual leave,7.4000 -2024-12-04,Annual leave,7.4000 -2024-12-25,Annual leave,7.4000 -2024-12-26,Annual leave,7.4000 -2025-01-01,Annual leave,7.4000 -2025-02-14,Annual leave,7.4000 -2025-02-17,Annual leave,7.4000 -2025-02-18,Annual leave,7.4000 -2025-02-19,Annual leave,7.4000 -2025-02-20,Annual leave,7.4000 -2025-02-21,Annual leave,7.4000 -2025-02-24,Annual leave,7.4000 diff --git a/billiam_database/models/seeds/data/work_hours.csv b/billiam_database/models/seeds/data/work_hours.csv deleted file mode 100644 index 0b522a5..0000000 --- a/billiam_database/models/seeds/data/work_hours.csv +++ /dev/null @@ -1,8 +0,0 @@ -company,from_date,to_date,sunday,monday,tuesday,wednesday,thursday,friday,saturday -TSB,2018-09-18,2019-11-29,0.0000,7.0000,7.0000,7.0000,7.0000,7.0000,0.0000 -TSB,2019-12-02,2020-09-11,0.0000,8.7500,8.7500,0.0000,8.7500,8.7500,0.0000 -Jaja,2020-09-14,2022-01-07,0.0000,7.5000,7.5000,7.5000,7.5000,7.5000,0.0000 -Allica,2022-01-17,2022-12-16,0.0000,7.0000,7.0000,7.0000,7.0000,7.0000,0.0000 -Sainsbury's,2023-01-09,2023-11-17,0.0000,7.4000,7.4000,7.4000,7.4000,7.4000,0.0000 -Sainsbury's,2023-11-20,2024-07-12,0.0000,9.2500,9.2500,0.0000,9.2500,9.2500,0.0000 -Sainsbury's,2024-07-15,,0.0000,7.4000,7.4000,7.4000,7.4000,7.4000,0.0000 diff --git a/pyproject.toml b/pyproject.toml index 7146a01..6eb848b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,8 +13,8 @@ readme = "README.md" keywords = ["sql", "sqlmesh", "duckdb"] requires-python = ">=3.11" dependencies = [ - "duckdb>=1.4.0", - "sqlmesh>=0.224.0", + "duckdb==1.3.2", + "sqlmesh[duckdb]>=0.224.0", ] [dependency-groups] @@ -48,6 +48,8 @@ lint.shell = """ SKIP=identity pre-commit run --all-files --hook-stage pre-commit echo '=== pre-push checks ===' pre-commit run --all-files --hook-stage pre-push + echo '=== sqlmesh checks ===' + sqlmesh -p billiam_database lint """ update.shell = """ uv sync --refresh --upgrade diff --git a/testing/setup.py b/testing/setup.py deleted file mode 100644 index e68584a..0000000 --- a/testing/setup.py +++ /dev/null @@ -1,21 +0,0 @@ -""" -Setup for CI. - -This is quick and dirty, but it works for now. -""" - -import os -import pathlib - -import duckdb - -CWD = pathlib.Path(os.getenv("GITHUB_WORKSPACE")) - -conn = duckdb.connect(database=CWD / "billiam_database/billiam.duckdb") -conn.close() - -# This is a temporary fix -- this should not be a seed because it includes -# sensitive data, so just need to refactor and move it somewhere better -counterparty_exclusions = CWD / "billiam_database/models/seeds/data/counterparty_exclusions.csv" -counterparty_exclusions.touch() -counterparty_exclusions.write_text("counterparty") diff --git a/uv.lock b/uv.lock index f998e5f..efbeb7a 100644 --- a/uv.lock +++ b/uv.lock @@ -52,8 +52,8 @@ dev = [ [package.metadata] requires-dist = [ - { name = "duckdb", specifier = ">=1.4.0" }, - { name = "sqlmesh", specifier = ">=0.224.0" }, + { name = "duckdb", specifier = "==1.3.2" }, + { name = "sqlmesh", extras = ["duckdb"], specifier = ">=0.224.0" }, ] [package.metadata.requires-dev] @@ -325,28 +325,31 @@ wheels = [ [[package]] name = "duckdb" -version = "1.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/82/93/adc0d183642fc9a602ca9b97cb16754c84b8c1d92e5b99aec412e0c419a8/duckdb-1.4.0.tar.gz", hash = "sha256:bd5edee8bd5a73b5822f2b390668597b5fcdc2d3292c244d8d933bb87ad6ac4c", size = 18453175, upload-time = "2025-09-16T10:22:41.509Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/60/e9/b29cc5bceac52e049b20d613551a2171a092df07f26d4315f3f9651c80d4/duckdb-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6505fed1ccae8df9f574e744c48fa32ee2feaeebe5346c2daf4d4d10a8dac5aa", size = 31290878, upload-time = "2025-09-16T10:21:43.256Z" }, - { url = "https://files.pythonhosted.org/packages/1f/68/d88a15dba48bf6a4b33f1be5097ef45c83f7b9e97c854cc638a85bb07d70/duckdb-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:36974a04b29c74ac2143457e95420a7422016d050e28573060b89a90b9cf2b57", size = 17288823, upload-time = "2025-09-16T10:21:45.716Z" }, - { url = "https://files.pythonhosted.org/packages/8c/7e/e3d2101dc6bbd60f2b3c1d748351ff541fc8c48790ac1218c0199cb930f6/duckdb-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:90484b896e5059f145d1facfabea38e22c54a2dcc2bd62dd6c290423f0aee258", size = 14819684, upload-time = "2025-09-16T10:21:48.117Z" }, - { url = "https://files.pythonhosted.org/packages/c4/bb/4ec8e4d03cb5b77d75b9ee0057c2c714cffaa9bda1e55ffec833458af0a3/duckdb-1.4.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a969d624b385853b31a43b0a23089683297da2f14846243921c6dbec8382d659", size = 18410075, upload-time = "2025-09-16T10:21:50.517Z" }, - { url = "https://files.pythonhosted.org/packages/ec/21/e896616d892d50dc1e0c142428e9359b483d4dd6e339231d822e57834ad3/duckdb-1.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5935644f96a75e9f6f3c3eeb3da14cdcaf7bad14d1199c08439103decb29466a", size = 20402984, upload-time = "2025-09-16T10:21:52.808Z" }, - { url = "https://files.pythonhosted.org/packages/c4/c0/b5eb9497e4a9167d23fbad745969eaa36e28d346648e17565471892d1b33/duckdb-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:300aa0e963af97969c38440877fffd576fc1f49c1f5914789a9d01f2fe7def91", size = 12282971, upload-time = "2025-09-16T10:21:55.314Z" }, - { url = "https://files.pythonhosted.org/packages/e8/6d/0c774d6af1aed82dbe855d266cb000a1c09ea31ed7d6c3a79e2167a38e7a/duckdb-1.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:18b3a048fca6cc7bafe08b10e1b0ab1509d7a0381ffb2c70359e7dc56d8a705d", size = 31307425, upload-time = "2025-09-16T10:21:57.83Z" }, - { url = "https://files.pythonhosted.org/packages/d3/c0/1fd7b7b2c0c53d8d748d2f28ea9096df5ee9dc39fa736cca68acabe69656/duckdb-1.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2c1271cb85aeacccfd0b1284e816280a7450df1dd4dd85ccb2848563cfdf90e9", size = 17295727, upload-time = "2025-09-16T10:22:02.242Z" }, - { url = "https://files.pythonhosted.org/packages/98/d3/4d4c4bd667b7ada5f6c207c2f127591ebb8468333f207f8f10ff0532578e/duckdb-1.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55064dd2e25711eeaa6a72c25405bdd7994c81a3221657e94309a2faf65d25a6", size = 14826879, upload-time = "2025-09-16T10:22:05.162Z" }, - { url = "https://files.pythonhosted.org/packages/b0/48/e0c1b97d76fb7567c53db5739931323238fad54a642707008104f501db37/duckdb-1.4.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0536d7c81bc506532daccf373ddbc8c6add46aeb70ef3cd5ee70ad5c2b3165ea", size = 18417856, upload-time = "2025-09-16T10:22:07.919Z" }, - { url = "https://files.pythonhosted.org/packages/12/78/297b838f3b9511589badc8f472f70b31cf3bbf9eb99fa0a4d6e911d3114a/duckdb-1.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:784554e3ddfcfc5c5c7b1aa1f9925fedb7938f6628729adba48f7ea37554598f", size = 20427154, upload-time = "2025-09-16T10:22:10.216Z" }, - { url = "https://files.pythonhosted.org/packages/ea/57/500d251b886494f6c52d56eeab8a1860572ee62aed05d7d50c71ba2320f3/duckdb-1.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:c5d2aa4d6981f525ada95e6db41bb929403632bb5ff24bd6d6dd551662b1b613", size = 12290108, upload-time = "2025-09-16T10:22:12.668Z" }, - { url = "https://files.pythonhosted.org/packages/2f/64/ee22b2b8572746e1523143b9f28d606575782e0204de5020656a1d15dd14/duckdb-1.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1d94d010a09b1a62d9021a2a71cf266188750f3c9b1912ccd6afe104a6ce8010", size = 31307662, upload-time = "2025-09-16T10:22:14.9Z" }, - { url = "https://files.pythonhosted.org/packages/76/2e/4241cd00046ca6b781bd1d9002e8223af061e85d1cc21830aa63e7a7db7c/duckdb-1.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c61756fa8b3374627e5fa964b8e0d5b58e364dce59b87dba7fb7bc6ede196b26", size = 17295617, upload-time = "2025-09-16T10:22:17.239Z" }, - { url = "https://files.pythonhosted.org/packages/f7/98/5ab136bc7b12ac18580350a220db7c00606be9eac2d89de259cce733f64c/duckdb-1.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e70d7d9881ea2c0836695de70ea68c970e18a2856ba3d6502e276c85bd414ae7", size = 14826727, upload-time = "2025-09-16T10:22:19.415Z" }, - { url = "https://files.pythonhosted.org/packages/23/32/57866cf8881288b3dfb9212720221fb890daaa534dbdc6fe3fff3979ecd1/duckdb-1.4.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2de258a93435c977a0ec3a74ec8f60c2f215ddc73d427ee49adc4119558facd3", size = 18421289, upload-time = "2025-09-16T10:22:21.564Z" }, - { url = "https://files.pythonhosted.org/packages/a0/83/7438fb43be451a7d4a04650aaaf662b2ff2d95895bbffe3e0e28cbe030c9/duckdb-1.4.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a6d3659641d517dd9ed1ab66f110cdbdaa6900106f116effaf2dbedd83c38de3", size = 20426547, upload-time = "2025-09-16T10:22:23.759Z" }, - { url = "https://files.pythonhosted.org/packages/21/b2/98fb89ae81611855f35984e96f648d871f3967bb3f524b51d1372d052f0c/duckdb-1.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:07fcc612ea5f0fe6032b92bcc93693034eb00e7a23eb9146576911d5326af4f7", size = 12290467, upload-time = "2025-09-16T10:22:25.923Z" }, +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/47/24/a2e7fb78fba577641c286fe33185789ab1e1569ccdf4d142e005995991d2/duckdb-1.3.2.tar.gz", hash = "sha256:c658df8a1bc78704f702ad0d954d82a1edd4518d7a04f00027ec53e40f591ff5", size = 11627775, upload-time = "2025-07-08T10:41:14.444Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/16/4cde40c37dd1f48d2f9ffa63027e8b668391c5cc32cbb59f7ca8b1cec6e2/duckdb-1.3.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:e1872cf63aae28c3f1dc2e19b5e23940339fc39fb3425a06196c5d00a8d01040", size = 15520798, upload-time = "2025-07-08T10:40:13.867Z" }, + { url = "https://files.pythonhosted.org/packages/22/ca/9ca65db51868604007114a27cc7d44864d89328ad6a934668626618147ff/duckdb-1.3.2-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:db256c206056468ae6a9e931776bdf7debaffc58e19a0ff4fa9e7e1e82d38b3b", size = 32502242, upload-time = "2025-07-08T10:40:15.949Z" }, + { url = "https://files.pythonhosted.org/packages/9e/ca/7f7cf01dd7731d358632fb516521f2962070a627558fb6fc3137e594bbaa/duckdb-1.3.2-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:1d57df2149d6e4e0bd5198689316c5e2ceec7f6ac0a9ec11bc2b216502a57b34", size = 17091841, upload-time = "2025-07-08T10:40:18.539Z" }, + { url = "https://files.pythonhosted.org/packages/4c/7f/38e518b8f51299410dcad9f1e99f1c99f3592516581467a2da344d3b5951/duckdb-1.3.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:54f76c8b1e2a19dfe194027894209ce9ddb073fd9db69af729a524d2860e4680", size = 19158775, upload-time = "2025-07-08T10:40:20.804Z" }, + { url = "https://files.pythonhosted.org/packages/90/a3/41f3d42fddd9629846aac328eb295170e76782d8dfc5e58b3584b96fa296/duckdb-1.3.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:45bea70b3e93c6bf766ce2f80fc3876efa94c4ee4de72036417a7bd1e32142fe", size = 21093951, upload-time = "2025-07-08T10:40:22.686Z" }, + { url = "https://files.pythonhosted.org/packages/11/8e/c5444b6890ae7f00836fd0cd17799abbcc3066bbab32e90b04aa8a8a5087/duckdb-1.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:003f7d36f0d8a430cb0e00521f18b7d5ee49ec98aaa541914c6d0e008c306f1a", size = 22743891, upload-time = "2025-07-08T10:40:24.987Z" }, + { url = "https://files.pythonhosted.org/packages/87/a1/e240bd07671542ddf2084962e68a7d5c9b068d8da3f938e935af69441355/duckdb-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:0eb210cedf08b067fa90c666339688f1c874844a54708562282bc54b0189aac6", size = 11387047, upload-time = "2025-07-08T10:40:27.443Z" }, + { url = "https://files.pythonhosted.org/packages/6c/5d/77f15528857c2b186ebec07778dc199ccc04aafb69fb7b15227af4f19ac9/duckdb-1.3.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2455b1ffef4e3d3c7ef8b806977c0e3973c10ec85aa28f08c993ab7f2598e8dd", size = 15538413, upload-time = "2025-07-08T10:40:29.551Z" }, + { url = "https://files.pythonhosted.org/packages/78/67/7e4964f688b846676c813a4acc527cd3454be8a9cafa10f3a9aa78d0d165/duckdb-1.3.2-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:9d0ae509713da3461c000af27496d5413f839d26111d2a609242d9d17b37d464", size = 32535307, upload-time = "2025-07-08T10:40:31.632Z" }, + { url = "https://files.pythonhosted.org/packages/95/3d/2d7f8078194130dbf30b5ae154ce454bfc208c91aa5f3e802531a3e09bca/duckdb-1.3.2-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:72ca6143d23c0bf6426396400f01fcbe4785ad9ceec771bd9a4acc5b5ef9a075", size = 17110219, upload-time = "2025-07-08T10:40:34.072Z" }, + { url = "https://files.pythonhosted.org/packages/cd/05/36ff9000b9c6d2a68c1b248f133ee316fcac10c0ff817112cbf5214dbe91/duckdb-1.3.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b49a11afba36b98436db83770df10faa03ebded06514cb9b180b513d8be7f392", size = 19178569, upload-time = "2025-07-08T10:40:35.995Z" }, + { url = "https://files.pythonhosted.org/packages/ac/73/f85acbb3ac319a86abbf6b46103d58594d73529123377219980f11b388e9/duckdb-1.3.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:36abdfe0d1704fe09b08d233165f312dad7d7d0ecaaca5fb3bb869f4838a2d0b", size = 21129975, upload-time = "2025-07-08T10:40:38.3Z" }, + { url = "https://files.pythonhosted.org/packages/32/40/9aa3267f3631ae06b30fb1045a48628f4dba7beb2efb485c0282b4a73367/duckdb-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3380aae1c4f2af3f37b0bf223fabd62077dd0493c84ef441e69b45167188e7b6", size = 22781859, upload-time = "2025-07-08T10:40:41.691Z" }, + { url = "https://files.pythonhosted.org/packages/8c/8d/47bf95f6999b327cf4da677e150cfce802abf9057b61a93a1f91e89d748c/duckdb-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:11af73963ae174aafd90ea45fb0317f1b2e28a7f1d9902819d47c67cc957d49c", size = 11395337, upload-time = "2025-07-08T10:40:43.651Z" }, + { url = "https://files.pythonhosted.org/packages/f5/f0/8cac9713735864899e8abc4065bbdb3d1617f2130006d508a80e1b1a6c53/duckdb-1.3.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:a3418c973b06ac4e97f178f803e032c30c9a9f56a3e3b43a866f33223dfbf60b", size = 15535350, upload-time = "2025-07-08T10:40:45.562Z" }, + { url = "https://files.pythonhosted.org/packages/c5/26/6698bbb30b7bce8b8b17697599f1517611c61e4bd68b37eaeaf4f5ddd915/duckdb-1.3.2-cp313-cp313-macosx_12_0_universal2.whl", hash = "sha256:2a741eae2cf110fd2223eeebe4151e22c0c02803e1cfac6880dbe8a39fecab6a", size = 32534715, upload-time = "2025-07-08T10:40:47.615Z" }, + { url = "https://files.pythonhosted.org/packages/10/75/8ab4da3099a2fac7335ecebce4246706d19bdd5dad167aa436b5b27c43c4/duckdb-1.3.2-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:51e62541341ea1a9e31f0f1ade2496a39b742caf513bebd52396f42ddd6525a0", size = 17110300, upload-time = "2025-07-08T10:40:49.674Z" }, + { url = "https://files.pythonhosted.org/packages/d1/46/af81b10d4a66a0f27c248df296d1b41ff2a305a235ed8488f93240f6f8b5/duckdb-1.3.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b3e519de5640e5671f1731b3ae6b496e0ed7e4de4a1c25c7a2f34c991ab64d71", size = 19180082, upload-time = "2025-07-08T10:40:51.679Z" }, + { url = "https://files.pythonhosted.org/packages/68/fc/259a54fc22111a847981927aa58528d766e8b228c6d41deb0ad8a1959f9f/duckdb-1.3.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4732fb8cc60566b60e7e53b8c19972cb5ed12d285147a3063b16cc64a79f6d9f", size = 21128404, upload-time = "2025-07-08T10:40:53.772Z" }, + { url = "https://files.pythonhosted.org/packages/ab/dc/5d5140383e40661173dacdceaddee2a97c3f6721a5e8d76e08258110595e/duckdb-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:97f7a22dcaa1cca889d12c3dc43a999468375cdb6f6fe56edf840e062d4a8293", size = 22779786, upload-time = "2025-07-08T10:40:55.826Z" }, + { url = "https://files.pythonhosted.org/packages/51/c9/2fcd86ab7530a5b6caff42dbe516ce7a86277e12c499d1c1f5acd266ffb2/duckdb-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:cd3d717bf9c49ef4b1016c2216517572258fa645c2923e91c5234053defa3fb5", size = 11395370, upload-time = "2025-07-08T10:40:57.655Z" }, ] [[package]]