From b8ad73202c1314cc5872a3b9679cc8c0150d2195 Mon Sep 17 00:00:00 2001 From: Deeman Date: Sun, 13 Jul 2025 23:20:50 +0200 Subject: [PATCH] finish historical extraction --- extract/psdonline/src/psdonline/execute.py | 54 ++++++++-------- pyproject.toml | 1 + transform/sqlmesh-duckdb/README.md | 0 transform/sqlmesh-duckdb/audits/.gitkeep | 0 .../audits/assert_positive_order_ids.sql | 9 --- transform/sqlmesh-duckdb/config.yaml | 59 ------------------ transform/sqlmesh-duckdb/db.db | Bin 2109440 -> 0 bytes transform/sqlmesh-duckdb/macros/.gitkeep | 0 transform/sqlmesh-duckdb/macros/__init__.py | 0 transform/sqlmesh-duckdb/models/.gitkeep | 0 .../models/example/full_model.sql | 15 ----- .../models/example/incremental_model.sql | 19 ------ .../models/example/seed_model.sql | 13 ---- transform/sqlmesh-duckdb/pyproject.toml | 16 ----- transform/sqlmesh-duckdb/seeds/.gitkeep | 0 transform/sqlmesh-duckdb/seeds/seed_data.csv | 8 --- transform/sqlmesh-duckdb/tests/.gitkeep | 0 .../sqlmesh-duckdb/tests/test_full_model.yaml | 19 ------ uv.lock | 38 +++++++++-- 19 files changed, 62 insertions(+), 189 deletions(-) delete mode 100644 transform/sqlmesh-duckdb/README.md delete mode 100644 transform/sqlmesh-duckdb/audits/.gitkeep delete mode 100644 transform/sqlmesh-duckdb/audits/assert_positive_order_ids.sql delete mode 100644 transform/sqlmesh-duckdb/config.yaml delete mode 100644 transform/sqlmesh-duckdb/db.db delete mode 100644 transform/sqlmesh-duckdb/macros/.gitkeep delete mode 100644 transform/sqlmesh-duckdb/macros/__init__.py delete mode 100644 transform/sqlmesh-duckdb/models/.gitkeep delete mode 100644 transform/sqlmesh-duckdb/models/example/full_model.sql delete mode 100644 transform/sqlmesh-duckdb/models/example/incremental_model.sql delete mode 100644 transform/sqlmesh-duckdb/models/example/seed_model.sql delete mode 100644 transform/sqlmesh-duckdb/pyproject.toml delete mode 100644 transform/sqlmesh-duckdb/seeds/.gitkeep delete mode 100644 transform/sqlmesh-duckdb/seeds/seed_data.csv delete mode 100644 transform/sqlmesh-duckdb/tests/.gitkeep delete mode 100644 transform/sqlmesh-duckdb/tests/test_full_model.yaml diff --git a/extract/psdonline/src/psdonline/execute.py b/extract/psdonline/src/psdonline/execute.py index b5e97f8..56104b3 100644 --- a/extract/psdonline/src/psdonline/execute.py +++ b/extract/psdonline/src/psdonline/execute.py @@ -1,11 +1,8 @@ import niquests -import io -import zipfile import pathlib import logging import sys from datetime import datetime -import asyncio logging.basicConfig( level=logging.INFO, @@ -15,42 +12,45 @@ logging.basicConfig( logging.StreamHandler(sys.stdout) ] ) - +logger = logging.getLogger("PSD Extraction") output_dir = pathlib.Path(__file__).parent / "data" output_dir.mkdir(parents=True, exist_ok=True) -logging.info(f"Output dir: {output_dir}") - -PSD_HISTORICAL_URL = "https://apps.fas.usda.gov/psdonline/downloads/archives/{year}/{month}/psd_alldata_csv.zip" +logger.info(f"Output dir: {output_dir}") +#TODO: adapt to environment values, so this writes to s3 in prod +PSD_HISTORICAL_URL = "https://apps.fas.usda.gov/psdonline/downloads/archives/{year}/{month:02d}/psd_alldata_csv.zip" PSD_LATEST_URL = "https://apps.fas.usda.gov/psdonline/downloads/psd_alldata_csv.zip" FIRST_YEAR = 2006 FIRST_MONTH = 8 -async def extract_psd_file(url:str, http_session: niquests.AsyncSession): - logging.info(f"Start downloading {url} ...") - latest_data = await http_session.get(url) - logging.info("Download done.") - if latest_data.status_code != 200: - logging.info(f"Status code not ok, STATUS={latest_data.status_code}") +def extract_psd_file(url:str, extract_to_path: pathlib.Path, http_session: niquests.Session): + logger.info(f"Start downloading {url} ...") + response = http_session.get(url) + if response.status_code != 200: + logger.error(f"Status code not ok, STATUS={response.status_code}") return - latest_buf=io.BytesIO() - latest_buf.write(latest_data.content) - latest_buf.seek(0) + logger.info(f"Storing file to {extract_to_path}") + extract_to_path.parent.mkdir(parents=True, exist_ok=True) + extract_to_path.write_bytes(response.content) + logger.info("Download done.") - logging.info("Extracting Zipfile ...") - zipfile.ZipFile(latest_buf).extract('psd_alldata.csv', output_dir) - logging.info("Extracting Zipfile done.") -async def extract_historical_psd_dataset(): +def extract_historical_psd_dataset(): today = datetime.now() years = list(range(FIRST_YEAR, today.year)) months = list(range(1,13)) - historical_data_extraction_urls = [PSD_HISTORICAL_URL.format(year=year, month=month) for year in years for month in months] - logging.info(f"Downloading {len(historical_data_extraction_urls)} urls") - async with niquests.AsyncSession() as session: - async with asyncio.TaskGroup() as tg: - for url in historical_data_extraction_urls: - tg.create_task(extract_psd_file(url, session)) + logger.info(f"Downloading {len(years) * len(months)} urls") + for year in years: + for month in months: + url = PSD_HISTORICAL_URL.format(year=year, month=month) + target_path = output_dir / f"{year}"/f"{month:02d}" / "psd_alldata_csv.zip" + with niquests.Session() as session: + logger.info(f"Downloading psd_alldata_csv.zip for {year}/{month:02d}") + try: + extract_psd_file(url=url, http_session=session, extract_to_path=target_path) + except Exception as e: + logger.error("Error trying to download file. Likely the file does not exist", e) + if __name__ == "__main__": - asyncio.run(extract_historical_psd_dataset()) + extract_historical_psd_dataset() diff --git a/pyproject.toml b/pyproject.toml index fb4ba74..74ed528 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,6 +8,7 @@ authors = [ ] requires-python = ">=3.13" dependencies = [ + "pyarrow>=20.0.0", "python-dotenv>=1.1.0", ] diff --git a/transform/sqlmesh-duckdb/README.md b/transform/sqlmesh-duckdb/README.md deleted file mode 100644 index e69de29..0000000 diff --git a/transform/sqlmesh-duckdb/audits/.gitkeep b/transform/sqlmesh-duckdb/audits/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/transform/sqlmesh-duckdb/audits/assert_positive_order_ids.sql b/transform/sqlmesh-duckdb/audits/assert_positive_order_ids.sql deleted file mode 100644 index 4b66f40..0000000 --- a/transform/sqlmesh-duckdb/audits/assert_positive_order_ids.sql +++ /dev/null @@ -1,9 +0,0 @@ -AUDIT ( - name assert_positive_order_ids, -); - -SELECT * -FROM @this_model -WHERE - item_id < 0 - \ No newline at end of file diff --git a/transform/sqlmesh-duckdb/config.yaml b/transform/sqlmesh-duckdb/config.yaml deleted file mode 100644 index feb572b..0000000 --- a/transform/sqlmesh-duckdb/config.yaml +++ /dev/null @@ -1,59 +0,0 @@ -# --- Gateway Connection --- -gateways: - duckdb: - connection: - # For more information on configuring the connection to your execution engine, visit: - # https://sqlmesh.readthedocs.io/en/stable/reference/configuration/#connection - # https://sqlmesh.readthedocs.io/en/stable/integrations/engines/duckdb/#connection-options - type: duckdb - database: db.db - # concurrent_tasks: 1 - # register_comments: True - # pre_ping: False - # pretty_sql: False - # catalogs: - # extensions: - # connector_config: - # secrets: - # filesystems: - # token: - -default_gateway: duckdb - -# --- Model Defaults --- -# https://sqlmesh.readthedocs.io/en/stable/reference/model_configuration/#model-defaults - -model_defaults: - dialect: duckdb - start: 2025-07-07 # Start date for backfill history - cron: '@daily' # Run models daily at 12am UTC (can override per model) - -# --- Linting Rules --- -# Enforce standards for your team -# https://sqlmesh.readthedocs.io/en/stable/guides/linter/ - -linter: - enabled: true - rules: - - ambiguousorinvalidcolumn - - invalidselectstarexpansion - -# FLOW: Minimal prompts, automatic changes, summary output -# https://sqlmesh.readthedocs.io/en/stable/reference/configuration/#plan - -plan: - no_diff: true # Hide detailed text differences for changed models - no_prompts: true # No interactive prompts - auto_apply: true # Apply changes automatically - -# --- Optional: Set a default target environment --- -# This is intended for local development to prevent users from accidentally applying plans to the prod environment. -# It is a development only config and should NOT be committed to your git repo. -# https://sqlmesh.readthedocs.io/en/stable/guides/configuration/#default-target-environment - -# Uncomment the following line to use a default target environment derived from the logged in user's name. -# default_target_environment: dev_{{ user() }} - -# Example usage: -# sqlmesh plan # Automatically resolves to: sqlmesh plan dev_yourname -# sqlmesh plan prod # Specify `prod` to apply changes to production diff --git a/transform/sqlmesh-duckdb/db.db b/transform/sqlmesh-duckdb/db.db deleted file mode 100644 index e7635a578ca9db22329b2b04c2e430262845b413..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2109440 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 zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1a>Cy zi(mbNzx&UxOg(f4g9R0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oN~r0zd!ApML2#e)${UeqFbmW8pP{xhB zo+qN{coOucpqhCAN^nyef+*Oq`llty?3Sv5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5;&gCOw#0XORc A!T=0.200.0", -] - -[build-system] -requires = ["hatchling"] -build-backend = "hatchling.build" diff --git a/transform/sqlmesh-duckdb/seeds/.gitkeep b/transform/sqlmesh-duckdb/seeds/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/transform/sqlmesh-duckdb/seeds/seed_data.csv b/transform/sqlmesh-duckdb/seeds/seed_data.csv deleted file mode 100644 index 2e3902e..0000000 --- a/transform/sqlmesh-duckdb/seeds/seed_data.csv +++ /dev/null @@ -1,8 +0,0 @@ -id,item_id,event_date -1,2,2020-01-01 -2,1,2020-01-01 -3,3,2020-01-03 -4,1,2020-01-04 -5,1,2020-01-05 -6,1,2020-01-06 -7,1,2020-01-07 diff --git a/transform/sqlmesh-duckdb/tests/.gitkeep b/transform/sqlmesh-duckdb/tests/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/transform/sqlmesh-duckdb/tests/test_full_model.yaml b/transform/sqlmesh-duckdb/tests/test_full_model.yaml deleted file mode 100644 index 390a80e..0000000 --- a/transform/sqlmesh-duckdb/tests/test_full_model.yaml +++ /dev/null @@ -1,19 +0,0 @@ -test_example_full_model: - model: sqlmesh_example.full_model - inputs: - sqlmesh_example.incremental_model: - rows: - - id: 1 - item_id: 1 - - id: 2 - item_id: 1 - - id: 3 - item_id: 2 - outputs: - query: - rows: - - item_id: 1 - num_orders: 2 - - item_id: 2 - num_orders: 1 - \ No newline at end of file diff --git a/uv.lock b/uv.lock index 9f2af24..7237a88 100644 --- a/uv.lock +++ b/uv.lock @@ -6,7 +6,7 @@ requires-python = ">=3.13" members = [ "materia", "psdonline", - "sqlmesh-duckdb", + "sqlmesh-materia", ] [[package]] @@ -516,6 +516,7 @@ name = "materia" version = "0.1.0" source = { editable = "." } dependencies = [ + { name = "pyarrow" }, { name = "python-dotenv" }, ] @@ -529,7 +530,10 @@ exploration = [ ] [package.metadata] -requires-dist = [{ name = "python-dotenv", specifier = ">=1.1.0" }] +requires-dist = [ + { name = "pyarrow", specifier = ">=20.0.0" }, + { name = "python-dotenv", specifier = ">=1.1.0" }, +] [package.metadata.requires-dev] dev = [ @@ -759,6 +763,32 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, ] +[[package]] +name = "pyarrow" +version = "20.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/ee/a7810cb9f3d6e9238e61d312076a9859bf3668fd21c69744de9532383912/pyarrow-20.0.0.tar.gz", hash = "sha256:febc4a913592573c8d5805091a6c2b5064c8bd6e002131f01061797d91c783c1", size = 1125187, upload-time = "2025-04-27T12:34:23.264Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/aa/daa413b81446d20d4dad2944110dcf4cf4f4179ef7f685dd5a6d7570dc8e/pyarrow-20.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:a15532e77b94c61efadde86d10957950392999503b3616b2ffcef7621a002893", size = 30798501, upload-time = "2025-04-27T12:30:48.351Z" }, + { url = "https://files.pythonhosted.org/packages/ff/75/2303d1caa410925de902d32ac215dc80a7ce7dd8dfe95358c165f2adf107/pyarrow-20.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:dd43f58037443af715f34f1322c782ec463a3c8a94a85fdb2d987ceb5658e061", size = 32277895, upload-time = "2025-04-27T12:30:55.238Z" }, + { url = "https://files.pythonhosted.org/packages/92/41/fe18c7c0b38b20811b73d1bdd54b1fccba0dab0e51d2048878042d84afa8/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa0d288143a8585806e3cc7c39566407aab646fb9ece164609dac1cfff45f6ae", size = 41327322, upload-time = "2025-04-27T12:31:05.587Z" }, + { url = "https://files.pythonhosted.org/packages/da/ab/7dbf3d11db67c72dbf36ae63dcbc9f30b866c153b3a22ef728523943eee6/pyarrow-20.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6953f0114f8d6f3d905d98e987d0924dabce59c3cda380bdfaa25a6201563b4", size = 42411441, upload-time = "2025-04-27T12:31:15.675Z" }, + { url = "https://files.pythonhosted.org/packages/90/c3/0c7da7b6dac863af75b64e2f827e4742161128c350bfe7955b426484e226/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:991f85b48a8a5e839b2128590ce07611fae48a904cae6cab1f089c5955b57eb5", size = 40677027, upload-time = "2025-04-27T12:31:24.631Z" }, + { url = "https://files.pythonhosted.org/packages/be/27/43a47fa0ff9053ab5203bb3faeec435d43c0d8bfa40179bfd076cdbd4e1c/pyarrow-20.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:97c8dc984ed09cb07d618d57d8d4b67a5100a30c3818c2fb0b04599f0da2de7b", size = 42281473, upload-time = "2025-04-27T12:31:31.311Z" }, + { url = "https://files.pythonhosted.org/packages/bc/0b/d56c63b078876da81bbb9ba695a596eabee9b085555ed12bf6eb3b7cab0e/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9b71daf534f4745818f96c214dbc1e6124d7daf059167330b610fc69b6f3d3e3", size = 42893897, upload-time = "2025-04-27T12:31:39.406Z" }, + { url = "https://files.pythonhosted.org/packages/92/ac/7d4bd020ba9145f354012838692d48300c1b8fe5634bfda886abcada67ed/pyarrow-20.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e8b88758f9303fa5a83d6c90e176714b2fd3852e776fc2d7e42a22dd6c2fb368", size = 44543847, upload-time = "2025-04-27T12:31:45.997Z" }, + { url = "https://files.pythonhosted.org/packages/9d/07/290f4abf9ca702c5df7b47739c1b2c83588641ddfa2cc75e34a301d42e55/pyarrow-20.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:30b3051b7975801c1e1d387e17c588d8ab05ced9b1e14eec57915f79869b5031", size = 25653219, upload-time = "2025-04-27T12:31:54.11Z" }, + { url = "https://files.pythonhosted.org/packages/95/df/720bb17704b10bd69dde086e1400b8eefb8f58df3f8ac9cff6c425bf57f1/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:ca151afa4f9b7bc45bcc791eb9a89e90a9eb2772767d0b1e5389609c7d03db63", size = 30853957, upload-time = "2025-04-27T12:31:59.215Z" }, + { url = "https://files.pythonhosted.org/packages/d9/72/0d5f875efc31baef742ba55a00a25213a19ea64d7176e0fe001c5d8b6e9a/pyarrow-20.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:4680f01ecd86e0dd63e39eb5cd59ef9ff24a9d166db328679e36c108dc993d4c", size = 32247972, upload-time = "2025-04-27T12:32:05.369Z" }, + { url = "https://files.pythonhosted.org/packages/d5/bc/e48b4fa544d2eea72f7844180eb77f83f2030b84c8dad860f199f94307ed/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f4c8534e2ff059765647aa69b75d6543f9fef59e2cd4c6d18015192565d2b70", size = 41256434, upload-time = "2025-04-27T12:32:11.814Z" }, + { url = "https://files.pythonhosted.org/packages/c3/01/974043a29874aa2cf4f87fb07fd108828fc7362300265a2a64a94965e35b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e1f8a47f4b4ae4c69c4d702cfbdfe4d41e18e5c7ef6f1bb1c50918c1e81c57b", size = 42353648, upload-time = "2025-04-27T12:32:20.766Z" }, + { url = "https://files.pythonhosted.org/packages/68/95/cc0d3634cde9ca69b0e51cbe830d8915ea32dda2157560dda27ff3b3337b/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:a1f60dc14658efaa927f8214734f6a01a806d7690be4b3232ba526836d216122", size = 40619853, upload-time = "2025-04-27T12:32:28.1Z" }, + { url = "https://files.pythonhosted.org/packages/29/c2/3ad40e07e96a3e74e7ed7cc8285aadfa84eb848a798c98ec0ad009eb6bcc/pyarrow-20.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:204a846dca751428991346976b914d6d2a82ae5b8316a6ed99789ebf976551e6", size = 42241743, upload-time = "2025-04-27T12:32:35.792Z" }, + { url = "https://files.pythonhosted.org/packages/eb/cb/65fa110b483339add6a9bc7b6373614166b14e20375d4daa73483755f830/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f3b117b922af5e4c6b9a9115825726cac7d8b1421c37c2b5e24fbacc8930612c", size = 42839441, upload-time = "2025-04-27T12:32:46.64Z" }, + { url = "https://files.pythonhosted.org/packages/98/7b/f30b1954589243207d7a0fbc9997401044bf9a033eec78f6cb50da3f304a/pyarrow-20.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e724a3fd23ae5b9c010e7be857f4405ed5e679db5c93e66204db1a69f733936a", size = 44503279, upload-time = "2025-04-27T12:32:56.503Z" }, + { url = "https://files.pythonhosted.org/packages/37/40/ad395740cd641869a13bcf60851296c89624662575621968dcfafabaa7f6/pyarrow-20.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:82f1ee5133bd8f49d31be1299dc07f585136679666b502540db854968576faf9", size = 25944982, upload-time = "2025-04-27T12:33:04.72Z" }, +] + [[package]] name = "pycparser" version = "2.22" @@ -1126,9 +1156,9 @@ wheels = [ ] [[package]] -name = "sqlmesh-duckdb" +name = "sqlmesh-materia" version = "0.1.0" -source = { editable = "transform/sqlmesh-duckdb" } +source = { editable = "transform/sqlmesh-materia" } dependencies = [ { name = "sqlmesh" }, ]