Skip to content

Commit

Permalink
Initial code for parsing from stream.
Browse files Browse the repository at this point in the history
  • Loading branch information
adiroiban committed Feb 16, 2014
1 parent 923f1b0 commit 032cfa1
Show file tree
Hide file tree
Showing 5 changed files with 95 additions and 6 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ dist
MANIFEST
.tox
.venv*
*.egg-info/
12 changes: 8 additions & 4 deletions lesscpy/lessc/lexer.py
Original file line number Diff line number Diff line change
Expand Up @@ -460,12 +460,16 @@ def file(self, filename):
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):
"""
Expand Down
10 changes: 8 additions & 2 deletions lesscpy/lessc/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ def __init__(self,
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
Expand All @@ -87,8 +87,14 @@ def parse(self, filename='', debuglevel=0):
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):
Expand Down
47 changes: 47 additions & 0 deletions test/test_lexer.py
Original file line number Diff line number Diff line change
@@ -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)
31 changes: 31 additions & 0 deletions test/test_parser.py
Original file line number Diff line number Diff line change
@@ -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)

0 comments on commit 032cfa1

Please sign in to comment.