summaryrefslogtreecommitdiff
path: root/pint/delegates/txt_defparser/defparser.py
diff options
context:
space:
mode:
Diffstat (limited to 'pint/delegates/txt_defparser/defparser.py')
-rw-r--r--pint/delegates/txt_defparser/defparser.py45
1 files changed, 37 insertions, 8 deletions
diff --git a/pint/delegates/txt_defparser/defparser.py b/pint/delegates/txt_defparser/defparser.py
index 0b99d6d..f1b8e45 100644
--- a/pint/delegates/txt_defparser/defparser.py
+++ b/pint/delegates/txt_defparser/defparser.py
@@ -5,11 +5,28 @@ import typing as ty
from ..._vendor import flexcache as fc
from ..._vendor import flexparser as fp
-from .. import base_defparser
+from ..base_defparser import ParserConfig
from . import block, common, context, defaults, group, plain, system
-class PintRootBlock(fp.RootBlock):
+class PintRootBlock(
+ fp.RootBlock[
+ ty.Union[
+ plain.CommentDefinition,
+ common.ImportDefinition,
+ context.ContextDefinition,
+ defaults.DefaultsDefinition,
+ system.SystemDefinition,
+ group.GroupDefinition,
+ plain.AliasDefinition,
+ plain.DerivedDimensionDefinition,
+ plain.DimensionDefinition,
+ plain.PrefixDefinition,
+ plain.UnitDefinition,
+ ],
+ ParserConfig,
+ ]
+):
body: fp.Multi[
ty.Union[
plain.CommentDefinition,
@@ -27,11 +44,15 @@ class PintRootBlock(fp.RootBlock):
]
+class PintSource(fp.ParsedSource[PintRootBlock, ParserConfig]):
+ """Source code in Pint."""
+
+
class HashTuple(tuple):
pass
-class _PintParser(fp.Parser):
+class _PintParser(fp.Parser[PintRootBlock, ParserConfig]):
"""Parser for the original Pint definition file, with cache."""
_delimiters = {
@@ -46,11 +67,11 @@ class _PintParser(fp.Parser):
_diskcache: fc.DiskCache
- def __init__(self, config: base_defparser.ParserConfig, *args, **kwargs):
+ def __init__(self, config: ParserConfig, *args, **kwargs):
self._diskcache = kwargs.pop("diskcache", None)
super().__init__(config, *args, **kwargs)
- def parse_file(self, path: pathlib.Path) -> fp.ParsedSource:
+ def parse_file(self, path: pathlib.Path) -> PintSource:
if self._diskcache is None:
return super().parse_file(path)
content, basename = self._diskcache.load(path, super().parse_file)
@@ -58,7 +79,13 @@ class _PintParser(fp.Parser):
class DefParser:
- skip_classes = (fp.BOF, fp.BOR, fp.BOS, fp.EOS, plain.CommentDefinition)
+ skip_classes: tuple[type] = (
+ fp.BOF,
+ fp.BOR,
+ fp.BOS,
+ fp.EOS,
+ plain.CommentDefinition,
+ )
def __init__(self, default_config, diskcache):
self._default_config = default_config
@@ -78,6 +105,8 @@ class DefParser:
continue
if isinstance(stmt, common.DefinitionSyntaxError):
+ # TODO: check why this assert fails
+ # assert isinstance(last_location, str)
stmt.set_location(last_location)
raise stmt
elif isinstance(stmt, block.DirectiveBlock):
@@ -101,7 +130,7 @@ class DefParser:
else:
yield stmt
- def parse_file(self, filename: pathlib.Path, cfg=None):
+ def parse_file(self, filename: pathlib.Path, cfg: ParserConfig | None = None):
return fp.parse(
filename,
_PintParser,
@@ -109,7 +138,7 @@ class DefParser:
diskcache=self._diskcache,
)
- def parse_string(self, content: str, cfg=None):
+ def parse_string(self, content: str, cfg: ParserConfig | None = None):
return fp.parse_bytes(
content.encode("utf-8"),
_PintParser,