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()