From e082abf627c2254c8eb353e59c4bd6a3294a3c3e Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Thu, 4 Apr 2019 18:39:07 +0200 Subject: [PATCH] [voltLib] Allow passing file-like object to Parser --- Lib/fontTools/voltLib/lexer.py | 7 +++++-- Lib/fontTools/voltLib/parser.py | 13 +++++++++++-- Tests/voltLib/parser_test.py | 21 ++------------------- 3 files changed, 18 insertions(+), 23 deletions(-) diff --git a/Lib/fontTools/voltLib/lexer.py b/Lib/fontTools/voltLib/lexer.py index 271fe3b08..53102b993 100644 --- a/Lib/fontTools/voltLib/lexer.py +++ b/Lib/fontTools/voltLib/lexer.py @@ -39,10 +39,13 @@ class Lexer(object): if token_type not in {Lexer.NEWLINE}: return (token_type, token, location) + def location_(self): + column = self.pos_ - self.line_start_ + 1 + return (self.filename_ or "", self.line_, column) + def next_(self): self.scan_over_(Lexer.CHAR_WHITESPACE_) - column = self.pos_ - self.line_start_ + 1 - location = (self.filename_, self.line_, column) + location = self.location_() start = self.pos_ text = self.text_ limit = len(text) diff --git a/Lib/fontTools/voltLib/parser.py b/Lib/fontTools/voltLib/parser.py index 4fe10a0ec..df035aa64 100644 --- a/Lib/fontTools/voltLib/parser.py +++ b/Lib/fontTools/voltLib/parser.py @@ -32,10 +32,19 @@ class Parser(object): self.lookups_ = SymbolTable() self.next_token_type_, self.next_token_ = (None, None) self.next_token_location_ = None - with open(path, "r") as f: - self.lexer_ = Lexer(f.read(), path) + self.make_lexer_(path) self.advance_lexer_() + def make_lexer_(self, file_or_path): + if hasattr(file_or_path, "read"): + filename = getattr(file_or_path, "name", None) + data = file_or_path.read() + else: + filename = file_or_path + with open(file_or_path, "r") as f: + data = f.read() + self.lexer_ = Lexer(data, filename) + def parse(self): statements = self.doc_.statements while self.next_token_type_ is not None: diff --git a/Tests/voltLib/parser_test.py b/Tests/voltLib/parser_test.py index a532b3758..3bfa17c8e 100644 --- a/Tests/voltLib/parser_test.py +++ b/Tests/voltLib/parser_test.py @@ -1,12 +1,9 @@ from __future__ import print_function, division, absolute_import from __future__ import unicode_literals +from fontTools.misc.py23 import * from fontTools.voltLib import ast from fontTools.voltLib.error import VoltLibError from fontTools.voltLib.parser import Parser -from io import open -import os -import shutil -import tempfile import unittest @@ -1119,22 +1116,8 @@ class ParserTest(unittest.TestCase): def_glyph.type, def_glyph.components), (".notdef", 0, None, "BASE", None)) - def setUp(self): - self.tempdir = None - self.num_tempfiles = 0 - - def tearDown(self): - if self.tempdir: - shutil.rmtree(self.tempdir) - def parse(self, text): - if not self.tempdir: - self.tempdir = tempfile.mkdtemp() - self.num_tempfiles += 1 - path = os.path.join(self.tempdir, "tmp%d.vtp" % self.num_tempfiles) - with open(path, "w") as outfile: - outfile.write(text) - return Parser(path).parse() + return Parser(UnicodeIO(text)).parse() if __name__ == "__main__": import sys