Skip to content

Commit 361869b

Browse files
committed
FluentParser and FluentSerializer
1 parent 1a30802 commit 361869b

File tree

9 files changed

+83
-62
lines changed

9 files changed

+83
-62
lines changed

fluent/syntax/__init__.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from .parser import FluentParser
2+
from .serializer import FluentSerializer
3+
4+
5+
def parse(source, **kwargs):
6+
parser = FluentParser(**kwargs)
7+
return parser.parse(source)
8+
9+
10+
def serialize(resource, **kwargs):
11+
serializer = FluentSerializer(**kwargs)
12+
return serializer.serialize(resource)

fluent/syntax/parser.py

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,31 @@
44
from .errors import ParseError
55

66

7-
def parse(source):
8-
comment = None
9-
10-
ps = FTLParserStream(source)
11-
ps.skip_ws_lines()
7+
class FluentParser(object):
8+
def parse(self, source):
9+
comment = None
1210

13-
entries = []
11+
ps = FTLParserStream(source)
12+
ps.skip_ws_lines()
1413

15-
while ps.current():
16-
entry = get_entry_or_junk(ps)
14+
entries = []
1715

18-
if isinstance(entry, ast.Comment) and len(entries) == 0:
19-
comment = entry
20-
else:
21-
entries.append(entry)
16+
while ps.current():
17+
entry = get_entry_or_junk(ps)
2218

23-
ps.skip_ws_lines()
19+
if isinstance(entry, ast.Comment) and len(entries) == 0:
20+
comment = entry
21+
else:
22+
entries.append(entry)
2423

25-
return ast.Resource(entries, comment)
24+
ps.skip_ws_lines()
2625

26+
return ast.Resource(entries, comment)
2727

28-
def parse_entry(source):
29-
ps = FTLParserStream(source)
30-
ps.skip_ws_lines()
31-
return get_entry_or_junk(ps)
28+
def parse_entry(self, source):
29+
ps = FTLParserStream(source)
30+
ps.skip_ws_lines()
31+
return get_entry_or_junk(ps)
3232

3333

3434
def get_entry_or_junk(ps):

fluent/syntax/serializer.py

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,31 +15,34 @@ def contain_new_line(elems):
1515
])
1616

1717

18-
def serialize(resource, with_junk=False):
19-
parts = []
20-
if resource.comment:
21-
parts.append(
22-
"{}\n\n".format(
23-
serialize_comment(resource.comment)
18+
class FluentSerializer(object):
19+
def __init__(self, with_junk=False):
20+
self.with_junk = with_junk
21+
22+
def serialize(self, resource):
23+
parts = []
24+
if resource.comment:
25+
parts.append(
26+
"{}\n\n".format(
27+
serialize_comment(resource.comment)
28+
)
2429
)
25-
)
26-
for entry in resource.body:
27-
if not isinstance(entry, ast.Junk) or with_junk:
28-
parts.append(serialize_entry(entry))
29-
30-
return "".join(parts)
31-
32-
33-
def serialize_entry(entry):
34-
if isinstance(entry, ast.Message):
35-
return serialize_message(entry)
36-
if isinstance(entry, ast.Section):
37-
return serialize_section(entry)
38-
if isinstance(entry, ast.Comment):
39-
return serialize_comment(entry)
40-
if isinstance(entry, ast.Junk):
41-
return serialize_junk(entry)
42-
raise Exception('Unknown entry type: {}'.format(entry.type))
30+
for entry in resource.body:
31+
if not isinstance(entry, ast.Junk) or self.with_junk:
32+
parts.append(self.serialize_entry(entry))
33+
34+
return "".join(parts)
35+
36+
def serialize_entry(self, entry):
37+
if isinstance(entry, ast.Message):
38+
return serialize_message(entry)
39+
if isinstance(entry, ast.Section):
40+
return serialize_section(entry)
41+
if isinstance(entry, ast.Comment):
42+
return serialize_comment(entry)
43+
if isinstance(entry, ast.Junk):
44+
return serialize_junk(entry)
45+
raise Exception('Unknown entry type: {}'.format(entry.type))
4346

4447

4548
def serialize_comment(comment):

tests/syntax/test_ast_json.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,19 @@
66

77
from tests.syntax import dedent_ftl
88
from fluent.syntax.ast import from_json
9-
from fluent.syntax.parser import parse
9+
from fluent.syntax.parser import FluentParser
1010

1111

1212
class TestASTJSON(unittest.TestCase):
13+
def setUp(self):
14+
self.parser = FluentParser()
15+
1316
def test_simple_resource(self):
1417
input = """\
1518
foo = Foo
1619
"""
1720

18-
ast1 = parse(dedent_ftl(input))
21+
ast1 = self.parser.parse(dedent_ftl(input))
1922
json1 = ast1.to_json()
2023
ast2 = from_json(json1)
2124
json2 = ast2.to_json()
@@ -47,7 +50,7 @@ def test_complex_resource(self):
4750
} post.
4851
"""
4952

50-
ast1 = parse(dedent_ftl(input))
53+
ast1 = self.parser.parse(dedent_ftl(input))
5154
json1 = ast1.to_json()
5255
ast2 = from_json(json1)
5356
json2 = ast2.to_json()
@@ -59,7 +62,7 @@ def test_syntax_error(self):
5962
foo = Foo {
6063
"""
6164

62-
ast1 = parse(dedent_ftl(input))
65+
ast1 = self.parser.parse(dedent_ftl(input))
6366
json1 = ast1.to_json()
6467
ast2 = from_json(json1)
6568
json2 = ast2.to_json()

tests/syntax/test_entry.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,14 @@
66

77
from tests.syntax import dedent_ftl
88
from fluent.syntax.ast import from_json
9-
from fluent.syntax.parser import parse_entry
10-
from fluent.syntax.serializer import serialize_entry
9+
from fluent.syntax.parser import FluentParser
10+
from fluent.syntax.serializer import FluentSerializer
1111

1212

1313
class TestParseEntry(unittest.TestCase):
14+
def setUp(self):
15+
self.parser = FluentParser()
16+
1417
def test_simple_message(self):
1518
input = """\
1619
foo = Foo
@@ -41,11 +44,14 @@ def test_simple_message(self):
4144
}
4245
}
4346

44-
message = parse_entry(dedent_ftl(input))
47+
message = self.parser.parse_entry(dedent_ftl(input))
4548
self.assertEqual(message.to_json(), output)
4649

4750

4851
class TestSerializeEntry(unittest.TestCase):
52+
def setUp(self):
53+
self.serializer = FluentSerializer()
54+
4955
def test_simple_message(self):
5056
input = {
5157
"comment": None,
@@ -76,5 +82,5 @@ def test_simple_message(self):
7682
foo = Foo
7783
"""
7884

79-
message = serialize_entry(from_json(input))
85+
message = self.serializer.serialize_entry(from_json(input))
8086
self.assertEqual(message, dedent_ftl(output))

tests/syntax/test_serializer.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@
55
sys.path.append('.')
66

77
from tests.syntax import dedent_ftl
8-
from fluent.syntax.parser import parse
9-
from fluent.syntax.serializer import serialize
8+
from fluent.syntax import parse, serialize
109

1110

1211
def pretty_ftl(text):

tools/fluentfmt.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44

55
sys.path.append('./')
66
import codecs
7-
import fluent.syntax.parser
8-
import fluent.syntax.serializer
7+
from fluent.syntax import parse, serialize
98

109

1110
def read_file(path):
@@ -15,8 +14,8 @@ def read_file(path):
1514

1615

1716
def pretty_print(fileType, data):
18-
ast = fluent.syntax.parser.parse(data)
19-
print(fluent.syntax.serializer.serialize(ast))
17+
ast = parse(data)
18+
print(serialize(ast))
2019

2120
if __name__ == "__main__":
2221
file_type = 'ftl'

tools/parse.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
sys.path.append('./')
66
import codecs
7-
import fluent.syntax.parser
7+
from fluent.syntax import parse
88
import json
99

1010

@@ -15,7 +15,7 @@ def read_file(path):
1515

1616

1717
def print_ast(fileType, data):
18-
ast = fluent.syntax.parser.parse(data)
18+
ast = parse(data)
1919
print(json.dumps(ast.to_json(), indent=2, ensure_ascii=False))
2020

2121

tools/serialize.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@
55

66
sys.path.append('./')
77
import codecs
8-
import fluent.syntax.ast
9-
import fluent.syntax.serializer
8+
from fluent.syntax import ast, serialize
109

1110

1211
def read_json(path):
@@ -15,8 +14,8 @@ def read_json(path):
1514

1615

1716
def pretty_print(fileType, data):
18-
ast = fluent.syntax.ast.from_json(data)
19-
print(fluent.syntax.serializer.serialize(ast))
17+
resource = ast.from_json(data)
18+
print(serialize(resource))
2019

2120
if __name__ == "__main__":
2221
file_type = 'ftl'

0 commit comments

Comments
 (0)