timsaucer opened a new issue, #1727:
URL: https://github.com/apache/datafusion-python/issues/1727

   Neither `datafusion-ffi-example` nor `datafusion-ffi-query-planner-example` 
has a script you can run. They are 51 and 47 pytest assertions respectively. 
Meanwhile `user-guide/data-sources.md:219` calls the first one a **"user 
example"** and sends Python users there from the user guide, and 
`io/table_provider.md:30` calls it "a complete example". We promise a runnable 
example and deliver a test suite.
   
   **Precedent:** `examples/tpch/` — the script is the artifact and a pytest 
keeps it honest. CI already runs `pytest python/tests/_test*.py` in each crate 
directory (`test.yml:136-150`), so a driver test needs **zero workflow 
changes**.
   
   Layout per crate: `run_demo.py` at the tree root, parallel to the existing 
`examples/distributed/run_tpch.py`, and a driver at 
`python/tests/_test_run_demo.py` that runs it via 
`subprocess.run([sys.executable, script])` and asserts on anchor lines. 
Subprocess rather than `import_module` or `runpy`, because it proves the thing 
being asked for: that it runs standalone with no pytest around it.
   
   Each script should open with an import guard that turns the one real failure 
mode into an instruction rather than a traceback:
   
   ```python
   try:
       from datafusion_ffi_example import MyTableProvider
   except ImportError:
       sys.exit("build the extension first:\n  uv run maturin develop\nSee 
README.md.")
   ```
   
   - [ ] **`datafusion-ffi-example/run_demo.py`** — walk the conformance matrix 
in numbered sections: table provider, functions, catalog provider, config 
extension, codec round-trip, then *the same bytes decoded a second time*. That 
last section is only truthful after the logical-codec sub-issue lands, and it 
is the one place in the repository where the guide's central rule is 
demonstrated rather than asserted.
   - [ ] **`datafusion-ffi-query-planner-example/run_demo.py`** — print plans, 
not rows. Planner nesting is understood by seeing the indented tree, and the 
existing tests assert on plan strings they never show. Cover the logical plan 
handed to the planner, the physical plan returned, the effect of `SET 
ffi_query_planner.max_rows`, and two planners nesting. Use `.display_indent()`.
   - [ ] **`Role:` header on each tree's README**, so the label survives the 
click from `examples/README.md`, which already distinguishes the trees but 
loses the distinction as soon as you follow the link. Three lines: what this 
tree is, where to go if you are learning the protocol, and how to run it.
   
   **Scope note:** make them runnable, but do not promise 
`datafusion-ffi-example` reads as a tutorial. It is a coverage matrix — 
`.ai/skills/check-upstream/SKILL.md:455` instructs adding every new FFI type to 
it — so it grows under protocol pressure rather than narrative need. The 
planner crate is single-topic and can carry the stronger claim.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to