From 032cfa1a8c4e54dead87bae11f956e1cb6881794 Mon Sep 17 00:00:00 2001 From: Adi Roiban Date: Sun, 16 Feb 2014 15:54:00 +0200 Subject: [PATCH] Initial code for parsing from stream. --- .gitignore | 1 + lesscpy/lessc/lexer.py | 12 +++++++---- lesscpy/lessc/parser.py | 10 +++++++-- test/test_lexer.py | 47 +++++++++++++++++++++++++++++++++++++++++ test/test_parser.py | 31 +++++++++++++++++++++++++++ 5 files changed, 95 insertions(+), 6 deletions(-) create mode 100644 test/test_lexer.py create mode 100644 test/test_parser.py diff --git a/.gitignore b/.gitignore index 46e49c8..6194089 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ dist MANIFEST .tox .venv* +*.egg-info/ diff --git a/lesscpy/lessc/lexer.py b/lesscpy/lessc/lexer.py index a333d94..2defdee 100644 --- a/lesscpy/lessc/lexer.py +++ b/lesscpy/lessc/lexer.py @@ -460,12 +460,16 @@ class LessLexer: self.lexer.input(f.read()) return self - def input(self, filename): + def input(self, file): """ - Wrapper for file + Load lexer with content from `file` which can be a path or a file + like object. """ - with open(filename) as f: - self.lexer.input(f.read()) + if isinstance(file, basestring): + with open(file) as f: + self.lexer.input(f.read()) + else: + self.lexer.input(file.read()) def token(self): """ diff --git a/lesscpy/lessc/parser.py b/lesscpy/lessc/parser.py index 153feff..84e65c2 100644 --- a/lesscpy/lessc/parser.py +++ b/lesscpy/lessc/parser.py @@ -77,7 +77,7 @@ class LessParser(object): self.result = None self.target = None - def parse(self, filename='', debuglevel=0): + def parse(self, filename='', filestream=None, debuglevel=0): """ Parse file. kwargs: filename (str): File to parse @@ -87,8 +87,14 @@ class LessParser(object): print('Compiling target: %s' % filename, file=sys.stderr) self.scope.push() self.target = filename + if filestream: + content = filestream + else: + content = filename + self.result = self.parser.parse( - filename, lexer=self.lex, debug=debuglevel) + content, lexer=self.lex, debug=debuglevel) + self.post_parse() def post_parse(self): diff --git a/test/test_lexer.py b/test/test_lexer.py new file mode 100644 index 0000000..d001202 --- /dev/null +++ b/test/test_lexer.py @@ -0,0 +1,47 @@ +""" +Unit tests for the lexer. +""" +from StringIO import StringIO +from tempfile import NamedTemporaryFile +import unittest + + +from lesscpy.lessc.lexer import LessLexer + + +class TestLessLexer(unittest.TestCase): + """ + Unit tests for LessLexer + """ + + def setUp(self): + self.lexer = LessLexer() + + + def test_input_stream(self): + """ + It can load content from a string. + """ + file = StringIO(""" + @simple-var: 1; + """) + + self.lexer.input(file) + + token = self.lexer.token() + self.assertEqual('@simple-var', token.value) + + def test_input_path(self): + """ + It can load content from a path. + """ + file = NamedTemporaryFile() + file.write(""" + @simple-var: 1; + """) + file.seek(0) + + self.lexer.input(file.name) + + token = self.lexer.token() + self.assertEqual('@simple-var', token.value) diff --git a/test/test_parser.py b/test/test_parser.py new file mode 100644 index 0000000..256ce2a --- /dev/null +++ b/test/test_parser.py @@ -0,0 +1,31 @@ +""" +Unit test for the parser. +""" +from StringIO import StringIO +import unittest + +from lesscpy.lessc.parser import LessParser + +class TestLessParser(unittest.TestCase): + """ + Unit tests for LessParser. + """ + + def setUp(self): + self.parser = LessParser() + + def test_parse_stream(self): + """ + It can parse input from a file stream. + """ + stream = StringIO(""" + @nice-blue: #5B83AD; + """) + + self.parser.parse(filestream=stream) + + # A single object is parser which is the expected variable. + self.assertEqual(1, len(self.parser.result)) + variable = self.parser.result[0] + self.assertEqual('@nice-blue', variable.name) + self.assertEqual(['#5b83ad'], variable.value)