kkpyutil 1.36.3__py3-none-any.whl → 1.38.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {kkpyutil-1.36.3.dist-info → kkpyutil-1.38.0.dist-info}/METADATA +1 -1
- kkpyutil-1.38.0.dist-info/RECORD +7 -0
- kkpyutil.py +46 -0
- kkpyutil-1.36.3.dist-info/RECORD +0 -7
- {kkpyutil-1.36.3.dist-info → kkpyutil-1.38.0.dist-info}/LICENSE +0 -0
- {kkpyutil-1.36.3.dist-info → kkpyutil-1.38.0.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
kkpyutil.py,sha256=Va9Q71B9N_mLQwIcHVImOiX-fDe-eubclrN-x-kGFPQ,110580
|
|
2
|
+
kkpyutil_helper/windows/kkttssave.ps1,sha256=xa3-WzqNh2rGYlOx_I4ewOuCE94gkTO5cEwYH0M67_0,446
|
|
3
|
+
kkpyutil_helper/windows/kkttsspeak.ps1,sha256=7WUUHMmjTQroUWA2Mvdt4JtSt475nZUHQx-qP-7rS6o,305
|
|
4
|
+
kkpyutil-1.38.0.dist-info/LICENSE,sha256=uISevGnCxB5QOU0ftbofN75_yUtd6E2h_MWE1zqagC8,1065
|
|
5
|
+
kkpyutil-1.38.0.dist-info/METADATA,sha256=9y_yLvL1dVSRzeDiF4VmrOrqZWu5D6PQaAxDDNCwkyI,1136
|
|
6
|
+
kkpyutil-1.38.0.dist-info/WHEEL,sha256=kLuE8m1WYU0Ig0_YEGrXyTtiJvKPpLpDEiChiNyei5Y,88
|
|
7
|
+
kkpyutil-1.38.0.dist-info/RECORD,,
|
kkpyutil.py
CHANGED
|
@@ -1242,6 +1242,10 @@ def extract_call_args(file, caller, callee):
|
|
|
1242
1242
|
return [elem.value if isinstance(elem, ast.Constant) else None for elem in argument.elts]
|
|
1243
1243
|
elif use_type_map := isinstance(argument, ast.Attribute):
|
|
1244
1244
|
return argument.attr
|
|
1245
|
+
elif use_typed_list := isinstance(argument, ast.Subscript):
|
|
1246
|
+
coll_type = argument.value.id
|
|
1247
|
+
elem_type = argument.slice.id if coll_type.startswith('list') or coll_type.startswith('tuple') else argument.slice.dims[0].id
|
|
1248
|
+
return f'{coll_type}[{elem_type}]'
|
|
1245
1249
|
glogger.error(f'Unsupported syntax node: {argument}. Will fallback to None.')
|
|
1246
1250
|
return None
|
|
1247
1251
|
|
|
@@ -1694,6 +1698,48 @@ def is_number_text(text):
|
|
|
1694
1698
|
return False
|
|
1695
1699
|
|
|
1696
1700
|
|
|
1701
|
+
def is_bool_text(text):
|
|
1702
|
+
return text.lower() in ('true', 'false')
|
|
1703
|
+
|
|
1704
|
+
|
|
1705
|
+
def create_parameter(name, default: str, val_range=None, step=0.1, precision: int = 2, delim=' '):
|
|
1706
|
+
"""
|
|
1707
|
+
- a single user text input may carry polymorphic primitive data types
|
|
1708
|
+
- so we need to convert it to a good enough data record that a frontend can understand
|
|
1709
|
+
- step is for numbers only, and precision is for floats only
|
|
1710
|
+
- some frontend may offer fine-tuning, a good practice is to use step/10 for that, but this low-level API does not offer fine-tuning for minimalism
|
|
1711
|
+
- for numbers, null xrange or null component means no range limit
|
|
1712
|
+
- for options, range is a tuple of options; single-selection uses a literal str as default; multi-selection uses a space-separated str 'opt1 opt2'
|
|
1713
|
+
"""
|
|
1714
|
+
if options := isinstance(val_range, tuple):
|
|
1715
|
+
assert len(val_range)
|
|
1716
|
+
try:
|
|
1717
|
+
i_default = val_range.index(default)
|
|
1718
|
+
# single-select
|
|
1719
|
+
default_opts = default
|
|
1720
|
+
except ValueError:
|
|
1721
|
+
# multi-select
|
|
1722
|
+
default_opts = tuple([opt.strip() for opt in default.split(delim)])
|
|
1723
|
+
return {'name': name, 'type': 'option', 'default': default_opts, 'range': val_range}
|
|
1724
|
+
if is_bool_text(default):
|
|
1725
|
+
return {'name': name, 'type': 'bool', 'default': default.lower() == 'true'}
|
|
1726
|
+
if is_number_text(default):
|
|
1727
|
+
# edge cases: None, (None, 1.0), (1.0, None), (None, None)
|
|
1728
|
+
if val_range is None:
|
|
1729
|
+
val_range = [float('-inf'), float('inf')]
|
|
1730
|
+
else:
|
|
1731
|
+
assert len(val_range) == 2
|
|
1732
|
+
if val_range[0] is None:
|
|
1733
|
+
val_range[0] = '-inf'
|
|
1734
|
+
if val_range[1] is None:
|
|
1735
|
+
val_range[1] = 'inf'
|
|
1736
|
+
val_range = [float(val_range[0]), float(val_range[1])]
|
|
1737
|
+
if is_float_text(default):
|
|
1738
|
+
return {'name': name, 'type': 'float', 'default': float(default), 'range': val_range, 'step': step, 'precision': precision}
|
|
1739
|
+
return {'name': name, 'type': 'int', 'default': int(default), 'range': val_range, 'step': max(int(step), 1)}
|
|
1740
|
+
return {'name': name, 'type': 'str', 'default': default}
|
|
1741
|
+
|
|
1742
|
+
|
|
1697
1743
|
def compare_dsv_lines(line1, line2, delim=' ', float_rel_tol=1e-6, float_abs_tol=1e-6, striptext=True, randomidok=False, logger=None):
|
|
1698
1744
|
"""
|
|
1699
1745
|
- compare two lines of delimiter-separated values, with numerical and uuid comparison in mind
|
kkpyutil-1.36.3.dist-info/RECORD
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
kkpyutil.py,sha256=oImW-f1e1EINwHSkoW8NkGPbVVCr5rsZAvJmBoDCU1I,108149
|
|
2
|
-
kkpyutil_helper/windows/kkttssave.ps1,sha256=xa3-WzqNh2rGYlOx_I4ewOuCE94gkTO5cEwYH0M67_0,446
|
|
3
|
-
kkpyutil_helper/windows/kkttsspeak.ps1,sha256=7WUUHMmjTQroUWA2Mvdt4JtSt475nZUHQx-qP-7rS6o,305
|
|
4
|
-
kkpyutil-1.36.3.dist-info/LICENSE,sha256=uISevGnCxB5QOU0ftbofN75_yUtd6E2h_MWE1zqagC8,1065
|
|
5
|
-
kkpyutil-1.36.3.dist-info/METADATA,sha256=JH4Dp5DbGimNbljX3GUYO8uNr9MzQPsb_7_qJ53TZ64,1136
|
|
6
|
-
kkpyutil-1.36.3.dist-info/WHEEL,sha256=kLuE8m1WYU0Ig0_YEGrXyTtiJvKPpLpDEiChiNyei5Y,88
|
|
7
|
-
kkpyutil-1.36.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|