From 9836550959bc92f38f0961d4a229080aac196f6b Mon Sep 17 00:00:00 2001 From: Ming-Jer Lee Date: Fri, 31 Jul 2026 19:57:11 -0700 Subject: [PATCH] fix: format markdown code blocks for ruff 0.16, pin ruff, bump to 0.0.5 Newer ruff (installed unpinned in the publish workflow) formats Python code blocks embedded in Markdown; three docs files failed the release format check for v0.0.4, blocking the PyPI publish. Formats those blocks, pins ruff to >=0.16.1,<0.17 so local and CI resolve the same formatter, and bumps to 0.0.5 for a clean release tag. --- README.md | 136 ++++++++++++++++++++++++----------- clgraph-simple-diagram.md | 3 +- examples/sql_files/README.md | 2 + pyproject.toml | 4 +- uv.lock | 47 ++++++------ 5 files changed, 124 insertions(+), 68 deletions(-) diff --git a/README.md b/README.md index 320243e..4be0432 100644 --- a/README.md +++ b/README.md @@ -108,7 +108,7 @@ print(query_lineage) # Get source tables input_nodes = query_lineage.get_input_nodes() source_tables = {node.table_name for node in input_nodes if node.table_name} -print("-"*60) +print("-" * 60) print(f"{len(source_tables)} source tables:") for table in source_tables: print(f" {table}") @@ -151,24 +151,33 @@ ColumnLineageGraph( from clgraph import Pipeline queries = [ - ("raw_events", """ + ( + "raw_events", + """ CREATE TABLE raw_events AS SELECT user_id, event_type, event_timestamp, session_id FROM source_events WHERE event_timestamp >= '2024-01-01' - """), - ("daily_active_users", """ + """, + ), + ( + "daily_active_users", + """ CREATE TABLE daily_active_users AS SELECT user_id, DATE(event_timestamp) as activity_date, COUNT(*) as event_count FROM raw_events GROUP BY user_id, DATE(event_timestamp) - """), - ("user_summary", """ + """, + ), + ( + "user_summary", + """ CREATE TABLE user_summary AS SELECT u.name, u.email, dau.activity_date, dau.event_count FROM users u JOIN daily_active_users dau ON u.id = dau.user_id - """), + """, + ), ] pipeline = Pipeline(queries, dialect="bigquery") @@ -287,17 +296,23 @@ from clgraph import Pipeline, JSONExporter, CSVExporter, visualize_pipeline_line # Build pipeline queries = [ - ("raw.orders", """ + ( + "raw.orders", + """ CREATE TABLE raw.orders AS SELECT order_id, user_email, amount, order_date FROM source.orders - """), - ("analytics.revenue", """ + """, + ), + ( + "analytics.revenue", + """ CREATE TABLE analytics.revenue AS SELECT user_email, SUM(amount) as total_revenue FROM raw.orders GROUP BY user_email - """), + """, + ), ] pipeline = Pipeline(queries, dialect="bigquery") @@ -369,7 +384,10 @@ import json # Build pipeline queries = [ ("staging", "CREATE TABLE staging.orders AS SELECT id, amount FROM raw.orders"), - ("analytics", "CREATE TABLE analytics.totals AS SELECT SUM(amount) as total FROM staging.orders"), + ( + "analytics", + "CREATE TABLE analytics.totals AS SELECT SUM(amount) as total FROM staging.orders", + ), ] pipeline = Pipeline.from_tuples(queries, dialect="bigquery") @@ -419,17 +437,23 @@ from langchain_ollama import ChatOllama # Build pipeline queries = [ - ("raw.orders", """ + ( + "raw.orders", + """ CREATE TABLE raw.orders AS SELECT order_id, user_email, amount, order_date FROM source.orders - """), - ("analytics.revenue", """ + """, + ), + ( + "analytics.revenue", + """ CREATE TABLE analytics.revenue AS SELECT user_email, SUM(amount) as total_revenue FROM raw.orders GROUP BY user_email - """), + """, + ), ] pipeline = Pipeline(queries, dialect="bigquery") @@ -445,9 +469,7 @@ pipeline.generate_all_descriptions(verbose=True) print("-" * 60) # View generated descriptions -columns_with_descriptions = [ - col for col in pipeline.columns.values() if col.description -] +columns_with_descriptions = [col for col in pipeline.columns.values() if col.description] print(f"Generated descriptions for {len(columns_with_descriptions)} columns:") for col in columns_with_descriptions: print(f" {col.full_name}:") @@ -489,17 +511,23 @@ from clgraph.agent import LineageAgent # Build pipeline queries = [ - ("staging.orders", """ + ( + "staging.orders", + """ CREATE TABLE staging.orders AS SELECT order_id, customer_id, amount, order_date FROM raw.orders WHERE amount > 0 - """), - ("analytics.revenue", """ + """, + ), + ( + "analytics.revenue", + """ CREATE TABLE analytics.revenue AS SELECT customer_id, SUM(amount) as total_revenue, COUNT(*) as order_count FROM staging.orders GROUP BY customer_id - """), + """, + ), ] pipeline = Pipeline(queries, dialect="bigquery") @@ -554,7 +582,9 @@ from clgraph import Pipeline # Build pipeline with column descriptions (from SQL comments) queries = [ - ("customers", """ + ( + "customers", + """ CREATE TABLE analytics.customers AS SELECT customer_id, -- Unique customer identifier @@ -562,8 +592,11 @@ queries = [ signup_date, -- Date customer signed up lifetime_value -- Total revenue from this customer in USD FROM raw.customers - """), - ("orders", """ + """, + ), + ( + "orders", + """ CREATE TABLE analytics.orders AS SELECT order_id, -- Unique order identifier @@ -571,7 +604,8 @@ queries = [ amount, -- Order amount in USD order_date -- Date of order FROM raw.orders - """), + """, + ), ] pipeline = Pipeline(queries, dialect="bigquery") @@ -633,14 +667,20 @@ from clgraph.tools import ( # Build pipeline queries = [ - ("staging.orders", """ + ( + "staging.orders", + """ CREATE TABLE staging.orders AS SELECT order_id, customer_email, amount FROM raw.orders - """), - ("analytics.revenue", """ + """, + ), + ( + "analytics.revenue", + """ CREATE TABLE analytics.revenue AS SELECT customer_email, SUM(amount) as total FROM staging.orders GROUP BY 1 - """), + """, + ), ] pipeline = Pipeline(queries, dialect="bigquery") @@ -1033,7 +1073,10 @@ from clgraph import Pipeline # Sample pipeline for examples queries = [ ("raw.orders", "CREATE TABLE raw.orders AS SELECT id, amount FROM source.orders"), - ("analytics.metrics", "CREATE TABLE analytics.metrics AS SELECT SUM(amount) as total FROM raw.orders"), + ( + "analytics.metrics", + "CREATE TABLE analytics.metrics AS SELECT SUM(amount) as total FROM raw.orders", + ), ] pipeline = Pipeline(queries, dialect="bigquery") @@ -1051,8 +1094,14 @@ from clgraph import Pipeline queries = [ ("raw.orders", "CREATE TABLE raw.orders AS SELECT id, amount FROM source.orders"), - ("staging.orders", "CREATE TABLE staging.orders AS SELECT id, amount FROM raw.orders WHERE amount > 0"), - ("analytics.metrics", "CREATE TABLE analytics.metrics AS SELECT SUM(amount) as total FROM staging.orders"), + ( + "staging.orders", + "CREATE TABLE staging.orders AS SELECT id, amount FROM raw.orders WHERE amount > 0", + ), + ( + "analytics.metrics", + "CREATE TABLE analytics.metrics AS SELECT SUM(amount) as total FROM staging.orders", + ), ] pipeline = Pipeline(queries, dialect="bigquery") @@ -1082,7 +1131,10 @@ from clgraph import Pipeline queries = [ ("raw.orders", "CREATE TABLE raw.orders AS SELECT id, amount FROM source.orders"), - ("analytics.metrics", "CREATE TABLE analytics.metrics AS SELECT SUM(amount) as total FROM raw.orders"), + ( + "analytics.metrics", + "CREATE TABLE analytics.metrics AS SELECT SUM(amount) as total FROM raw.orders", + ), ] pipeline = Pipeline(queries, dialect="bigquery") @@ -1091,7 +1143,9 @@ print(f"Columns: {len(pipeline.column_graph.columns)}") print(f"Edges: {len(pipeline.column_graph.edges)}") # Backward compatible access (property aliases) -print(f"pipeline.columns == pipeline.column_graph.columns: {pipeline.columns == pipeline.column_graph.columns}") +print( + f"pipeline.columns == pipeline.column_graph.columns: {pipeline.columns == pipeline.column_graph.columns}" +) # Get source columns (no incoming edges) source_cols = pipeline.column_graph.get_source_columns() @@ -1112,7 +1166,10 @@ from clgraph import Pipeline queries = [ ("raw.orders", "CREATE TABLE raw.orders AS SELECT id, amount FROM source.orders"), ("staging.orders", "CREATE TABLE staging.orders AS SELECT id, amount FROM raw.orders"), - ("analytics.metrics", "CREATE TABLE analytics.metrics AS SELECT SUM(amount) as total FROM staging.orders"), + ( + "analytics.metrics", + "CREATE TABLE analytics.metrics AS SELECT SUM(amount) as total FROM staging.orders", + ), ] pipeline = Pipeline(queries, dialect="bigquery") @@ -1125,10 +1182,7 @@ impacts = pipeline.trace_column_forward("raw.orders", "amount") print(f"Impacts of raw.orders.amount: {[i.full_name for i in impacts]}") # Find specific lineage path between two columns (returns edges) -path = pipeline.get_lineage_path( - "raw.orders", "amount", - "analytics.metrics", "total" -) +path = pipeline.get_lineage_path("raw.orders", "amount", "analytics.metrics", "total") if path: print(f"Path has {len(path)} edges") for edge in path: diff --git a/clgraph-simple-diagram.md b/clgraph-simple-diagram.md index 2a9081d..d9f0907 100644 --- a/clgraph-simple-diagram.md +++ b/clgraph-simple-diagram.md @@ -62,7 +62,7 @@ pipeline = Pipeline.from_sql_files("examples/sql_files/", dialect="duckdb") # 2. Pipeline object created automatically # 3. Access graphs -table_deps = pipeline.table_graph # Table dependencies +table_deps = pipeline.table_graph # Table dependencies col_lineage = pipeline.column_graph # Column lineage # 4. Use applications @@ -90,6 +90,7 @@ dag = pipeline.to_airflow_dag(executor=my_execute_sql, dag_id="my_pipeline") # LLM-powered descriptions (requires langchain) from langchain_openai import ChatOpenAI + pipeline.llm = ChatOpenAI() pipeline.generate_all_descriptions() ``` diff --git a/examples/sql_files/README.md b/examples/sql_files/README.md index aac8409..6de6e68 100644 --- a/examples/sql_files/README.md +++ b/examples/sql_files/README.md @@ -119,10 +119,12 @@ conn = duckdb.connect(":memory:") # Build pipeline pipeline = Pipeline(queries, dialect="duckdb") + # Define executor def execute_sql(sql: str): conn.execute(sql) + # Run pipeline in dependency order result = pipeline.run(executor=execute_sql, max_workers=1, verbose=True) diff --git a/pyproject.toml b/pyproject.toml index e03fd5c..caf9c7a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "clgraph" -version = "0.0.4" +version = "0.0.5" description = "Column lineage and pipeline dependency analysis for SQL" readme = "README.md" requires-python = ">=3.10" @@ -51,7 +51,7 @@ mcp = [ dev = [ "pytest>=7.0.0", "pytest-cov>=4.0.0", - "ruff>=0.6.0", + "ruff>=0.16.1,<0.17", "ty>=0.0.1a0", "jinja2>=3.0.0", "duckdb>=0.9.0", diff --git a/uv.lock b/uv.lock index 8b85d0c..e57f428 100644 --- a/uv.lock +++ b/uv.lock @@ -811,7 +811,7 @@ wheels = [ [[package]] name = "clgraph" -version = "0.0.4" +version = "0.0.5" source = { editable = "." } dependencies = [ { name = "graphviz" }, @@ -900,7 +900,7 @@ requires-dist = [ { name = "pytest", marker = "extra == 'dev'", specifier = ">=7.0.0" }, { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=4.0.0" }, { name = "rich", specifier = ">=13.0.0" }, - { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.6.0" }, + { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.16.1,<0.17" }, { name = "sqlglot", specifier = ">=28.0.0,<31.0.0" }, { name = "streamlit", marker = "extra == 'examples'", specifier = ">=1.28.0" }, { name = "twine", marker = "extra == 'build'", specifier = ">=4.0.0" }, @@ -4929,28 +4929,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.14.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/df/55/cccfca45157a2031dcbb5a462a67f7cf27f8b37d4b3b1cd7438f0f5c1df6/ruff-0.14.4.tar.gz", hash = "sha256:f459a49fe1085a749f15414ca76f61595f1a2cc8778ed7c279b6ca2e1fd19df3", size = 5587844, upload-time = "2025-11-06T22:07:45.033Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/17/b9/67240254166ae1eaa38dec32265e9153ac53645a6c6670ed36ad00722af8/ruff-0.14.4-py3-none-linux_armv6l.whl", hash = "sha256:e6604613ffbcf2297cd5dcba0e0ac9bd0c11dc026442dfbb614504e87c349518", size = 12606781, upload-time = "2025-11-06T22:07:01.841Z" }, - { url = "https://files.pythonhosted.org/packages/46/c8/09b3ab245d8652eafe5256ab59718641429f68681ee713ff06c5c549f156/ruff-0.14.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:d99c0b52b6f0598acede45ee78288e5e9b4409d1ce7f661f0fa36d4cbeadf9a4", size = 12946765, upload-time = "2025-11-06T22:07:05.858Z" }, - { url = "https://files.pythonhosted.org/packages/14/bb/1564b000219144bf5eed2359edc94c3590dd49d510751dad26202c18a17d/ruff-0.14.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:9358d490ec030f1b51d048a7fd6ead418ed0826daf6149e95e30aa67c168af33", size = 11928120, upload-time = "2025-11-06T22:07:08.023Z" }, - { url = "https://files.pythonhosted.org/packages/a3/92/d5f1770e9988cc0742fefaa351e840d9aef04ec24ae1be36f333f96d5704/ruff-0.14.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81b40d27924f1f02dfa827b9c0712a13c0e4b108421665322218fc38caf615c2", size = 12370877, upload-time = "2025-11-06T22:07:10.015Z" }, - { url = "https://files.pythonhosted.org/packages/e2/29/e9282efa55f1973d109faf839a63235575519c8ad278cc87a182a366810e/ruff-0.14.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f5e649052a294fe00818650712083cddc6cc02744afaf37202c65df9ea52efa5", size = 12408538, upload-time = "2025-11-06T22:07:13.085Z" }, - { url = "https://files.pythonhosted.org/packages/8e/01/930ed6ecfce130144b32d77d8d69f5c610e6d23e6857927150adf5d7379a/ruff-0.14.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa082a8f878deeba955531f975881828fd6afd90dfa757c2b0808aadb437136e", size = 13141942, upload-time = "2025-11-06T22:07:15.386Z" }, - { url = "https://files.pythonhosted.org/packages/6a/46/a9c89b42b231a9f487233f17a89cbef9d5acd538d9488687a02ad288fa6b/ruff-0.14.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:1043c6811c2419e39011890f14d0a30470f19d47d197c4858b2787dfa698f6c8", size = 14544306, upload-time = "2025-11-06T22:07:17.631Z" }, - { url = "https://files.pythonhosted.org/packages/78/96/9c6cf86491f2a6d52758b830b89b78c2ae61e8ca66b86bf5a20af73d20e6/ruff-0.14.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a9f3a936ac27fb7c2a93e4f4b943a662775879ac579a433291a6f69428722649", size = 14210427, upload-time = "2025-11-06T22:07:19.832Z" }, - { url = "https://files.pythonhosted.org/packages/71/f4/0666fe7769a54f63e66404e8ff698de1dcde733e12e2fd1c9c6efb689cb5/ruff-0.14.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:95643ffd209ce78bc113266b88fba3d39e0461f0cbc8b55fb92505030fb4a850", size = 13658488, upload-time = "2025-11-06T22:07:22.32Z" }, - { url = "https://files.pythonhosted.org/packages/ee/79/6ad4dda2cfd55e41ac9ed6d73ef9ab9475b1eef69f3a85957210c74ba12c/ruff-0.14.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:456daa2fa1021bc86ca857f43fe29d5d8b3f0e55e9f90c58c317c1dcc2afc7b5", size = 13354908, upload-time = "2025-11-06T22:07:24.347Z" }, - { url = "https://files.pythonhosted.org/packages/b5/60/f0b6990f740bb15c1588601d19d21bcc1bd5de4330a07222041678a8e04f/ruff-0.14.4-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:f911bba769e4a9f51af6e70037bb72b70b45a16db5ce73e1f72aefe6f6d62132", size = 13587803, upload-time = "2025-11-06T22:07:26.327Z" }, - { url = "https://files.pythonhosted.org/packages/c9/da/eaaada586f80068728338e0ef7f29ab3e4a08a692f92eb901a4f06bbff24/ruff-0.14.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:76158a7369b3979fa878612c623a7e5430c18b2fd1c73b214945c2d06337db67", size = 12279654, upload-time = "2025-11-06T22:07:28.46Z" }, - { url = "https://files.pythonhosted.org/packages/66/d4/b1d0e82cf9bf8aed10a6d45be47b3f402730aa2c438164424783ac88c0ed/ruff-0.14.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:f3b8f3b442d2b14c246e7aeca2e75915159e06a3540e2f4bed9f50d062d24469", size = 12357520, upload-time = "2025-11-06T22:07:31.468Z" }, - { url = "https://files.pythonhosted.org/packages/04/f4/53e2b42cc82804617e5c7950b7079d79996c27e99c4652131c6a1100657f/ruff-0.14.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c62da9a06779deecf4d17ed04939ae8b31b517643b26370c3be1d26f3ef7dbde", size = 12719431, upload-time = "2025-11-06T22:07:33.831Z" }, - { url = "https://files.pythonhosted.org/packages/a2/94/80e3d74ed9a72d64e94a7b7706b1c1ebaa315ef2076fd33581f6a1cd2f95/ruff-0.14.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5a443a83a1506c684e98acb8cb55abaf3ef725078be40237463dae4463366349", size = 13464394, upload-time = "2025-11-06T22:07:35.905Z" }, - { url = "https://files.pythonhosted.org/packages/54/1a/a49f071f04c42345c793d22f6cf5e0920095e286119ee53a64a3a3004825/ruff-0.14.4-py3-none-win32.whl", hash = "sha256:643b69cb63cd996f1fc7229da726d07ac307eae442dd8974dbc7cf22c1e18fff", size = 12493429, upload-time = "2025-11-06T22:07:38.43Z" }, - { url = "https://files.pythonhosted.org/packages/bc/22/e58c43e641145a2b670328fb98bc384e20679b5774258b1e540207580266/ruff-0.14.4-py3-none-win_amd64.whl", hash = "sha256:26673da283b96fe35fa0c939bf8411abec47111644aa9f7cfbd3c573fb125d2c", size = 13635380, upload-time = "2025-11-06T22:07:40.496Z" }, - { url = "https://files.pythonhosted.org/packages/30/bd/4168a751ddbbf43e86544b4de8b5c3b7be8d7167a2a5cb977d274e04f0a1/ruff-0.14.4-py3-none-win_arm64.whl", hash = "sha256:dd09c292479596b0e6fec8cd95c65c3a6dc68e9ad17b8f2382130f87ff6a75bb", size = 12663065, upload-time = "2025-11-06T22:07:42.603Z" }, +version = "0.16.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/70/25/7113f6d5498888c5fb7db34081cba7d5971c4cb1bfb26819966eee68f003/ruff-0.16.1.tar.gz", hash = "sha256:fedad7c801dabd3fb9741d76aca39246e6ddd9ca446a015875207bf19f1e6bc7", size = 4877500, upload-time = "2026-07-30T19:37:01.379Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/bd/694da69368e0973de65df2ddc73ab18d43c469d5963d9b150911de6bc513/ruff-0.16.1-py3-none-linux_armv6l.whl", hash = "sha256:58edb313b88f0c5460a26adf5f39a37a3be789494a15e3e411e35fa78b89f9a0", size = 10839126, upload-time = "2026-07-30T19:36:13.697Z" }, + { url = "https://files.pythonhosted.org/packages/3f/f0/b626e5d5bd0dd9576263658ef12885e2288afd1029a48e26ffed65ec1ac1/ruff-0.16.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:fde5a99e2f97479af66edd6622c6d5a2a7592c77cf4153d9e4428f5eeb55b60c", size = 11070253, upload-time = "2026-07-30T19:36:17.14Z" }, + { url = "https://files.pythonhosted.org/packages/83/63/f40acfb6b35b88623e71684942b552c3edd96035f5d98f313815f7b277de/ruff-0.16.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e0d4c20532fca4f7fa609369161d968dd28f65d83dabbd61d8e9c7edbf7001f6", size = 10561425, upload-time = "2026-07-30T19:36:20.04Z" }, + { url = "https://files.pythonhosted.org/packages/aa/dd/14ec0e9c2b4d315547dd38765004b4863e354e1b52cb308272215d9f6f6d/ruff-0.16.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30affbcedf59ad5703d9c91f82266e02b47739f797e1a7b6e158e5526a6dae38", size = 10948879, upload-time = "2026-07-30T19:36:22.476Z" }, + { url = "https://files.pythonhosted.org/packages/33/e9/9d870cbae575030fdef595f04b4b97573c525b5497cce4f4498cf2f85446/ruff-0.16.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:24e9c631573cbca9d20f1283f8f479b2afa4a8503504822bd71a293889f16743", size = 10643691, upload-time = "2026-07-30T19:36:24.914Z" }, + { url = "https://files.pythonhosted.org/packages/c4/09/12743d544e2173f53ecd27217c65f90d2bc0f8424a66a60339e56bbc0457/ruff-0.16.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b41bdd48fb420987a9b5212e4957c26ad4abce401fa9ea9d4d85843727945f4f", size = 11435354, upload-time = "2026-07-30T19:36:28.447Z" }, + { url = "https://files.pythonhosted.org/packages/7f/89/a1652b2daee52083c9554a6333b678a8b01d0400f976827bb87857f9449a/ruff-0.16.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b0d1e1393b7648079e13669de1c1f4fde06d4583e84d8fd5c1551e0a77a2aa75", size = 12259033, upload-time = "2026-07-30T19:36:31.326Z" }, + { url = "https://files.pythonhosted.org/packages/16/96/ecdcb8c54ee7b123b487f807eb014e6e019155a0b81dfb669acd52f28ce3/ruff-0.16.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07bf434b1c95f4e093be4532068ef4fcf00924eb2ade8796075980902d6fd54a", size = 11667981, upload-time = "2026-07-30T19:36:34.394Z" }, + { url = "https://files.pythonhosted.org/packages/cd/90/c52e12e0d862e9572f2a33aa227409143520abe53111e9a6babbac7b4af8/ruff-0.16.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39897739f112253ee4fdd2e8aa9a4f9ded99fb2be367d5f31dfa4ded6025584c", size = 11468183, upload-time = "2026-07-30T19:36:37.339Z" }, + { url = "https://files.pythonhosted.org/packages/2c/6b/4ffb7ad1d83eb16cf8cbb3c8815d3f11c88460fd162d4b372a2059be1c2a/ruff-0.16.1-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:82ae3c0c0d74daf17b968a10b7b3bb3ef297ab7de0c1f749646b25e690ccb150", size = 11470071, upload-time = "2026-07-30T19:36:39.91Z" }, + { url = "https://files.pythonhosted.org/packages/9c/72/32ae7db4c0b5e32ab611787caa19d1546800676d79f7483b7100a3561bf4/ruff-0.16.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4d5f2ed10f8242d83fc08d521301089364e3375375705356f20c0e31606ef3ef", size = 10919503, upload-time = "2026-07-30T19:36:42.65Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ca/3d901ba6ad6fc38da39c3448fc6c59ac945679293a17c3ceb6d6c1cba13e/ruff-0.16.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a4665b309891f83f3e3c25447935f1213e9abbd4b5640af7a1f2def9f8d413c1", size = 10649861, upload-time = "2026-07-30T19:36:45.18Z" }, + { url = "https://files.pythonhosted.org/packages/92/79/894ef1ced26552d5f8c9cf6d85b0687840e1128c55aeab7b9c2d54a0d880/ruff-0.16.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:26e9ca5c9bc3971f20d3cf18a957f52ffd6a5f6564ff15c4912a144dcac22494", size = 11148137, upload-time = "2026-07-30T19:36:47.936Z" }, + { url = "https://files.pythonhosted.org/packages/2d/69/3609a09fa1cb46cc28b762363e440a354204e5dff01bd0c8d7437874d6b9/ruff-0.16.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:67e1e1e3fa4f0c82f0e36d4cd61e661f6e7a6196cb1aa92fe0828fa7b8f257cd", size = 11559211, upload-time = "2026-07-30T19:36:50.448Z" }, + { url = "https://files.pythonhosted.org/packages/fc/8a/fb22af2fd78a736e241fabf67e30ce1799a64244026377a49e133af90762/ruff-0.16.1-py3-none-win32.whl", hash = "sha256:d31765e131295b8445caf301e3e8a85b34d1b9b211b4109b7ba457888b051806", size = 10838258, upload-time = "2026-07-30T19:36:53.298Z" }, + { url = "https://files.pythonhosted.org/packages/d4/35/e57fd9fb5d423961df087a00b12d42c0a830288dc2f3b45ecca299158b4f/ruff-0.16.1-py3-none-win_amd64.whl", hash = "sha256:09b05e8b90c2cb06ad63464350e7a45e8e44a2dfe52072ebfba6666ca8d3f596", size = 11961111, upload-time = "2026-07-30T19:36:56.107Z" }, + { url = "https://files.pythonhosted.org/packages/cb/46/240ea004bf6dc4feb40e9832f2205a476a47dd5b8a3f8211a5fc5f95e20e/ruff-0.16.1-py3-none-win_arm64.whl", hash = "sha256:dbaadaac38c70239f056d306b7476f246b0bf000fa6b3876402acbf5b227eaf8", size = 11309414, upload-time = "2026-07-30T19:36:58.79Z" }, ] [[package]]