From fdd5f183464ed1446b13c8572d787d94ec6008af Mon Sep 17 00:00:00 2001 From: rlbr Date: Mon, 15 Oct 2018 11:42:22 -0500 Subject: [PATCH 1/7] Deffered imports = faster start time --- main.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/main.py b/main.py index 001ef13..f155eb3 100644 --- a/main.py +++ b/main.py @@ -1,12 +1,11 @@ import argparse -from print2d import print2d import re import ctabus from dateutil.parser import parse as date_parse import datetime +# for logging import sys import os.path as osp -from search import Search,StopSearch def numb_sort(str): n = 40 try: @@ -96,7 +95,12 @@ if __name__ == "__main__": args = parser.parse_args() sys.stderr = open(osp.join(osp.dirname(__file__),'stderr.log'),'w') args.arg = ' '.join(args.arg) + if not args.arg.isdecimal(): + # save on import time slightly + from print2d import print2d + if any(arg for arg in (args.route,args.direction)): + from search import Search,StopSearch #routes if not args.route: data = ctabus.get_routes()['routes'] From 0dbf88d1bda2bc8b625b18513455550f2d3b6759 Mon Sep 17 00:00:00 2001 From: rlbr Date: Mon, 15 Oct 2018 11:54:40 -0500 Subject: [PATCH 2/7] tabs... --- main.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/main.py b/main.py index f155eb3..05e4bf7 100644 --- a/main.py +++ b/main.py @@ -95,12 +95,12 @@ if __name__ == "__main__": args = parser.parse_args() sys.stderr = open(osp.join(osp.dirname(__file__),'stderr.log'),'w') args.arg = ' '.join(args.arg) - + if not args.arg.isdecimal(): - # save on import time slightly - from print2d import print2d - if any(arg for arg in (args.route,args.direction)): - from search import Search,StopSearch + # save on import time slightly + from print2d import print2d + if any(arg for arg in (args.route,args.direction)): + from search import Search,StopSearch #routes if not args.route: data = ctabus.get_routes()['routes'] From 4fb70db451224ded939e98710e13ce11a44675e1 Mon Sep 17 00:00:00 2001 From: rlbr Date: Mon, 15 Oct 2018 12:20:33 -0500 Subject: [PATCH 3/7] fixed negative time bug --- main.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/main.py b/main.py index 05e4bf7..c80171c 100644 --- a/main.py +++ b/main.py @@ -127,12 +127,13 @@ if __name__ == "__main__": today = datetime.datetime.today() for time in sorted(times,key = lambda t: t["prdtm"]): arrival = date_parse(time['prdtm']) - delta = pprint_delta(arrival-today) - t = arrival.strftime('%H:%M:%S') - route = time['rt'] - direction = time['rtdir'] - end = time['des'] - nm = time['stpnm'] - print( - config.format(**globals()),end= '\n'*2 - ) + if arrival > today: + delta = pprint_delta(arrival-today) + t = arrival.strftime('%H:%M:%S') + route = time['rt'] + direction = time['rtdir'] + end = time['des'] + nm = time['stpnm'] + print( + config.format(**globals()),end= '\n'*2 + ) From 2a2e6511d624dc425fa218b7f40b5f376e049c1b Mon Sep 17 00:00:00 2001 From: Raphael Roberts Date: Mon, 15 Oct 2018 12:50:31 -0500 Subject: [PATCH 4/7] slight fix for deffering the import --- main.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/main.py b/main.py index c80171c..4a9d9e6 100644 --- a/main.py +++ b/main.py @@ -99,8 +99,7 @@ if __name__ == "__main__": if not args.arg.isdecimal(): # save on import time slightly from print2d import print2d - if any(arg for arg in (args.route,args.direction)): - from search import Search,StopSearch + from search import Search,StopSearch #routes if not args.route: data = ctabus.get_routes()['routes'] From 63985520e42fbf4e45cb94640a8a003740605c84 Mon Sep 17 00:00:00 2001 From: Raphael Roberts Date: Tue, 30 Oct 2018 16:56:49 -0500 Subject: [PATCH 5/7] not using format strings --- main.py | 2 +- print2d.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/main.py b/main.py index 4a9d9e6..edf0ac4 100644 --- a/main.py +++ b/main.py @@ -95,7 +95,7 @@ if __name__ == "__main__": args = parser.parse_args() sys.stderr = open(osp.join(osp.dirname(__file__),'stderr.log'),'w') args.arg = ' '.join(args.arg) - + if not args.arg.isdecimal(): # save on import time slightly from print2d import print2d diff --git a/print2d.py b/print2d.py index 3efee86..5f66c5f 100644 --- a/print2d.py +++ b/print2d.py @@ -18,9 +18,9 @@ def print2d(l,datetime_format = "%A, %B %e, %Y %H:%M:%S",seperator= ' | ',spacer fmt_row = '{content}' if l_end: - fmt_row = f'{l_end} ' + fmt_row + fmt_row = '{} {}'.format(l_end,fmt_row) if r_end: - fmt_row = fmt_row + f' {r_end}' + fmt_row = '{} {}'.format(fmt_row,r_end) done = [] for row in l: From 3a3c84f742384b7db90a9957f162369dea02e377 Mon Sep 17 00:00:00 2001 From: Raphael Roberts Date: Tue, 30 Oct 2018 17:01:25 -0500 Subject: [PATCH 6/7] support canceling the selection process --- main.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/main.py b/main.py index edf0ac4..faf43a9 100644 --- a/main.py +++ b/main.py @@ -68,7 +68,11 @@ def gen_list(objs,data,*displays,key = None,sort = 0,num_pic = True): which = None while not which: try: - which = srt_keys[int(input('Which one?: '))] + which = input('Which one?: ') + except KeyboardInterrupt: + quit() + try: + which = srt_keys[int(which)] except ValueError: which = None return display_data[which] From d1e81d91bd163e7734e7814b603f5633034e30ac Mon Sep 17 00:00:00 2001 From: rlbr Date: Wed, 31 Oct 2018 13:37:02 -0500 Subject: [PATCH 7/7] Added periodic update check and route-filtering --- main.py | 77 ++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 51 insertions(+), 26 deletions(-) diff --git a/main.py b/main.py index faf43a9..da95f78 100644 --- a/main.py +++ b/main.py @@ -1,18 +1,27 @@ +from dateutil.parser import parse as date_parse import argparse -import re import ctabus -from dateutil.parser import parse as date_parse import datetime +import os +import re +import time # for logging -import sys import os.path as osp -def numb_sort(str): - n = 40 - try: - return re.sub(r'\d+',lambda match: match.group(0).rjust(n,'0'),str) - except Exception as E: - print(str) - raise E +import sys +import re + +# https://stackoverflow.com/a/5967539 +def atoi(text): + return int(text) if text.isdigit() else text +def clearscr(): + os.system('cls' if os.name == 'nt' else 'clear') +def numb_sort(text): + ''' + alist.sort(key=natural_keys) sorts in human order + http://nedbatchelder.com/blog/200712/human_sorting.html + (See Toothy's implementation in the comments) + ''' + return [ atoi(c) for c in re.split(r'(\d+)', text) ] def pprint_delta(delta): delta = str(delta) @@ -90,12 +99,31 @@ config = '''\ {nm}, stop {stop_id} {delta} ({t})\ ''' +def show(stop_id,rt_filter=None): + times = ctabus.get_times(stop_id)['prd'] + today = datetime.datetime.today() + arrivals = sorted(times,key = lambda t: t["prdtm"]) + if rt_filter is not None: + arrivals =filter(lambda arrival: arrival['rt'] == rt_filter,arrivals) + for time in arrivals: + arrival = date_parse(time['prdtm']) + if arrival > today: + delta = pprint_delta(arrival-today) + t = arrival.strftime('%H:%M:%S') + route = time['rt'] + direction = time['rtdir'] + end = time['des'] + nm = time['stpnm'] + print( + config.format(**locals()),end= '\n'*2 + ) if __name__ == "__main__": parser = argparse.ArgumentParser(prog = 'ctabus') - parser.add_argument('arg',nargs = '+',metavar = '(stop-id | cross streets)') + parser.add_argument('-l','--lucky',action='store_true',help = 'picks first result') + parser.add_argument('-p','--periodic',metavar = 'SEC',type=int,help='checks periodically') parser.add_argument('-r','--route',default = None) parser.add_argument('-d','--direction',default = None) - parser.add_argument('-l','--lucky',action='store_true',help = 'picks first result') + parser.add_argument('arg',nargs = '+',metavar = '(stop-id | cross streets)') args = parser.parse_args() sys.stderr = open(osp.join(osp.dirname(__file__),'stderr.log'),'w') args.arg = ' '.join(args.arg) @@ -126,17 +154,14 @@ if __name__ == "__main__": stop_id = gen_list(stops,'stpid','stpnm',key = s) else: stop_id = args.arg - times = ctabus.get_times(stop_id)['prd'] - today = datetime.datetime.today() - for time in sorted(times,key = lambda t: t["prdtm"]): - arrival = date_parse(time['prdtm']) - if arrival > today: - delta = pprint_delta(arrival-today) - t = arrival.strftime('%H:%M:%S') - route = time['rt'] - direction = time['rtdir'] - end = time['des'] - nm = time['stpnm'] - print( - config.format(**globals()),end= '\n'*2 - ) + if args.periodic is not None: + _done = False + while not _done: + try: + clearscr() + show(stop_id,args.route) + time.sleep(args.periodic) + except KeyboardInterrupt as e: + _done = True + else: + show(stop_id,args.route) \ No newline at end of file