ripple-sql 0.1.8__tar.gz → 0.1.10__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/CHANGELOG.md +13 -1
  2. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/PKG-INFO +3 -3
  3. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/README.md +2 -2
  4. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/pyproject.toml +1 -1
  5. ripple_sql-0.1.10/src/ripple/check_file.py +627 -0
  6. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/cli.py +27 -23
  7. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/engine/cte_tracing.py +1 -1
  8. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/loaders/dbt_config.py +17 -8
  9. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/loaders/identity.py +41 -10
  10. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/loaders/types.py +3 -0
  11. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/project.py +9 -1
  12. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/render_shims.py +2 -2
  13. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/static/answer.css +89 -82
  14. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/static/answer.html +6 -4
  15. ripple_sql-0.1.8/src/ripple/check_file.py +0 -336
  16. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/.gitignore +0 -0
  17. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/LICENSE +0 -0
  18. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/__init__.py +0 -0
  19. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/answer.py +0 -0
  20. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/answer_page.py +0 -0
  21. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/cache.py +0 -0
  22. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/ci.py +0 -0
  23. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/ci_signature.py +0 -0
  24. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/doctor.py +0 -0
  25. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/engine/__init__.py +0 -0
  26. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/engine/budget.py +0 -0
  27. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/engine/column_lineage.py +0 -0
  28. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/engine/column_ref.py +0 -0
  29. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/engine/dependencies.py +0 -0
  30. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/engine/dialect.py +0 -0
  31. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/engine/dispatch.py +0 -0
  32. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/engine/extraction.py +0 -0
  33. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/engine/generators.py +0 -0
  34. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/engine/jinja.py +0 -0
  35. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/engine/json_sources.py +0 -0
  36. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/engine/macro_source.py +0 -0
  37. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/engine/pipeline.py +0 -0
  38. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/engine/preprocess.py +0 -0
  39. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/engine/safe_gen.py +0 -0
  40. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/engine/schema_qualification.py +0 -0
  41. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/engine/scope.py +0 -0
  42. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/engine/select_sources.py +0 -0
  43. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/engine/sql_script.py +0 -0
  44. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/engine/statement.py +0 -0
  45. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/engine/tech_debt.py +0 -0
  46. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/engine/tsql_catalog.py +0 -0
  47. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/engine/tsql_scalar_vars.py +0 -0
  48. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/engine/tsql_tvf.py +0 -0
  49. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/engine/tsql_xml.py +0 -0
  50. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/engine/types.py +0 -0
  51. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/engine/unused_deps.py +0 -0
  52. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/engine/validation.py +0 -0
  53. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/graph.py +0 -0
  54. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/home.py +0 -0
  55. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/loaders/__init__.py +0 -0
  56. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/loaders/dbt.py +0 -0
  57. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/loaders/sidecar.py +0 -0
  58. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/loaders/sqldir.py +0 -0
  59. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/lookml.py +0 -0
  60. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/mcp_server.py +0 -0
  61. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/names.py +0 -0
  62. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/py.typed +0 -0
  63. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/render.py +0 -0
  64. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/schemas.py +0 -0
  65. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/semantic.py +0 -0
  66. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/server.py +0 -0
  67. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/sourcefiles.py +0 -0
  68. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/star_resolution.py +0 -0
  69. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/static/answer_twin.js +0 -0
  70. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/static/explore.js +0 -0
  71. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/static/find.js +0 -0
  72. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/static/focus.js +0 -0
  73. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/usage/__init__.py +0 -0
  74. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/usage/cli.py +0 -0
  75. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/usage/collect.py +0 -0
  76. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/usage/discover.py +0 -0
  77. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/usage/ingest.py +0 -0
  78. {ripple_sql-0.1.8 → ripple_sql-0.1.10}/src/ripple/usage/report.py +0 -0
@@ -6,6 +6,16 @@ Notable changes to Ripple. The format follows
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.1.10] - 2026-09-15
10
+
11
+ ### Changed
12
+ - The answer page and `ripple serve` home read as one instrument. Panels sit on a hairline shadow instead of a drawn box. A faint dot grid runs under the graph and under nothing else. Every count beside a name is set in tabular monospace at one size. The wires touching the chosen model carry the accent and the rest recede. Type sits on five sizes (title, prose, the question box, labels, counts); the small text is darker so it reads at 4.5:1; the header counts carry a thousands separator. Motion has two durations, 150 ms for hover and 240 ms for entering, ease-out, on transform and opacity only.
13
+
14
+ ## [0.1.9] - 2026-09-15
15
+
16
+ ### Changed
17
+ - `ripple check-file` no longer needs the table's name in the common case. A file binds to the table its own columns name when they say it clearly: at least two of them are one table's, they are most of the file's columns, and no other table matches as many ("matched by 4 of 5 column names"). `--source` takes the bare table name when one schema has it (`--source vendor_feed`); a name two schemas share is refused with both spellings. When two tables fit a file equally, or none does, the command lists the tables with declared columns and stops with exit 2, never picking one. `--source` and a declared `files:` pattern still come first. A review of the command's edge cases also fixed: a column read only in a where clause or a join now counts as read; a reader the graph only sees through select star counts instead of vanishing; long chains are counted whole; an xlsx is read by the workbook's own sheet order, streamed no further than its first row, with rich text joined and empty cells kept as positions; tab-separated `.txt` and semicolon `.csv` files are read by their delimiter; a file that is not UTF-8 asks for `--encoding`; an unclosed quote, a duplicated header name, a DOCTYPE in the XML, a broken xlsx part, a pyarrow older than 14.0.1 and a broken `ripple.yml` are each a plain message with exit 2; a folder pattern (`incoming/*.csv`) matches the file's path; two patterns that name two tables are refused; `--source` never reads the pattern map; a missing file, a folder, and a project that cannot load give the same JSON shape as any other failure.
18
+
9
19
  ## [0.1.8] - 2026-09-15
10
20
 
11
21
  ### Added
@@ -270,7 +280,9 @@ First public release.
270
280
  ### Removed
271
281
  - The dark whole-graph canvas that `ripple serve` used to open (`static/index.html`). Every surface now draws one answer.
272
282
 
273
- [Unreleased]: https://github.com/bteh/ripple/compare/v0.1.8...HEAD
283
+ [Unreleased]: https://github.com/bteh/ripple/compare/v0.1.10...HEAD
284
+ [0.1.10]: https://github.com/bteh/ripple/releases/tag/v0.1.10
285
+ [0.1.9]: https://github.com/bteh/ripple/releases/tag/v0.1.9
274
286
  [0.1.8]: https://github.com/bteh/ripple/releases/tag/v0.1.8
275
287
  [0.1.7]: https://github.com/bteh/ripple/releases/tag/v0.1.7
276
288
  [0.1.6]: https://github.com/bteh/ripple/releases/tag/v0.1.6
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: ripple-sql
3
- Version: 0.1.8
3
+ Version: 0.1.10
4
4
  Summary: Offline column-level SQL lineage. See what breaks before you merge.
5
5
  Project-URL: Homepage, https://github.com/bteh/ripple
6
6
  Project-URL: Repository, https://github.com/bteh/ripple
@@ -240,7 +240,7 @@ Stop: 2 columns that 4 models read are missing from this file. (exit 1)
240
240
 
241
241
  The first line and the last are the same sentence, so the vendor's screenshot and the engineer's scrolled terminal both end on the verdict. Exit 0 means nothing downstream changes (a new column nobody reads is fine), 1 means something breaks, 2 means the check could not run. Header only: no data row is read and nothing leaves the machine.
242
242
 
243
- The file finds its table through `--source raw.vendor_feed`, or through a pattern the project declares once:
243
+ The file finds its table by its own columns when they say it clearly (most of them belong to one table and no other table comes close: "matched by 4 of 5 column names"), by `--source vendor_feed` (the bare table name is enough when one schema has it), or by a pattern the project declares once:
244
244
 
245
245
  ```yaml
246
246
  sources:
@@ -255,7 +255,7 @@ sources:
255
255
  - name: customer_name
256
256
  ```
257
257
 
258
- A plain SQL folder keeps the same map in `ripple.yml` (`files: {"vendor_feed_*.csv": raw.vendor_feed}`). The table's declared columns are the contract: `columns:` in sources.yml, a seed, or a list from `ripple ingest-schema`. Reads csv, tsv, xlsx and parquet (parquet needs pyarrow installed). `--json` carries the same facts for an ingest job.
258
+ A plain SQL folder keeps the same map in `ripple.yml` (`files: {"vendor_feed_*.csv": raw.vendor_feed}`). When two tables fit the file equally, or none does, the command lists the tables it can check and stops with exit 2 rather than pick one. The table's declared columns are the contract: `columns:` in sources.yml, a seed, or a list from `ripple ingest-schema`. Reads csv, tsv, xlsx and parquet (parquet needs pyarrow 14.0.1 or newer). A file that is not UTF-8 takes `--encoding cp1252`. `--json` carries the same facts for an ingest job, in the same shape whether the check ran or could not.
259
259
 
260
260
  ## Bring your query history (optional)
261
261
 
@@ -200,7 +200,7 @@ Stop: 2 columns that 4 models read are missing from this file. (exit 1)
200
200
 
201
201
  The first line and the last are the same sentence, so the vendor's screenshot and the engineer's scrolled terminal both end on the verdict. Exit 0 means nothing downstream changes (a new column nobody reads is fine), 1 means something breaks, 2 means the check could not run. Header only: no data row is read and nothing leaves the machine.
202
202
 
203
- The file finds its table through `--source raw.vendor_feed`, or through a pattern the project declares once:
203
+ The file finds its table by its own columns when they say it clearly (most of them belong to one table and no other table comes close: "matched by 4 of 5 column names"), by `--source vendor_feed` (the bare table name is enough when one schema has it), or by a pattern the project declares once:
204
204
 
205
205
  ```yaml
206
206
  sources:
@@ -215,7 +215,7 @@ sources:
215
215
  - name: customer_name
216
216
  ```
217
217
 
218
- A plain SQL folder keeps the same map in `ripple.yml` (`files: {"vendor_feed_*.csv": raw.vendor_feed}`). The table's declared columns are the contract: `columns:` in sources.yml, a seed, or a list from `ripple ingest-schema`. Reads csv, tsv, xlsx and parquet (parquet needs pyarrow installed). `--json` carries the same facts for an ingest job.
218
+ A plain SQL folder keeps the same map in `ripple.yml` (`files: {"vendor_feed_*.csv": raw.vendor_feed}`). When two tables fit the file equally, or none does, the command lists the tables it can check and stops with exit 2 rather than pick one. The table's declared columns are the contract: `columns:` in sources.yml, a seed, or a list from `ripple ingest-schema`. Reads csv, tsv, xlsx and parquet (parquet needs pyarrow 14.0.1 or newer). A file that is not UTF-8 takes `--encoding cp1252`. `--json` carries the same facts for an ingest job, in the same shape whether the check ran or could not.
219
219
 
220
220
  ## Bring your query history (optional)
221
221
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ripple-sql"
3
- version = "0.1.8"
3
+ version = "0.1.10"
4
4
  description = "Offline column-level SQL lineage. See what breaks before you merge."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"