CHAR_COMMENT = '#'
CHAR_DESIGN_ALT = '='
CHAR_ATTR_EQ = '='
+CHAR_TEXTCONTAINS = ':'
SEP_DESIGN_DESC = ' #'
SEP_DESIGN_ATTR = '|'
CHAR_COLL_INDENT = ' '
CHAR_COL_TRANSPARENT = '-'
BOX_PREFIX = 'box:'
+ARG_Q_MARK = '?'
PARAM_Q_ID = f'id{CHAR_ATTR_EQ}'
-PARAM_Q_TEXT = 'text:'
+PARAM_Q_TEXT = f'text{CHAR_TEXTCONTAINS}'
+PARAM_Q_DELIMITERS = {CHAR_ATTR_EQ, CHAR_TEXTCONTAINS}
TOK_SORT_BOX = 'box'
TOK_SORT_ID = 'id'
def lookup(
self,
table_name: str,
- item_id: str,
formatter: str,
match_by: str,
sort_by: str
) -> str:
- 'Return result of inquiry on table of table_name.'
+ 'Return formatted result of inquiry on table of table_name.'
assert table_name in self.lookupables
+ match_key = match_val = ''
+ for idx, c in enumerate(match_by):
+ match_key += c
+ if c in PARAM_Q_DELIMITERS:
+ match_val = match_by[idx+1:]
+ break
cls = self.lookupables[table_name]
- for argument, keys in [(arg, m().keys())
- for arg, m in ((match_by, cls.matchers),
- (sort_by, cls.sorters),
- (formatter, cls.formatters))]:
- if argument == '?':
+ for arg_key, keys in [(arg, m().keys())
+ for arg, m in ((match_key, cls.matchers),
+ (sort_by, cls.sorters),
+ (formatter, cls.formatters))]:
+ if arg_key == ARG_Q_MARK:
return CHAR_NEWLINE.join(keys)
- table = getattr(self, table_name)
- if item_id:
- match_by = PARAM_Q_ID + item_id
- items = tuple(table.values())
+ assert (not arg_key) or arg_key in keys, (arg_key, keys)
+ items = tuple(getattr(self, table_name).values())
if items and sort_by:
items = cls.sorters()[sort_by](self, items)
if items and match_by:
- p_key = ''
- for p_key in [p_key for p_key in cls.matchers()
- if match_by.startswith(p_key)]:
- break
- assert p_key
- p_val = match_by[len(p_key):]
- items = tuple(item for item in items if item.match(p_key, p_val))
+ items = tuple(x for x in items if x.match(match_key, match_val))
return CHAR_NEWLINE.join([cls.formatters()[formatter](item)
for item in items])
choices=choices, type=complete, metavar='TABLE', help=msg)
parser = ArgumentParser()
add_abbreviable_table_arg()
- hint_qmark = 'use "?" to see what be available for chosen table'
+ hint_qmark = f'use "{ARG_Q_MARK}" to list options for chosen table'
hint_ldraw = 'allowed: ' + ', '.join(sorted(list(LDRAW_MODES)))
parser.add_argument(
'item_id',
'-f', '--format',
action='store', help=hint_qmark, default='default')
parser.add_argument(
- '-m', '--match-by',
- action='store', help=hint_qmark)
+ '-m', '--match',
+ action='store', help=hint_qmark, default='')
parser.add_argument(
- '-s', '--sort-by',
+ '-s', '--sort',
action='store', help=hint_qmark, default=TOK_SORT_ID)
action_ldraw = parser.add_argument(
'-l', '--ldraw',
for _ in [m for m in args.ldraw.split(CHAR_SEP_LDRAW_MODES)
if m and m not in LDRAW_MODES]:
parser.error(str(ArgumentError(action_ldraw, hint_ldraw)))
+ if args.match_by != ARG_Q_MARK and args.item_id:
+ args.match_by = PARAM_Q_ID + args.item_id
return args
args = parse_args()
print(
db.lookup(
table_name=args.table,
- item_id=args.item_id,
formatter=args.format,
- match_by=args.match_by,
- sort_by=args.sort_by
+ match_by=args.match,
+ sort_by=args.sort
).rstrip())