cmds.projects.CmdCreateFile: Add --field-separator option

List values in a rendered template are joined with a fixed separator of
",\n" (comma plus newline), and there is no way to change that. Templates
sometimes want a different separator, e.g. a plain newline or a single-line
comma-separated list.

Add a --field-separator option that controls how list values are joined
in the rendered output. %n expands to a newline, and the default remains
",\n" for both formats. render_tmpl() applies the separator to the rendered
template, while render_pyright() rejects any other value: the built-in
pyrightconfig.json template is a fixed JSON document, and no alternative
separator is supported for it.

Update the help output test expectation accordingly.

Assisted-by: unsloth/Qwen3.8-27B-GGUF:Q4_K_M with pi.dev v0.85.1
Signed-off-by: Jan Lindemann <jan@janware.com>
This commit is contained in:
Jan Lindemann 2026-09-12 19:33:54 +02:00
commit 1349665c39
Signed by: Jan Lindemann
GPG key ID: 3750640C9E25DD61
4 changed files with 76 additions and 8 deletions

View file

@ -55,32 +55,56 @@ class CmdCreateFile(Cmd): # export
p = 'render_'
return [name.removeprefix(p) for name in dir(self) if name.startswith(p)]
def __format_separator(self, separator: str | None, default: str) -> str:
if separator is None:
return default
format_chars = {
'%n': '\n',
}
for src, dst in format_chars.items():
separator = separator.replace(src, dst)
return separator
def __render(
self,
template_name: str,
values: list[RenderValues],
li_quote: bool = False,
li_delimiter: str = '\n',
li_separator: str = '\n',
) -> str:
return tmpl_render(
template_name,
values,
li_quote = li_quote,
li_delimiter = li_delimiter,
li_delimiter = li_separator,
search_path = self.app.args.search_path.split(':'),
)
def render_tmpl(self, module: str, extra_fields: RenderValues) -> str:
def render_tmpl(
self,
module: str,
extra_fields: RenderValues,
separator: str | None,
) -> str:
template_name = self.app.args.template_name
if template_name is None:
raise Exception('Can\'t render template without name')
return self.__render(
template_name, [extra_fields],
template_name,
[extra_fields],
li_quote = self.app.args.quote,
li_delimiter = ',\n'
li_separator = self.__format_separator(separator, ',\n'),
)
def render_pyright(self, module: str, extra_fields: RenderValues) -> str:
def render_pyright(
self,
module: str,
extra_fields: RenderValues,
separator: str | None,
) -> str:
separator = self.__format_separator(separator, ',\n')
if separator != ',\n':
raise Exception(f'Unsupported separator for pyright config: "{separator}"')
extra_paths = []
for m in self.__jw_required(include_self = True):
path = self.app.find_dir(m, search_subdirs = ['src/python', 'tools/python'])
@ -94,7 +118,7 @@ class CmdCreateFile(Cmd): # export
return self.__render(
'pyrightconfig.json', [values, extra_fields],
li_quote = True,
li_delimiter = ',\n'
li_separator = ',\n'
)
def __init__(self, parent: Parent) -> None:
@ -142,6 +166,13 @@ class CmdCreateFile(Cmd): # export
'rendering output'
)
)
parser.add_argument(
'--field-separator',
help = (
'Field separator. %%n expands to newline. Default value depends on '
'--format'
)
)
parser.add_argument('module', help = 'The module to generate the file for')
@override
@ -166,4 +197,4 @@ class CmdCreateFile(Cmd): # export
raise Exception(f'Unsupported output format {args.format}')
# -- Render
sys.stdout.write(method(args.module, fields))
sys.stdout.write(method(args.module, fields, args.field_separator))