test/integration/jw-pkg -> test/integration/jw_pkg

The mypy module names of the test tree derive from the full path, anchored
by the top-level test/__init__.py, but a file below a path component that
is not a valid identifier - the dashes in jw-pkg - falls back to the bare
file name, so two same-named test.py drivers collide (the duplicate module
error that drove the runme.py and main.py renames).

Rename the directory a sane Python name - jw_pkg, that's the better fix.
Then name the driver test.py like all the others for consistency.

Signed-off-by: Jan Lindemann <jan@janware.com>
This commit is contained in:
Jan Lindemann 2026-10-15 11:08:09 +02:00
commit 61c9479e79
Signed by: Jan Lindemann
GPG key ID: 3750640C9E25DD61
5 changed files with 0 additions and 0 deletions

View file

@ -0,0 +1,23 @@
TOPDIR = ../../../../..
OUTPUT = test-out.txt
REFERENCE = test-expected.txt
# Relative topdir keeps the rendered project paths relocatable; dropping the
# log position keeps the error output free of volatile line numbers.
TEST_CMD_ARGS = --topdir-format relative --log-flags prio,stderr
include $(TOPDIR)/make/proj.mk
include $(TOPDIR)/make/test-jw-pkg.mk
all:
$(OUTPUT): Makefile test.sh templates/basic.tmpl templates/list.tmpl
bash ./test.sh $(TEST_CMD_LINE) > $(OUTPUT).tmp 2>&1
diff $(REFERENCE) $(OUTPUT).tmp
mv $(OUTPUT).tmp $(OUTPUT)
test: $(OUTPUT)
clean: test.integration.in-tree.clean
test.integration.in-tree.clean:
rm -f $(OUTPUT) $(OUTPUT).tmp

View file

@ -0,0 +1,2 @@
name={name}
path={path}

View file

@ -0,0 +1 @@
start={items}end

View file

@ -0,0 +1,55 @@
============= Running: jw-pkg.py -t ../../../../.. --log-level info --topdir-format relative --log-flags prio,stderr projects create-file --format tmpl --template-name basic.tmpl --search-path templates --field name=foo jw-pkg
name=foo
path={path}
============= Running: jw-pkg.py -t ../../../../.. --log-level info --topdir-format relative --log-flags prio,stderr projects create-file --format tmpl --template-name list.tmpl --search-path templates --field items=a --field items=b jw-pkg
start=a,
start=bend
============= Running: jw-pkg.py -t ../../../../.. --log-level info --topdir-format relative --log-flags prio,stderr projects create-file --format tmpl --template-name list.tmpl --search-path templates --field items=a --field items=b --field-separator | jw-pkg
start=a|bend
============= Running: jw-pkg.py -t ../../../../.. --log-level info --topdir-format relative --log-flags prio,stderr projects create-file --format tmpl --template-name list.tmpl --search-path templates --field items=a --field items=b --field-separator %n jw-pkg
start=a
start=bend
============= Running: jw-pkg.py -t ../../../../.. --log-level info --topdir-format relative --log-flags prio,stderr projects create-file --format tmpl --template-name list.tmpl --search-path templates --field items=a --field items=b --quote --field-separator | jw-pkg
start="a"|"b"end
============= Running: jw-pkg.py -t ../../../../.. --log-level info --topdir-format relative --log-flags prio,stderr projects create-file --format tmpl --template-name basic.tmpl --search-path templates --field-keys name,path --field name=foo jw-pkg
name=foo
path=
============= Running: jw-pkg.py -t ../../../../.. --log-level info --topdir-format relative --log-flags prio,stderr projects create-file --format pyright --field base=./conf/project/pyrightconfig-base.json --field include=src/python jw-pkg
{
"extends": "./conf/project/pyrightconfig-base.json",
"include": [
"src/python"
],
"exclude": [
"**/__pycache__",
"**/.pytest_cache",
"**/.mypy_cache",
"**/.ruff_cache",
"**/.venv",
"**/build",
"**/dist"
],
"extraPaths": [
"src/python"
],
"typeCheckingMode": "basic",
"pythonPlatform": "Linux"
}
============= Running (expect failure): jw-pkg.py -t ../../../../.. --log-level info --topdir-format relative --log-flags prio,stderr projects create-file --format tmpl jw-pkg
<E> Failed: Can't render template without name
============= Exit status: 1
============= Running (expect failure): jw-pkg.py -t ../../../../.. --log-level info --topdir-format relative --log-flags prio,stderr projects create-file --format tmpl --template-name nosuch.tmpl --search-path templates jw-pkg
<E> Failed: Failed to find template "nosuch.tmpl"
============= Exit status: 1
============= Running (expect failure): jw-pkg.py -t ../../../../.. --log-level info --topdir-format relative --log-flags prio,stderr projects create-file --format tmpl --template-name basic.tmpl --search-path templates --field-keys name --field path=x jw-pkg
<E> Failed: The following keys in --field are not in --field-keys: path
============= Exit status: 1
============= Running (expect failure): jw-pkg.py -t ../../../../.. --log-level info --topdir-format relative --log-flags prio,stderr projects create-file --format pyright --field base=x --field include=y --field-separator | jw-pkg
<E> Failed: Unsupported separator for pyright config: "|"
============= Exit status: 1
============= Running (expect failure): jw-pkg.py -t ../../../../.. --log-level info --topdir-format relative --log-flags prio,stderr projects create-file --format bogus jw-pkg
jw-pkg.py projects create-file: error: argument --format: invalid choice: 'bogus' (choose from 'pyright', 'tmpl')
============= Exit status: 2
============= Running (expect failure): jw-pkg.py -t ../../../../.. --log-level info --topdir-format relative --log-flags prio,stderr projects create-file --format tmpl --template-name basic.tmpl --search-path templates --field noval jw-pkg
jw-pkg.py projects create-file: error: argument -f/--field: Expected KEY=VALUE
============= Exit status: 2

View file

@ -0,0 +1,108 @@
#!/bin/bash
# shellcheck disable=SC2048,SC2086
# Unquoted $* is intentional — the jw-pkg command line
export LC_ALL="C"
set -euo pipefail
jw_pkg_py="$*"
# Print a header and run a command whose output is part of the expected
# result. Under `set -e` a non-zero exit aborts the test.
run()
{
local log_cmd
# shellcheck disable=SC2001
log_cmd=$(echo "$*" | sed 's|.*python3[0-9.]*\s\+\(\.\.\/\)*scripts/||')
printf '============= Running: %s\n' "$log_cmd"
"$@"
}
# Run a command that must exit non-zero and report the given message. Prints
# the command, the resulting error message, and the observed exit status.
# Fails the test if the command unexpectedly succeeds or the message is
# missing. Only the last output line is shown: for the app-level errors it is
# the error itself, and for argparse rejections it is the error line, which
# keeps the expected file free of the volatile usage text.
expect_fail()
{
local expected out rc log_cmd
expected=$1
shift
# shellcheck disable=SC2001
log_cmd=$(echo "$*" | sed 's|.*python3[0-9.]*\s\+\(\.\.\/\)*scripts/||')
printf '============= Running (expect failure): %s\n' "$log_cmd"
set +e
out=$("$@" 2>&1)
rc=$?
set -e
printf '%s\n' "$(tail -n 1 <<<"$out")"
printf '============= Exit status: %s\n' "$rc"
if [ "$rc" -eq 0 ]; then
echo "ERROR: expected failure, but the command succeeded" >&2
return 1
fi
if ! grep -qF -- "$expected" <<<"$out"; then
echo "ERROR: expected message not found: $expected" >&2
return 1
fi
}
cmd_test()
{
# -- tmpl: substitute a field; a marker without a value stays literal
run $jw_pkg_py projects create-file --format tmpl \
--template-name basic.tmpl --search-path templates \
--field name=foo jw-pkg
# -- tmpl: multi-value field, default separator (comma, newline)
run $jw_pkg_py projects create-file --format tmpl \
--template-name list.tmpl --search-path templates \
--field items=a --field items=b jw-pkg
# -- tmpl: multi-value field, custom separator
run $jw_pkg_py projects create-file --format tmpl \
--template-name list.tmpl --search-path templates \
--field items=a --field items=b --field-separator '|' jw-pkg
# -- tmpl: multi-value field, "%n" separator
run $jw_pkg_py projects create-file --format tmpl \
--template-name list.tmpl --search-path templates \
--field items=a --field items=b --field-separator '%n' jw-pkg
# -- tmpl: multi-value field, quoted values
run $jw_pkg_py projects create-file --format tmpl \
--template-name list.tmpl --search-path templates \
--field items=a --field items=b --quote --field-separator '|' jw-pkg
# -- tmpl: --field-keys adds keys that were not passed as empty fields
run $jw_pkg_py projects create-file --format tmpl \
--template-name basic.tmpl --search-path templates \
--field-keys name,path --field name=foo jw-pkg
# -- pyright: built-in template, extra paths from project metadata
run $jw_pkg_py projects create-file --format pyright \
--field base=./conf/project/pyrightconfig-base.json \
--field include=src/python jw-pkg
# -- errors
expect_fail "Can't render template without name" \
$jw_pkg_py projects create-file --format tmpl jw-pkg
expect_fail 'Failed to find template "nosuch.tmpl"' \
$jw_pkg_py projects create-file --format tmpl \
--template-name nosuch.tmpl --search-path templates jw-pkg
expect_fail "not in --field-keys: path" \
$jw_pkg_py projects create-file --format tmpl \
--template-name basic.tmpl --search-path templates \
--field-keys name --field path=x jw-pkg
expect_fail 'Unsupported separator for pyright config: "|"' \
$jw_pkg_py projects create-file --format pyright \
--field base=x --field include=y --field-separator '|' jw-pkg
expect_fail "invalid choice: 'bogus'" \
$jw_pkg_py projects create-file --format bogus jw-pkg
expect_fail "Expected KEY=VALUE" \
$jw_pkg_py projects create-file --format tmpl \
--template-name basic.tmpl --search-path templates --field noval jw-pkg
}
cmd_test