Skip to content

Commit e7df6b2

Browse files
committed
Make resolve headers/keys lenient so headers can use any preferred casing
1 parent 1f9fe6c commit e7df6b2

File tree

2 files changed

+27
-9
lines changed

2 files changed

+27
-9
lines changed

servicestack/reflection.py

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,19 @@ def _align_auto(obj: Any, length: int, pad: str = ' '):
448448
return s
449449

450450

451+
def sanitize_key(key: str): return key.replace("_", " ").replace(" ", "").lower()
452+
453+
454+
def lenient_getitem(obj: dict, key: str):
455+
if key in obj:
456+
return obj[key]
457+
sanitized_key = sanitize_key(key)
458+
for k in obj:
459+
if sanitize_key(k) == sanitized_key:
460+
return obj[k]
461+
return ""
462+
463+
451464
def table(objs, headers=None):
452465
if not is_list(type(objs)):
453466
raise TypeError('objs must be a list')
@@ -459,8 +472,8 @@ def table(objs, headers=None):
459472
for k in headers:
460473
max = len(k)
461474
for row in map_rows:
462-
if k in row:
463-
col = row[k]
475+
col = lenient_getitem(row, k)
476+
if col != "":
464477
val_size = len(_str(col))
465478
if val_size > max:
466479
max = val_size
@@ -480,7 +493,7 @@ def table(objs, headers=None):
480493
for row in map_rows:
481494
to = "|"
482495
for k in headers:
483-
to += '' + _align_auto(row[k] if k in row else "", col_sizes[k]) + "|"
496+
to += '' + _align_auto(lenient_getitem(row, k), col_sizes[k]) + "|"
484497
sb.append(to)
485498

486499
sb.append(f"+{'-' * (row_width - 2)}+")
@@ -490,13 +503,15 @@ def table(objs, headers=None):
490503
def printtable(obj, headers=None):
491504
print(table(obj, headers))
492505

506+
493507
def htmllist(d: dict):
494508
sb: List[str] = ["<table><tbody>"]
495509
for k, v in d.items():
496510
sb.append(f"<tr><th>{_str(k)}</th><td>{htmldump(v)}</td></tr>")
497511
sb.append("</tbody></table>")
498512
return ''.join(sb)
499513

514+
500515
def htmldump(objs, headers=None):
501516
if is_builtin(type(objs)):
502517
return _str(objs)
@@ -526,7 +541,7 @@ def htmldump(objs, headers=None):
526541
if len(headers) > 0:
527542
row = []
528543
for k in headers:
529-
val = item[k] if k in item else ""
544+
val = lenient_getitem(item, k)
530545
row.append(f"<td>{htmldump(val)}</td>")
531546
rows.append(''.join(row))
532547
else:

tests/test_inspect.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,12 @@ def test_does_support_FindTechnologies(self):
4545
take=5,
4646
fields='id,name,vendorName,createdBy,viewCount,favCount'))
4747

48-
# printdump(response)
49-
# printtable(response.results)
50-
# printtable(response.results, headers=['id', 'name', 'vendor_name', 'view_count', 'fav_count'])
51-
# printtable(to_dict(response.results, key_case=titlecase))
48+
printdump(response)
49+
printtable(response.results)
50+
printtable(response.results,
51+
headers=['id', 'name', 'vendor_name', 'view_count', 'fav_count'])
52+
printtable(response.results,
53+
headers=['Id', 'Name', 'VendorName', 'ViewCount', 'FavCount'])
54+
printtable(to_dict(response.results, key_case=titlecase))
5255
printhtmldump(response)
53-
# inspect_vars({"response": response})
56+
inspect_vars({"response": response})

0 commit comments

Comments
 (0)