From 0fa608345c536e244694d404aff8f56421dae39e Mon Sep 17 00:00:00 2001 From: Jon Mease Date: Sat, 27 Feb 2021 09:31:20 -0500 Subject: [PATCH 1/5] Honor plotly figure's template width --- repos/kaleido/py/kaleido/scopes/plotly.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/repos/kaleido/py/kaleido/scopes/plotly.py b/repos/kaleido/py/kaleido/scopes/plotly.py index e6b4b442..ca755bb6 100644 --- a/repos/kaleido/py/kaleido/scopes/plotly.py +++ b/repos/kaleido/py/kaleido/scopes/plotly.py @@ -115,9 +115,19 @@ def transform(self, figure, format=None, width=None, height=None, scale=None): # Get figure layout layout = figure.get("layout", {}) - # Compute default width / height - width = width or layout.get("width", None) or self.default_width - height = height or layout.get("height", None) or self.default_height + # Compute image width / height + width = ( + width + or layout.get("width", None) + or layout.get("template", {}).get("layout", {}).get("width", None) + or self.default_width + ) + height = ( + height + or layout.get("height", None) + or layout.get("template", {}).get("layout", {}).get("height", None) + or self.default_height + ) # Normalize format original_format = format From 42234c3d49a5d44c90ee569c269726246c443acb Mon Sep 17 00:00:00 2001 From: Jon Mease Date: Sat, 27 Feb 2021 10:34:00 -0500 Subject: [PATCH 2/5] Set plotGlPixelRatio to 2x the scale factor --- repos/kaleido/js/src/plotly/constants.js | 3 --- repos/kaleido/js/src/plotly/render.js | 8 ++++---- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/repos/kaleido/js/src/plotly/constants.js b/repos/kaleido/js/src/plotly/constants.js index 914b7c1f..ab8a213d 100644 --- a/repos/kaleido/js/src/plotly/constants.js +++ b/repos/kaleido/js/src/plotly/constants.js @@ -34,9 +34,6 @@ module.exports = { mathJaxConfigQuery: '?config=TeX-AMS-MML_SVG', - // config option passed in render step - plotGlPixelRatio: 2.5, - // time [in ms] after which printToPDF errors when image isn't loaded pdfPageLoadImgTimeout: 20000 } diff --git a/repos/kaleido/js/src/plotly/render.js b/repos/kaleido/js/src/plotly/render.js index 1da555f3..51127a23 100644 --- a/repos/kaleido/js/src/plotly/render.js +++ b/repos/kaleido/js/src/plotly/render.js @@ -38,14 +38,14 @@ function render (info, mapboxAccessToken, topojsonURL) { // Use parsed export request info = parsed.result; - const figure = info.figure - const format = info.format - const encoded = info.encoded + const figure = info.figure; + const format = info.format; + const encoded = info.encoded; // Build default config, and let figure.config override it const defaultConfig = { mapboxAccessToken: opts.mapboxAccessToken || null, - plotGlPixelRatio: opts.plotGlPixelRatio || cst.plotGlPixelRatio + plotGlPixelRatio: info.scale * 2 } if (opts.topojsonURL) { defaultConfig.topojsonURL = opts.topojsonURL From eb7dfb89e1047f6572982c276d25eb9be7c3927d Mon Sep 17 00:00:00 2001 From: Jon Mease Date: Sat, 27 Feb 2021 11:04:12 -0500 Subject: [PATCH 3/5] Refactor to use plotly.py to_json method for json encoding This will provide future compatibility with the plotly.py 5.0 JSON engine, and accelerated orjson encoder. --- repos/kaleido/py/kaleido/scopes/base.py | 10 ++++------ repos/kaleido/py/kaleido/scopes/plotly.py | 6 ++++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/repos/kaleido/py/kaleido/scopes/base.py b/repos/kaleido/py/kaleido/scopes/base.py index 449cd881..5d7fc5a6 100644 --- a/repos/kaleido/py/kaleido/scopes/base.py +++ b/repos/kaleido/py/kaleido/scopes/base.py @@ -14,9 +14,6 @@ class BaseScope(object): - # Subclasses may override to specify a custom JSON encoder for input data - _json_encoder = None - # Tuple of class properties that will be passed as command-line # flags to configure scope _scope_flags = () @@ -274,6 +271,9 @@ def chromium_args(self, val): self._chromium_args = tuple(val) self._shutdown_kaleido() + def _json_dumps(self, val): + return json.dumps(val) + def _perform_transform(self, data, **kwargs): """ Transform input data using the current scope, returning dict response with error code @@ -287,9 +287,7 @@ def _perform_transform(self, data, **kwargs): self._ensure_kaleido() # Perform export - export_spec = json.dumps( - dict(kwargs, data=data), - cls=self._json_encoder).encode('utf-8') + export_spec = self._json_dumps(dict(kwargs, data=data)).encode('utf-8') # Write to process and read result within a lock so that can be # sure we're reading the response to our request diff --git a/repos/kaleido/py/kaleido/scopes/plotly.py b/repos/kaleido/py/kaleido/scopes/plotly.py index ca755bb6..977fa960 100644 --- a/repos/kaleido/py/kaleido/scopes/plotly.py +++ b/repos/kaleido/py/kaleido/scopes/plotly.py @@ -1,6 +1,6 @@ from __future__ import absolute_import from kaleido.scopes.base import BaseScope, which -from _plotly_utils.utils import PlotlyJSONEncoder +import plotly.io as pio import base64 import os from pathlib import Path @@ -10,7 +10,6 @@ class PlotlyScope(BaseScope): """ Scope for transforming Plotly figures to static images """ - _json_encoder = PlotlyJSONEncoder _all_formats = ("png", "jpg", "jpeg", "webp", "svg", "pdf", "eps", "json") _text_formats = ("svg", "json", "eps") @@ -73,6 +72,9 @@ def _initialize_mathax(self, mathjax=None): def scope_name(self): return "plotly" + def _json_dumps(self, val): + return pio.to_json(val, validate=False, remove_uids=False) + def transform(self, figure, format=None, width=None, height=None, scale=None): """ Convert a Plotly figure into a static image From fa3cd67e45ae4341be42dd169894e8e660e06ab0 Mon Sep 17 00:00:00 2001 From: Jon Mease Date: Sat, 27 Feb 2021 12:34:48 -0500 Subject: [PATCH 4/5] Add --single-process chromium arg on AWS Lambda --- repos/kaleido/py/kaleido/scopes/base.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/repos/kaleido/py/kaleido/scopes/base.py b/repos/kaleido/py/kaleido/scopes/base.py index 5d7fc5a6..2c4fae44 100644 --- a/repos/kaleido/py/kaleido/scopes/base.py +++ b/repos/kaleido/py/kaleido/scopes/base.py @@ -18,11 +18,17 @@ class BaseScope(object): # flags to configure scope _scope_flags = () + # Specify default chromium arguments _default_chromium_args = ( "--disable-gpu", "--allow-file-access-from-files", "--disable-breakpad", "--disable-dev-shm-usage", + ) + ( + # Add "--single-process" when running on AWS Lambda. Flag is described + # as for debugging only by the chromium project, but it's the only way to get + # chromium headless working on Lambda + ("--single-process",) if os.environ.get("LAMBDA_RUNTIME_DIR", None) else () ) _scope_chromium_args = () From 7be8de815c2c19f10fdb28c9067ea5a2ac3d0cac Mon Sep 17 00:00:00 2001 From: Jon Mease Date: Sun, 28 Feb 2021 05:18:38 -0500 Subject: [PATCH 5/5] Update no_output_timeout for windows fetch --- .circleci/config.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 751f16a0..069469ba 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -280,7 +280,9 @@ jobs: steps: - checkout - run: echo $Host.Version - - run: .\repos\win_scripts\fetch_chromium.ps1 + - run: + command: .\repos\win_scripts\fetch_chromium.ps1 + no_output_timeout: 30m - persist_to_workspace: root: ./repos paths: