This repo contains code to mirror other repos. It also contains the code that is getting mirrored.
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.

68 lines
1.8 KiB

  1. """
  2. Transformer merging
  3. ==================
  4. This example is intended to show how transformers can be merged in order to
  5. keep the individual steps clean and simple.
  6. .. note::
  7. The imported rules will have to be aliased according to the file it is in.
  8. (See `storage.lark` for an implementation of this idea.)
  9. """
  10. from lark import Lark, Tree
  11. from json import dumps
  12. from lark.visitors import Transformer, merge_transformers, v_args
  13. class JsonTreeToJson(Transformer):
  14. @v_args(inline=True)
  15. def string(self, s):
  16. return s[1:-1].replace('\\"', '"')
  17. array = list
  18. pair = tuple
  19. object = dict
  20. number = v_args(inline=True)(float)
  21. null = lambda self, _: None
  22. true = lambda self, _: True
  23. false = lambda self, _: False
  24. class CsvTreeToPandasDict(Transformer):
  25. INT = int
  26. FLOAT = float
  27. SIGNED_FLOAT = float
  28. WORD = str
  29. NON_SEPARATOR_STRING = str
  30. def row(self, children):
  31. return children
  32. def start(self, children):
  33. data = {}
  34. header = children[0].children
  35. for heading in header:
  36. data[heading] = []
  37. for row in children[1:]:
  38. for i, element in enumerate(row):
  39. data[header[i]].append(element)
  40. return data
  41. class Base(Transformer):
  42. def start(self, children):
  43. return children[0]
  44. if __name__ == "__main__":
  45. merged = merge_transformers(Base(), csv=CsvTreeToPandasDict(), json=JsonTreeToJson())
  46. parser = Lark.open("storage.lark")
  47. csv_tree = parser.parse("""# file lines author
  48. data.json 12 Robin
  49. data.csv 30 erezsh
  50. compiler.py 123123 Megalng
  51. """)
  52. print("CSV data in pandas form:", merged.transform(csv_tree))
  53. json_tree = parser.parse(dumps({"test": "a", "dict": { "list": [1, 1.2] }}))
  54. print("JSON data transformed: ", merged.transform(json_tree))