Add a version field to the Package class and make query_packages() fill it. It's very much distribution and package dependent what shape that version has, so from Package's perspective, it's just a str-typed member. Further improvements and fixes: - Make query_packages() accept throw, defaulting to the previous behaviour, so a caller that wants to be prepared for a missing package / an empty result can pass throw = False. - Make dpkg's _run() and run_dpkg_query() forward ec and the remaining keyword arguments on the sudo path, which dropped them before. Add unit tests for the file type tree and its StatResult predicates. Assisted-by: unsloth/Qwen3.8-27B-GGUF:Q4_K_M with pi.dev v1.4.0 Signed-off-by: Jan Lindemann <jan@janware.com>
85 lines
2.2 KiB
Python
85 lines
2.2 KiB
Python
from jw.pkg.lib.Package import Package, meta_tags
|
|
|
|
# -- parse_spec_str --
|
|
|
|
p = Package.parse_spec_str(
|
|
'jw-core|jw|Jan|https://example.com/jw-core|Jan <jan@example.com>|1.0.0-1'
|
|
)
|
|
assert p.name == 'jw-core'
|
|
assert p.vendor == 'jw'
|
|
assert p.packager == 'Jan'
|
|
assert p.url == 'https://example.com/jw-core'
|
|
assert p.maintainer == 'Jan <jan@example.com>'
|
|
assert p.version == '1.0.0-1'
|
|
|
|
# An empty field is preserved as an empty string
|
|
p = Package.parse_spec_str('name|||||')
|
|
assert p.name == 'name'
|
|
assert p.vendor == ''
|
|
assert p.packager == ''
|
|
assert p.url == ''
|
|
assert p.maintainer == ''
|
|
assert p.version == ''
|
|
|
|
# A custom delimiter works
|
|
p = Package.parse_spec_str('a,b,c,d,e,f', delimiter = ',')
|
|
assert p.name == 'a'
|
|
assert p.maintainer == 'e'
|
|
assert p.version == 'f'
|
|
|
|
# Wrong field counts raise
|
|
for spec in ('a', 'a|b', 'a|b|c', 'a|b|c|d|e', 'a|b|c|d|e|f|g'):
|
|
try:
|
|
Package.parse_spec_str(spec)
|
|
assert False, f'Should have raised for "{spec}"'
|
|
except ValueError:
|
|
pass
|
|
|
|
# -- parse_specs_str --
|
|
|
|
specs = (
|
|
'jw-core|jw|Jan|https://example.com/jw-core|Jan|1.0.0-1\n'
|
|
'jw-base|jw|Jan|https://example.com/jw-base|Jan|2.0.0-1'
|
|
)
|
|
packages = Package.parse_specs_str(specs)
|
|
assert [p.name for p in packages] == ['jw-core', 'jw-base']
|
|
# A trailing newline does not create a phantom package
|
|
assert len(packages) == 2
|
|
# A trailing newline is not needed
|
|
packages = Package.parse_specs_str(specs + '\n')
|
|
assert [p.name for p in packages] == ['jw-core', 'jw-base']
|
|
|
|
# An empty string parses to no packages
|
|
assert Package.parse_specs_str('') == []
|
|
|
|
# -- order_tags --
|
|
|
|
mapping = {
|
|
'maintainer': 'Jan',
|
|
'name': 'jw-core',
|
|
'url': 'https://example.com/jw-core',
|
|
}
|
|
ordered = Package.order_tags(mapping)
|
|
assert list(ordered) == meta_tags
|
|
assert ordered == {
|
|
'name': 'jw-core',
|
|
'vendor': '',
|
|
'packager': '',
|
|
'url': 'https://example.com/jw-core',
|
|
'maintainer': 'Jan',
|
|
'version': '',
|
|
}
|
|
|
|
# -- __repr__ --
|
|
|
|
p = Package.parse_spec_str('jw-core|jw|Jan|url|Jan|1.0.0-1')
|
|
assert repr(p) == (
|
|
'name : jw-core\n'
|
|
'vendor : jw\n'
|
|
'packager : Jan\n'
|
|
'url : url\n'
|
|
'maintainer : Jan\n'
|
|
'version : 1.0.0-1'
|
|
)
|
|
|
|
print('All Package tests passed')
|