def scan_quoted_literal(self) -> tokens.QuotedLiteralToken: """Returns a token from a quoted literal string. The initial double quote character is consumed in the scan method, so this method only scans for the trailing quote to indicate the end of the token. Example: >>> lexer = Lexer('Label"') >>> lexer.scan_quoted_literal() QuotedLiteralToken(Label) """ chars = "" while True: ch = self.peek() if ch == '"': break elif ch == "\\": chars += self.consume( ) # Extra consume to skip the escaped character elif ch == "\n": self.line_number += 1 chars += self.consume() self.advance() return tokens.QuotedLiteralToken(chars, self.line_number)
def test_parse_value_quoted_literal(): quoted_literal = "This is a quoted literal." stream = (tokens.QuotedLiteralToken(quoted_literal, 1), tokens.StreamEndToken(1)) parser = lkml.parser.Parser(stream) result = parser.parse_value() assert result == quoted_literal
def test_parse_list_with_pairs(): stream = ( tokens.LiteralToken("sorts", 1), tokens.ValueToken(1), tokens.WhitespaceToken(" ", 1), tokens.ListStartToken(1), tokens.LiteralToken("orders.customer_id", 1), tokens.ValueToken(1), tokens.WhitespaceToken(" ", 1), tokens.LiteralToken("asc", 1), tokens.CommaToken(1), tokens.LiteralToken("orders.order_id", 1), tokens.ValueToken(1), tokens.WhitespaceToken(" ", 1), tokens.LiteralToken("desc", 1), tokens.ListEndToken(1), tokens.StreamEndToken(1), ) parser = lkml.parser.Parser(stream) result = parser.parse_list() assert result == ListNode( type=SyntaxToken("sorts"), left_bracket=LeftBracket(), items=( PairNode(SyntaxToken("orders.customer_id"), SyntaxToken("asc")), PairNode(SyntaxToken("orders.order_id"), SyntaxToken("desc")), ), right_bracket=RightBracket(), ) stream = ( tokens.LiteralToken("filters", 1), tokens.ValueToken(1), tokens.WhitespaceToken(" ", 1), tokens.ListStartToken(1), tokens.WhitespaceToken("\n ", 1), tokens.LiteralToken("view_name.field_one", 2), tokens.ValueToken(2), tokens.WhitespaceToken(" ", 2), tokens.QuotedLiteralToken("-0,-1,-8,-9,-99,-NULL,-EMPTY", 2), tokens.WhitespaceToken("\n", 2), tokens.ListEndToken(3), tokens.StreamEndToken(3), ) parser = lkml.parser.Parser(stream) result = parser.parse_list() assert result == ListNode( type=SyntaxToken("filters"), left_bracket=LeftBracket(), items=( PairNode( SyntaxToken("view_name.field_one", prefix="\n "), QuotedSyntaxToken("-0,-1,-8,-9,-99,-NULL,-EMPTY"), ), ), right_bracket=RightBracket(prefix="\n"), )
def test_parse_pair_with_bad_key(): stream = ( tokens.QuotedLiteralToken("hidden", 1), tokens.ValueToken(1), tokens.LiteralToken("yes", 1), tokens.StreamEndToken(1), ) parser = lkml.parser.Parser(stream) result = parser.parse_pair() assert result is None
def test_parse_pair_with_quoted_literal(): stream = ( tokens.LiteralToken("view_label", 1), tokens.ValueToken(1), tokens.QuotedLiteralToken("View Label", 1), tokens.StreamEndToken(1), ) parser = lkml.parser.Parser(stream) result = parser.parse_pair() assert result == {"view_label": "View Label"}
def test_parse_value_quoted_literal_with_leftovers(): quoted_literal = "This is a quoted literal." literal = "Some other tokens following." stream = ( tokens.QuotedLiteralToken(quoted_literal, 1), tokens.LiteralToken(literal, 1), tokens.ValueToken(1), tokens.StreamEndToken(1), ) parser = lkml.parser.Parser(stream) result = parser.parse_value() assert result == quoted_literal assert parser.index == 1
def scan_quoted_literal(self) -> tokens.QuotedLiteralToken: chars = "" while True: ch = self.peek() if ch == '"': break elif ch == "\\": chars += self.consume( ) # Extra consume to skip the escaped character elif ch == "\n": self.line_number += 1 chars += self.consume() self.advance() return tokens.QuotedLiteralToken(chars, self.line_number)
def test_parse_pair_with_quoted_literal(): stream = ( tokens.LiteralToken("view_label", 1), tokens.ValueToken(1), tokens.WhitespaceToken(" ", 1), tokens.QuotedLiteralToken("The View", 1), tokens.StreamEndToken(1), ) parser = lkml.parser.Parser(stream) result = parser.parse_pair() assert result == PairNode( type=SyntaxToken("view_label"), value=QuotedSyntaxToken("The View") ) with pytest.raises(AttributeError): result.prefix
def test_scan_quoted_literal(): text = '"This is quoted text."' lexer = lkml.Lexer(text) lexer.index = 1 token = lexer.scan_quoted_literal() assert token == tokens.QuotedLiteralToken("This is quoted text.", 1)
def test_scan_quoted_literal_with_escaped_quotes(): text = r'"#.### \"M\""' lexer = lkml.Lexer(text) lexer.index = 1 token = lexer.scan_quoted_literal() assert token == tokens.QuotedLiteralToken(r"#.### \"M\"", 1)
def test_scan_quoted_literal_with_otherwise_illegal_chars(): text = '"This: is {quoted} \n text."' lexer = lkml.Lexer(text) lexer.index = 1 token = lexer.scan_quoted_literal() assert token == tokens.QuotedLiteralToken("This: is {quoted} \n text.", 1)