cli command
This commit is contained in:
parent
7e699ddda3
commit
4399e4ea8d
|
@ -14,6 +14,7 @@ from ceod.transactions.groups import (
|
|||
DeleteGroupTransaction,
|
||||
)
|
||||
|
||||
import heapq
|
||||
|
||||
@click.group(short_help='Perform operations on CSC groups/clubs')
|
||||
def groups():
|
||||
|
@ -150,10 +151,75 @@ def delete(group_name):
|
|||
resp = http_delete(f'/api/groups/{group_name}')
|
||||
handle_stream_response(resp, DeleteGroupTransaction.operations)
|
||||
|
||||
# compute levenshtein edit distance
|
||||
def _fuzzy_match(s1, s2):
|
||||
if len(s1) == 0:
|
||||
return len(s2)
|
||||
if len(s2) == 0:
|
||||
return len(s1)
|
||||
|
||||
edits = []
|
||||
for i in range(len(s2) + 1):
|
||||
edits.append(i)
|
||||
|
||||
for i in range(len(s1)):
|
||||
corner = i
|
||||
edits[0] = i + 1
|
||||
|
||||
for j in range(len(s2)):
|
||||
upper = edits[j + 1]
|
||||
if s1[i] == s2[j]:
|
||||
edits[j + 1] = corner
|
||||
else:
|
||||
m = min(corner, upper, edits[j])
|
||||
edits[j + 1] = m + 1
|
||||
|
||||
corner = upper
|
||||
|
||||
return edits[-1]
|
||||
|
||||
# this is needed TRUST ME
|
||||
class _fuzzy_result:
|
||||
def __init__(self, string, score):
|
||||
self.string = string
|
||||
self.score = score
|
||||
|
||||
def __lt__(self, other):
|
||||
return self.score < other.score
|
||||
|
||||
def __gt__(self, other):
|
||||
return self.score > other.score
|
||||
|
||||
def __le__(self, other):
|
||||
return self.score <= other.score
|
||||
|
||||
def __ge__(self, other):
|
||||
return self.score >= other.score
|
||||
|
||||
def __eq__(self, other):
|
||||
return self.score == other.score
|
||||
|
||||
def __ne__(self, other):
|
||||
return self.score != other.score
|
||||
|
||||
@groups.command(short_help='Search for groups')
|
||||
@click.argument('group_name')
|
||||
def search(group_name):
|
||||
@click.option('--count', default=10, help='number of results to show')
|
||||
def search(group_name, count):
|
||||
check_if_in_development()
|
||||
resp = http_get('/api/groups/clubs')
|
||||
result = handle_sync_response(resp)
|
||||
print(result)
|
||||
|
||||
scores = []
|
||||
for i in range(count):
|
||||
dummy_result = _fuzzy_result(None, -99999)
|
||||
scores.append(dummy_result)
|
||||
|
||||
for cn in result:
|
||||
score = -1 * _fuzzy_match(group_name, cn)
|
||||
result = _fuzzy_result(cn, score)
|
||||
heapq.heappushpop(scores, result)
|
||||
|
||||
matches = heapq.nlargest(count, scores)
|
||||
for result in matches:
|
||||
if result.string: click.echo(result.string)
|
||||
|
|
Loading…
Reference in New Issue