From 5556d03b339f00adf4e61de8a24f3e068d82157c Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Sat, 23 Mar 2019 14:59:31 +0200 Subject: Add: effitool search for exact, contains --- effitool | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 63 insertions(+), 2 deletions(-) diff --git a/effitool b/effitool index a6e59e2..4bf5aa6 100755 --- a/effitool +++ b/effitool @@ -285,6 +285,49 @@ class Session: return sorted(obj.get('resources', [])) +class SearchCond: + + def __init__(self, field, pattern): + self._field = field + self._pattern = pattern + + def matches(self, member): + if self._field not in member: + return False + value = member[self._field] + return self.op(value.casefold(), self._pattern.casefold()) + + def op(self, value, pattern): + raise NotImplementedError() + + +class ExactCond(SearchCond): + + def op(self, value, pattern): + return value == pattern + + +class ContainsCond(SearchCond): + + def op(self, value, pattern): + return pattern in value + + +class CondFactory: + + _pairs = [ + ('=', ExactCond), + (':', ContainsCond), + ] + + def parse(self, cond): + for op, klass in self._pairs: + if op in cond: + field, pattern = cond.split(op, 1) + return klass(field, pattern) + sys.exit('Do not understand search condition {}'.format(cond)) + + class Tool: def __init__(self, config): @@ -390,12 +433,27 @@ class Tool: def dump_members(self, args): session = self.get_session(args) - rids = session.get_all_member_ids() members = session.get_all_members() self._format_json(members, sys.stdout) + def search_members(self, args): + factory = CondFactory() + conds = [factory.parse(cond) for cond in args['cond']] + + session = self.get_session(args) + members = session.get_all_members() + + matches = {} + for rid, m in members.items(): + for c in conds: + if c.matches(m): + matches[rid] = m + break + self._format_json(matches, sys.stdout) + def _format_json(self, obj, output): - return json.dump(obj, output, indent=4, sort_keys=True) + json.dump(obj, output, indent=4, sort_keys=True) + output.write('\n') def uniq(items): @@ -440,6 +498,9 @@ def process_args(config): ('delete-member', tool.delete_member, [ ('rid', {}), ]), + ('search', tool.search_members, [ + ('cond', {'nargs':'*'}), + ]), ] p = argparse.ArgumentParser() -- cgit v1.2.1