Skip to content

Commit 6bb1ce8

Browse files
authored
Fix string representations of parsers (#114)
* TransformationParser * ConversionParser * RegexParser
1 parent 1c3e000 commit 6bb1ce8

File tree

4 files changed

+15
-10
lines changed

4 files changed

+15
-10
lines changed

src/parsita/parsers/_conversion.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ def _consume(
2525
return None
2626

2727
def __repr__(self):
28-
return self.name_or_nothing() + repr(self.parser)
28+
return self.name_or_nothing() + f"{self.parser!r} > {self.converter.__name__}"
2929

3030

3131
class TransformationParser(Generic[Input, Output, Convert], Parser[Input, Convert]):
@@ -47,3 +47,7 @@ def _consume(
4747
return self.transformer(status.value).consume(state, status.remainder)
4848
else:
4949
return status
50+
51+
def __repr__(self) -> str:
52+
string = f"{self.parser.name_or_repr()} >= {self.transformer.__name__}"
53+
return self.name_or_nothing() + string

src/parsita/parsers/_regex.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ def _consume(self, state: State[StringType], reader: Reader[StringType]):
3636

3737
return Continue(reader, value)
3838

39-
def __repr__(self):
40-
return self.name_or_nothing() + f"reg(r'{self.pattern.pattern}')"
39+
def __repr__(self) -> str:
40+
return self.name_or_nothing() + f"reg({self.pattern.pattern!r})"
4141

4242

4343
def reg(pattern: Union[re.Pattern, StringType]) -> RegexParser[StringType]:

tests/test_basic.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -437,8 +437,8 @@ def make_twentyone(x):
437437
assert TestParsers.one.parse("1") == Success(1)
438438
assert TestParsers.twelve.parse("12") == Success(12)
439439
assert TestParsers.twentyone.parse("21") == Success(21)
440-
assert str(TestParsers.twelve) == "twelve = one & two"
441-
assert str(TestParsers.twentyone) == "twentyone = two & one"
440+
assert str(TestParsers.twelve) == "twelve = one & two > <lambda>"
441+
assert str(TestParsers.twentyone) == "twentyone = two & one > make_twentyone"
442442

443443

444444
def test_recursion():

tests/test_regex.py

+6-5
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class TestParsers(ParserContext, whitespace="[ ]*"):
3434
assert TestParsers.hundred.parse(" 100") == Success(100)
3535
assert TestParsers.hundred.parse("100 ") == Success(100)
3636
assert TestParsers.hundred.parse(" 100 ") == Success(100)
37-
assert str(TestParsers.hundred) == "hundred = '100'"
37+
assert str(TestParsers.hundred) == "hundred = '100' > float"
3838

3939

4040
def test_literal_no_whitespace():
@@ -48,7 +48,7 @@ class TestParsers(ParserContext):
4848
assert TestParsers.hundred.parse("100 ") == Failure(
4949
ParseError(StringReader("100 ", 3), ["end of source"])
5050
)
51-
assert str(TestParsers.hundred) == "hundred = '100'"
51+
assert str(TestParsers.hundred) == "hundred = '100' > float"
5252

5353

5454
def test_literal_multiple():
@@ -108,7 +108,7 @@ class TestParsers(ParserContext, whitespace="[ ]*"):
108108
assert TestParsers.digits.parse(" 100") == Success("100")
109109
assert TestParsers.digits.parse("100 ") == Success("100")
110110
assert TestParsers.digits.parse(" 100 ") == Success("100")
111-
assert str(TestParsers.digits) == r"digits = reg(r'\d+')"
111+
assert str(TestParsers.digits) == r"digits = reg('\\d+')"
112112

113113

114114
def test_regex_no_whitespace():
@@ -122,7 +122,7 @@ class TestParsers(ParserContext):
122122
assert TestParsers.digits.parse("100 ") == Failure(
123123
ParseError(StringReader("100 ", 3), ["end of source"])
124124
)
125-
assert str(TestParsers.digits) == r"digits = reg(r'\d+')"
125+
assert str(TestParsers.digits) == r"digits = reg('\\d+') > float"
126126

127127

128128
def test_regex_custom_whitespace():
@@ -142,7 +142,7 @@ class TestParsers(ParserContext, whitespace="[ ]*"):
142142
assert TestParsers.pair.parse("100\n100") == Failure(
143143
ParseError(StringReader("100\n100", 3), [r"r'\d+'"])
144144
)
145-
assert str(TestParsers.digits) == r"digits = reg(r'\d+')"
145+
assert str(TestParsers.digits) == r"digits = reg('\\d+') > float"
146146
assert str(TestParsers.pair) == "pair = digits & digits"
147147

148148

@@ -342,6 +342,7 @@ def select_parser(type: str):
342342
assert NumberParsers.number.parse("decimal 5") == Failure(
343343
ParseError(StringReader("decimal 5", 8), [r"r'[0-9]+\.[0-9]+'"])
344344
)
345+
assert str(NumberParsers.number) == "number = type >= select_parser"
345346

346347

347348
def test_transformation_error_propogation():

0 commit comments

Comments
 (0)