Blob Blame History Raw
From 7047c6a90535564c9d05121fc8a095aef1de3c21 Mon Sep 17 00:00:00 2001
From: kernc <kerncece@gmail.com>
Date: Wed, 21 Apr 2021 17:29:22 +0200
Subject: [PATCH] Replace deprecated jinja2.Markup with jinja2.tojson (#11174)

* Replace deprecated jinja2.Markup -> markupsafe.Markup

* Expose |tojson as |json. Bump Jinja2 >=2.9

* Replace |json filter with jinja's |tojson throughout

* Fix test_autoload_template_has_changed
---
 _setup_support.py                       |  2 +-
 bokeh/core/_templates/autoload_js.js    | 14 +++++++-------
 bokeh/core/_templates/autoload_nb_js.js |  6 +++---
 bokeh/core/templates.py                 |  4 +---
 tests/unit/bokeh/core/test_templates.py |  2 +-
 5 files changed, 13 insertions(+), 15 deletions(-)

diff --git a/bokeh/core/_templates/autoload_js.js b/bokeh/core/_templates/autoload_js.js
index 792a74c7cc2..d15ea9778e6 100644
--- a/bokeh/core/_templates/autoload_js.js
+++ b/bokeh/core/_templates/autoload_js.js
@@ -20,7 +20,7 @@ calls it with the rendered model.
     return new Date();
   }
 
-  var force = {{ force|default(False)|json }};
+  var force = {{ force|default(False)|tojson }};
 
   if (typeof root._bokeh_onload_callbacks === "undefined" || force === true) {
     root._bokeh_onload_callbacks = [];
@@ -32,7 +32,7 @@ calls it with the rendered model.
 
   {% block autoload_init %}
     {%- if elementid -%}
-    var element = document.getElementById({{ elementid|json }});
+    var element = document.getElementById({{ elementid|tojson }});
     if (element == null) {
       console.warn("Bokeh: autoload.js configured with elementid '{{ elementid }}' but no matching script tag was found.")
     }
@@ -91,7 +91,7 @@ calls it with the rendered model.
       document.body.appendChild(element);
     }
 
-    const hashes = {{ bundle.hashes|json }};
+    const hashes = {{ bundle.hashes|tojson }};
 
     for (let i = 0; i < js_urls.length; i++) {
       const url = js_urls[i];
@@ -110,17 +110,17 @@ calls it with the rendered model.
   }
 
   {% if bundle %}
-  var js_urls = {{ bundle.js_urls|json }};
-  var css_urls = {{ bundle.css_urls|json }};
+  var js_urls = {{ bundle.js_urls|tojson }};
+  var css_urls = {{ bundle.css_urls|tojson }};
   {% else %}
-  var js_urls = {{ js_urls|json }};
-  var css_urls = {{ css_urls|json }};
+  var js_urls = {{ js_urls|tojson }};
+  var css_urls = {{ css_urls|tojson }};
   {% endif %}
 
   var inline_js = [
     {%- for css in (bundle.css_raw if bundle else css_raw) %}
     function(Bokeh) {
-      inject_raw_css({{ css|json }});
+      inject_raw_css({{ css|tojson }});
     },
     {%- endfor %}
     {%- for js in (bundle.js_raw if bundle else js_raw) %}
diff --git a/bokeh/core/_templates/autoload_nb_js.js b/bokeh/core/_templates/autoload_nb_js.js
index 2c75850b2b4..ca96a59cd2d 100644
--- a/bokeh/core/_templates/autoload_nb_js.js
+++ b/bokeh/core/_templates/autoload_nb_js.js
@@ -132,7 +132,7 @@
 
 {% block autoload_init %}
   if (typeof (root._bokeh_timeout) === "undefined" || force === true) {
-    root._bokeh_timeout = Date.now() + {{ timeout|default(0)|json }};
+    root._bokeh_timeout = Date.now() + {{ timeout|default(0)|tojson }};
     root._bokeh_failed_load = false;
   }
 
@@ -153,7 +153,7 @@
      "</div>"}};
 
   function display_loaded() {
-    var el = document.getElementById({{ elementid|json }});
+    var el = document.getElementById({{ elementid|tojson }});
     if (el != null) {
       el.textContent = "BokehJS is loading...";
     }
@@ -181,7 +181,7 @@
       console.log("Bokeh: BokehJS failed to load within specified timeout.");
       root._bokeh_failed_load = true;
     } else if (force !== true) {
-      var cell = $(document.getElementById({{ elementid|json }})).parents('.cell').data().cell;
+      var cell = $(document.getElementById({{ elementid|tojson }})).parents('.cell').data().cell;
       cell.output_area.append_execute_result(NB_LOAD_WARNING)
     }
 {% endblock %}
diff --git a/bokeh/core/templates.py b/bokeh/core/templates.py
index 10344ecaf7d..c7cd25ea7f2 100644
--- a/bokeh/core/templates.py
+++ b/bokeh/core/templates.py
@@ -36,12 +36,11 @@
 #-----------------------------------------------------------------------------
 
 # Standard library imports
-import json
 import sys
 from os.path import dirname, join
 
 # External imports
-from jinja2 import Environment, FileSystemLoader, Markup
+from jinja2 import Environment, FileSystemLoader
 
 #-----------------------------------------------------------------------------
 # Globals and constants
@@ -86,7 +85,6 @@ def get_env():
 #-----------------------------------------------------------------------------
 
 _env = get_env()
-_env.filters['json'] = lambda obj: Markup(json.dumps(obj))
 
 #-----------------------------------------------------------------------------
 # General API