From be5e37187cabc86c1588682eddad1b8db54aa077 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Espino?= Date: Fri, 16 May 2014 12:22:02 +0200 Subject: [PATCH] Adding some tests and a improved version of the wikilinks extension --- taiga/mdrender/gfm/__init__.py | 2 + taiga/mdrender/gfm/wikilinks.py | 79 +++++++++++++++++++++++++++++++++ taiga/mdrender/service.py | 3 +- tests/unit/__init__.py | 0 tests/unit/test_mdrender.py | 78 +++++++++++++++++++------------- 5 files changed, 131 insertions(+), 31 deletions(-) create mode 100644 taiga/mdrender/gfm/wikilinks.py create mode 100644 tests/unit/__init__.py diff --git a/taiga/mdrender/gfm/__init__.py b/taiga/mdrender/gfm/__init__.py index 48f85fde..781cf7c5 100644 --- a/taiga/mdrender/gfm/__init__.py +++ b/taiga/mdrender/gfm/__init__.py @@ -8,6 +8,7 @@ from . import hidden_hilite from . import semi_sane_lists from . import spaced_link from . import strikethrough +from . import wikilinks AutolinkExtension = autolink.AutolinkExtension AutomailExtension = automail.AutomailExtension @@ -15,3 +16,4 @@ HiddenHiliteExtension = hidden_hilite.HiddenHiliteExtension SemiSaneListExtension = semi_sane_lists.SemiSaneListExtension SpacedLinkExtension = spaced_link.SpacedLinkExtension StrikethroughExtension = strikethrough.StrikethroughExtension +WikiLinkExtension = wikilinks.WikiLinkExtension diff --git a/taiga/mdrender/gfm/wikilinks.py b/taiga/mdrender/gfm/wikilinks.py new file mode 100644 index 00000000..d33a723c --- /dev/null +++ b/taiga/mdrender/gfm/wikilinks.py @@ -0,0 +1,79 @@ +from __future__ import absolute_import +from __future__ import unicode_literals +from markdown import Extension +from markdown.inlinepatterns import Pattern +from markdown.util import etree +import re + +def build_url(label, base, end): + """ Build a url from the label, a base, and an end. """ + clean_label = re.sub(r'([ ]+_)|(_[ ]+)|([ ]+)', '_', label) + return '%s%s%s'% (base, clean_label, end) + + +class WikiLinkExtension(Extension): + def __init__(self, configs): + # set extension defaults + self.config = { + 'base_url' : ['/', 'String to append to beginning or URL.'], + 'end_url' : ['/', 'String to append to end of URL.'], + 'html_class' : ['wikilink', 'CSS hook. Leave blank for none.'], + 'build_url' : [build_url, 'Callable formats URL from label.'], + } + configs = dict(configs) or {} + # Override defaults with user settings + for key, value in configs.items(): + self.setConfig(key, value) + + def extendMarkdown(self, md, md_globals): + self.md = md + + # append to end of inline patterns + WIKILINK_RE = r'\[\[([\w0-9_ -]+)(\|[\w0-9_ -]+)?\]\]' + wikilinkPattern = WikiLinks(WIKILINK_RE, self.getConfigs()) + wikilinkPattern.md = md + md.inlinePatterns.add('wikilink', wikilinkPattern, ":smile:") assert result == 'smile' @@ -49,11 +54,7 @@ def test_proccessor_valid_us_reference(): UserStoryBack = references.UserStory references.UserStory = MockModelWithInstance - DummyProject = DummyClass() - DummyProject.id = 1 - DummyProject.slug = "test" - - result = references.references(DummyProject, "**#us1**") + result = references.references(dummy_project, "**#us1**") assert result == '**[#us1](/#/project/test/user-story/1 "test-subject")**' references.UserStory = UserStoryBack @@ -65,14 +66,10 @@ def test_proccessor_invalid_us_reference(): def filter(*args, **kwargs): return [] - DummyProject = DummyClass() - DummyProject.id = 1 - DummyProject.slug = "test" - UserStoryBack = references.UserStory references.UserStory = MockModelEmpty - result = references.references(DummyProject, "**#us1**") + result = references.references(dummy_project, "**#us1**") assert result == "**#us1**" references.UserStory = UserStoryBack @@ -87,11 +84,7 @@ def test_proccessor_valid_issue_reference(): IssueBack = references.Issue references.Issue = MockModelWithInstance - DummyProject = DummyClass() - DummyProject.id = 1 - DummyProject.slug = "test" - - result = references.references(DummyProject, "**#issue1**") + result = references.references(dummy_project, "**#issue1**") assert result == '**[#issue1](/#/project/test/issues/1 "test-subject")**' references.Issue = IssueBack @@ -103,14 +96,10 @@ def test_proccessor_invalid_issue_reference(): def filter(*args, **kwargs): return [] - DummyProject = DummyClass() - DummyProject.id = 1 - DummyProject.slug = "test" - IssueBack = references.Issue references.Issue = MockModelEmpty - result = references.references(DummyProject, "**#issue1**") + result = references.references(dummy_project, "**#issue1**") assert result == "**#issue1**" references.Issue = IssueBack @@ -125,11 +114,7 @@ def test_proccessor_valid_task_reference(): TaskBack = references.Task references.Task = MockModelWithInstance - DummyProject = DummyClass() - DummyProject.id = 1 - DummyProject.slug = "test" - - result = references.references(DummyProject, "**#task1**") + result = references.references(dummy_project, "**#task1**") assert result == '**[#task1](/#/project/test/tasks/1 "test-subject")**' references.Task = TaskBack @@ -141,14 +126,10 @@ def test_proccessor_invalid_task_reference(): def filter(*args, **kwargs): return [] - DummyProject = DummyClass() - DummyProject.id = 1 - DummyProject.slug = "test" - TaskBack = references.Task references.Task = MockModelEmpty - result = references.references(DummyProject, "**#task1**") + result = references.references(dummy_project, "**#task1**") assert result == "**#task1**" references.Task = TaskBack @@ -156,3 +137,40 @@ def test_proccessor_invalid_task_reference(): def test_proccessor_invalid_type_reference(): result = references.references(None, "**#invalid1**") assert result == "**#invalid1**" + +def test_render_wiki_strong(): + assert render(dummy_project, "**test**") == "

test

" + +def test_render_absolute_link(): + assert render(dummy_project, "[test](/test)") == "

test

" + +def test_render_relative_link(): + assert render(dummy_project, "[test](test)") == "

test

" + +def test_render_wikilink(): + expected_result = "

test

" + assert render(dummy_project, "[[test]]") == expected_result + +def test_render_wikilink_with_custom_title(): + expected_result = "

custom

" + assert render(dummy_project, "[[test|custom]]") == expected_result + +def test_render_absolute_image(): + assert render(dummy_project, "![test](/test.png)") == "

\"test\"

" + +def test_render_relative_image(): + assert render(dummy_project, "![test](test.png)") == "

\"test\"

" + +# def test_render_wikilink_attachment(): +# assert render(dummy_project, "![[test.png]]") == "

\"test.png\"

" +# +# def test_render_wikilink_attachment_with_custom_alt(): +# assert render(dummy_project, "![[test.png|test]]") == "

\"test\"

" + +def test_render_triple_quote_code(): + expected_result = "
print("test")\n
" + assert render(dummy_project, "```\nprint(\"test\")\n```") == expected_result + +def test_render_triple_quote_and_lang_code(): + expected_result = "
print("test")\n
" + assert render(dummy_project, "```python\nprint(\"test\")\n```") == expected_result