Skip to content

Commit 08bf204

Browse files
committed
🛠️ fix(api): restore diff semantics and parser compat
1 parent 983460c commit 08bf204

6 files changed

Lines changed: 30 additions & 13 deletions

File tree

sdiff/__init__.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ def diff(md1, md2, renderer=TextRenderer(), parser_cls: type[MdParser] = MdParse
88
tree2 = parse(md2, parser_cls)
99

1010
tree1, tree2, struct_errors = diff_struct(tree1, tree2)
11-
tree1, tree2, links_errors = diff_links(tree1, tree2)
12-
13-
errors = struct_errors + links_errors
11+
errors = struct_errors
1412

1513
return renderer.render(tree1), renderer.render(tree2), errors

sdiff/compare.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,7 @@ def _diff(tree1, tree2, include_symbols=None, exclude_symbols=None):
4444

4545

4646
def diff_links(tree1, tree2):
47-
tree1, tree2, errors = _diff(tree1, tree2, exclude_symbols=['t', 'i'])
48-
link_errors = [error for error in errors if error.node.symbol == 'a']
49-
return tree1, tree2, link_errors
47+
return _diff(tree1, tree2, include_symbols=['p', 'h', 'l', 'a'])
5048

5149

5250
def diff_struct(tree1, tree2):

sdiff/parser.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222

2323

2424
class MdParser:
25+
list_rules = None
26+
2527
@classmethod
2628
def get_lexer(cls):
2729
return cls()
@@ -30,9 +32,9 @@ def __init__(self):
3032
self._markdown = mistune.create_markdown(renderer='ast')
3133
self._reference_definitions = {}
3234

33-
def parse(self, text):
35+
def parse(self, text, rules=None):
3436
tokens = self._markdown(text)
35-
return Root(self._convert_block_tokens(tokens))
37+
return self._convert_block_tokens(tokens)
3638

3739
def _set_reference_definitions(self, definitions):
3840
self._reference_definitions = definitions
@@ -250,9 +252,9 @@ class ZendeskHelpMdParser(MdParser):
250252
_STEPS_PATTERN = re.compile(r'(?s)<steps>(?P<content>.*?)</steps>')
251253
_TABS_PATTERN = re.compile(r'(?s)<tabs>(?P<content>.*?)</tabs>')
252254

253-
def parse(self, text):
255+
def parse(self, text, rules=None):
254256
nodes = self._parse_nodes(text)
255-
return Root(nodes)
257+
return nodes
256258

257259
def _parse_nodes(self, text: str):
258260
nodes = []
@@ -425,9 +427,9 @@ def _remove_ltr_rtl_marks(text):
425427
def parse(text, parser_cls: type[MdParser] = MdParser):
426428
text = _remove_spaces_from_empty_lines(text)
427429
text = _remove_ltr_rtl_marks(text)
428-
text, reference_definitions = _extract_reference_definitions(text)
429430
parser = parser_cls()
430431
if hasattr(parser, '_set_reference_definitions'):
432+
text, reference_definitions = _extract_reference_definitions(text)
431433
parser._set_reference_definitions(reference_definitions)
432434
result = parser.parse(text)
433435
if isinstance(result, list):

tests/test_compare.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ def test_not_equal_links(self):
1919
_, _, actual = diff_links(trees.pa(), trees.paa())
2020
self.assertEqual('dummy link 2', actual[0].node.text)
2121

22+
def test_non_link_structure_diffs_returned(self):
23+
_, _, errors = diff_links(trees.r2t(), trees.pt())
24+
self.assertTrue(any(error.node.name == 'header' for error in errors))
25+
2226

2327
class TestEqual(TestCase):
2428

tests/test_parser.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,10 @@ def test_remove_ltr_rtl_marks(self):
263263

264264

265265
class DummyParser:
266-
def parse(self, text):
266+
last_text = None
267+
268+
def parse(self, text, rules=None):
269+
DummyParser.last_text = text
267270
return [Paragraph([Text(text)])]
268271

269272

@@ -272,3 +275,13 @@ def test_wraps_list_parser_output(self):
272275
tree = parser.parse('hello', parser_cls=DummyParser)
273276
self.assertIsInstance(tree, Root)
274277
self.assertEqual('pt', tree.print_all())
278+
279+
def test_custom_parser_input_not_mutated_by_ref_defs(self):
280+
data = 'See [API][id].\n\n[id]: https://example.com'
281+
parser.parse(data, parser_cls=DummyParser)
282+
self.assertIn('[id]: https://example.com', DummyParser.last_text)
283+
284+
def test_mdparser_parse_accepts_rules_argument(self):
285+
md_parser = MdParser()
286+
nodes = md_parser.parse('1. one', MdParser.list_rules)
287+
self.assertIsInstance(nodes, list)

tests/test_sdiff.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ def test_ignores_link_content(self):
4646
def test_missing_link_is_reported(self):
4747
left = 'text [Link](http://example.com)'
4848
right = 'text'
49-
_, _, errors = sdiff.diff(left, right)
49+
tree1 = sdiff.parse(left)
50+
tree2 = sdiff.parse(right)
51+
_, _, errors = sdiff.diff_links(tree1, tree2)
5052
self.assertTrue(any(error.node.name == 'link' for error in errors))
5153

5254
def test_extra_paragraph_has_paragraph_error(self):

0 commit comments

Comments
 (0)