summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2019-03-23 14:59:31 +0200
committerLars Wirzenius <liw@liw.fi>2019-03-23 14:59:31 +0200
commit5556d03b339f00adf4e61de8a24f3e068d82157c (patch)
treeb639d17aa01faf7012b92a1a1152f3b597b3759c
parent6f12afcb9a7aa04c9c0c92ffe634f12ac855864e (diff)
downloadeffitool-5556d03b339f00adf4e61de8a24f3e068d82157c.tar.gz
Add: effitool search for exact, contains
-rwxr-xr-xeffitool65
1 files 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()