You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by po...@apache.org on 2020/07/14 10:56:39 UTC

[airflow] 04/08: Fixes failing formatting of DAG file containing {} in docstring (#9779)

This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch v1-10-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit 05cdc93e7e4fb2d57e73b10a6f7bf9cdccf3729a
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Sun Jul 12 18:42:36 2020 +0200

    Fixes failing formatting of DAG file containing {} in docstring (#9779)
    
    (cherry picked from commit 43cb059e96dda850aae6f6666c518f2b2ae22faa)
---
 airflow/www/utils.py      | 13 +++++++++++++
 airflow/www/views.py      | 11 +----------
 airflow/www_rbac/utils.py |  4 ++--
 tests/www/test_utils.py   | 28 ++++++++++++++++++++++++++++
 4 files changed, 44 insertions(+), 12 deletions(-)

diff --git a/airflow/www/utils.py b/airflow/www/utils.py
index 11ebedb..3a33c59 100644
--- a/airflow/www/utils.py
+++ b/airflow/www/utils.py
@@ -19,7 +19,11 @@
 #
 # flake8: noqa: E402
 import inspect
+
+import markdown
 from future import standard_library
+from markupsafe import Markup
+
 standard_library.install_aliases()  # noqa: E402
 from builtins import str, object
 
@@ -486,3 +490,12 @@ class UtcFilterConverter(sqlafilters.FilterConverter):
     @filters.convert('utcdatetime')
     def conv_utcdatetime(self, column, name, **kwargs):
         return [f(column, name, **kwargs) for f in self.utcdatetime_filters]
+
+
+def wrapped_markdown(s, css_class=None):
+    if s is None:
+        return None
+
+    return Markup(
+        '<div class="rich_doc {css_class}" >'.format(css_class=css_class) + markdown.markdown(s) + "</div>"
+    )
diff --git a/airflow/www/views.py b/airflow/www/views.py
index abd1b9e..b496e72 100644
--- a/airflow/www/views.py
+++ b/airflow/www/views.py
@@ -34,7 +34,6 @@ from datetime import timedelta
 from functools import wraps
 from textwrap import dedent
 
-import markdown
 import sqlalchemy as sqla
 import pendulum
 from flask import (
@@ -87,6 +86,7 @@ from airflow.utils.timezone import datetime
 from airflow.www import utils as wwwutils
 from airflow.www.forms import (DateTimeForm, DateTimeWithNumRunsForm,
                                DateTimeWithNumRunsWithDagRunsForm)
+from airflow.www.utils import wrapped_markdown
 from airflow.www.validators import GreaterEqualThan
 
 QUERY_LIMIT = 100000
@@ -249,15 +249,6 @@ def render(obj, lexer):
     return out
 
 
-def wrapped_markdown(s, css_class=None):
-    if s is None:
-        return None
-
-    return Markup(
-        '<div class="rich_doc {css_class}" >' + markdown.markdown(s) + "</div>"
-    ).format(css_class=css_class)
-
-
 attr_renderer = {
     'bash_command': lambda x: render(x, lexers.BashLexer),
     'hql': lambda x: render(x, lexers.SqlLexer),
diff --git a/airflow/www_rbac/utils.py b/airflow/www_rbac/utils.py
index f493490..0697135 100644
--- a/airflow/www_rbac/utils.py
+++ b/airflow/www_rbac/utils.py
@@ -318,8 +318,8 @@ def wrapped_markdown(s, css_class=None):
         return None
 
     return Markup(
-        '<div class="rich_doc {css_class}" >' + markdown.markdown(s) + "</div>"
-    ).format(css_class=css_class)
+        '<div class="rich_doc {css_class}" >'.format(css_class=css_class) + markdown.markdown(s) + "</div>"
+    )
 
 
 def get_attr_renderer():
diff --git a/tests/www/test_utils.py b/tests/www/test_utils.py
index cc371ef..bc3ca16 100644
--- a/tests/www/test_utils.py
+++ b/tests/www/test_utils.py
@@ -30,6 +30,8 @@ from airflow.settings import Session
 from airflow.utils.state import State
 from airflow.utils import dates, timezone
 from airflow.www import utils, app as application
+from airflow.www.utils import wrapped_markdown
+from airflow.www_rbac.utils import wrapped_markdown as wrapped_markdown_rbac
 from tests.test_utils.config import conf_vars
 
 if six.PY2:
@@ -360,5 +362,31 @@ class TestDecorators(unittest.TestCase):
                             execution_date=self.EXAMPLE_DAG_DEFAULT_DATE)
 
 
+class TestWrappedMarkdown(unittest.TestCase):
+
+    def test_wrapped_markdown_with_docstring_curly_braces(self):
+        rendered = wrapped_markdown("{braces}", css_class="a_class")
+        self.assertEqual('<div class="rich_doc a_class" ><p>{braces}</p></div>', rendered)
+
+    def test_wrapped_markdown_with_some_markdown(self):
+        rendered = wrapped_markdown("*italic*\n**bold**\n", css_class="a_class")
+        self.assertEqual(
+            '''<div class="rich_doc a_class" ><p><em>italic</em>
+<strong>bold</strong></p></div>''', rendered)
+
+
+class TestWrappedMarkdownRbac(unittest.TestCase):
+
+    def test_wrapped_markdown_with_docstring_curly_braces(self):
+        rendered = wrapped_markdown_rbac("{braces}", css_class="a_class")
+        self.assertEqual('<div class="rich_doc a_class" ><p>{braces}</p></div>', rendered)
+
+    def test_wrapped_markdown_with_some_markdown(self):
+        rendered = wrapped_markdown_rbac("*italic*\n**bold**\n", css_class="a_class")
+        self.assertEqual(
+            '''<div class="rich_doc a_class" ><p><em>italic</em>
+<strong>bold</strong></p></div>''', rendered)
+
+
 if __name__ == '__main__':
     unittest.main()