__main__.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import os
  2. from collections import namedtuple
  3. from datetime import date
  4. import csv
  5. from pathlib import Path
  6. import re
  7. import click
  8. TestCase = namedtuple('TestCase', 'statements successful ratio')
  9. def load_testcases(filename):
  10. testcases = {}
  11. with open(filename, newline='') as infile:
  12. reader = csv.DictReader(infile, delimiter=',')
  13. for row in reader:
  14. testcases[row['testcase']] = TestCase(row['statements'], row['successful'], row['ratio'])
  15. return testcases
  16. reIncrement = re.compile(r'(\d+)(?: ?\(+ ?(\d+)\))?')
  17. def format_success_count(old, new):
  18. m = reIncrement.search(old)
  19. if m is None:
  20. return str(new)
  21. old_count = int(m[1])
  22. new_count = int(new)
  23. if old_count < new_count:
  24. return f'{new_count} (+{new_count - old_count})'
  25. # we need it to keep old increments, if count stays the same
  26. if old_count == new_count:
  27. return str(old)
  28. return str(new)
  29. reTableRow = re.compile(r'^\|\| \d+ \|')
  30. @click.command()
  31. @click.argument("reportfile", type=str, nargs=1)
  32. @click.argument("statusfile", type=str, nargs=1)
  33. def cli(reportfile, statusfile):
  34. today = date.today().strftime('%d.%m.%Y')
  35. testcases = load_testcases(reportfile)
  36. outfile = Path(statusfile).with_suffix('.tmp')
  37. with open(statusfile, 'r') as fin, open(outfile, 'w') as fout:
  38. for line in fin:
  39. if reTableRow.match(line):
  40. testno, testname, stmts_count, success_count, ratio, when_updated, notes = line.split(' | ')
  41. try:
  42. testcase = testcases[testname]
  43. new_success_count = format_success_count(success_count, testcase.successful)
  44. fout.write(
  45. ' | '.join(
  46. [
  47. testno,
  48. testname,
  49. testcase.statements,
  50. new_success_count,
  51. testcase.ratio,
  52. today if new_success_count != success_count else when_updated,
  53. notes,
  54. ]
  55. )
  56. )
  57. except KeyError:
  58. fout.write(line)
  59. else:
  60. fout.write(line)
  61. oldfile = Path(statusfile).with_suffix('.old')
  62. os.rename(statusfile, oldfile)
  63. os.rename(outfile, statusfile)
  64. if __name__ == '__main__':
  65. cli()