diff --git a/.circleci/config.yml b/.circleci/config.yml index 386397b3230..f93ba602546 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -217,9 +217,15 @@ jobs: make-baselines-virtual-webgl: parallelism: 8 docker: - - image: circleci/python:3.8.9 + - image: cimg/python:3.8.9-browsers working_directory: ~/plotly.js steps: + - run: sudo apt-get update + - browser-tools/install-browser-tools: + install-firefox: false + install-geckodriver: false + install-chrome: true + chrome-version: "132.0.6834.110" - attach_workspace: at: ~/ - run: @@ -235,9 +241,15 @@ jobs: make-baselines-mathjax3: docker: - - image: circleci/python:3.8.9 + - image: cimg/python:3.8.9-browsers working_directory: ~/plotly.js steps: + - run: sudo apt-get update + - browser-tools/install-browser-tools: + install-firefox: false + install-geckodriver: false + install-chrome: true + chrome-version: "132.0.6834.110" - attach_workspace: at: ~/ - run: @@ -254,9 +266,15 @@ jobs: make-baselines: parallelism: 12 docker: - - image: circleci/python:3.8.9 + - image: cimg/python:3.8.9-browsers working_directory: ~/plotly.js steps: + - run: sudo apt-get update + - browser-tools/install-browser-tools: + install-firefox: false + install-geckodriver: false + install-chrome: true + chrome-version: "132.0.6834.110" - attach_workspace: at: ~/ - run: @@ -273,9 +291,15 @@ jobs: make-baselines-b64: parallelism: 12 docker: - - image: circleci/python:3.8.9 + - image: cimg/python:3.8.9-browsers working_directory: ~/plotly.js steps: + - run: sudo apt-get update + - browser-tools/install-browser-tools: + install-firefox: false + install-geckodriver: false + install-chrome: true + chrome-version: "132.0.6834.110" - attach_workspace: at: ~/ - run: @@ -347,9 +371,15 @@ jobs: make-exports: docker: - - image: circleci/python:3.8.9 + - image: cimg/python:3.8.9-browsers working_directory: ~/plotly.js steps: + - run: sudo apt-get update + - browser-tools/install-browser-tools: + install-firefox: false + install-geckodriver: false + install-chrome: true + chrome-version: "132.0.6834.110" - attach_workspace: at: ~/ - run: diff --git a/.circleci/env_image.sh b/.circleci/env_image.sh index 47b5d530545..5cf1dde7ec5 100755 --- a/.circleci/env_image.sh +++ b/.circleci/env_image.sh @@ -1,11 +1,16 @@ #!/bin/sh set -e +python3 --version # install required fonts sudo apt-get install fonts-liberation2 fonts-open-sans fonts-noto-cjk fonts-noto-color-emoji -sudo python3 .circleci/download_google_fonts.py +python3 -m pip install requests --progress-bar off +python3 .circleci/download_google_fonts.py sudo cp -r .circleci/fonts/ /usr/share/ sudo fc-cache -f # install kaleido & plotly -sudo python3 -m pip install kaleido==0.2.1 plotly==5.5.0 --progress-bar off +# python -m pip install "plotly[kaleido]==6.1.2" --progress-bar off +# Once the next Plotly version is released, uncomment the line above, update the Plotly version, +# and delete the line below. +python3 -m pip install "git+https://github.com/plotly/plotly.py.git@0089b4d#egg=plotly[kaleido]" --progress-bar off # install numpy i.e. to convert arrays to typed arrays -sudo python3 -m pip install numpy==1.24.2 +python3 -m pip install numpy==1.24.2 diff --git a/test/image/baselines/font-decorline-scatter.png b/test/image/baselines/font-decorline-scatter.png index a90b231b04e..f1ff530c03a 100644 Binary files a/test/image/baselines/font-decorline-scatter.png and b/test/image/baselines/font-decorline-scatter.png differ diff --git a/test/image/baselines/funnel_horizontal_group_basic.png b/test/image/baselines/funnel_horizontal_group_basic.png index 4e1376720bc..8ebd3d752ab 100644 Binary files a/test/image/baselines/funnel_horizontal_group_basic.png and b/test/image/baselines/funnel_horizontal_group_basic.png differ diff --git a/test/image/baselines/indicator_scatter.png b/test/image/baselines/indicator_scatter.png index f43e7a8a24e..6061a84acf2 100644 Binary files a/test/image/baselines/indicator_scatter.png and b/test/image/baselines/indicator_scatter.png differ diff --git a/test/image/baselines/legend_mathjax_title_and_items.png b/test/image/baselines/legend_mathjax_title_and_items.png index 39db29193b3..5c83c049acb 100644 Binary files a/test/image/baselines/legend_mathjax_title_and_items.png and b/test/image/baselines/legend_mathjax_title_and_items.png differ diff --git a/test/image/baselines/mathjax.png b/test/image/baselines/mathjax.png index b3a18ba4b65..b5599ccada6 100644 Binary files a/test/image/baselines/mathjax.png and b/test/image/baselines/mathjax.png differ diff --git a/test/image/baselines/ternary-mathjax-title-place-subtitle.png b/test/image/baselines/ternary-mathjax-title-place-subtitle.png index bc884352869..6d83fc945ce 100644 Binary files a/test/image/baselines/ternary-mathjax-title-place-subtitle.png and b/test/image/baselines/ternary-mathjax-title-place-subtitle.png differ diff --git a/test/image/baselines/text_on_shapes_basic.png b/test/image/baselines/text_on_shapes_basic.png index ec1e63dd288..5879e86a820 100644 Binary files a/test/image/baselines/text_on_shapes_basic.png and b/test/image/baselines/text_on_shapes_basic.png differ diff --git a/test/image/baselines/world-cals.png b/test/image/baselines/world-cals.png index 9549610192a..37c2a9ab80d 100644 Binary files a/test/image/baselines/world-cals.png and b/test/image/baselines/world-cals.png differ diff --git a/test/image/baselines/worldcup.png b/test/image/baselines/worldcup.png index 204a756c3f8..326d19e0f7a 100644 Binary files a/test/image/baselines/worldcup.png and b/test/image/baselines/worldcup.png differ diff --git a/test/image/make_baseline.py b/test/image/make_baseline.py index 519335d31cd..34f5cc9d51b 100644 --- a/test/image/make_baseline.py +++ b/test/image/make_baseline.py @@ -1,9 +1,14 @@ +import asyncio import os import sys import json + import plotly.io as pio +import kaleido + from convert_b64 import arraysToB64 + args = [] if len(sys.argv) == 2 : args = sys.argv[1].split() @@ -19,7 +24,7 @@ dirIn = os.path.join(root, 'test', 'image', 'mocks') dirOut = os.path.join(root, 'build', 'test_images') -# N.B. equal is the falg to write to baselines not test_images +# N.B. equal is the flag to write to baselines not test_images if '=' in args : args = args[args.index('=') + 1:] @@ -31,11 +36,12 @@ print('output to', dirOut) mathjax_version = 2 +mathjax = None if 'mathjax3' in sys.argv or 'mathjax3=' in sys.argv : # until https://github.com/plotly/Kaleido/issues/124 is addressed # we are uanble to use local mathjax v3 installed in node_modules # for now let's download it from the internet: - pio.kaleido.scope.mathjax = 'https://cdn.jsdelivr.net/npm/mathjax@3.2.2/es5/tex-svg.js' + mathjax = 'https://cdn.jsdelivr.net/npm/mathjax@3.2.2/es5/tex-svg.js' mathjax_version = 3 print('Kaleido using MathJax v3') @@ -52,7 +58,6 @@ plotlyjs = plotlyjs_with_virtual_webgl -pio.kaleido.scope.plotlyjs = plotlyjs pio.templates.default = 'none' ALL_MOCKS = [os.path.splitext(a)[0] for a in os.listdir(dirIn) if a.endswith('.json')] @@ -66,6 +71,13 @@ # unable to generate baselines for the following mocks blacklist = [ 'map_stamen-style', + 'map_predefined-styles1', # Temporarily blacklist: fails with Kaleido v1.0.0rc14 + 'map_predefined-styles2', # Temporarily blacklist: fails with Kaleido v1.0.0rc14 + 'grid_subplot_types', # Temporarily blacklist: fails with Kaleido v1.0.0rc14 + 'map_fonts-supported-metropolis', # Temporarily blacklist: fails with Kaleido v1.0.0rc14 + 'map_fonts-supported-metropolis-italic', # Temporarily blacklist: fails with Kaleido v1.0.0rc14 + 'map_fonts-supported-metropolis-weight', # Temporarily blacklist: fails with Kaleido v1.0.0rc14 + 'map_fonts-supported-open-sans-weight', # Temporarily blacklist: fails with Kaleido v1.0.0rc14 ] allNames = [a for a in allNames if a not in blacklist] @@ -74,55 +86,74 @@ sys.exit(1) failed = [] -for name in allNames : - outName = name - if mathjax_version == 3 : - outName = 'mathjax3___' + name - - print(outName) - - created = False - - MAX_RETRY = 2 # 1 means retry once - for attempt in range(0, MAX_RETRY + 1) : - with open(os.path.join(dirIn, name + '.json'), 'r') as _in : - fig = json.load(_in) - - width = 700 - height = 500 - if 'layout' in fig : - layout = fig['layout'] - if 'autosize' not in layout or layout['autosize'] != True : - if 'width' in layout : - width = layout['width'] - if 'height' in layout : - height = layout['height'] - - if 'b64' in sys.argv or 'b64=' in sys.argv or 'b64-json' in sys.argv : - newFig = dict() - arraysToB64(fig, newFig) - fig = newFig - if 'b64-json' in sys.argv and attempt == 0 : print(json.dumps(fig, indent = 2)) - - try : - pio.write_image( - fig=fig, - file=os.path.join(dirOut, outName + '.png'), - width=width, - height=height, - validate=False - ) - created = True - except Exception as e : - print(e) - if attempt < MAX_RETRY : - print('retry', attempt + 1, '/', MAX_RETRY) - else : - failed.append(outName) - - if(created) : break - -if len(failed) > 0 : - print('Failed at :') - print(failed) - sys.exit(1) + +async def make_baselines_async(): + + kopts = dict( + plotlyjs=plotlyjs, + ) + if mathjax is not None: + kopts['mathjax'] = mathjax + + async with kaleido.Kaleido(n=1, **kopts) as k: + for name in allNames: + outName = name + if mathjax_version == 3: + outName = 'mathjax3___' + name + + print(outName) + + created = False + + MAX_RETRY = 2 # 1 means retry once + for attempt in range(0, MAX_RETRY + 1) : + with open(os.path.join(dirIn, name + '.json'), 'r') as _in : + fig = json.load(_in) + + width = 700 + height = 500 + if 'layout' in fig : + layout = fig['layout'] + if 'autosize' not in layout or layout['autosize'] != True : + if 'width' in layout : + width = layout['width'] + if 'height' in layout : + height = layout['height'] + + if 'b64' in sys.argv or 'b64=' in sys.argv or 'b64-json' in sys.argv : + newFig = dict() + arraysToB64(fig, newFig) + fig = newFig + if 'b64-json' in sys.argv and attempt == 0 : print(json.dumps(fig, indent = 2)) + + try: + bytes = await k.calc_fig( + fig, + path=None, + opts=dict( + format="png", + width=width, + height=height, + ), + ) + filename = os.path.join(dirOut, outName + '.png') + with open(filename, "wb") as f: + f.write(bytes) + created = True + except Exception as e: + print(e) + if attempt < MAX_RETRY : + print('retry', attempt + 1, '/', MAX_RETRY) + else : + failed.append(outName) + + if(created): break + + if len(failed) > 0 : + print('Failed at :') + print(failed) + sys.exit(1) + + +if __name__ == "__main__": + asyncio.run(make_baselines_async()) diff --git a/test/image/make_exports.py b/test/image/make_exports.py index ea8a4efe7f1..2beec83ad73 100644 --- a/test/image/make_exports.py +++ b/test/image/make_exports.py @@ -10,7 +10,7 @@ pio.templates.default = 'none' pio.kaleido.scope.plotlyjs = os.path.join(root, 'build', 'plotly.js') -allFormats = ['svg', 'jpg', 'jpeg', 'webp', 'eps', 'pdf'] +allFormats = ['svg', 'jpg', 'jpeg', 'webp', 'pdf'] # 'png' is tested by image-test allNames = [ @@ -28,7 +28,7 @@ 'zsmooth_methods', 'fonts', 'worldcup', - 'mathjax' + 'mathjax', ] failed = 0