diff --git a/src/parse.py b/src/parse.py index b673f10..f8df467 100644 --- a/src/parse.py +++ b/src/parse.py @@ -175,41 +175,38 @@ return t -# The note skipper in a wrapper class for easy testing -class NoteSkipper: - # Skip a note - def skip_note(self, stream, parent_context): - context = ParseContext(ParseTask.PARSE_NOTE, stream.peek(), parent_context) - read_token(stream, "StartNote", context) - while True: - t = read_token(stream, None, context) - # Don't allow StartNote in notes - if t.value in ["StartNote"]: - raise ParseErrorException(ParseError.FOUND_STARTNOTE, t, None, context) - # EndNote found, end things - elif t.value == "EndNote": - break - return None +# Skip a note +def skip_note(stream, parent_context): + context = ParseContext(ParseTask.PARSE_NOTE, stream.peek(), parent_context) + read_token(stream, "StartNote", context) + while True: + t = read_token(stream, None, context) + # Don't allow StartNote in notes + if t.value in ["StartNote"]: + raise ParseErrorException(ParseError.FOUND_STARTNOTE, t, None, context) + # EndNote found, end things + elif t.value == "EndNote": + break + return None - # Clear notes - def clear_notes(self, stream, parent_context): - context = ParseContext(ParseTask.CLEAR_NOTES, stream.peek(), parent_context) - tokens = [] + +# Clear notes +def clear_notes(stream, parent_context): + context = ParseContext(ParseTask.CLEAR_NOTES, stream.peek(), parent_context) + tokens = [] + token = stream.peek() + while token is not None: + # Found a note, skip it + if token.value == "StartNote": + skip_note(stream, context) + # EndNote found outside note + elif token.value == "EndNote": + raise ParseErrorException(ParseError.FOUND_ENDNOTE, token, None, context) + # Add the token if it's not note related + else: + tokens.append(stream.pop()) token = stream.peek() - while token is not None: - # Found a note, skip it - if token.value == "StartNote": - self.skip_note(stream, context) - # EndNote found outside note - elif token.value == "EndNote": - raise ParseErrorException( - ParseError.FOUND_ENDNOTE, token, None, context - ) - # Add the token if it's not note related - else: - tokens.append(stream.pop()) - token = stream.peek() - return tokens + return tokens # The recursive descent parser in a wrapper class for easy testing @@ -352,7 +349,7 @@ # Parses tokens def parse(tokens, context): stream = TokenStream(tokens) - cleared = NoteSkipper().clear_notes(stream, context) + cleared = clear_notes(stream, context) stream2 = TokenStream(cleared) parsed = Parser().parse_file(stream2, context) return parsed diff --git a/tests/parse/test_clear_notes.py b/tests/parse/test_clear_notes.py index 8adb7fd..66f1201 100644 --- a/tests/parse/test_clear_notes.py +++ b/tests/parse/test_clear_notes.py @@ -5,7 +5,7 @@ from hypothesis.strategies import composite, just, lists, one_of from src.parse import ( - NoteSkipper, + clear_notes, ParseContext, ParseError, ParseErrorException, @@ -43,18 +43,17 @@ def test_parse_clear_notes_valid(test_data): (tokens, result) = test_data stream = TokenStream(tokens) - cleared = NoteSkipper().clear_notes(stream, None) + cleared = clear_notes(stream, None) assert cleared == result # Tests clear_notes passes through skip_note errors def test_parse_clear_notes_startnote_propagation(): tokens = static_note_invalid() - parser = NoteSkipper().clear_notes parent_context = static_parse_context() context = ParseContext(ParseTask.CLEAR_NOTES, tokens[0], parent_context) error = static_note_invalid_error(context) - template_test_invalid(parser, parent_context, tokens, error) + template_test_invalid(clear_notes, parent_context, tokens, error) # Tests clear_notes errors when finding an EndNote @@ -62,8 +61,7 @@ def test_parse_clear_notes_invalid_endnote(tokens): token = static_token_by_value("EndNote") new_tokens = tokens + [token] - parser = NoteSkipper().clear_notes parent_context = static_parse_context() context = ParseContext(ParseTask.CLEAR_NOTES, new_tokens[0], parent_context) error = ParseErrorException(ParseError.FOUND_ENDNOTE, token, None, context) - template_test_invalid(parser, parent_context, new_tokens, error) + template_test_invalid(clear_notes, parent_context, new_tokens, error) diff --git a/tests/parse/test_note.py b/tests/parse/test_note.py index 9c7b8f7..03fb66e 100644 --- a/tests/parse/test_note.py +++ b/tests/parse/test_note.py @@ -8,7 +8,7 @@ ) from src.parse import ( - NoteSkipper, + skip_note, ParseContext, ParseError, ParseErrorException, @@ -75,7 +75,7 @@ # template_test provides general parsing properties @given(draw_token_note_valid()) def test_parse_note_valid(tokens): - template_test_valid(NoteSkipper().skip_note, tokens, None) + template_test_valid(skip_note, tokens, None) # Tests parsing notes without StartNote @@ -89,7 +89,7 @@ parent_context = static_parse_context() context = ParseContext(ParseTask.PARSE_NOTE, new_tokens[0], parent_context) error = ParseErrorException(ParseError.WRONG_TOKEN, token, "StartNote", context) - template_test_invalid(NoteSkipper().skip_note, parent_context, new_tokens, error) + template_test_invalid(skip_note, parent_context, new_tokens, error) # Tests parsing empty notes @@ -101,7 +101,7 @@ parent_context = static_parse_context() context = ParseContext(ParseTask.PARSE_NOTE, None, parent_context) error = ParseErrorException(ParseError.NO_TOKEN, None, None, context) - template_test_invalid(NoteSkipper().skip_note, parent_context, [], error) + template_test_invalid(skip_note, parent_context, [], error) # Tests parsing a note with a StartNote token in it @@ -114,7 +114,7 @@ parent_context = static_parse_context() context = ParseContext(ParseTask.PARSE_NOTE, tokens[0], parent_context) error = ParseErrorException(ParseError.FOUND_STARTNOTE, start, None, context) - template_test_invalid(NoteSkipper().skip_note, parent_context, tokens, error) + template_test_invalid(skip_note, parent_context, tokens, error) # Tests parsing a note without an EndNote token @@ -128,4 +128,4 @@ parent_context = static_parse_context() context = ParseContext(ParseTask.PARSE_NOTE, tokens[0], parent_context) error = ParseErrorException(ParseError.NO_TOKEN, None, None, context) - template_test_invalid(NoteSkipper().skip_note, parent_context, new_tokens, error) + template_test_invalid(skip_note, parent_context, new_tokens, error) diff --git a/tests/parse/test_parse.py b/tests/parse/test_parse.py index 2725beb..f9bcce3 100644 --- a/tests/parse/test_parse.py +++ b/tests/parse/test_parse.py @@ -5,7 +5,7 @@ from hypothesis.strategies import lists from src.parse import ( - NoteSkipper, + clear_notes, ParseErrorException, Parser, parse, @@ -25,7 +25,7 @@ parsed = None try: stream = TokenStream(tokens.copy()) - cleared = NoteSkipper().clear_notes(stream, context) + cleared = clear_notes(stream, context) stream2 = TokenStream(cleared) result = Parser().parse_file(stream2, context) except ParseErrorException as e: