cmds.projects.CmdCreatePkgConfig: Fix Requires lines and add integration test #101

Merged
Jan Lindemann merged 2 commits from jan/fix/20260913-create-pkg-config-requires into master 2026-09-13 23:03:22 +02:00 AGit
6 changed files with 136 additions and 10 deletions

View file

@ -23,16 +23,25 @@ class CmdCreatePkgConfig(Cmd): # export
def __cleanup_requires(string: str) -> str:
import re
regexes = [
(r'^ +', ''),
(r'([ \t]|$)+', ', '),
(r', $', ''),
(r', $', ''),
(r' *,* *([<>=]+) *,* *', r' \1 '),
]
for patt, replacement in regexes:
string = re.sub(patt, replacement, string)
return string
rx_op = r'(!=|<=|>=|==|[<>=])'
ret: list[str] = []
for element in string.split(','):
# -- Separate the version constraints from their operands,
# which turns every package name, operator, and version into
# its own whitespace-separated token
element = re.sub(rx_op, r' \1 ', element)
tokens = element.split()
i = 0
while i < len(tokens):
if (i + 2 < len(tokens)
and re.fullmatch(rx_op, tokens[i + 1]) is not None):
# -- Merge the name, operator, and version back together
ret.append(' '.join(tokens[i:i + 3]))
i += 3
continue
ret.append(tokens[i])
i += 1
return ', '.join(ret)
@override
def add_arguments(self, parser: ArgumentParser) -> None:

View file

@ -0,0 +1,19 @@
TOPDIR = ../../../../..
OUTPUT = test-out.txt
REFERENCE = test-expected.txt
include $(TOPDIR)/make/proj.mk
include $(TOPDIR)/make/test-jw-pkg.mk
all:
$(OUTPUT): Makefile test.sh
bash ./test.sh $(TEST_CMD_LINE) > $(OUTPUT).tmp
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,31 @@
============= Running: jw-pkg.py -t ../../../../.. --log-level info projects create-pkg-config -n jw-pkg -s jw-pkg test -p /usr -v 1.0 --cflags=-I/usr/include --libflags=-L/usr/lib -ljw-pkg -r jw-core >= 1.0, jw-base -R jw-devel
prefix = /usr
exec_prefix = ${prefix}
includedir = ${prefix}/include
libdir = ${exec_prefix}/lib
Name: jw-pkg
Description: jw-pkg test
Version: 1.0
Cflags: -I/usr/include
Libs: -L/usr/lib -ljw-pkg
Requires: jw-core >= 1.0, jw-base
Requires.private: jw-devel============= Running: jw-pkg.py -t ../../../../.. --log-level info projects create-pkg-config -n jw-pkg -p /usr -v 1.0 -r foo bar>=2.0, baz
prefix = /usr
exec_prefix = ${prefix}
includedir = ${prefix}/include
libdir = ${exec_prefix}/lib
Name: jw-pkg
Description:
Version: 1.0
Requires: foo, bar >= 2.0, baz============= Running: jw-pkg.py -t ../../../../.. --log-level info projects create-pkg-config -n jw-pkg -p /usr -v 1.0 -R qux
prefix = /usr
exec_prefix = ${prefix}
includedir = ${prefix}/include
libdir = ${exec_prefix}/lib
Name: jw-pkg
Description:
Version: 1.0
Requires.private: qux

View file

@ -0,0 +1,28 @@
#!/bin/bash
# shellcheck disable=SC2048,SC2086
# Unquoted $* is intentional — the jw-pkg command line
export LC_ALL="C"
set -euo pipefail
jw_pkg_py="$*"
run()
{
local log_cmd
# shellcheck disable=SC2001
log_cmd=$(echo "$*" | sed 's|.*python3[0-9.]*\s\+\(\.\.\/\)*scripts/||')
printf '============= Running: %s\n' "$log_cmd"
"$@"
}
run $jw_pkg_py projects create-pkg-config \
-n jw-pkg -s 'jw-pkg test' -p /usr -v 1.0 \
--cflags=-I/usr/include --libflags=-L/usr/lib\ -ljw-pkg \
-r 'jw-core >= 1.0, jw-base' -R 'jw-devel'
run $jw_pkg_py projects create-pkg-config \
-n jw-pkg -p /usr -v 1.0 -r 'foo bar>=2.0, baz'
run $jw_pkg_py projects create-pkg-config \
-n jw-pkg -p /usr -v 1.0 -R 'qux'

View file

@ -0,0 +1,8 @@
TOPDIR = ../../../../../../../..
include $(TOPDIR)/make/proj.mk
include $(JWBDIR)/make/py-run.mk
all:
test: run

View file

@ -0,0 +1,31 @@
from jw.pkg.cmds.projects.CmdCreatePkgConfig import CmdCreatePkgConfig
# __cleanup_requires() is a private staticmethod; reach it via getattr
cleanup = getattr(CmdCreatePkgConfig, '_CmdCreatePkgConfig__cleanup_requires')
# -- __cleanup_requires --
# Comma- and space-separated input alike comes out as a clean ", "-joined list
assert cleanup('jw-core >= 1.0, jw-base') == 'jw-core >= 1.0, jw-base'
assert cleanup('jw-core >= 1.0 jw-base') == 'jw-core >= 1.0, jw-base'
assert cleanup('jw-core >= 1.0, jw-base') == 'jw-core >= 1.0, jw-base'
# Plain names without version constraints are joined the same way
assert cleanup('a b c') == 'a, b, c'
# A single element is unchanged
assert cleanup('jw-core >= 1.0') == 'jw-core >= 1.0'
# The empty input yields the empty output
assert cleanup('') == ''
# Every constraint operator is re-paired with its name and version
assert (
cleanup('x <= 2, y != 3, z == 4, w > 5, v < 6, u = 7') ==
'x <= 2, y != 3, z == 4, w > 5, v < 6, u = 7'
)
# Whitespace around a separator collapses to a single ", "
assert cleanup('jw-a = 1.0 , jw-b = 2.0') == 'jw-a = 1.0, jw-b = 2.0'
print('All CmdCreatePkgConfig tests passed')