You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123 lines
3.6 KiB

7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
  1. import argparse
  2. from print2d import print2d
  3. import re
  4. import ctabus
  5. from dateutil.parser import parse as date_parse
  6. import datetime
  7. from search import Search,StopSearch
  8. def numb_sort(str):
  9. n = 40
  10. try:
  11. return re.sub(r'\d+',lambda match: match.group(0).rjust(n,'0'),str)
  12. except Exception as E:
  13. print(str)
  14. raise E
  15. def pprint_delta(delta):
  16. delta = str(delta)
  17. days= None
  18. s1 = delta.split(', ')
  19. if len(s1) > 1:
  20. days,time = s1
  21. else:
  22. time = s1[0]
  23. time = time.split('.')[0]
  24. hour,minute,second = map(int,time.split(':'))
  25. time = ''
  26. if hour:
  27. time += f'{hour} hour' + ('s' if hour != 1 else '')
  28. if minute:
  29. if time and not time.endswith(', '):
  30. time += ', '
  31. time += f'{minute} minute' + ('s' if minute != 1 else '')
  32. if second:
  33. if time and not time.endswith(', '):
  34. time += ', '
  35. time += f'{second} second' + ('s' if second != 1 else '')
  36. ret = ''
  37. if days:
  38. ret = days + ', ' if time else ''
  39. ret += time
  40. return ret
  41. def gen_list(objs,data,*displays,key = None,sort = 0,num_pic = True):
  42. k = displays[sort]
  43. display_data = {obj[k]:obj[data] for obj in objs}
  44. srt_keys = sorted(display_data.keys(),key=key)
  45. display = sorted(
  46. [
  47. [obj[d] for d in displays] for obj in objs
  48. ],
  49. key = lambda row: key(row[sort]) if key else row[sort]
  50. )
  51. if num_pic:
  52. display = [[i] + data for i,data in enumerate(display)]
  53. opts = {
  54. 'spacer':' ',
  55. 'seperator':' ',
  56. 'interactive': True,
  57. 'bottom':'=',
  58. 'l_end':'<',
  59. 'r_end':'>',
  60. }
  61. print2d(display,**opts)
  62. if num_pic:
  63. which = None
  64. while not which:
  65. try:
  66. which = srt_keys[int(input('Which one?: '))]
  67. except ValueError:
  68. which = None
  69. return display_data[which]
  70. else:
  71. ret = None
  72. while not ret:
  73. try:
  74. ret = display_data[input('Which one?: ')]
  75. except KeyError:
  76. pass
  77. return ret
  78. config = '''{delta} ({t})
  79. {route} - {end} ({direction})'''
  80. if __name__ == "__main__":
  81. parser = argparse.ArgumentParser(prog = 'ctabus')
  82. parser.add_argument('arg',nargs = '+',metavar = '(stop-id | cross streets)')
  83. parser.add_argument('-r','--route',default = None)
  84. parser.add_argument('-d','--direction',default = None)
  85. args = parser.parse_args()
  86. args.arg = ' '.join(args.arg)
  87. if not args.arg.isdecimal():
  88. #routes
  89. if not args.route:
  90. data = ctabus.get_routes()['routes']
  91. route = gen_list(data,'rt','rt','rtnm',num_pic = False,key=numb_sort)
  92. else:
  93. route = args.route
  94. data = ctabus.get_directions(route)['directions']
  95. #direction
  96. if not args.direction:
  97. direction = gen_list(data,'dir','dir')
  98. else:
  99. s = Search(args.direction)
  100. direction = sorted((obj['dir'] for obj in data),key = s)[0]
  101. #direction
  102. stops = ctabus.get_stops(route,direction)['stops']
  103. s = StopSearch(args.arg)
  104. stop_id = gen_list(stops,'stpid','stpnm',key = s)
  105. else:
  106. stop_id = args.arg
  107. times = ctabus.get_times(stop_id)['prd']
  108. today = datetime.datetime.today()
  109. for time in times:
  110. arrival = date_parse(time['prdtm'])
  111. delta = pprint_delta(arrival-today)
  112. t = arrival.strftime('%H:%M:%S')
  113. route = time['rt']
  114. direction = time['rtdir']
  115. end = time['des']
  116. print(
  117. config.format(**globals()),end= '\n'*2
  118. )