mirror of
https://github.com/simonw/sqlite-utils.git
synced 2026-09-29 13:24:12 +02:00
Honor --no-headers for --fmt and --table output (#566)
`--no-headers` was only applied to `--csv`/`--tsv` output. For the tabulate formats (`--fmt ...` and `-t`/`--table`) the flag was silently ignored, so `sqlite-utils query db "select ..." --fmt plain --no-headers` still printed the column-name header row. Both `tabulate.tabulate(...)` call sites (the `query`/`memory` output and the `rows`/`tables` output) now pass `headers=()` when `--no-headers` is set, which suppresses the header row across every tabulate format while leaving the default (headers shown) untouched. The CSV/TSV behaviour is unchanged. Also clarifies the `--no-headers` help text, which previously said "Omit CSV headers", and regenerates docs/cli-reference.rst via cog to match. Adds test_output_table_no_headers covering --fmt simple, -t and --fmt github for both the query and rows commands. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
8f0c06e188
commit
de2601c42f
3 changed files with 67 additions and 11 deletions
|
|
@ -115,7 +115,7 @@ See :ref:`cli_query`.
|
||||||
--arrays Output rows as arrays instead of objects
|
--arrays Output rows as arrays instead of objects
|
||||||
--csv Output CSV
|
--csv Output CSV
|
||||||
--tsv Output TSV
|
--tsv Output TSV
|
||||||
--no-headers Omit CSV headers
|
--no-headers Omit headers from CSV/TSV and table/--fmt output
|
||||||
-t, --table Output as a formatted table
|
-t, --table Output as a formatted table
|
||||||
--fmt TEXT Table format - one of asciidoc, colon_grid,
|
--fmt TEXT Table format - one of asciidoc, colon_grid,
|
||||||
double_grid, double_outline, fancy_grid,
|
double_grid, double_outline, fancy_grid,
|
||||||
|
|
@ -184,7 +184,7 @@ See :ref:`cli_memory`.
|
||||||
--arrays Output rows as arrays instead of objects
|
--arrays Output rows as arrays instead of objects
|
||||||
--csv Output CSV
|
--csv Output CSV
|
||||||
--tsv Output TSV
|
--tsv Output TSV
|
||||||
--no-headers Omit CSV headers
|
--no-headers Omit headers from CSV/TSV and table/--fmt output
|
||||||
-t, --table Output as a formatted table
|
-t, --table Output as a formatted table
|
||||||
--fmt TEXT Table format - one of asciidoc, colon_grid,
|
--fmt TEXT Table format - one of asciidoc, colon_grid,
|
||||||
double_grid, double_outline, fancy_grid,
|
double_grid, double_outline, fancy_grid,
|
||||||
|
|
@ -423,7 +423,7 @@ See :ref:`cli_search`.
|
||||||
--arrays Output rows as arrays instead of objects
|
--arrays Output rows as arrays instead of objects
|
||||||
--csv Output CSV
|
--csv Output CSV
|
||||||
--tsv Output TSV
|
--tsv Output TSV
|
||||||
--no-headers Omit CSV headers
|
--no-headers Omit headers from CSV/TSV and table/--fmt output
|
||||||
-t, --table Output as a formatted table
|
-t, --table Output as a formatted table
|
||||||
--fmt TEXT Table format - one of asciidoc, colon_grid,
|
--fmt TEXT Table format - one of asciidoc, colon_grid,
|
||||||
double_grid, double_outline, fancy_grid, fancy_outline,
|
double_grid, double_outline, fancy_grid, fancy_outline,
|
||||||
|
|
@ -689,7 +689,7 @@ See :ref:`cli_tables`.
|
||||||
--arrays Output rows as arrays instead of objects
|
--arrays Output rows as arrays instead of objects
|
||||||
--csv Output CSV
|
--csv Output CSV
|
||||||
--tsv Output TSV
|
--tsv Output TSV
|
||||||
--no-headers Omit CSV headers
|
--no-headers Omit headers from CSV/TSV and table/--fmt output
|
||||||
-t, --table Output as a formatted table
|
-t, --table Output as a formatted table
|
||||||
--fmt TEXT Table format - one of asciidoc, colon_grid,
|
--fmt TEXT Table format - one of asciidoc, colon_grid,
|
||||||
double_grid, double_outline, fancy_grid, fancy_outline,
|
double_grid, double_outline, fancy_grid, fancy_outline,
|
||||||
|
|
@ -731,7 +731,7 @@ See :ref:`cli_views`.
|
||||||
--arrays Output rows as arrays instead of objects
|
--arrays Output rows as arrays instead of objects
|
||||||
--csv Output CSV
|
--csv Output CSV
|
||||||
--tsv Output TSV
|
--tsv Output TSV
|
||||||
--no-headers Omit CSV headers
|
--no-headers Omit headers from CSV/TSV and table/--fmt output
|
||||||
-t, --table Output as a formatted table
|
-t, --table Output as a formatted table
|
||||||
--fmt TEXT Table format - one of asciidoc, colon_grid,
|
--fmt TEXT Table format - one of asciidoc, colon_grid,
|
||||||
double_grid, double_outline, fancy_grid, fancy_outline,
|
double_grid, double_outline, fancy_grid, fancy_outline,
|
||||||
|
|
@ -778,7 +778,7 @@ See :ref:`cli_rows`.
|
||||||
--arrays Output rows as arrays instead of objects
|
--arrays Output rows as arrays instead of objects
|
||||||
--csv Output CSV
|
--csv Output CSV
|
||||||
--tsv Output TSV
|
--tsv Output TSV
|
||||||
--no-headers Omit CSV headers
|
--no-headers Omit headers from CSV/TSV and table/--fmt output
|
||||||
-t, --table Output as a formatted table
|
-t, --table Output as a formatted table
|
||||||
--fmt TEXT Table format - one of asciidoc, colon_grid,
|
--fmt TEXT Table format - one of asciidoc, colon_grid,
|
||||||
double_grid, double_outline, fancy_grid,
|
double_grid, double_outline, fancy_grid,
|
||||||
|
|
@ -818,7 +818,7 @@ See :ref:`cli_triggers`.
|
||||||
--arrays Output rows as arrays instead of objects
|
--arrays Output rows as arrays instead of objects
|
||||||
--csv Output CSV
|
--csv Output CSV
|
||||||
--tsv Output TSV
|
--tsv Output TSV
|
||||||
--no-headers Omit CSV headers
|
--no-headers Omit headers from CSV/TSV and table/--fmt output
|
||||||
-t, --table Output as a formatted table
|
-t, --table Output as a formatted table
|
||||||
--fmt TEXT Table format - one of asciidoc, colon_grid,
|
--fmt TEXT Table format - one of asciidoc, colon_grid,
|
||||||
double_grid, double_outline, fancy_grid, fancy_outline,
|
double_grid, double_outline, fancy_grid, fancy_outline,
|
||||||
|
|
@ -858,7 +858,7 @@ See :ref:`cli_indexes`.
|
||||||
--arrays Output rows as arrays instead of objects
|
--arrays Output rows as arrays instead of objects
|
||||||
--csv Output CSV
|
--csv Output CSV
|
||||||
--tsv Output TSV
|
--tsv Output TSV
|
||||||
--no-headers Omit CSV headers
|
--no-headers Omit headers from CSV/TSV and table/--fmt output
|
||||||
-t, --table Output as a formatted table
|
-t, --table Output as a formatted table
|
||||||
--fmt TEXT Table format - one of asciidoc, colon_grid,
|
--fmt TEXT Table format - one of asciidoc, colon_grid,
|
||||||
double_grid, double_outline, fancy_grid, fancy_outline,
|
double_grid, double_outline, fancy_grid, fancy_outline,
|
||||||
|
|
|
||||||
|
|
@ -107,7 +107,11 @@ def output_options(fn):
|
||||||
),
|
),
|
||||||
click.option("--csv", is_flag=True, help="Output CSV"),
|
click.option("--csv", is_flag=True, help="Output CSV"),
|
||||||
click.option("--tsv", is_flag=True, help="Output TSV"),
|
click.option("--tsv", is_flag=True, help="Output TSV"),
|
||||||
click.option("--no-headers", is_flag=True, help="Omit CSV headers"),
|
click.option(
|
||||||
|
"--no-headers",
|
||||||
|
is_flag=True,
|
||||||
|
help="Omit headers from CSV/TSV and table/--fmt output",
|
||||||
|
),
|
||||||
click.option(
|
click.option(
|
||||||
"-t", "--table", is_flag=True, help="Output as a formatted table"
|
"-t", "--table", is_flag=True, help="Output as a formatted table"
|
||||||
),
|
),
|
||||||
|
|
@ -236,7 +240,13 @@ def tables(
|
||||||
yield row
|
yield row
|
||||||
|
|
||||||
if table or fmt:
|
if table or fmt:
|
||||||
print(tabulate.tabulate(_iter(), headers=headers, tablefmt=fmt or "simple"))
|
print(
|
||||||
|
tabulate.tabulate(
|
||||||
|
_iter(),
|
||||||
|
headers=() if no_headers else headers,
|
||||||
|
tablefmt=fmt or "simple",
|
||||||
|
)
|
||||||
|
)
|
||||||
elif csv or tsv:
|
elif csv or tsv:
|
||||||
writer = csv_std.writer(sys.stdout, dialect="excel-tab" if tsv else "excel")
|
writer = csv_std.writer(sys.stdout, dialect="excel-tab" if tsv else "excel")
|
||||||
if not no_headers:
|
if not no_headers:
|
||||||
|
|
@ -2139,7 +2149,9 @@ def _execute_query(
|
||||||
elif fmt or table:
|
elif fmt or table:
|
||||||
print(
|
print(
|
||||||
tabulate.tabulate(
|
tabulate.tabulate(
|
||||||
list(cursor), headers=headers, tablefmt=fmt or "simple"
|
list(cursor),
|
||||||
|
headers=() if no_headers else headers,
|
||||||
|
tablefmt=fmt or "simple",
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif csv or tsv:
|
elif csv or tsv:
|
||||||
|
|
|
||||||
|
|
@ -195,6 +195,50 @@ def test_output_table(db_path, options, expected):
|
||||||
assert expected == result.output.strip()
|
assert expected == result.output.strip()
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
"fmt_option", [["--fmt", "simple"], ["-t"], ["--fmt", "github"]]
|
||||||
|
)
|
||||||
|
def test_output_table_no_headers(db_path, fmt_option):
|
||||||
|
# --no-headers should omit the header row from --fmt/--table output too, not
|
||||||
|
# just from --csv/--tsv (#566). Previously the flag was silently ignored for
|
||||||
|
# tabulate formats and the column names were always printed.
|
||||||
|
db = Database(db_path)
|
||||||
|
with db.conn:
|
||||||
|
db["dogs"].insert_all(
|
||||||
|
[
|
||||||
|
{"id": 1, "name": "Cleo", "age": 4},
|
||||||
|
{"id": 2, "name": "Pancakes", "age": 2},
|
||||||
|
]
|
||||||
|
)
|
||||||
|
sql = "select id, name, age from dogs order by id"
|
||||||
|
|
||||||
|
with_headers = CliRunner().invoke(cli.cli, ["query", db_path, sql] + fmt_option)
|
||||||
|
without_headers = CliRunner().invoke(
|
||||||
|
cli.cli, ["query", db_path, sql] + fmt_option + ["--no-headers"]
|
||||||
|
)
|
||||||
|
assert with_headers.exit_code == 0
|
||||||
|
assert without_headers.exit_code == 0
|
||||||
|
|
||||||
|
# The column names appear when headers are shown, and must not appear at all
|
||||||
|
# once --no-headers is passed.
|
||||||
|
assert "name" in with_headers.output
|
||||||
|
for header in ("id", "name", "age"):
|
||||||
|
assert (
|
||||||
|
header not in without_headers.output
|
||||||
|
), f"header {header!r} leaked into --no-headers output"
|
||||||
|
# The data is still all present.
|
||||||
|
for value in ("Cleo", "Pancakes", "1", "2", "4"):
|
||||||
|
assert value in without_headers.output
|
||||||
|
|
||||||
|
# The rows command shares the same code path.
|
||||||
|
rows_no_headers = CliRunner().invoke(
|
||||||
|
cli.cli, ["rows", db_path, "dogs"] + fmt_option + ["--no-headers"]
|
||||||
|
)
|
||||||
|
assert rows_no_headers.exit_code == 0
|
||||||
|
assert "name" not in rows_no_headers.output
|
||||||
|
assert "Cleo" in rows_no_headers.output
|
||||||
|
|
||||||
|
|
||||||
def test_create_index(db_path):
|
def test_create_index(db_path):
|
||||||
db = Database(db_path)
|
db = Database(db_path)
|
||||||
assert [] == db["Gosh"].indexes
|
assert [] == db["Gosh"].indexes
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue