pyparsing_compat.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. """
  2. Compatibility helpers for supporting pyparsing v2 and v3 APIs.
  3. """
  4. from __future__ import annotations
  5. from typing import Callable, Dict, Type, cast
  6. import pyparsing
  7. ParseResults = pyparsing.ParseResults
  8. ParserElement = pyparsing.ParserElement
  9. _RAW_VERSION = getattr(pyparsing, "__version__", "0")
  10. try:
  11. PYPARSING_MAJOR_VERSION = int(_RAW_VERSION.split(".", 1)[0])
  12. except (TypeError, ValueError):
  13. PYPARSING_MAJOR_VERSION = 0
  14. PYPARSING_V3 = PYPARSING_MAJOR_VERSION >= 3
  15. _ParserFactory = Callable[..., ParserElement]
  16. _ParserTransform = Callable[..., ParserElement]
  17. DelimitedList: _ParserFactory
  18. original_text_for: _ParserTransform
  19. rest_of_line: ParserElement
  20. if PYPARSING_V3:
  21. DelimitedList = pyparsing.DelimitedList
  22. original_text_for = pyparsing.original_text_for
  23. rest_of_line = pyparsing.rest_of_line
  24. else:
  25. DelimitedList = pyparsing.delimitedList
  26. original_text_for = pyparsing.originalTextFor
  27. rest_of_line = pyparsing.restOfLine
  28. def _alias_instance_method(klass: Type[object], new_name: str, old_name: str) -> None:
  29. if hasattr(klass, new_name) or not hasattr(klass, old_name):
  30. return
  31. def _method(self: object, *args: object, **kwargs: object) -> object:
  32. # Resolve old_name on self so subclass overrides are preserved.
  33. method = cast(Callable[..., object], getattr(self, old_name))
  34. return method(*args, **kwargs)
  35. setattr(klass, new_name, _method)
  36. def _alias_static_method(klass: Type[object], new_name: str, old_name: str) -> None:
  37. if hasattr(klass, new_name) or not hasattr(klass, old_name):
  38. return
  39. old_method = cast(Callable[..., object], getattr(klass, old_name))
  40. def _method(*args: object, **kwargs: object) -> object:
  41. return old_method(*args, **kwargs)
  42. setattr(klass, new_name, staticmethod(_method))
  43. _alias_instance_method(ParserElement, "set_parse_action", "setParseAction")
  44. _alias_instance_method(ParserElement, "add_parse_action", "addParseAction")
  45. _alias_instance_method(ParserElement, "leave_whitespace", "leaveWhitespace")
  46. _alias_instance_method(ParserElement, "set_name", "setName")
  47. _alias_instance_method(ParserElement, "set_results_name", "setResultsName")
  48. _alias_instance_method(ParserElement, "parse_with_tabs", "parseWithTabs")
  49. _alias_instance_method(ParserElement, "search_string", "searchString")
  50. _alias_static_method(
  51. ParserElement,
  52. "set_default_whitespace_chars",
  53. "setDefaultWhitespaceChars",
  54. )
  55. if not hasattr(ParserElement, "parse_string"):
  56. def _parse_string(
  57. self: ParserElement,
  58. instring: str,
  59. parse_all: bool = False,
  60. *,
  61. parseAll: bool = False,
  62. ) -> ParseResults:
  63. if parseAll:
  64. parse_all = parseAll
  65. parser = cast(Callable[..., ParseResults], getattr(self, "parseString"))
  66. return parser(instring, parseAll=parse_all)
  67. setattr(ParserElement, "parse_string", _parse_string)
  68. _alias_instance_method(ParseResults, "as_list", "asList")
  69. def combine_join_kwargs(value: str) -> Dict[str, str]:
  70. if PYPARSING_V3:
  71. return {"join_string": value}
  72. return {"joinString": value}