integration.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. from csv import reader
  2. from difflib import ndiff
  3. from json import loads as jloads
  4. from logging import getLogger
  5. from os import path
  6. from scriptshifter.trans import transliterate
  7. from test import TEST_DATA_DIR
  8. logger = getLogger(__name__)
  9. def test_sample(dset):
  10. """
  11. Test an individual sample set and produce a human-readable report.
  12. Used outside of automated tests.
  13. @param dset (str): sample set name (without the .csv extension) found in
  14. the `data/script_samples` directory.
  15. """
  16. deltas = []
  17. dset_fpath = path.join(TEST_DATA_DIR, "script_samples", dset + ".csv")
  18. log_fpath = path.join(TEST_DATA_DIR, "log", f"test_{dset}.log")
  19. with open(dset_fpath, newline="") as fh:
  20. csv = reader(fh)
  21. i = 1
  22. for row in csv:
  23. logger.debug(f"CSV row #{i}")
  24. lang, script, rom = row[:3]
  25. if not lang:
  26. continue
  27. t_dir = row[3] if len(row) > 3 else None
  28. opts = jloads(row[4]) if len(row) > 4 and row[4] else {}
  29. if t_dir:
  30. _trans(script, lang, t_dir, opts, rom, deltas)
  31. else:
  32. _trans(script, lang, "s2r", opts, rom, deltas)
  33. _trans(rom, lang, "r2s", opts, script, deltas)
  34. i += 1
  35. with open(log_fpath, "w") as fh:
  36. # If no deltas, just truncate the file.
  37. for lang, script, delta in deltas:
  38. fh.write(f"Language: {lang}\n")
  39. fh.write(f"Original: {script}\nDiff (result vs. expected):\n")
  40. for dline in delta:
  41. fh.write(dline.strip() + "\n")
  42. fh.write("\n\n")
  43. ct = len(deltas)
  44. if ct > 0:
  45. print(f"\n\n{ct} failed tests. See report at {log_fpath}")
  46. else:
  47. print("All tests passed.")
  48. def _trans(script, lang, t_dir, opts, rom, deltas):
  49. logger.debug(f"Transliterating {lang}: {t_dir}")
  50. trans, warnings = transliterate(
  51. script, lang, t_dir=t_dir,
  52. capitalize=opts.get("capitalize"), options=opts)
  53. if (trans == rom):
  54. print(".", end="")
  55. else:
  56. print("F", end="")
  57. deltas.append((lang, script, ndiff([trans], [rom])))