From e2fe3f25eb8d49105655116d5f20e259bfaf6a7a Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Tue, 24 Jan 2023 16:00:47 +0100 Subject: [PATCH 01/99] First version of powershell script without python running --- tests/run-test.ps1 | 110 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 tests/run-test.ps1 diff --git a/tests/run-test.ps1 b/tests/run-test.ps1 new file mode 100644 index 00000000000..65fcff531a8 --- /dev/null +++ b/tests/run-test.ps1 @@ -0,0 +1,110 @@ +# Determine the path to this script (we'll use this to figure out relative positions of other files) +$SOURCE = $MyInvocation.MyCommand.Path + +# ------ Setting all the paths required + +Write-Host "> Setting all the paths required..." + +# Tests folder +# e.g quarto-cli/tests folder +$SCRIPT_PATH = Split-Path -Path $SOURCE + +# Project folder +# e.g quarto-cli project folder +$QUARTO_ROOT = Split-Path $SCRIPT_PATH + +# Source folder +# e.g quarto-cli/src folder +$QUARTO_SRC_DIR= Join-Path $QUARTO_ROOT "src" + +# .sh version has source $SCRIPT_PATH/../package/scripts/common/utils.sh for configure.sh requirements +# but configure.cmd does not need it + +# Quarto binary folder +# e.g quarto-cli/package/dist/bin +$QUARTO_BIN_PATH = Join-Path $QUARTO_ROOT "package" "dist" "bin" +# Deno binary in tools/ +$QUARTO_DENO = Join-Path $Env:QUARTO_BIN_PATH "tools" "deno.exe" + +# Shared resource folder +# e.g quarto-cli/src/resources +$QUARTO_SHARE_PATH = Join-Path $QUARTO_ROOT "src" "resources" + + +# ----- Restoring tests environnment --------- + +Write-Host "> Restoring R environment with renv..." + +# Ensure that we've restored the renv environment for tests with R +Rscript -e "if (!requireNamespace('renv', quietly = TRUE)) install.packages('renv')" +Rscript -e "renv::restore()" + +Write-Host "> Restoring python environment in virtualenv..." + +# Ensure that we've actived the python env and restore it +# FIX: Testing python require a re-design of the environment +$QUARTO_TESTS_VIRTUALENV="FALSE" +If ($QUARTO_TESTS_VIRTUALENV -ne "FALSE" ) + { + python3 -m pip install -r requirements.txt --prefer-binary -q + } else { + Write-Host -ForegroundColor "red" ">> No testing with Python" + } + +Write-Host "> Updating TinyTeX..." +# Ensure that tinytex is installed and updated to latest version +quarto install tinytex --no-prompt + +# ----- Preparing running tests ------------ + + +Write-Host "> Preparing running tests..." + +# Exporting some variables with paths as env var required for running quarto +$Env:QUARTO_ROOT = $QUARTO_ROOT +$Env:QUARTO_BIN_PATH = $QUARTO_BIN_PATH +$Env:QUARTO_SHARE_PATH = $QUARTO_SHARE_PATH + +# Activated debug mode by default for stack trace +$Env:QUARTO_DEBUG = "true" + +# Preparing running Deno with default arguments + +$QUARTO_IMPORT_ARGMAP="--importmap=$(Join-Path $QUARTO_SRC_DIR "dev_import_map.json")" +$QUARTO_DENO_OPTIONS="--config test-conf.json --unstable --allow-read --allow-write --allow-run --allow-env --allow-net --check" + +# Parsing argument passed to the script + +# We Don't use `param()` or `$args` - instead, we do our own argument parsing because +# PowerShell quietly strips -- from the list of arguments and `--` is need for Deno to pass argument to the script +# Code adapted from: https://stackoverflow.com/questions/56750826/how-to-use-dash-argument-in-powershell + +# Extract the argument list from the invocation command line. +$argList = ($MyInvocation.Line -replace ('^.*' + [regex]::Escape($MyInvocation.InvocationName)) -split '[;|]')[0].Trim() + +# Use Invoke-Expression with a Write-Output call to parse the raw argument list, +# performing evaluation and splitting it into an array: +$customArgs = if ($argList) { @(Invoke-Expression "Write-Output -- $argList") } else { @() } + +# ---- Running tests with Deno ------- + +$DENO_ARGS = @() +$DENO_ARGS += "test" +$DENO_ARGS += -split $QUARTO_DENO_OPTIONS +# Allow to pass some more options - empty by default +If ($QUARTO_DENO_EXTRA_OPTIONS -ne $null) { + $DENO_ARGS += -split $QUARTO_DENO_EXTRA_OPTIONS +} +$DENO_ARGS += -split $QUARTO_IMPORT_ARGMAP +$DENO_ARGS += $customArgs + +Write-Host "> Running tests with `"$QUARTO_DENO $DENO_ARGS`" " + +& $QUARTO_DENO $DENO_ARGS + +$SUCCESS = $? +$DENO_EXIT_CODE = $LASTEXITCODE + +# Add Coverage handling + +Exit $DENO_EXIT_CODE From b0cfe9467e308df97804e2ba2ffd5f0a16a63837 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 25 Jan 2023 10:36:27 +0100 Subject: [PATCH 02/99] Setup python environment for Windows and UNIX --- tests/.gitignore | 8 ++++++++ tests/.python-version | 1 + 2 files changed, 9 insertions(+) create mode 100644 tests/.gitignore create mode 100644 tests/.python-version diff --git a/tests/.gitignore b/tests/.gitignore new file mode 100644 index 00000000000..cb907ef9ce3 --- /dev/null +++ b/tests/.gitignore @@ -0,0 +1,8 @@ +# Python Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ \ No newline at end of file diff --git a/tests/.python-version b/tests/.python-version new file mode 100644 index 00000000000..371cfe355dd --- /dev/null +++ b/tests/.python-version @@ -0,0 +1 @@ +3.11.1 From b5c07410e56e45aa3dae2f177285c2fda1877df2 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 25 Jan 2023 16:13:42 +0100 Subject: [PATCH 03/99] update python package --- tests/requirements.txt | 74 +++++++++++++++++++++++++++++------------- 1 file changed, 51 insertions(+), 23 deletions(-) diff --git a/tests/requirements.txt b/tests/requirements.txt index 135cafcf85d..3d3eea9aee9 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -1,40 +1,55 @@ +anyio==3.6.2 appnope==0.1.2 -argon2-cffi==20.1.0 +argon2-cffi==21.3.0 +argon2-cffi-bindings==21.2.0 +asttokens==2.2.1 async-generator==1.10 attrs==21.2.0 backcall==0.2.0 -bleach==3.3.0 +beautifulsoup4==4.11.1 +bleach==6.0.0 bokeh==3.0.3 cffi==1.14.5 +colorama==0.4.6 +comm==0.1.2 contourpy==1.0.7 cycler==0.10.0 +debugpy==1.6.6 decorator==5.0.9 defusedxml==0.7.1 entrypoints==0.3 +executing==1.2.0 +fastjsonschema==2.16.2 fonttools==4.38.0 -ipykernel==5.5.5 -ipython==7.25.0 +idna==3.4 +ipykernel==6.20.2 +ipython==8.8.0 ipython-genutils==0.2.0 -ipywidgets==7.6.3 +ipywidgets==8.0.4 jedi==0.18.0 Jinja2==3.0.1 jsonschema==3.2.0 jupyter==1.0.0 -jupyter-client==6.1.12 -jupyter-console==6.4.0 -jupyter-core==4.7.1 +jupyter-console==6.4.4 +jupyter-events==0.6.3 +jupyter_client==7.4.9 +jupyter_core==5.1.5 +jupyter_server==2.1.0 +jupyter_server_terminals==0.4.4 jupyterlab-pygments==0.1.2 -jupyterlab-widgets==1.0.0 +jupyterlab-widgets==3.0.5 kiwisolver==1.4.4 MarkupSafe==2.0.1 -matplotlib==3.5.3 +matplotlib==3.6.3 matplotlib-inline==0.1.2 -mistune==0.8.4 -nbclient==0.5.3 -nbconvert==6.1.0 -nbformat==5.1.3 -nest-asyncio==1.5.1 -notebook==6.4.0 +mistune==2.0.4 +nbclassic==0.4.8 +nbclient==0.7.2 +nbconvert==7.2.9 +nbformat==5.7.3 +nest-asyncio==1.5.6 +notebook==6.5.2 +notebook_shim==0.2.2 numpy==1.23.2 packaging==20.9 pandas==1.5.3 @@ -43,26 +58,39 @@ parso==0.8.2 pexpect==4.8.0 pickleshare==0.7.5 Pillow==9.2.0 +platformdirs==2.6.2 prometheus-client==0.11.0 prompt-toolkit==3.0.19 +psutil==5.9.4 ptyprocess==0.7.0 +pure-eval==0.2.2 pycparser==2.20 Pygments==2.9.0 pyparsing==3.0.9 pyrsistent==0.17.3 -python-dateutil==2.8.1 +python-dateutil==2.8.2 +python-json-logger==2.0.4 pytz==2022.7.1 +pywin32==305 +pywinpty==2.0.10 PyYAML==6.0 pyzmq==24.0.1 -qtconsole==5.1.0 -QtPy==1.9.0 -Send2Trash==1.7.1 +qtconsole==5.4.0 +QtPy==2.3.0 +rfc3339-validator==0.1.4 +rfc3986-validator==0.1.1 +Send2Trash==1.8.0 six==1.16.0 +sniffio==1.3.0 +soupsieve==2.3.2.post1 +stack-data==0.6.2 terminado==0.10.1 testpath==0.5.0 -tornado==6.1 -traitlets==5.0.5 +tinycss2==1.2.1 +tornado==6.2 +traitlets==5.8.1 wcwidth==0.2.5 webencodings==0.5.1 -widgetsnbextension==3.5.1 +websocket-client==1.4.2 +widgetsnbextension==4.0.5 xyzservices==2022.9.0 From 230c51be72887217470b06a804c8be60cb425013 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 25 Jan 2023 19:02:59 +0100 Subject: [PATCH 04/99] Try something for python on windows - Be sure to deactivate Quarto env var that forces PYTHON to overwrite local config - Use `py.exe` because in `venv` the `exe` do not work somehow. --- tests/run-test.ps1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/run-test.ps1 b/tests/run-test.ps1 index 65fcff531a8..3e362c0ffef 100644 --- a/tests/run-test.ps1 +++ b/tests/run-test.ps1 @@ -24,7 +24,7 @@ $QUARTO_SRC_DIR= Join-Path $QUARTO_ROOT "src" # e.g quarto-cli/package/dist/bin $QUARTO_BIN_PATH = Join-Path $QUARTO_ROOT "package" "dist" "bin" # Deno binary in tools/ -$QUARTO_DENO = Join-Path $Env:QUARTO_BIN_PATH "tools" "deno.exe" +$QUARTO_DENO = Join-Path $QUARTO_BIN_PATH "tools" "deno.exe" # Shared resource folder # e.g quarto-cli/src/resources @@ -43,10 +43,10 @@ Write-Host "> Restoring python environment in virtualenv..." # Ensure that we've actived the python env and restore it # FIX: Testing python require a re-design of the environment -$QUARTO_TESTS_VIRTUALENV="FALSE" -If ($QUARTO_TESTS_VIRTUALENV -ne "FALSE" ) +If ($QUARTO_TESTS_VIRTUALENV -ne "FALSE") { - python3 -m pip install -r requirements.txt --prefer-binary -q + $Env:QUARTO_PYTHON=$null + py -m pip install -r requirements.txt --prefer-binary -q } else { Write-Host -ForegroundColor "red" ">> No testing with Python" } From bfa82f5039b75d0c2202c5183b26a79d20bd8ffc Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 25 Jan 2023 19:04:51 +0100 Subject: [PATCH 05/99] Activate tests on Windows --- tests/smoke/crossref/figures.test.ts | 62 +++++++++++------------ tests/smoke/render/render-jupyter.test.ts | 8 ++- 2 files changed, 33 insertions(+), 37 deletions(-) diff --git a/tests/smoke/crossref/figures.test.ts b/tests/smoke/crossref/figures.test.ts index 94adc2353f2..8f051adc191 100644 --- a/tests/smoke/crossref/figures.test.ts +++ b/tests/smoke/crossref/figures.test.ts @@ -31,39 +31,37 @@ testRender(simpleQmd.input, "html", false, [ ]), ]); -if (Deno.build.os !== "windows") { - const pythonQmd = crossref("python.qmd", "html"); - testRender(pythonQmd.input, "html", false, [ - ensureHtmlElements(pythonQmd.output.outputPath, [ - "section#python-crossref-figure div#fig-plot > figure img.figure-img", - "section#python-crossref-figure div#fig-plot > figure > figcaption", - ]), - ensureFileRegexMatches(pythonQmd.output.outputPath, [ - /Figure 1: Plot/, - /Figure 1/, - ], [ - /\?@fig-/, - ]), - ]); +const pythonQmd = crossref("python.qmd", "html"); +testRender(pythonQmd.input, "html", false, [ + ensureHtmlElements(pythonQmd.output.outputPath, [ + "section#python-crossref-figure div#fig-plot > figure img.figure-img", + "section#python-crossref-figure div#fig-plot > figure > figcaption", + ]), + ensureFileRegexMatches(pythonQmd.output.outputPath, [ + /Figure 1: Plot/, + /Figure 1/, + ], [ + /\?@fig-/, + ]), +]); - const pythonSubfigQmd = crossref("python-subfig.qmd", "html"); - testRender(pythonSubfigQmd.input, "html", false, [ - ensureHtmlElements(pythonSubfigQmd.output.outputPath, [ - "section#python-crossref-figure div.quarto-layout-panel > figure > div.quarto-layout-row", - "section#python-crossref-figure div.quarto-layout-panel > figure > figcaption.figure-caption", - "section#python-crossref-figure div.quarto-layout-panel > figure img.figure-img", - ]), - ensureFileRegexMatches(pythonSubfigQmd.output.outputPath, [ - /Figure 1: Plots/, - /Figure 1/, - /Figure 1 \(b\)/, - /\(a\) Plot 1/, - /\(b\) Plot 2/, - ], [ - /\?@fig-/, - ]), - ]); -} +const pythonSubfigQmd = crossref("python-subfig.qmd", "html"); +testRender(pythonSubfigQmd.input, "html", false, [ + ensureHtmlElements(pythonSubfigQmd.output.outputPath, [ + "section#python-crossref-figure div.quarto-layout-panel > figure > div.quarto-layout-row", + "section#python-crossref-figure div.quarto-layout-panel > figure > figcaption.figure-caption", + "section#python-crossref-figure div.quarto-layout-panel > figure img.figure-img", + ]), + ensureFileRegexMatches(pythonSubfigQmd.output.outputPath, [ + /Figure 1: Plots/, + /Figure 1/, + /Figure 1 \(b\)/, + /\(a\) Plot 1/, + /\(b\) Plot 2/, + ], [ + /\?@fig-/, + ]), +]); const knitrQmd = crossref("knitr.qmd", "html"); testRender(knitrQmd.input, "html", false, [ diff --git a/tests/smoke/render/render-jupyter.test.ts b/tests/smoke/render/render-jupyter.test.ts index 50515dfaf1e..78aabd8926c 100644 --- a/tests/smoke/render/render-jupyter.test.ts +++ b/tests/smoke/render/render-jupyter.test.ts @@ -7,8 +7,6 @@ import { docs } from "../../utils.ts"; import { testRender } from "./render.ts"; -if (Deno.build.os !== "windows") { - testRender(docs("test-jupyter.md"), "pdf", true); - testRender(docs("unpaired.ipynb"), "html", false); - testRender(docs("unpaired-md.md"), "html", false); -} +testRender(docs("test-jupyter.md"), "pdf", true); +testRender(docs("unpaired.ipynb"), "html", false); +testRender(docs("unpaired-md.md"), "html", false); From 7ee197798723377db6f499a0885876698161cba8 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 25 Jan 2023 20:14:34 +0100 Subject: [PATCH 06/99] Adapt our action for windows --- .../workflows/actions/quarto-dev/action.yml | 13 ++++--- .github/workflows/test-smokes.yml | 39 ++++++++----------- 2 files changed, 25 insertions(+), 27 deletions(-) diff --git a/.github/workflows/actions/quarto-dev/action.yml b/.github/workflows/actions/quarto-dev/action.yml index d17b6bc2792..132cb3c2b87 100644 --- a/.github/workflows/actions/quarto-dev/action.yml +++ b/.github/workflows/actions/quarto-dev/action.yml @@ -12,7 +12,12 @@ runs: - name: Configure Quarto shell: bash run: | - ./configure.sh + case $RUNNER_OS in + "Windows") + pwsh -C "./configure.cmd" + *) + ./configure.sh + esac - name: Basic dev mode sanity check shell: bash @@ -23,7 +28,5 @@ runs: - name: Quarto Check shell: bash - run: | - pushd tests - quarto check - popd + run: quarto check + working-directory: tests diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index ccf7ad0afdd..c0236e288a0 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -39,6 +39,7 @@ jobs: - name: Install node dependencies run: yarn working-directory: ./tests/integration/playwright + shell: bash - name: Install Playwright Browsers run: npx playwright install --with-deps @@ -52,29 +53,11 @@ jobs: restore-keys: | ${{ runner.os }}-1-renv- - - name: Restore packages - working-directory: tests - run: | - if (!requireNamespace('renv', quietly = TRUE)) install.packages('renv') - renv::restore() - shell: Rscript {0} - - name: Set up Python uses: actions/setup-python@v4 with: - python-version: "3.x" cache: "pip" - - name: Python Dependencies - run: | - pushd tests - source bin/activate - python3 -m pip install --upgrade pip pip==21.3.1 - python3 -m pip install wheel - python3 -m pip install --user virtualenv - python3 -m pip install -r requirements.txt - popd - - uses: ./.github/workflows/actions/quarto-dev - name: Install Tinytex @@ -89,12 +72,19 @@ jobs: - name: Smoke Test Commits if: github.event.before != '' env: + # Useful as TinyTeX latest release is checked in run-test.sh GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | git checkout ${{ github.sha}} pushd tests - ./run-tests.sh + case $RUNNER_OS in + "Windows") + pwsh -F ./run-test.ps1 + *) + ./run-tests.sh + esac popd + shell: bash - name: Smoke Test Head env: @@ -102,7 +92,12 @@ jobs: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} if: github.event.before == '' run: | - pushd tests quarto render docs/test.qmd --to pdf - ./run-tests.sh - popd + case $RUNNER_OS in + "Windows") + pwsh -F ./run-test.ps1 + *) + ./run-tests.sh + esac + working-directory: tests + shell: bash From 1890775b6a79e3509fea58ca9914d5311f781bbc Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 25 Jan 2023 20:20:21 +0100 Subject: [PATCH 07/99] Run effectively CI on windows --- .github/workflows/test-smokes.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index c0236e288a0..db94612f28e 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -17,7 +17,11 @@ env: jobs: run-smokes: - runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-latest] + runs-on: ${{ matrix.os }} steps: - name: Checkout Repo From 22213bbb8eeebbaaae06a0f022b37c674ce6cd2e Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 25 Jan 2023 20:22:06 +0100 Subject: [PATCH 08/99] Try unix with the python virtualenv setup that probably is not used at all --- tests/.gitignore | 4 +- tests/bin/Activate.ps1 | 241 ------------------------------------- tests/bin/activate | 76 ------------ tests/bin/activate.csh | 37 ------ tests/bin/activate.fish | 75 ------------ tests/bin/easy_install | 10 -- tests/bin/easy_install-3.8 | 10 -- tests/bin/pip | 10 -- tests/bin/pip3 | 10 -- tests/bin/pip3.8 | 10 -- tests/bin/python | 1 - tests/bin/python3 | 1 - tests/run-tests.sh | 1 - 13 files changed, 3 insertions(+), 483 deletions(-) delete mode 100644 tests/bin/Activate.ps1 delete mode 100644 tests/bin/activate delete mode 100644 tests/bin/activate.csh delete mode 100644 tests/bin/activate.fish delete mode 100755 tests/bin/easy_install delete mode 100755 tests/bin/easy_install-3.8 delete mode 100755 tests/bin/pip delete mode 100755 tests/bin/pip3 delete mode 100755 tests/bin/pip3.8 delete mode 120000 tests/bin/python delete mode 120000 tests/bin/python3 diff --git a/tests/.gitignore b/tests/.gitignore index cb907ef9ce3..bb5bf639eda 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -5,4 +5,6 @@ env/ venv/ ENV/ env.bak/ -venv.bak/ \ No newline at end of file +venv.bak/ + +bin/ \ No newline at end of file diff --git a/tests/bin/Activate.ps1 b/tests/bin/Activate.ps1 deleted file mode 100644 index 90af274d6c2..00000000000 --- a/tests/bin/Activate.ps1 +++ /dev/null @@ -1,241 +0,0 @@ -<# -.Synopsis -Activate a Python virtual environment for the current PowerShell session. - -.Description -Pushes the python executable for a virtual environment to the front of the -$Env:PATH environment variable and sets the prompt to signify that you are -in a Python virtual environment. Makes use of the command line switches as -well as the `pyvenv.cfg` file values present in the virtual environment. - -.Parameter VenvDir -Path to the directory that contains the virtual environment to activate. The -default value for this is the parent of the directory that the Activate.ps1 -script is located within. - -.Parameter Prompt -The prompt prefix to display when this virtual environment is activated. By -default, this prompt is the name of the virtual environment folder (VenvDir) -surrounded by parentheses and followed by a single space (ie. '(.venv) '). - -.Example -Activate.ps1 -Activates the Python virtual environment that contains the Activate.ps1 script. - -.Example -Activate.ps1 -Verbose -Activates the Python virtual environment that contains the Activate.ps1 script, -and shows extra information about the activation as it executes. - -.Example -Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv -Activates the Python virtual environment located in the specified location. - -.Example -Activate.ps1 -Prompt "MyPython" -Activates the Python virtual environment that contains the Activate.ps1 script, -and prefixes the current prompt with the specified string (surrounded in -parentheses) while the virtual environment is active. - -.Notes -On Windows, it may be required to enable this Activate.ps1 script by setting the -execution policy for the user. You can do this by issuing the following PowerShell -command: - -PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser - -For more information on Execution Policies: -ttps:/go.microsoft.com/fwlink/?LinkID=135170 - -#> -Param( - [Parameter(Mandatory = $false)] - [String] - $VenvDir, - [Parameter(Mandatory = $false)] - [String] - $Prompt -) - -<# Function declarations --------------------------------------------------- #> - -<# -.Synopsis -Remove all shell session elements added by the Activate script, including the -addition of the virtual environment's Python executable from the beginning of -the PATH variable. - -.Parameter NonDestructive -If present, do not remove this function from the global namespace for the -session. - -#> -function global:deactivate ([switch]$NonDestructive) { - # Revert to original values - - # The prior prompt: - if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { - Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt - Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT - } - - # The prior PYTHONHOME: - if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { - Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME - Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME - } - - # The prior PATH: - if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { - Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH - Remove-Item -Path Env:_OLD_VIRTUAL_PATH - } - - # Just remove the VIRTUAL_ENV altogether: - if (Test-Path -Path Env:VIRTUAL_ENV) { - Remove-Item -Path env:VIRTUAL_ENV - } - - # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: - if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { - Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force - } - - # Leave deactivate function in the global namespace if requested: - if (-not $NonDestructive) { - Remove-Item -Path function:deactivate - } -} - -<# -.Description -Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the -given folder, and returns them in a map. - -For each line in the pyvenv.cfg file, if that line can be parsed into exactly -two strings separated by `=` (with any amount of whitespace surrounding the =) -then it is considered a `key = value` line. The left hand string is the key, -the right hand is the value. - -If the value starts with a `'` or a `"` then the first and last character is -stripped from the value before being captured. - -.Parameter ConfigDir -Path to the directory that contains the `pyvenv.cfg` file. -#> -function Get-PyVenvConfig( - [String] - $ConfigDir -) { - Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" - - # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). - $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue - - # An empty map will be returned if no config file is found. - $pyvenvConfig = @{ } - - if ($pyvenvConfigPath) { - - Write-Verbose "File exists, parse `key = value` lines" - $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath - - $pyvenvConfigContent | ForEach-Object { - $keyval = $PSItem -split "\s*=\s*", 2 - if ($keyval[0] -and $keyval[1]) { - $val = $keyval[1] - - # Remove extraneous quotations around a string value. - if ("'""".Contains($val.Substring(0, 1))) { - $val = $val.Substring(1, $val.Length - 2) - } - - $pyvenvConfig[$keyval[0]] = $val - Write-Verbose "Adding Key: '$($keyval[0])'='$val'" - } - } - } - return $pyvenvConfig -} - - -<# Begin Activate script --------------------------------------------------- #> - -# Determine the containing directory of this script -$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition -$VenvExecDir = Get-Item -Path $VenvExecPath - -Write-Verbose "Activation script is located in path: '$VenvExecPath'" -Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" -Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" - -# Set values required in priority: CmdLine, ConfigFile, Default -# First, get the location of the virtual environment, it might not be -# VenvExecDir if specified on the command line. -if ($VenvDir) { - Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" -} -else { - Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." - $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") - Write-Verbose "VenvDir=$VenvDir" -} - -# Next, read the `pyvenv.cfg` file to determine any required value such -# as `prompt`. -$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir - -# Next, set the prompt from the command line, or the config file, or -# just use the name of the virtual environment folder. -if ($Prompt) { - Write-Verbose "Prompt specified as argument, using '$Prompt'" -} -else { - Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" - if ($pyvenvCfg -and $pyvenvCfg['prompt']) { - Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" - $Prompt = $pyvenvCfg['prompt']; - } - else { - Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virutal environment)" - Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" - $Prompt = Split-Path -Path $venvDir -Leaf - } -} - -Write-Verbose "Prompt = '$Prompt'" -Write-Verbose "VenvDir='$VenvDir'" - -# Deactivate any currently active virtual environment, but leave the -# deactivate function in place. -deactivate -nondestructive - -# Now set the environment variable VIRTUAL_ENV, used by many tools to determine -# that there is an activated venv. -$env:VIRTUAL_ENV = $VenvDir - -if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { - - Write-Verbose "Setting prompt to '$Prompt'" - - # Set the prompt to include the env name - # Make sure _OLD_VIRTUAL_PROMPT is global - function global:_OLD_VIRTUAL_PROMPT { "" } - Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT - New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt - - function global:prompt { - Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " - _OLD_VIRTUAL_PROMPT - } -} - -# Clear PYTHONHOME -if (Test-Path -Path Env:PYTHONHOME) { - Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME - Remove-Item -Path Env:PYTHONHOME -} - -# Add the venv to the PATH -Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH -$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" diff --git a/tests/bin/activate b/tests/bin/activate deleted file mode 100644 index a2ce4c45404..00000000000 --- a/tests/bin/activate +++ /dev/null @@ -1,76 +0,0 @@ -# This file must be used with "source bin/activate" *from bash* -# you cannot run it directly - -deactivate () { - # reset old environment variables - if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then - PATH="${_OLD_VIRTUAL_PATH:-}" - export PATH - unset _OLD_VIRTUAL_PATH - fi - if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then - PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" - export PYTHONHOME - unset _OLD_VIRTUAL_PYTHONHOME - fi - - # This should detect bash and zsh, which have a hash command that must - # be called to get it to forget past commands. Without forgetting - # past commands the $PATH changes we made may not be respected - if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then - hash -r - fi - - if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then - PS1="${_OLD_VIRTUAL_PS1:-}" - export PS1 - unset _OLD_VIRTUAL_PS1 - fi - - unset VIRTUAL_ENV - if [ ! "${1:-}" = "nondestructive" ] ; then - # Self destruct! - unset -f deactivate - fi -} - -# unset irrelevant variables -deactivate nondestructive - -VIRTUAL_ENV="/Users/charlesteague/Development/quarto/quarto-cli/tests" -export VIRTUAL_ENV - -_OLD_VIRTUAL_PATH="$PATH" -PATH="$VIRTUAL_ENV/bin:$PATH" -export PATH - -# unset PYTHONHOME if set -# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) -# could use `if (set -u; : $PYTHONHOME) ;` in bash -if [ -n "${PYTHONHOME:-}" ] ; then - _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" - unset PYTHONHOME -fi - -if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then - _OLD_VIRTUAL_PS1="${PS1:-}" - if [ "x(tests) " != x ] ; then - PS1="(tests) ${PS1:-}" - else - if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then - # special case for Aspen magic directories - # see http://www.zetadev.com/software/aspen/ - PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1" - else - PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1" - fi - fi - export PS1 -fi - -# This should detect bash and zsh, which have a hash command that must -# be called to get it to forget past commands. Without forgetting -# past commands the $PATH changes we made may not be respected -if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then - hash -r -fi diff --git a/tests/bin/activate.csh b/tests/bin/activate.csh deleted file mode 100644 index 06aa1d984e0..00000000000 --- a/tests/bin/activate.csh +++ /dev/null @@ -1,37 +0,0 @@ -# This file must be used with "source bin/activate.csh" *from csh*. -# You cannot run it directly. -# Created by Davide Di Blasi . -# Ported to Python 3.3 venv by Andrew Svetlov - -alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate' - -# Unset irrelevant variables. -deactivate nondestructive - -setenv VIRTUAL_ENV "/Users/charlesteague/Development/quarto/quarto-cli/tests" - -set _OLD_VIRTUAL_PATH="$PATH" -setenv PATH "$VIRTUAL_ENV/bin:$PATH" - - -set _OLD_VIRTUAL_PROMPT="$prompt" - -if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then - if ("tests" != "") then - set env_name = "tests" - else - if (`basename "VIRTUAL_ENV"` == "__") then - # special case for Aspen magic directories - # see http://www.zetadev.com/software/aspen/ - set env_name = `basename \`dirname "$VIRTUAL_ENV"\`` - else - set env_name = `basename "$VIRTUAL_ENV"` - endif - endif - set prompt = "[$env_name] $prompt" - unset env_name -endif - -alias pydoc python -m pydoc - -rehash diff --git a/tests/bin/activate.fish b/tests/bin/activate.fish deleted file mode 100644 index a4f64486fcc..00000000000 --- a/tests/bin/activate.fish +++ /dev/null @@ -1,75 +0,0 @@ -# This file must be used with ". bin/activate.fish" *from fish* (http://fishshell.org) -# you cannot run it directly - -function deactivate -d "Exit virtualenv and return to normal shell environment" - # reset old environment variables - if test -n "$_OLD_VIRTUAL_PATH" - set -gx PATH $_OLD_VIRTUAL_PATH - set -e _OLD_VIRTUAL_PATH - end - if test -n "$_OLD_VIRTUAL_PYTHONHOME" - set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME - set -e _OLD_VIRTUAL_PYTHONHOME - end - - if test -n "$_OLD_FISH_PROMPT_OVERRIDE" - functions -e fish_prompt - set -e _OLD_FISH_PROMPT_OVERRIDE - functions -c _old_fish_prompt fish_prompt - functions -e _old_fish_prompt - end - - set -e VIRTUAL_ENV - if test "$argv[1]" != "nondestructive" - # Self destruct! - functions -e deactivate - end -end - -# unset irrelevant variables -deactivate nondestructive - -set -gx VIRTUAL_ENV "/Users/charlesteague/Development/quarto/quarto-cli/tests" - -set -gx _OLD_VIRTUAL_PATH $PATH -set -gx PATH "$VIRTUAL_ENV/bin" $PATH - -# unset PYTHONHOME if set -if set -q PYTHONHOME - set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME - set -e PYTHONHOME -end - -if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" - # fish uses a function instead of an env var to generate the prompt. - - # save the current fish_prompt function as the function _old_fish_prompt - functions -c fish_prompt _old_fish_prompt - - # with the original prompt function renamed, we can override with our own. - function fish_prompt - # Save the return status of the last command - set -l old_status $status - - # Prompt override? - if test -n "(tests) " - printf "%s%s" "(tests) " (set_color normal) - else - # ...Otherwise, prepend env - set -l _checkbase (basename "$VIRTUAL_ENV") - if test $_checkbase = "__" - # special case for Aspen magic directories - # see http://www.zetadev.com/software/aspen/ - printf "%s[%s]%s " (set_color -b blue white) (basename (dirname "$VIRTUAL_ENV")) (set_color normal) - else - printf "%s(%s)%s" (set_color -b blue white) (basename "$VIRTUAL_ENV") (set_color normal) - end - end - - # Restore the return status of the previous command. - echo "exit $old_status" | . - _old_fish_prompt - end - - set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" -end diff --git a/tests/bin/easy_install b/tests/bin/easy_install deleted file mode 100755 index dca0f60daf8..00000000000 --- a/tests/bin/easy_install +++ /dev/null @@ -1,10 +0,0 @@ -#!/Users/charlesteague/Development/quarto/quarto-cli/tests/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys - -from setuptools.command.easy_install import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/tests/bin/easy_install-3.8 b/tests/bin/easy_install-3.8 deleted file mode 100755 index dca0f60daf8..00000000000 --- a/tests/bin/easy_install-3.8 +++ /dev/null @@ -1,10 +0,0 @@ -#!/Users/charlesteague/Development/quarto/quarto-cli/tests/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys - -from setuptools.command.easy_install import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/tests/bin/pip b/tests/bin/pip deleted file mode 100755 index 91c82418bae..00000000000 --- a/tests/bin/pip +++ /dev/null @@ -1,10 +0,0 @@ -#!/Users/charlesteague/Development/quarto/quarto-cli/tests/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys - -from pip._internal import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/tests/bin/pip3 b/tests/bin/pip3 deleted file mode 100755 index 91c82418bae..00000000000 --- a/tests/bin/pip3 +++ /dev/null @@ -1,10 +0,0 @@ -#!/Users/charlesteague/Development/quarto/quarto-cli/tests/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys - -from pip._internal import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/tests/bin/pip3.8 b/tests/bin/pip3.8 deleted file mode 100755 index 91c82418bae..00000000000 --- a/tests/bin/pip3.8 +++ /dev/null @@ -1,10 +0,0 @@ -#!/Users/charlesteague/Development/quarto/quarto-cli/tests/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys - -from pip._internal import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/tests/bin/python b/tests/bin/python deleted file mode 120000 index b8a0adbbb97..00000000000 --- a/tests/bin/python +++ /dev/null @@ -1 +0,0 @@ -python3 \ No newline at end of file diff --git a/tests/bin/python3 b/tests/bin/python3 deleted file mode 120000 index b6cdcd882bf..00000000000 --- a/tests/bin/python3 +++ /dev/null @@ -1 +0,0 @@ -/opt/miniconda3/bin/python3 \ No newline at end of file diff --git a/tests/run-tests.sh b/tests/run-tests.sh index eae62dd3c6b..fa96a2a38d7 100755 --- a/tests/run-tests.sh +++ b/tests/run-tests.sh @@ -32,7 +32,6 @@ Rscript -e "renv::restore()" # Ensure that we've actived the python env if [[ $QUARTO_TESTS_VIRTUALENV != "FALSE" ]]; then - source bin/activate python3 -m pip install -r requirements.txt --prefer-binary -q fi From 55e606d9d1a3a741f675909fdd845690d09efee9 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 25 Jan 2023 20:28:07 +0100 Subject: [PATCH 09/99] Forgot ;; in the bash case syntax --- .github/workflows/actions/quarto-dev/action.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/actions/quarto-dev/action.yml b/.github/workflows/actions/quarto-dev/action.yml index 132cb3c2b87..7effa44e1cb 100644 --- a/.github/workflows/actions/quarto-dev/action.yml +++ b/.github/workflows/actions/quarto-dev/action.yml @@ -15,8 +15,10 @@ runs: case $RUNNER_OS in "Windows") pwsh -C "./configure.cmd" + ;; *) ./configure.sh + ;; esac - name: Basic dev mode sanity check From 4a193db48136c1e5365a4d49bba7a108433255a8 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 25 Jan 2023 20:33:01 +0100 Subject: [PATCH 10/99] Fix all syntax --- .github/workflows/test-smokes.yml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index db94612f28e..cbc71fdc90f 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -84,8 +84,10 @@ jobs: case $RUNNER_OS in "Windows") pwsh -F ./run-test.ps1 - *) - ./run-tests.sh + ;; + *) + ./run-tests.sh + ;; esac popd shell: bash @@ -100,8 +102,10 @@ jobs: case $RUNNER_OS in "Windows") pwsh -F ./run-test.ps1 - *) - ./run-tests.sh + ;; + *) + ./run-tests.sh + ;; esac working-directory: tests shell: bash From 3b9f8137d72d93712797cd406135a96c13f639ab Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 25 Jan 2023 20:43:56 +0100 Subject: [PATCH 11/99] .python-version is not found as in tests/ and not root project --- .github/workflows/test-smokes.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index cbc71fdc90f..0e9ea25455d 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -61,6 +61,7 @@ jobs: uses: actions/setup-python@v4 with: cache: "pip" + python-version-file: "./tests/.python-version" - uses: ./.github/workflows/actions/quarto-dev From 627cd095c4d90bafbbd564f0b3e507dc22bc38e4 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 25 Jan 2023 23:36:28 +0100 Subject: [PATCH 12/99] Separate in one step per OS --- .../workflows/actions/quarto-dev/action.yml | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/.github/workflows/actions/quarto-dev/action.yml b/.github/workflows/actions/quarto-dev/action.yml index 7effa44e1cb..597c2396e98 100644 --- a/.github/workflows/actions/quarto-dev/action.yml +++ b/.github/workflows/actions/quarto-dev/action.yml @@ -9,17 +9,15 @@ runs: run: | echo "$HOME/bin" >> $GITHUB_PATH - - name: Configure Quarto + - name: Configure Quarto (.sh) + if: runner.os != 'Windows' shell: bash - run: | - case $RUNNER_OS in - "Windows") - pwsh -C "./configure.cmd" - ;; - *) - ./configure.sh - ;; - esac + run: ./configure.sh + + - name: Configure Quarto (.ps1) + if: runner.os == 'Windows' + shell: cmd + run: ./configure.cmd - name: Basic dev mode sanity check shell: bash From add2c3830eb4be2e060e94d465eca26f2dd6a9c1 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 25 Jan 2023 23:46:19 +0100 Subject: [PATCH 13/99] Put back setup in main workflow We duplicate the step in the `run-test` script, but it is better to have this setup before installing quarto-dev in next step --- .github/workflows/test-smokes.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index 0e9ea25455d..bd293f29344 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -57,12 +57,26 @@ jobs: restore-keys: | ${{ runner.os }}-1-renv- + - name: Restore packages + working-directory: tests + run: | + if (!requireNamespace('renv', quietly = TRUE)) install.packages('renv') + renv::restore() + shell: Rscript {0} + - name: Set up Python uses: actions/setup-python@v4 with: cache: "pip" python-version-file: "./tests/.python-version" + - name: Python Dependencies + working-directory: tests + run: | + python3 -m pip install --upgrade pip + python3 -m pip install wheel + python3 -m pip install -r requirements.txt + - uses: ./.github/workflows/actions/quarto-dev - name: Install Tinytex From 53c1669b95cfb6095c0b129e48e010efdd85f9d0 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 26 Jan 2023 00:17:30 +0100 Subject: [PATCH 14/99] We need some platform specifier in requirement.txt --- tests/requirements.txt | 64 +++++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/tests/requirements.txt b/tests/requirements.txt index 3d3eea9aee9..524b15b4ce7 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -1,34 +1,38 @@ anyio==3.6.2 -appnope==0.1.2 +appnope==0.1.3 argon2-cffi==21.3.0 argon2-cffi-bindings==21.2.0 +arrow==1.2.3 asttokens==2.2.1 async-generator==1.10 -attrs==21.2.0 +attrs==22.2.0 backcall==0.2.0 beautifulsoup4==4.11.1 bleach==6.0.0 bokeh==3.0.3 -cffi==1.14.5 -colorama==0.4.6 +cffi==1.15.1 +colorama==0.4.6; platform_system == "Windows" comm==0.1.2 contourpy==1.0.7 -cycler==0.10.0 +cycler==0.11.0 debugpy==1.6.6 -decorator==5.0.9 +decorator==5.1.1 defusedxml==0.7.1 -entrypoints==0.3 +entrypoints==0.4 executing==1.2.0 fastjsonschema==2.16.2 fonttools==4.38.0 +fqdn==1.5.1 idna==3.4 ipykernel==6.20.2 ipython==8.8.0 ipython-genutils==0.2.0 ipywidgets==8.0.4 -jedi==0.18.0 -Jinja2==3.0.1 -jsonschema==3.2.0 +isoduration==20.11.0 +jedi==0.18.2 +Jinja2==3.1.2 +jsonpointer==2.3 +jsonschema==4.17.3 jupyter==1.0.0 jupyter-console==6.4.4 jupyter-events==0.6.3 @@ -36,12 +40,12 @@ jupyter_client==7.4.9 jupyter_core==5.1.5 jupyter_server==2.1.0 jupyter_server_terminals==0.4.4 -jupyterlab-pygments==0.1.2 +jupyterlab-pygments==0.2.2 jupyterlab-widgets==3.0.5 kiwisolver==1.4.4 -MarkupSafe==2.0.1 +MarkupSafe==2.1.2 matplotlib==3.6.3 -matplotlib-inline==0.1.2 +matplotlib-inline==0.1.6 mistune==2.0.4 nbclassic==0.4.8 nbclient==0.7.2 @@ -50,31 +54,31 @@ nbformat==5.7.3 nest-asyncio==1.5.6 notebook==6.5.2 notebook_shim==0.2.2 -numpy==1.23.2 -packaging==20.9 +numpy==1.24.1 +packaging==23.0 pandas==1.5.3 -pandocfilters==1.4.3 -parso==0.8.2 +pandocfilters==1.5.0 +parso==0.8.3 pexpect==4.8.0 pickleshare==0.7.5 -Pillow==9.2.0 +Pillow==9.4.0 platformdirs==2.6.2 -prometheus-client==0.11.0 -prompt-toolkit==3.0.19 +prometheus-client==0.16.0 +prompt-toolkit==3.0.36 psutil==5.9.4 ptyprocess==0.7.0 pure-eval==0.2.2 -pycparser==2.20 -Pygments==2.9.0 +pycparser==2.21 +Pygments==2.14.0 pyparsing==3.0.9 -pyrsistent==0.17.3 +pyrsistent==0.19.3 python-dateutil==2.8.2 python-json-logger==2.0.4 pytz==2022.7.1 -pywin32==305 -pywinpty==2.0.10 +pywin32==305; platform_system == "Windows" +pywinpty==2.0.10; platform_system == "Windows" PyYAML==6.0 -pyzmq==24.0.1 +pyzmq==25.0.0 qtconsole==5.4.0 QtPy==2.3.0 rfc3339-validator==0.1.4 @@ -84,12 +88,14 @@ six==1.16.0 sniffio==1.3.0 soupsieve==2.3.2.post1 stack-data==0.6.2 -terminado==0.10.1 -testpath==0.5.0 +terminado==0.17.1 +testpath==0.6.0 tinycss2==1.2.1 tornado==6.2 traitlets==5.8.1 -wcwidth==0.2.5 +uri-template==1.2.0 +wcwidth==0.2.6 +webcolors==1.12 webencodings==0.5.1 websocket-client==1.4.2 widgetsnbextension==4.0.5 From 03f5a88b13c0418625650c73a3dd99aa243e50bb Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 26 Jan 2023 00:37:35 +0100 Subject: [PATCH 15/99] [debug] Adapt GHA to debug * Using tmate * Deactivating other workflow as not useful when debugging --- .github/workflows/performance-check.yml | 1 + .github/workflows/test-bundle.yml | 1 + .github/workflows/test-quarto-latexmk.yml | 1 + .github/workflows/test-smokes.yml | 6 +++++- 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/performance-check.yml b/.github/workflows/performance-check.yml index 7ae975196c7..9924a38d5c6 100644 --- a/.github/workflows/performance-check.yml +++ b/.github/workflows/performance-check.yml @@ -12,6 +12,7 @@ on: jobs: test-bundle: + if: false runs-on: ubuntu-latest steps: diff --git a/.github/workflows/test-bundle.yml b/.github/workflows/test-bundle.yml index df187890082..e3a3cf743e2 100644 --- a/.github/workflows/test-bundle.yml +++ b/.github/workflows/test-bundle.yml @@ -12,6 +12,7 @@ on: jobs: test-bundle: + if: false runs-on: ubuntu-latest steps: diff --git a/.github/workflows/test-quarto-latexmk.yml b/.github/workflows/test-quarto-latexmk.yml index eeb3e89f0e2..5e0519478d0 100644 --- a/.github/workflows/test-quarto-latexmk.yml +++ b/.github/workflows/test-quarto-latexmk.yml @@ -9,6 +9,7 @@ name: Test quarto-latexmk jobs: quarto-latexmk: + if: false runs-on: ${{ matrix.config.os }} name: ${{ matrix.config.os }} diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index bd293f29344..0b092f08cb8 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -20,7 +20,8 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest] + # os: [ubuntu-latest, windows-latest] + os: [windows-latest] runs-on: ${{ matrix.os }} steps: @@ -77,6 +78,9 @@ jobs: python3 -m pip install wheel python3 -m pip install -r requirements.txt + - name: Setup tmate session + uses: mxschmitt/action-tmate@v3 + - uses: ./.github/workflows/actions/quarto-dev - name: Install Tinytex From e505add089a9c234107164c3b8d65ace18419d76 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 26 Jan 2023 01:28:09 +0100 Subject: [PATCH 16/99] Fix configure.cmd to work on CI --- configure.cmd | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/configure.cmd b/configure.cmd index 0dbe000abad..1f40c5dbf9e 100644 --- a/configure.cmd +++ b/configure.cmd @@ -7,7 +7,8 @@ REM using ! ! instead of % %. However, this only allows one level of expansio REM try to create a variable that derives from a derived variable. It will be empty. REM First Check that Deno isn't running since this causes weird and confusing errors -tasklist /fi "ImageName eq deno.exe" /fo csv 2>NUL | find /I "deno.exe">NUL +REM find can conflict with one provided in bash with other args so use absolute path +tasklist /fi "ImageName eq deno.exe" /fo csv 2>NUL | "%WINDIR%/system32/find" /I "deno.exe">NUL if "%ERRORLEVEL%"=="0" goto :denoRunning call package\src\store_win_configuration.bat @@ -28,7 +29,8 @@ if "%QUARTO_VENDOR_BINARIES%" == "true" ( CURL --fail -L "https://github.com/denoland/deno/releases/download/!DENO!/!DENO_FILE!" -o "!DENO_FILE!" REM Windows doesn't have unzip installed by default, but starting in Windows 10 build 17063 they did REM include a build in 'tar' command. Windows 10 build 17063 was released in 2017. - tar -xf !DENO_FILE! + REM We need to use absolute if another tar is in PATH, that would not support .zip extension + %WINDIR%/System32/tar -xf !DENO_FILE! REM If tar failed, try unzipping it. IF %ERRORLEVEL% NEQ 0 ( @@ -86,11 +88,11 @@ ECHO Downloading Deno Stdlib CALL !QUARTO_PACKAGE_PATH!\scripts\deno_std\download.bat SET QUARTO_DENO_EXTRA_OPTIONS="--reload" -IF EXIST !QUARTO_BIN_PATH!\quarto.bat ( +IF EXIST !QUARTO_BIN_PATH!\quarto.cmd ( CALL "!QUARTO_BIN_PATH!\quarto" --version ) -ECHO NOTE: To use quarto please use quarto-cmd (located in this folder) or add the following path to your PATH +ECHO NOTE: To use quarto please use quarto.cmd (located in this folder) or add the following path to your PATH ECHO !QUARTO_BIN_PATH! From 3bb301ac3387e6df396c3bb8fcff10686de2f93f Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 26 Jan 2023 01:34:15 +0100 Subject: [PATCH 17/99] [debug] deactivate tmate --- .github/workflows/test-smokes.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index 0b092f08cb8..5f2bad27b91 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -79,6 +79,7 @@ jobs: python3 -m pip install -r requirements.txt - name: Setup tmate session + if: false uses: mxschmitt/action-tmate@v3 - uses: ./.github/workflows/actions/quarto-dev From 00b9c42f135ad73a503f7eaff2cd4a20c0282e36 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 26 Jan 2023 11:40:40 +0100 Subject: [PATCH 18/99] Correctly put quarto to PATH for Unix and Windows --- .github/workflows/actions/quarto-dev/action.yml | 13 ++++++------- configure.cmd | 1 + 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/actions/quarto-dev/action.yml b/.github/workflows/actions/quarto-dev/action.yml index 597c2396e98..7dc80ed474a 100644 --- a/.github/workflows/actions/quarto-dev/action.yml +++ b/.github/workflows/actions/quarto-dev/action.yml @@ -4,20 +4,19 @@ description: "Configures the image for Quarto Development" runs: using: "composite" steps: - - name: Set Path - shell: bash - run: | - echo "$HOME/bin" >> $GITHUB_PATH - - name: Configure Quarto (.sh) if: runner.os != 'Windows' shell: bash - run: ./configure.sh + run: | + ./configure.sh + echo "$HOME/bin" >> $GITHUB_PATH - name: Configure Quarto (.ps1) if: runner.os == 'Windows' shell: cmd - run: ./configure.cmd + run: | + ./configure.cmd + ECHO %QUARTO_BIN_DEV% >> %GITHUB_PATH% - name: Basic dev mode sanity check shell: bash diff --git a/configure.cmd b/configure.cmd index 1f40c5dbf9e..0666e0c2dd5 100644 --- a/configure.cmd +++ b/configure.cmd @@ -95,6 +95,7 @@ IF EXIST !QUARTO_BIN_PATH!\quarto.cmd ( ECHO NOTE: To use quarto please use quarto.cmd (located in this folder) or add the following path to your PATH ECHO !QUARTO_BIN_PATH! +endlocal & set QUARTO_BIN_DEV=%QUARTO_BIN_PATH% GOTO :eof From 5d5d4cad20cd774958c73376f49bf7d9a8ad50b9 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 26 Jan 2023 11:58:03 +0100 Subject: [PATCH 19/99] Check that new Julia addition is also working --- .github/workflows/test-smokes.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index 4304e2e4b9f..a8104506a1d 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -20,8 +20,8 @@ jobs: strategy: fail-fast: false matrix: - # os: [ubuntu-latest, windows-latest] - os: [windows-latest] + os: [ubuntu-latest, windows-latest] + # os: [windows-latest] runs-on: ${{ matrix.os }} steps: @@ -58,7 +58,7 @@ jobs: restore-keys: | ${{ runner.os }}-1-renv- - - name: Restore packages + - name: Restore R packages working-directory: tests run: | if (!requireNamespace('renv', quietly = TRUE)) install.packages('renv') @@ -71,7 +71,7 @@ jobs: cache: "pip" python-version-file: "./tests/.python-version" - - name: Python Dependencies + - name: Restore Python Dependencies working-directory: tests run: | python3 -m pip install --upgrade pip @@ -96,11 +96,10 @@ jobs: - name: Setup Julia uses: julia-actions/setup-julia@v1 - - name: Julia Packages + - name: Restore Julia Packages + working-directory: tests run: | - pushd tests julia --project=. -e "import Pkg; Pkg.instantiate(); Pkg.build(\"IJulia\"); Pkg.precompile()" - popd - name: Smoke Test Commits if: github.event.before != '' From ae55ed511e2271db193f1afaf4e8220b64d2da0c Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 26 Jan 2023 12:24:36 +0100 Subject: [PATCH 20/99] Correct quote for Windows and UNIX --- .github/workflows/test-smokes.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index a8104506a1d..bec753af5ed 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -99,7 +99,7 @@ jobs: - name: Restore Julia Packages working-directory: tests run: | - julia --project=. -e "import Pkg; Pkg.instantiate(); Pkg.build(\"IJulia\"); Pkg.precompile()" + julia --project=. -e 'import Pkg; Pkg.instantiate(); Pkg.build("IJulia"); Pkg.precompile()' - name: Smoke Test Commits if: github.event.before != '' From b7bfa0e9bd33f5669034502ed6ca62b989cadd46 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 26 Jan 2023 12:24:59 +0100 Subject: [PATCH 21/99] Fix merge problem in figute test for Julia --- tests/smoke/crossref/figures.test.ts | 93 ++++++++++++++-------------- 1 file changed, 46 insertions(+), 47 deletions(-) diff --git a/tests/smoke/crossref/figures.test.ts b/tests/smoke/crossref/figures.test.ts index 16fb442c183..7e1f46ae3c7 100644 --- a/tests/smoke/crossref/figures.test.ts +++ b/tests/smoke/crossref/figures.test.ts @@ -45,55 +45,54 @@ testRender(pythonQmd.input, "html", false, [ ]), ]); - const pythonSubfigQmd = crossref("python-subfig.qmd", "html"); - testRender(pythonSubfigQmd.input, "html", false, [ - ensureHtmlElements(pythonSubfigQmd.output.outputPath, [ - "section#python-crossref-figure div.quarto-layout-panel > figure > div.quarto-layout-row", - "section#python-crossref-figure div.quarto-layout-panel > figure > figcaption.figure-caption", - "section#python-crossref-figure div.quarto-layout-panel > figure img.figure-img", - ]), - ensureFileRegexMatches(pythonSubfigQmd.output.outputPath, [ - /Figure 1: Plots/, - /Figure 1/, - /Figure 1 \(b\)/, - /\(a\) Plot 1/, - /\(b\) Plot 2/, - ], [ - /\?@fig-/, - ]), - ]); +const pythonSubfigQmd = crossref("python-subfig.qmd", "html"); +testRender(pythonSubfigQmd.input, "html", false, [ + ensureHtmlElements(pythonSubfigQmd.output.outputPath, [ + "section#python-crossref-figure div.quarto-layout-panel > figure > div.quarto-layout-row", + "section#python-crossref-figure div.quarto-layout-panel > figure > figcaption.figure-caption", + "section#python-crossref-figure div.quarto-layout-panel > figure img.figure-img", + ]), + ensureFileRegexMatches(pythonSubfigQmd.output.outputPath, [ + /Figure 1: Plots/, + /Figure 1/, + /Figure 1 \(b\)/, + /\(a\) Plot 1/, + /\(b\) Plot 2/, + ], [ + /\?@fig-/, + ]), +]); - const juliaQmd = crossref("julia.qmd", "html"); - testRender(juliaQmd.input, "html", false, [ - ensureHtmlElements(juliaQmd.output.outputPath, [ - "section#julia-crossref-figure div#fig-plot > figure img.figure-img", - "section#julia-crossref-figure div#fig-plot > figure > figcaption", - ]), - ensureFileRegexMatches(juliaQmd.output.outputPath, [ - /Figure 1: Plot/, - /Figure 1/, - ], [ - /\?@fig-/, - ]), - ]); +const juliaQmd = crossref("julia.qmd", "html"); +testRender(juliaQmd.input, "html", false, [ + ensureHtmlElements(juliaQmd.output.outputPath, [ + "section#julia-crossref-figure div#fig-plot > figure img.figure-img", + "section#julia-crossref-figure div#fig-plot > figure > figcaption", + ]), + ensureFileRegexMatches(juliaQmd.output.outputPath, [ + /Figure 1: Plot/, + /Figure 1/, + ], [ + /\?@fig-/, + ]), +]); - const juliaSubfigQmd = crossref("julia-subfig.qmd", "html"); - testRender(juliaSubfigQmd.input, "html", false, [ - ensureHtmlElements(juliaSubfigQmd.output.outputPath, [ - "section#julia-crossref-figure div.quarto-layout-panel > figure > div.quarto-layout-row", - "section#julia-crossref-figure div.quarto-layout-panel > figure > figcaption.figure-caption", - ]), - ensureFileRegexMatches(juliaSubfigQmd.output.outputPath, [ - /Figure 1: Plots/, - /Figure 1/, - /Figure 1 \(b\)/, - /\(a\) Plot 1/, - /\(b\) Plot 2/, - ], [ - /\?@fig-/, - ]), - ]); -} +const juliaSubfigQmd = crossref("julia-subfig.qmd", "html"); +testRender(juliaSubfigQmd.input, "html", false, [ + ensureHtmlElements(juliaSubfigQmd.output.outputPath, [ + "section#julia-crossref-figure div.quarto-layout-panel > figure > div.quarto-layout-row", + "section#julia-crossref-figure div.quarto-layout-panel > figure > figcaption.figure-caption", + ]), + ensureFileRegexMatches(juliaSubfigQmd.output.outputPath, [ + /Figure 1: Plots/, + /Figure 1/, + /Figure 1 \(b\)/, + /\(a\) Plot 1/, + /\(b\) Plot 2/, + ], [ + /\?@fig-/, + ]), +]); const knitrQmd = crossref("knitr.qmd", "html"); testRender(knitrQmd.input, "html", false, [ From cae26e27566ee9f9a3e9a4300657419308330b37 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 26 Jan 2023 12:36:36 +0100 Subject: [PATCH 22/99] fIx custom action to work on Windows and UNIX --- .github/workflows/actions/quarto-dev/action.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/actions/quarto-dev/action.yml b/.github/workflows/actions/quarto-dev/action.yml index 7dc80ed474a..3ce0b2d11d9 100644 --- a/.github/workflows/actions/quarto-dev/action.yml +++ b/.github/workflows/actions/quarto-dev/action.yml @@ -10,6 +10,7 @@ runs: run: | ./configure.sh echo "$HOME/bin" >> $GITHUB_PATH + echo "QUARTO_BIN=quarto" >> $GITHUB_ENV - name: Configure Quarto (.ps1) if: runner.os == 'Windows' @@ -17,15 +18,16 @@ runs: run: | ./configure.cmd ECHO %QUARTO_BIN_DEV% >> %GITHUB_PATH% + ECHO "QUARTO_BIN=quarto.cmd" >> %GITHUB_ENV% - name: Basic dev mode sanity check shell: bash run: | - [ "$(quarto --version)" == "99.9.9" ] || exit 1 - [ "$(quarto --paths | grep package/dist/share)" == "" ] || exit 1 + [ "$(${{ env.QUARTO_BIN }} --version)" == "99.9.9" ] || exit 1 + [ "$(${{ env.QUARTO_BIN }} --paths | grep package/dist/share)" == "" ] || exit 1 [ "$(git status --porcelain)" == "" ] || exit 1 - name: Quarto Check - shell: bash - run: quarto check working-directory: tests + shell: bash + run: ${{ env.QUARTO_BIN }} check From 47b1804a5ba38d477c48536cd655aa5addcf7cd2 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 26 Jan 2023 12:42:46 +0100 Subject: [PATCH 23/99] Add caching to Julia --- .github/workflows/test-smokes.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index bec753af5ed..e174367aaf5 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -50,7 +50,7 @@ jobs: run: npx playwright install --with-deps working-directory: ./tests/integration/playwright - - name: Cache packages + - name: Cache R packages uses: actions/cache@v3 with: path: ${{ env.RENV_PATHS_ROOT }} @@ -96,10 +96,13 @@ jobs: - name: Setup Julia uses: julia-actions/setup-julia@v1 + - name: Cache Julia Packages + uses: julia-actions/setup-julia@v1 + - name: Restore Julia Packages working-directory: tests run: | - julia --project=. -e 'import Pkg; Pkg.instantiate(); Pkg.build("IJulia"); Pkg.precompile()' + julia --color=yes --project=. -e 'import Pkg; Pkg.instantiate(); Pkg.build("IJulia"); Pkg.precompile()' - name: Smoke Test Commits if: github.event.before != '' From 5bec9414e4ff00a3486e9aaca16613b5ef12a4c2 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 26 Jan 2023 12:53:33 +0100 Subject: [PATCH 24/99] Try with no quote to export an ENV in github action with cmd shell --- .github/workflows/actions/quarto-dev/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/actions/quarto-dev/action.yml b/.github/workflows/actions/quarto-dev/action.yml index 3ce0b2d11d9..28739010cdc 100644 --- a/.github/workflows/actions/quarto-dev/action.yml +++ b/.github/workflows/actions/quarto-dev/action.yml @@ -18,7 +18,7 @@ runs: run: | ./configure.cmd ECHO %QUARTO_BIN_DEV% >> %GITHUB_PATH% - ECHO "QUARTO_BIN=quarto.cmd" >> %GITHUB_ENV% + ECHO QUARTO_BIN=quarto.cmd >> %GITHUB_ENV% - name: Basic dev mode sanity check shell: bash From 63c58778b904b97e3b1ca3d5e255f5609ef68622 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 26 Jan 2023 12:54:06 +0100 Subject: [PATCH 25/99] Correct action for Julia Cache --- .github/workflows/test-smokes.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index e174367aaf5..1fbbf0e36a4 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -97,7 +97,7 @@ jobs: uses: julia-actions/setup-julia@v1 - name: Cache Julia Packages - uses: julia-actions/setup-julia@v1 + uses: julia-actions/cache@v1 - name: Restore Julia Packages working-directory: tests From f26424f253066f085eb149da8819b4aea968e32f Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 26 Jan 2023 13:10:41 +0100 Subject: [PATCH 26/99] Try with powershell instead of cmd for window sheel in custom action --- .github/workflows/actions/quarto-dev/action.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/actions/quarto-dev/action.yml b/.github/workflows/actions/quarto-dev/action.yml index 28739010cdc..e94901a065c 100644 --- a/.github/workflows/actions/quarto-dev/action.yml +++ b/.github/workflows/actions/quarto-dev/action.yml @@ -14,11 +14,11 @@ runs: - name: Configure Quarto (.ps1) if: runner.os == 'Windows' - shell: cmd + shell: pwsh run: | ./configure.cmd - ECHO %QUARTO_BIN_DEV% >> %GITHUB_PATH% - ECHO QUARTO_BIN=quarto.cmd >> %GITHUB_ENV% + $env:QUARTO_BIN_DEV >> $env:GITHUB_PATH + "QUARTO_BIN=quarto.cmd" >> $env:GITHUB_ENV - name: Basic dev mode sanity check shell: bash From 3790f2bf1c0e0d68622acb14d38d587cbfc2d382 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 26 Jan 2023 13:50:03 +0100 Subject: [PATCH 27/99] Try using pwsh shell available for all OS too as on Windows it will match `quarto` in PATH for `quarto.cmd` which does not happen in bash shell --- .github/workflows/actions/quarto-dev/action.yml | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/.github/workflows/actions/quarto-dev/action.yml b/.github/workflows/actions/quarto-dev/action.yml index e94901a065c..fdd64745f56 100644 --- a/.github/workflows/actions/quarto-dev/action.yml +++ b/.github/workflows/actions/quarto-dev/action.yml @@ -10,7 +10,6 @@ runs: run: | ./configure.sh echo "$HOME/bin" >> $GITHUB_PATH - echo "QUARTO_BIN=quarto" >> $GITHUB_ENV - name: Configure Quarto (.ps1) if: runner.os == 'Windows' @@ -18,16 +17,15 @@ runs: run: | ./configure.cmd $env:QUARTO_BIN_DEV >> $env:GITHUB_PATH - "QUARTO_BIN=quarto.cmd" >> $env:GITHUB_ENV - name: Basic dev mode sanity check - shell: bash + shell: pwsh run: | - [ "$(${{ env.QUARTO_BIN }} --version)" == "99.9.9" ] || exit 1 - [ "$(${{ env.QUARTO_BIN }} --paths | grep package/dist/share)" == "" ] || exit 1 - [ "$(git status --porcelain)" == "" ] || exit 1 + If ( "$(quarto --version)" -ne "99.9.9") { Exit 1 } + If ( -not $(quarto --paths | Select-String -Pattern "package[/\\]+dist[/\\]+share") -ne $null ) { Exit 1 } + If ( -not "$(git status --porcelain)" -ne "" ) { Exit 1 } - name: Quarto Check working-directory: tests - shell: bash - run: ${{ env.QUARTO_BIN }} check + shell: pwsh + run: quarto check From 6897b2b67dc3227c3b829b9f73663e26a8ba6c69 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 26 Jan 2023 14:46:54 +0100 Subject: [PATCH 28/99] Show PATH to check it is correctly set --- .github/workflows/actions/quarto-dev/action.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/actions/quarto-dev/action.yml b/.github/workflows/actions/quarto-dev/action.yml index fdd64745f56..c130d20224b 100644 --- a/.github/workflows/actions/quarto-dev/action.yml +++ b/.github/workflows/actions/quarto-dev/action.yml @@ -18,6 +18,9 @@ runs: ./configure.cmd $env:QUARTO_BIN_DEV >> $env:GITHUB_PATH + - shell: pwsh + run: $env:PATH -Split ";" + - name: Basic dev mode sanity check shell: pwsh run: | From 2eeecd1f79dfc38f409011cd9c248827b2895708 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 26 Jan 2023 15:07:19 +0100 Subject: [PATCH 29/99] [debug] try tmate in composition action --- .github/workflows/actions/quarto-dev/action.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/actions/quarto-dev/action.yml b/.github/workflows/actions/quarto-dev/action.yml index c130d20224b..44024b8390f 100644 --- a/.github/workflows/actions/quarto-dev/action.yml +++ b/.github/workflows/actions/quarto-dev/action.yml @@ -18,6 +18,9 @@ runs: ./configure.cmd $env:QUARTO_BIN_DEV >> $env:GITHUB_PATH + - name: Setup tmate session + uses: mxschmitt/action-tmate@v3 + - shell: pwsh run: $env:PATH -Split ";" From 047b73b0b5cb647b3c77cd65096f439e45365655 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 26 Jan 2023 15:20:14 +0100 Subject: [PATCH 30/99] Correct test for sanity check --- .github/workflows/actions/quarto-dev/action.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/actions/quarto-dev/action.yml b/.github/workflows/actions/quarto-dev/action.yml index 44024b8390f..d9cc2386966 100644 --- a/.github/workflows/actions/quarto-dev/action.yml +++ b/.github/workflows/actions/quarto-dev/action.yml @@ -28,8 +28,8 @@ runs: shell: pwsh run: | If ( "$(quarto --version)" -ne "99.9.9") { Exit 1 } - If ( -not $(quarto --paths | Select-String -Pattern "package[/\\]+dist[/\\]+share") -ne $null ) { Exit 1 } - If ( -not "$(git status --porcelain)" -ne "" ) { Exit 1 } + If ( $(quarto --paths | Select-String -Pattern "package[/\\]+dist[/\\]+share") -ne $null ) { Exit 1 } + If ( "$(git status --porcelain)" -ne "" ) { Exit 1 } - name: Quarto Check working-directory: tests From b5cbd993eaa98436a4eba0cb9edbaba9a2b6862a Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 26 Jan 2023 15:20:24 +0100 Subject: [PATCH 31/99] [debug] Only debug windows now --- .github/workflows/actions/quarto-dev/action.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/actions/quarto-dev/action.yml b/.github/workflows/actions/quarto-dev/action.yml index d9cc2386966..2ff3da1f548 100644 --- a/.github/workflows/actions/quarto-dev/action.yml +++ b/.github/workflows/actions/quarto-dev/action.yml @@ -19,6 +19,7 @@ runs: $env:QUARTO_BIN_DEV >> $env:GITHUB_PATH - name: Setup tmate session + if: runner.os == 'Windows' uses: mxschmitt/action-tmate@v3 - shell: pwsh From 141838b4dd9e1f16fb75116970a9206461cd52ed Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 26 Jan 2023 15:46:15 +0100 Subject: [PATCH 32/99] [debug] Only run windows now --- .github/workflows/test-smokes.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index 1fbbf0e36a4..4ba71f2bab1 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -20,8 +20,8 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest] - # os: [windows-latest] + #os: [ubuntu-latest, windows-latest] + os: [windows-latest] runs-on: ${{ matrix.os }} steps: From 3ad47a2980a2cb58df5e5a731ce75e47bea582a5 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 26 Jan 2023 15:47:33 +0100 Subject: [PATCH 33/99] we need to stay in CMD to access variable --- .github/workflows/actions/quarto-dev/action.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/actions/quarto-dev/action.yml b/.github/workflows/actions/quarto-dev/action.yml index 2ff3da1f548..d1f9d8af312 100644 --- a/.github/workflows/actions/quarto-dev/action.yml +++ b/.github/workflows/actions/quarto-dev/action.yml @@ -8,23 +8,24 @@ runs: if: runner.os != 'Windows' shell: bash run: | + # install with symlink in /usr/local/bin which in PATH on CI ./configure.sh - echo "$HOME/bin" >> $GITHUB_PATH - name: Configure Quarto (.ps1) if: runner.os == 'Windows' - shell: pwsh + shell: cmd run: | ./configure.cmd - $env:QUARTO_BIN_DEV >> $env:GITHUB_PATH + echo %QUARTO_BIN_DEV% >> %GITHUB_PATH% + + - shell: pwsh + if: runner.os == 'Windows' + run: $env:PATH -Split ";" - name: Setup tmate session if: runner.os == 'Windows' uses: mxschmitt/action-tmate@v3 - - shell: pwsh - run: $env:PATH -Split ";" - - name: Basic dev mode sanity check shell: pwsh run: | From b7df10d959af389985dd6c0d95df7af22ed09d4d Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 26 Jan 2023 16:18:41 +0100 Subject: [PATCH 34/99] Try to access variable again in CMD --- .github/workflows/actions/quarto-dev/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/actions/quarto-dev/action.yml b/.github/workflows/actions/quarto-dev/action.yml index d1f9d8af312..91b73e4db72 100644 --- a/.github/workflows/actions/quarto-dev/action.yml +++ b/.github/workflows/actions/quarto-dev/action.yml @@ -16,7 +16,7 @@ runs: shell: cmd run: | ./configure.cmd - echo %QUARTO_BIN_DEV% >> %GITHUB_PATH% + endlocal & CALL ECHO %QUARTO_BIN_DEV% >> %GITHUB_PATH% - shell: pwsh if: runner.os == 'Windows' From aa59f60f921cce9b4f4e34c84ea1fbbc71a7c8b9 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 26 Jan 2023 16:44:22 +0100 Subject: [PATCH 35/99] Remove the double backslash on windows --- .github/workflows/actions/quarto-dev/action.yml | 7 +++++-- package/src/store_win_configuration.bat | 6 +++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.github/workflows/actions/quarto-dev/action.yml b/.github/workflows/actions/quarto-dev/action.yml index 91b73e4db72..12bd9a8bcf6 100644 --- a/.github/workflows/actions/quarto-dev/action.yml +++ b/.github/workflows/actions/quarto-dev/action.yml @@ -16,8 +16,11 @@ runs: shell: cmd run: | ./configure.cmd - endlocal & CALL ECHO %QUARTO_BIN_DEV% >> %GITHUB_PATH% - + echo %GITHUB_PATH% + type %GITHUB_PATH% + echo %QUARTO_BIN_DEV% + echo %QUARTO_BIN_DEV% >> %GITHUB_PATH% + type %GITHUB_PATH% - shell: pwsh if: runner.os == 'Windows' run: $env:PATH -Split ";" diff --git a/package/src/store_win_configuration.bat b/package/src/store_win_configuration.bat index 7d0643460ff..0a02e882c9a 100644 --- a/package/src/store_win_configuration.bat +++ b/package/src/store_win_configuration.bat @@ -42,8 +42,8 @@ echo set "QUARTO_SRC_PATH=%%~dp0\src" >> %~dp0\..\..\win_configuration.bat echo set "QUARTO_PACKAGE_PATH=%%~dp0\%%QUARTO_PACKAGE_DIR%%" >> %~dp0\..\..\win_configuration.bat :: These paths end up in the output package or conda build prefix. -echo set "QUARTO_DIST_PATH=%%~dp0\%%QUARTO_PACKAGE_DIR%%\%%QUARTO_DIST_DIR%%" >> %~dp0\..\..\win_configuration.bat -echo set "QUARTO_SHARE_PATH=%%~dp0\%%QUARTO_PACKAGE_DIR%%\%%QUARTO_DIST_DIR%%\%%QUARTO_SHARE_DIR%%" >> %~dp0\..\..\win_configuration.bat -echo set "QUARTO_BIN_PATH=%%~dp0\%%QUARTO_PACKAGE_DIR%%\%%QUARTO_DIST_DIR%%\%%QUARTO_BIN_DIR%%" >> %~dp0\..\..\win_configuration.bat +echo set "QUARTO_DIST_PATH=%%~dp0%%QUARTO_PACKAGE_DIR%%\%%QUARTO_DIST_DIR%%" >> %~dp0\..\..\win_configuration.bat +echo set "QUARTO_SHARE_PATH=%%~dp0%%QUARTO_PACKAGE_DIR%%\%%QUARTO_DIST_DIR%%\%%QUARTO_SHARE_DIR%%" >> %~dp0\..\..\win_configuration.bat +echo set "QUARTO_BIN_PATH=%%~dp0%%QUARTO_PACKAGE_DIR%%\%%QUARTO_DIST_DIR%%\%%QUARTO_BIN_DIR%%" >> %~dp0\..\..\win_configuration.bat echo "Translated/recorded configuration settings from unix configuration script" From 7ec38805df690780b5ed76d491e5d3d62fbe23f5 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 26 Jan 2023 17:03:38 +0100 Subject: [PATCH 36/99] fixup: Remove the double backslash on windows --- package/src/store_win_configuration.bat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package/src/store_win_configuration.bat b/package/src/store_win_configuration.bat index 0a02e882c9a..84874153d60 100644 --- a/package/src/store_win_configuration.bat +++ b/package/src/store_win_configuration.bat @@ -38,8 +38,8 @@ echo set "QUARTO_ROOT=%%~dp0" >> %~dp0\..\..\win_configuration.bat :: zip file archives that we build. :: These are the paths within the Quarto source tree - the "package" subfolder. -echo set "QUARTO_SRC_PATH=%%~dp0\src" >> %~dp0\..\..\win_configuration.bat -echo set "QUARTO_PACKAGE_PATH=%%~dp0\%%QUARTO_PACKAGE_DIR%%" >> %~dp0\..\..\win_configuration.bat +echo set "QUARTO_SRC_PATH=%%~dp0src" >> %~dp0\..\..\win_configuration.bat +echo set "QUARTO_PACKAGE_PATH=%%~dp0%%QUARTO_PACKAGE_DIR%%" >> %~dp0\..\..\win_configuration.bat :: These paths end up in the output package or conda build prefix. echo set "QUARTO_DIST_PATH=%%~dp0%%QUARTO_PACKAGE_DIR%%\%%QUARTO_DIST_DIR%%" >> %~dp0\..\..\win_configuration.bat From 4fac13eaf6f1993691a4a18ea5b1e7dc624511f3 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 26 Jan 2023 17:17:37 +0100 Subject: [PATCH 37/99] Retry with Powershell and set PATH hardcoded in action --- .github/workflows/actions/quarto-dev/action.yml | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/.github/workflows/actions/quarto-dev/action.yml b/.github/workflows/actions/quarto-dev/action.yml index 12bd9a8bcf6..4ebe2de411f 100644 --- a/.github/workflows/actions/quarto-dev/action.yml +++ b/.github/workflows/actions/quarto-dev/action.yml @@ -13,22 +13,15 @@ runs: - name: Configure Quarto (.ps1) if: runner.os == 'Windows' - shell: cmd + shell: pwsh run: | ./configure.cmd - echo %GITHUB_PATH% - type %GITHUB_PATH% - echo %QUARTO_BIN_DEV% - echo %QUARTO_BIN_DEV% >> %GITHUB_PATH% - type %GITHUB_PATH% + "$(Get-ChildItem -Path ./package/dist/bin/quarto.cmd | %{ $_.FullName } | Split-Path)" >> $env:GITHUB_PATH + - shell: pwsh if: runner.os == 'Windows' run: $env:PATH -Split ";" - - name: Setup tmate session - if: runner.os == 'Windows' - uses: mxschmitt/action-tmate@v3 - - name: Basic dev mode sanity check shell: pwsh run: | From 45b94c96ed46f811de06c720c23df0abd5db0fd9 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 26 Jan 2023 17:53:48 +0100 Subject: [PATCH 38/99] [debug] Move tmate to debug Julia installation --- .github/workflows/test-smokes.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index 4ba71f2bab1..83d76ea0fae 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -78,10 +78,6 @@ jobs: python3 -m pip install wheel python3 -m pip install -r requirements.txt - - name: Setup tmate session - if: false - uses: mxschmitt/action-tmate@v3 - - uses: ./.github/workflows/actions/quarto-dev - name: Install Tinytex @@ -99,6 +95,9 @@ jobs: - name: Cache Julia Packages uses: julia-actions/cache@v1 + - name: Setup tmate session + uses: mxschmitt/action-tmate@v3 + - name: Restore Julia Packages working-directory: tests run: | From 674e12ee202bb8ce395b944ce4a61d5ca3b022e8 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 26 Jan 2023 18:54:01 +0100 Subject: [PATCH 39/99] Keep original command for julia but enforce bash as shell --- .github/workflows/test-smokes.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index 83d76ea0fae..b6b63dcc5a8 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -96,12 +96,14 @@ jobs: uses: julia-actions/cache@v1 - name: Setup tmate session + if: false uses: mxschmitt/action-tmate@v3 - name: Restore Julia Packages working-directory: tests + shell: bash run: | - julia --color=yes --project=. -e 'import Pkg; Pkg.instantiate(); Pkg.build("IJulia"); Pkg.precompile()' + julia --color=yes --project=. -e "import Pkg; Pkg.instantiate(); Pkg.build(\"IJulia\"); Pkg.precompile()" - name: Smoke Test Commits if: github.event.before != '' From d7a5d4adcb9fcac0fe10efe7ae16f76eff7179fe Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Fri, 27 Jan 2023 11:00:54 +0100 Subject: [PATCH 40/99] [debug] Add tmate later to debug renv --- .github/workflows/test-smokes.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index b6b63dcc5a8..4bc4b59f652 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -20,8 +20,8 @@ jobs: strategy: fail-fast: false matrix: - #os: [ubuntu-latest, windows-latest] - os: [windows-latest] + os: [ubuntu-latest, windows-latest] + #os: [windows-latest] runs-on: ${{ matrix.os }} steps: @@ -95,16 +95,16 @@ jobs: - name: Cache Julia Packages uses: julia-actions/cache@v1 - - name: Setup tmate session - if: false - uses: mxschmitt/action-tmate@v3 - - name: Restore Julia Packages working-directory: tests shell: bash run: | julia --color=yes --project=. -e "import Pkg; Pkg.instantiate(); Pkg.build(\"IJulia\"); Pkg.precompile()" + - name: Setup tmate session + if: runner.os == 'Windows' + uses: mxschmitt/action-tmate@v3 + - name: Smoke Test Commits if: github.event.before != '' env: From e56d26dc66de5bf0fc3e646fbe4bf3e7de7669a6 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Fri, 27 Jan 2023 12:30:50 +0100 Subject: [PATCH 41/99] For multi OS we need another RENV_PATH_ROOT --- .github/workflows/test-smokes.yml | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index 4bc4b59f652..b1ef3c30362 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -8,22 +8,19 @@ on: push: # only trigger on branches, not on tags branches: [main] -env: - RENV_PATHS_ROOT: ~/.local/share/renv - -# Ubuntu: ~/.local/share/renv -# macOS: ~/Library/Application Support/renv -# Windows: %LOCALAPPDATA%/renv jobs: run-smokes: strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest] - #os: [windows-latest] + #os: [ubuntu-latest, windows-latest] + os: [windows-latest] runs-on: ${{ matrix.os }} + env: + RENV_PATHS_ROOT: ${{ runner.temp }}/renv + steps: - name: Checkout Repo uses: actions/checkout@v3 From bfe07e86bb99fb08d1b8e5c44f6e540a82150aec Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Fri, 27 Jan 2023 12:57:03 +0100 Subject: [PATCH 42/99] Set RENV_PATHS_ROOT later --- .github/workflows/test-smokes.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index b1ef3c30362..166d7d2f28c 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -18,9 +18,6 @@ jobs: os: [windows-latest] runs-on: ${{ matrix.os }} - env: - RENV_PATHS_ROOT: ${{ runner.temp }}/renv - steps: - name: Checkout Repo uses: actions/checkout@v3 @@ -47,6 +44,11 @@ jobs: run: npx playwright install --with-deps working-directory: ./tests/integration/playwright + - name: Set RENV_PATHS_ROOT + shell: bash + run: | + echo "RENV_PATHS_ROOT=${{ runner.temp }}/renv" >> $GITHUB_ENV + - name: Cache R packages uses: actions/cache@v3 with: From 508358e6ed3d515fa67f5bc3a0b2c7561a1923c8 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Fri, 27 Jan 2023 13:17:01 +0100 Subject: [PATCH 43/99] [debug] Check on linux and no tmate --- .github/workflows/test-smokes.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index 166d7d2f28c..e3e0b5adeae 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -14,8 +14,8 @@ jobs: strategy: fail-fast: false matrix: - #os: [ubuntu-latest, windows-latest] - os: [windows-latest] + os: [ubuntu-latest, windows-latest] + # os: [windows-latest] runs-on: ${{ matrix.os }} steps: @@ -101,7 +101,7 @@ jobs: julia --color=yes --project=. -e "import Pkg; Pkg.instantiate(); Pkg.build(\"IJulia\"); Pkg.precompile()" - name: Setup tmate session - if: runner.os == 'Windows' + if: false uses: mxschmitt/action-tmate@v3 - name: Smoke Test Commits From 23e7960e36dabe2b52f17fe89a5f64bf286fa327 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Fri, 27 Jan 2023 14:23:47 +0100 Subject: [PATCH 44/99] Add a configure helper script --- tests/configure-test.ps1 | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 tests/configure-test.ps1 diff --git a/tests/configure-test.ps1 b/tests/configure-test.ps1 new file mode 100644 index 00000000000..f4224154239 --- /dev/null +++ b/tests/configure-test.ps1 @@ -0,0 +1,15 @@ +# Check python test environment --- + +try { $null = gcm py -ea stop; $py=$true} catch { + Write-Host -ForegroundColor red "Missing Python launcher - py.exe is required on Windows" +} + +try { $null = gcm python3 -ea stop; $python=$true } catch { + Write-Host -ForegroundColor red "No python found in PATH - Install python3" +} + +If ( $py -and $python -and $env:VIRTUAL_ENV -eq $null) { + Write-Host "Setting up virtual environment in .venv" + python3 -m venv .venv +} + From 9f37289bf945f6410cd4a3051cd96d6bdc29d0a4 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Fri, 27 Jan 2023 15:46:35 +0100 Subject: [PATCH 45/99] [tests-fix] Handle windows path correctly to detect folder --- tests/smoke/render/render.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/smoke/render/render.ts b/tests/smoke/render/render.ts index 0d7cd79ea84..c78462fe706 100644 --- a/tests/smoke/render/render.ts +++ b/tests/smoke/render/render.ts @@ -26,7 +26,8 @@ export function testRender( // Verify that the output was created and // that supporting files are present or missing const verify: Verify[] = []; - if (!input.endsWith("/")) { + // If we're not rendering a folder but a single document, add some more assertions + if (!input.match(/[\\/]$/)) { verify.push(outputCreated(input, to)); if (noSupporting) { verify.push(noSupportingFiles(input, to)); From 2e2fa8fa6dd305333a5dc302a0bb39e615e828fa Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Fri, 27 Jan 2023 16:15:41 +0100 Subject: [PATCH 46/99] [tests-fix] On windows, quarto.cmd needs to be run, not just quarto --- tests/smoke/create/create.test.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/smoke/create/create.test.ts b/tests/smoke/create/create.test.ts index 6b7d0d87a16..5e7d6876f0b 100644 --- a/tests/smoke/create/create.test.ts +++ b/tests/smoke/create/create.test.ts @@ -24,6 +24,8 @@ const kCreateTypes: Record = { ], }; +const quartoCmd = Deno.build.os === "windows" ? "quarto.cmd" : "quarto"; + const tempDir = Deno.makeTempDirSync(); for (const type of Object.keys(kCreateTypes)) { for (const template of kCreateTypes[type]) { @@ -42,9 +44,9 @@ for (const type of Object.keys(kCreateTypes)) { // Create the artifact let result: CreateResult | undefined = undefined; - await t.step(`> create ${type} ${template}`, async () => { + await t.step(`> quarto ${type} ${template}`, async () => { // test quarto cmd render - const cmd = ["quarto", "create", "--json"]; + const cmd = [quartoCmd, "create", "--json"]; const stdIn = JSON.stringify(createDirective); const process = await execProcess({ cmd, @@ -70,7 +72,7 @@ for (const type of Object.keys(kCreateTypes)) { for (const file of openfiles) { if (file.endsWith(".qmd")) { // provide a step name and function - const cmd = ["quarto", "render", file]; + const cmd = [quartoCmd, "render", file]; const process = await execProcess({ cmd, cwd: path, From 960a061a1b494fe97bb23887751e2840adfd7786 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Fri, 27 Jan 2023 16:33:07 +0100 Subject: [PATCH 47/99] Fix TMPDIR on windows to avoid different disk drives --- .github/workflows/test-smokes.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index e3e0b5adeae..1194485e360 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -25,6 +25,11 @@ jobs: # checkout full tree fetch-depth: 0 + - name: Change temp dir to use runner one (windows) + if: runner.os == 'Windows' + run: echo "TMPDIR=${{ runner.temp }}" >> $GITHUB_ENV + shell: bash + - name: Set up R uses: r-lib/actions/setup-r@v2 with: From af0ae7844b525a886bf6b3950fd2c82209a0fd15 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Fri, 27 Jan 2023 17:22:52 +0100 Subject: [PATCH 48/99] Fix tempdir for Deno to avoid different drive issue On Windows the default / system temp directory is on `C:/` whild projects and all are on `D:/` - this creates issues when moving file around (like we do with Deno) --- .github/workflows/test-smokes.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index 1194485e360..dcc3c72bc4e 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -25,9 +25,12 @@ jobs: # checkout full tree fetch-depth: 0 - - name: Change temp dir to use runner one (windows) + - name: Fix temp dir to use runner one (windows) if: runner.os == 'Windows' - run: echo "TMPDIR=${{ runner.temp }}" >> $GITHUB_ENV + run: | + echo "TMPDIR=${{ runner.temp }}" >> $GITHUB_ENV + echo "TMP=${{ runner.temp }}" >> $GITHUB_ENV + echo "TEMP=${{ runner.temp }}" >> $GITHUB_ENV shell: bash - name: Set up R From 69dee798df89ba1f15700d647de82b8e4321b508 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Fri, 27 Jan 2023 18:08:11 +0100 Subject: [PATCH 49/99] [bug-fix] Check first for http(s) protocol before testing local On Window, `existsSync()` on a URL path does not work as it does on Linux. So filtering those urls fix #4124 - Installing extension from url fails on Windows --- src/extension/extension-host.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/extension/extension-host.ts b/src/extension/extension-host.ts index 1700f11869f..d9b036578f1 100644 --- a/src/extension/extension-host.ts +++ b/src/extension/extension-host.ts @@ -36,7 +36,7 @@ export interface ExtensionSource { export async function extensionSource( target: string, ): Promise { - if (existsSync(target)) { + if (!target.match(/^https?:\/\/.*$/) && existsSync(target)) { return { type: "local", resolvedTarget: target }; } From c29a182c3a8d596567074b2425cf8e95df760770 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Fri, 27 Jan 2023 18:09:28 +0100 Subject: [PATCH 50/99] [tests-fix] Go back to parent dir before removing current directory It seems to work on Linux, but not on windows were a "lock as in use" issue is thrown --- tests/smoke/extensions/install.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/smoke/extensions/install.test.ts b/tests/smoke/extensions/install.test.ts index f5850d75724..20b4b35ebdf 100644 --- a/tests/smoke/extensions/install.test.ts +++ b/tests/smoke/extensions/install.test.ts @@ -120,6 +120,7 @@ testQuartoCmd( return templateDir; }, teardown: () => { + Deno.chdir(".."); Deno.removeSync(templateDir, { recursive: true }); return Promise.resolve(); }, From 6be823273c7bd666e7d18f2d8caa8fdca0a257b7 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Fri, 27 Jan 2023 20:53:33 +0100 Subject: [PATCH 51/99] quarto.cmd needs to be explicit on Windows --- .github/workflows/test-smokes.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index dcc3c72bc4e..b8ef06ec2a3 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -137,12 +137,13 @@ jobs: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} if: github.event.before == '' run: | - quarto render docs/test.qmd --to pdf case $RUNNER_OS in "Windows") + ./package/dist/bin/quarto.cmd render docs/test.qmd --to pdf pwsh -F ./run-test.ps1 ;; *) + quarto render docs/test.qmd --to pdf ./run-tests.sh ;; esac From e4dfa93db1664a3a80a6cd8dfbb79858446d6605 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 1 Feb 2023 11:37:08 -0800 Subject: [PATCH 52/99] test better for http(s) remote extension --- src/extension/extension-host.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/extension/extension-host.ts b/src/extension/extension-host.ts index d9b036578f1..d9616cad66a 100644 --- a/src/extension/extension-host.ts +++ b/src/extension/extension-host.ts @@ -36,10 +36,22 @@ export interface ExtensionSource { export async function extensionSource( target: string, ): Promise { - if (!target.match(/^https?:\/\/.*$/) && existsSync(target)) { - return { type: "local", resolvedTarget: target }; + let targetUrl; + try { + // is this a remote extension with full URL ? + targetUrl = new URL(target); + if (!/^http(s)?/.test(targetUrl.protocol)) { + throw new Error("Only http(s) remote extensions can be installed."); + } + } catch { + // is this a local extension ? + if (existsSync(target)) { + // local extensions on file system + return { type: "local", resolvedTarget: target }; + } } + // resolve remote extension shortener (e.g quarto-ext/lightbox) for (const resolver of extensionHostResolvers) { const resolved = resolver(target); if (!resolved) { From 505d38379d3e68ad5986ee904d2d9b5f327a8dc9 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 1 Feb 2023 13:36:13 -0800 Subject: [PATCH 53/99] Revert "test better for http(s) remote extension" This reverts commit e4dfa93db1664a3a80a6cd8dfbb79858446d6605. --- src/extension/extension-host.ts | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/src/extension/extension-host.ts b/src/extension/extension-host.ts index d9616cad66a..d9b036578f1 100644 --- a/src/extension/extension-host.ts +++ b/src/extension/extension-host.ts @@ -36,22 +36,10 @@ export interface ExtensionSource { export async function extensionSource( target: string, ): Promise { - let targetUrl; - try { - // is this a remote extension with full URL ? - targetUrl = new URL(target); - if (!/^http(s)?/.test(targetUrl.protocol)) { - throw new Error("Only http(s) remote extensions can be installed."); - } - } catch { - // is this a local extension ? - if (existsSync(target)) { - // local extensions on file system - return { type: "local", resolvedTarget: target }; - } + if (!target.match(/^https?:\/\/.*$/) && existsSync(target)) { + return { type: "local", resolvedTarget: target }; } - // resolve remote extension shortener (e.g quarto-ext/lightbox) for (const resolver of extensionHostResolvers) { const resolved = resolver(target); if (!resolved) { From f7c506f81301f1ec9df14ff73a0d342ebb6d7709 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Tue, 7 Feb 2023 11:31:08 +0100 Subject: [PATCH 54/99] Add Julia configuration --- tests/configure-test.ps1 | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/configure-test.ps1 b/tests/configure-test.ps1 index f4224154239..b5b10278882 100644 --- a/tests/configure-test.ps1 +++ b/tests/configure-test.ps1 @@ -13,3 +13,13 @@ If ( $py -and $python -and $env:VIRTUAL_ENV -eq $null) { python3 -m venv .venv } +try {$null = gcm julia -ea stop; julia=$true } catch { + Write-Host -ForegroundColor red "Missing Julia - An installation is required" +} + +If ($julia) { + # TODO: Check to do equivalent of virtualenv + Write-Host "Setting up Julia global environment" + julia --color=yes --project=. -e 'import Pkg; Pkg.instantiate(); Pkg.build("IJulia"); Pkg.precompile()' +} + From 345294069040fc3e26662c2d73f971f585157f6c Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Tue, 7 Feb 2023 11:38:33 +0100 Subject: [PATCH 55/99] Checking newline should be OS independant --- tests/docs/smoke-all/2023/01/26/asciidoc-callout.qmd | 4 ++-- tests/smoke/render/render-commonmark.test.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/docs/smoke-all/2023/01/26/asciidoc-callout.qmd b/tests/docs/smoke-all/2023/01/26/asciidoc-callout.qmd index c6ffb27521c..59fc9f5af2c 100644 --- a/tests/docs/smoke-all/2023/01/26/asciidoc-callout.qmd +++ b/tests/docs/smoke-all/2023/01/26/asciidoc-callout.qmd @@ -7,8 +7,8 @@ _quarto: asciidoc: ensureFileRegexMatches: - - - '\[NOTE\]\n.Bruv\n====' - - '\[TIP\]\n====' + - '\[NOTE\](\r\n?|\n).Bruv(\r\n?|\n)====' + - '\[TIP\](\r\n?|\n)====' --- diff --git a/tests/smoke/render/render-commonmark.test.ts b/tests/smoke/render/render-commonmark.test.ts index 101d2740439..d087c8718e9 100644 --- a/tests/smoke/render/render-commonmark.test.ts +++ b/tests/smoke/render/render-commonmark.test.ts @@ -23,7 +23,7 @@ tests.forEach((test) => { "commonmark", true, [ensureFileRegexMatches(output.outputPath, [ - /test\n================/, + /test(\r\n?|\n)================/, ])], ); }); From 418d0776dfc1d644a5025119eafd33cdd53fe255 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Tue, 7 Feb 2023 12:26:12 +0100 Subject: [PATCH 56/99] Allow to ignore tests Some tests can be run only on one OS for example, and porting to Windows is not worth it --- tests/smoke/run/stdlib-run-version.test.ts | 2 ++ tests/test.ts | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/smoke/run/stdlib-run-version.test.ts b/tests/smoke/run/stdlib-run-version.test.ts index 9ff429ad8cd..d5b0e7d67b1 100644 --- a/tests/smoke/run/stdlib-run-version.test.ts +++ b/tests/smoke/run/stdlib-run-version.test.ts @@ -18,4 +18,6 @@ unitTest("yaml-intelligence-unit-regression", async () => { ], }); assert(result.success); +}, { + ignore: Deno.build.os == "windows", }); diff --git a/tests/test.ts b/tests/test.ts index c4828fea015..5f13b99cf20 100644 --- a/tests/test.ts +++ b/tests/test.ts @@ -51,6 +51,9 @@ export interface TestContext { // Control of underlying sanitizer santize?: { resources?: boolean; ops?: boolean; exit?: boolean }; + + // control if test is ran or skipped + ignore?: boolean; } export function testQuartoCmd( @@ -85,11 +88,12 @@ export interface ExecuteOutput { export function unitTest( name: string, ver: () => Promise, // VoidFunction, + context?: TestContext, ) { test({ name, type: "unit", - context: {}, + context: context || {}, execute: () => { return Promise.resolve(); }, @@ -112,6 +116,7 @@ export function test(test: TestDescriptor) { const sanitizeResources = test.context.santize?.resources; const sanitizeOps = test.context.santize?.ops; const sanitizeExit = test.context.santize?.exit; + const ignore = test.context.ignore; const userSession = !runningInCI(); Deno.test({ @@ -247,6 +252,7 @@ export function test(test: TestDescriptor) { warning(`Skipped - ${test.name}`); } }, + ignore, sanitizeExit, sanitizeOps, sanitizeResources, From cbd191183b02c49b7ae996d57deb4abc7a2a85f7 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Tue, 7 Feb 2023 12:27:44 +0100 Subject: [PATCH 57/99] Add a configuration for VSCODE to debug in tests Current configuration debug when `deno run`. Here we want to debug when `deno test` --- .vscode/launch.json | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index d07aa782941..5b8b8af0e91 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -11,7 +11,6 @@ "program": "${workspaceFolder}/src/quarto.ts", "args": ["serve"], "cwd": "${workspaceFolder}/../quarto-demo", - "runtimeExecutable": "deno", "runtimeExecutable": "${workspaceFolder}/package/dist/bin/tools/deno", "runtimeArgs": [ "run", @@ -28,6 +27,34 @@ "windows": { "runtimeExecutable": "${workspaceFolder}\\package\\dist\\bin\\tools\\deno.exe" } + }, + { + "name": "Run Quarto test", + "request": "launch", + "type": "node", + "program": "smoke/smoke-all.test.ts", // test script here + "args": [], // args to the script here, like in command line smoke/smoke-all.test.t -- .\docs\smoke-all\2023\01\19\2107.qmd + "cwd": "${workspaceFolder}/tests", + "runtimeExecutable": "${workspaceFolder}/package/dist/bin/tools/deno", + "runtimeArgs": [ + "test", + "--config=test-conf.json", + "--unstable", + "--allow-all", + "--check", + "--importmap=${workspaceFolder}/src/import_map.json", + "--inspect-brk" + ], + "env": { + "QUARTO_ROOT": "${workspaceFolder}", + "QUARTO_BIN_PATH": "${workspaceFolder}/package/dist/bin", + "QUARTO_SHARE_PATH": "${workspaceFolder}/src/resources", + "QUARTO_DEBUG": "true" + }, + "attachSimplePort": 9229, + "windows": { + "runtimeExecutable": "${workspaceFolder}\\package\\dist\\bin\\tools\\deno.exe" + } } ] } From 8f87fbf57e96a1f4ccd65ca0771e0aac3f44d00a Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Tue, 7 Feb 2023 15:57:28 +0100 Subject: [PATCH 58/99] Do not error on file existence when filtering resources (#4255) --- src/command/render/resources.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/command/render/resources.ts b/src/command/render/resources.ts index ba471d1f8ee..9e281595115 100644 --- a/src/command/render/resources.ts +++ b/src/command/render/resources.ts @@ -6,9 +6,12 @@ */ import { dirname, join } from "path/mod.ts"; -import { existsSync } from "fs/mod.ts"; - -import { normalizePath, ResolvedPathGlobs, resolvePathGlobs } from "../../core/path.ts"; +import { + normalizePath, + ResolvedPathGlobs, + resolvePathGlobs, + safeExistsSync, +} from "../../core/path.ts"; import { engineIgnoreGlobs } from "../../execute/engine.ts"; import { kQuartoScratch } from "../../project/project-scratch.ts"; import { extractResolvedResourceFilenamesFromQmd } from "../../execute/ojs/extract-resources.ts"; @@ -105,7 +108,7 @@ export async function resourceFilesFromFile( if (!selfContained) { const resultFiles = resources.files .map((file) => join(resourceDir, file)) - .filter(existsSync) + .filter(safeExistsSync) .map(normalizePath); fileResourceFiles.include.push(...resultFiles); } From 902c436b69539121b2500301f0ec0c2afd1ba0c0 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Mon, 13 Feb 2023 17:52:01 +0100 Subject: [PATCH 59/99] Show path to test as relative to tests directory. `expandGlob*` was returning absolute path which lead to long absolute path in tests log preventing easy copy of failing tests --- tests/smoke/smoke-all.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/smoke/smoke-all.test.ts b/tests/smoke/smoke-all.test.ts index 59a2fc6aa66..8dbdd0cb838 100644 --- a/tests/smoke/smoke-all.test.ts +++ b/tests/smoke/smoke-all.test.ts @@ -28,7 +28,7 @@ import { readYamlFromMarkdown } from "../../src/core/yaml.ts"; import { outputForInput } from "../utils.ts"; import { jupyterToMarkdown } from "../../src/core/jupyter/jupyter.ts"; import { jupyterNotebookToMarkdown } from "../../src/command/convert/jupyter.ts"; -import { dirname, join } from "path/mod.ts"; +import { dirname, join, relative } from "path/mod.ts"; async function fullInit() { await initYamlIntelligenceResourcesFromFilesystem(); @@ -146,7 +146,7 @@ await initYamlIntelligenceResourcesFromFilesystem(); for ( const { path: fileName } of globOutput ) { - const input = fileName; + const input = relative(Deno.cwd(), fileName); const metadata = input.endsWith("qmd") ? readYamlFromMarkdown(Deno.readTextFileSync(input)) From 96ea80f8cdc5188cfc2cec3c174555549c1c823c Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Mon, 13 Feb 2023 20:06:18 +0100 Subject: [PATCH 60/99] [fix] Correctly handle windows file path on windows for test logging --- tests/test.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/test.ts b/tests/test.ts index 5f13b99cf20..3a2d81f0df7 100644 --- a/tests/test.ts +++ b/tests/test.ts @@ -16,6 +16,7 @@ import * as colors from "fmt/colors.ts"; import { runningInCI } from "../src/core/ci-info.ts"; import { relative } from "path/mod.ts"; import { quartoConfig } from "../src/core/quarto.ts"; +import { fromFileUrl } from "path/win32.ts"; export interface TestDescriptor { // The name of the test @@ -187,8 +188,9 @@ export function test(test: TestDescriptor) { const offset = testName.indexOf(">"); // Form the test runner command - const originUrl = new URL(context.origin); - const absPath = originUrl.pathname; + const absPath = Deno.build.os === "windows" + ? fromFileUrl(context.origin) + : (new URL(context.origin)).pathname; const quartoRoot = join(quartoConfig.binPath(), "..", "..", ".."); const relPath = relative( @@ -196,7 +198,7 @@ export function test(test: TestDescriptor) { absPath, ); const command = Deno.build.os === "windows" - ? "run-tests.psl" + ? "run-tests.ps1" : "./run-tests.sh"; const testCommand = `${ offset > 0 ? " ".repeat(offset + 2) : "" From 7d71c0723bbbdf03ad34d5e3b490caca6c73c409 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Mon, 13 Feb 2023 20:49:20 +0100 Subject: [PATCH 61/99] [fix] Ignore qualified path tests on WIndows This is temporary waiting for #4339 --- tests/unit/paths/qualified-path.test.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/unit/paths/qualified-path.test.ts b/tests/unit/paths/qualified-path.test.ts index 16445fbc9da..c4f43a062ef 100644 --- a/tests/unit/paths/qualified-path.test.ts +++ b/tests/unit/paths/qualified-path.test.ts @@ -45,6 +45,8 @@ unitTest("qualified-path - basic", async () => { ); } } +}, { + ignore: Deno.build.os === "windows", }); unitTest("qualified-path - validation", async () => { @@ -60,4 +62,6 @@ unitTest("qualified-path - validation", async () => { // this should raise because it resolves outside of projectRoot. return makePath("../../file1", paths); }); +}, { + ignore: Deno.build.os === "windows", }); From 5ccadb4cd776c414c087dde3a3e8127511f4c7e8 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 15 Feb 2023 10:52:07 +0100 Subject: [PATCH 62/99] [fix] Ignore test rendering to stdout for now --- tests/smoke/project/project-stdout.test.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/smoke/project/project-stdout.test.ts b/tests/smoke/project/project-stdout.test.ts index 405170a14b4..fb86532dd6f 100644 --- a/tests/smoke/project/project-stdout.test.ts +++ b/tests/smoke/project/project-stdout.test.ts @@ -37,5 +37,8 @@ testQuartoCmd( await Deno.remove(siteOutDir, { recursive: true }); } }, + // TODO: Make the test works for Windows + // https://github.com/quarto-dev/quarto-cli/issues/4194 + ignore: Deno.build.os == "windows", }, ); From 04db6f4b5d1aacf59512413f195687b08f4474ec Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 15 Feb 2023 10:57:08 +0100 Subject: [PATCH 63/99] [gha] Invalidate R cache based on OS and R version --- .github/workflows/test-smokes.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index b8ef06ec2a3..a8deb281d91 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -57,13 +57,20 @@ jobs: run: | echo "RENV_PATHS_ROOT=${{ runner.temp }}/renv" >> $GITHUB_ENV + - name: Get R and OS version + id: get-version + run: | + cat("os-version=", sessionInfo()$running, "\n", file = Sys.getenv("GITHUB_OUTPUT"), sep = "", append = TRUE) + cat("r-version=", R.Version()$version.string, "\n", file = Sys.getenv("GITHUB_OUTPUT"), sep = "", append = TRUE) + shell: Rscript {0} + - name: Cache R packages uses: actions/cache@v3 with: path: ${{ env.RENV_PATHS_ROOT }} - key: ${{ runner.os }}-1-renv-${{ hashFiles('**/renv.lock') }} + key: ${{ steps.get-version.outputs.os-version }}-${{ steps.get-version.outputs.r-version }}-renv-1-${{ hashFiles('renv.lock') }} restore-keys: | - ${{ runner.os }}-1-renv- + ${{ steps.get-version.outputs.os-version }}-${{ steps.get-version.outputs.r-version }}-renv-1- - name: Restore R packages working-directory: tests From f30816bf4051333be9bde136329804919d71dbd6 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 15 Feb 2023 11:23:40 +0100 Subject: [PATCH 64/99] [test workflow] same name as linux script --- tests/{run-test.ps1 => run-tests.ps1} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/{run-test.ps1 => run-tests.ps1} (100%) diff --git a/tests/run-test.ps1 b/tests/run-tests.ps1 similarity index 100% rename from tests/run-test.ps1 rename to tests/run-tests.ps1 From 25aa2522d26697cba6d04505a2e54830f632dac8 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 15 Feb 2023 11:46:23 +0100 Subject: [PATCH 65/99] [fix] Fix playwright test by using quarto.cmd on Windows --- tests/integration/playwright-tests.test.ts | 3 ++- tests/smoke/create/create.test.ts | 7 +++---- tests/utils.ts | 5 +++++ 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/tests/integration/playwright-tests.test.ts b/tests/integration/playwright-tests.test.ts index 1f288f54f0a..02795d29c54 100644 --- a/tests/integration/playwright-tests.test.ts +++ b/tests/integration/playwright-tests.test.ts @@ -13,6 +13,7 @@ import { } from "../../src/core/lib/yaml-validation/state.ts"; import { cleanoutput } from "../smoke/render/render.ts"; import { execProcess } from "../../src/core/process.ts"; +import { quartoDevCmd } from "../utils.ts"; async function fullInit() { await initYamlIntelligenceResourcesFromFilesystem(); @@ -37,7 +38,7 @@ for (const { path: fileName } of globOutput) { // mediabag inspection if we don't wait all renders // individually. This is very slow.. await execProcess({ - cmd: ["quarto", "render", input, "--to", "html"], + cmd: [quartoDevCmd(), "render", input, "--to", "html"], }); fileNames.push(fileName); } diff --git a/tests/smoke/create/create.test.ts b/tests/smoke/create/create.test.ts index 5e7d6876f0b..7284c95af76 100644 --- a/tests/smoke/create/create.test.ts +++ b/tests/smoke/create/create.test.ts @@ -9,6 +9,7 @@ import { execProcess } from "../../../src/core/process.ts"; import { join } from "path/mod.ts"; import { CreateResult } from "../../../src/command/create/cmd.ts"; import { assert } from "testing/asserts.ts"; +import { quartoDevCmd } from "../../utils.ts"; const kCreateTypes: Record = { "project": ["website", "default", "book", "website:blog"], @@ -24,8 +25,6 @@ const kCreateTypes: Record = { ], }; -const quartoCmd = Deno.build.os === "windows" ? "quarto.cmd" : "quarto"; - const tempDir = Deno.makeTempDirSync(); for (const type of Object.keys(kCreateTypes)) { for (const template of kCreateTypes[type]) { @@ -46,7 +45,7 @@ for (const type of Object.keys(kCreateTypes)) { let result: CreateResult | undefined = undefined; await t.step(`> quarto ${type} ${template}`, async () => { // test quarto cmd render - const cmd = [quartoCmd, "create", "--json"]; + const cmd = [quartoDevCmd(), "create", "--json"]; const stdIn = JSON.stringify(createDirective); const process = await execProcess({ cmd, @@ -72,7 +71,7 @@ for (const type of Object.keys(kCreateTypes)) { for (const file of openfiles) { if (file.endsWith(".qmd")) { // provide a step name and function - const cmd = [quartoCmd, "render", file]; + const cmd = [quartoDevCmd(), "render", file]; const process = await execProcess({ cmd, cwd: path, diff --git a/tests/utils.ts b/tests/utils.ts index 1d7b763e6ad..c108ddf342d 100644 --- a/tests/utils.ts +++ b/tests/utils.ts @@ -87,3 +87,8 @@ export function fileLoader(...path: string[]) { }; }; } + +// On Windows, `quarto.cmd` needs to be explicit in `execProcess()` +export function quartoDevCmd(): string { + return Deno.build.os === "windows" ? "quarto.cmd" : "quarto"; +} From 35a5f797d8b013b1b20f88a8620d8c2356ba0893 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 15 Feb 2023 12:13:05 +0100 Subject: [PATCH 66/99] [gha] Use pak to install dependency As curl was updated in lock file and require missing system deps --- .github/workflows/test-smokes.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index a8deb281d91..fb324848512 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -74,6 +74,8 @@ jobs: - name: Restore R packages working-directory: tests + env: + RENV_CONFIG_PAK_ENABLE: TRUE run: | if (!requireNamespace('renv', quietly = TRUE)) install.packages('renv') renv::restore() From 289c508cc7c2a0f421402d62aa06ffbca7644a5d Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 15 Feb 2023 12:14:05 +0100 Subject: [PATCH 67/99] [gha] Fix name of script in worflow --- .github/workflows/test-smokes.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index fb324848512..f0115112998 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -131,7 +131,7 @@ jobs: pushd tests case $RUNNER_OS in "Windows") - pwsh -F ./run-test.ps1 + pwsh -F ./run-tests.ps1 ;; *) ./run-tests.sh From acb1cd96e8762e7a26d045c4c42efb067264ce98 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 15 Feb 2023 12:40:04 +0100 Subject: [PATCH 68/99] [gha] Correct env var --- .github/workflows/test-smokes.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index f0115112998..dddfa7e0c1c 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -75,7 +75,7 @@ jobs: - name: Restore R packages working-directory: tests env: - RENV_CONFIG_PAK_ENABLE: TRUE + RENV_CONFIG_PAK_ENABLED: TRUE run: | if (!requireNamespace('renv', quietly = TRUE)) install.packages('renv') renv::restore() From 6540674ab39293123da7c30c068cf828c89eb5d8 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 15 Feb 2023 12:48:54 +0100 Subject: [PATCH 69/99] [gha] correct relative path --- .github/workflows/test-smokes.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index dddfa7e0c1c..329d56c453c 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -148,7 +148,7 @@ jobs: run: | case $RUNNER_OS in "Windows") - ./package/dist/bin/quarto.cmd render docs/test.qmd --to pdf + ../package/dist/bin/quarto.cmd render docs/test.qmd --to pdf pwsh -F ./run-test.ps1 ;; *) From a94e02ae9fe7da97337a38cf0084102ee49f7e6c Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 15 Feb 2023 13:35:18 +0100 Subject: [PATCH 70/99] [fix] Use `npx.cmd` on Windows --- tests/integration/playwright-tests.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/playwright-tests.test.ts b/tests/integration/playwright-tests.test.ts index 02795d29c54..b0b473a72f3 100644 --- a/tests/integration/playwright-tests.test.ts +++ b/tests/integration/playwright-tests.test.ts @@ -58,7 +58,7 @@ const proc = Deno.run({ try { // run playwright await execProcess({ - cmd: ["npx", "playwright", "test"], + cmd: [Deno.build.os == "windows" ? "npx.cmd" : "npx", "playwright", "test"], cwd: "integration/playwright", }); } finally { From 8afe53850090f865e1fe0ddac1ebf29a57cc77a4 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 15 Feb 2023 14:05:31 +0100 Subject: [PATCH 71/99] [test environment] handle tinytex download failure due to API rate limitation --- tests/configure-test.ps1 | 8 ++++++++ tests/run-tests.ps1 | 6 +++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/tests/configure-test.ps1 b/tests/configure-test.ps1 index b5b10278882..700cc1db70b 100644 --- a/tests/configure-test.ps1 +++ b/tests/configure-test.ps1 @@ -23,3 +23,11 @@ If ($julia) { julia --color=yes --project=. -e 'import Pkg; Pkg.instantiate(); Pkg.build("IJulia"); Pkg.precompile()' } +If ([string]::IsNullOrEmpty($env:GH_TOKEN)) { + try { $null = gcm gh -ea stop ; $ghtoken=$(gh auth token) } catch {} + If (-not ([string]::IsNullOrEmpty($ghtoken))) { + $env:GH_TOKEN=$ghtoken + Write-Host "Setting GH_TOKEN env var for Github Download." + } +} +quarto install tinytex diff --git a/tests/run-tests.ps1 b/tests/run-tests.ps1 index 3e362c0ffef..ac6e21bf5b5 100644 --- a/tests/run-tests.ps1 +++ b/tests/run-tests.ps1 @@ -53,7 +53,11 @@ If ($QUARTO_TESTS_VIRTUALENV -ne "FALSE") Write-Host "> Updating TinyTeX..." # Ensure that tinytex is installed and updated to latest version -quarto install tinytex --no-prompt +try { + quarto install tinytex --no-prompt +} catch { + Write-Host "Updating TinyTeX failed." +} # ----- Preparing running tests ------------ From fc86625d483915d658d04043f4c97f765b2ae745 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 15 Feb 2023 15:01:14 +0100 Subject: [PATCH 72/99] [test environment] Use pipenv to handle python environment This will be better for several reasons - A manifest file to track our required dependencies - Handling several type of dependencies environment, like last versions of packages or lock version - Handling better virtualenvironment for local project on Windows and Linux - Allow to install to system python also Only requirement : having pipenv installed --- .github/workflows/test-smokes.yml | 8 +- tests/Pipfile | 15 + tests/Pipfile.lock | 1373 +++++++++++++++++++++++++++++ tests/configure-test.ps1 | 12 +- tests/requirements.txt | 102 --- tests/run-tests.ps1 | 2 +- tests/run-tests.sh | 2 +- 7 files changed, 1402 insertions(+), 112 deletions(-) create mode 100644 tests/Pipfile create mode 100644 tests/Pipfile.lock delete mode 100644 tests/requirements.txt diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index 329d56c453c..e8f9d7a184f 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -84,15 +84,15 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - cache: "pip" + cache: "pipenv" + cache-dependency-path: "./tests/Pipfile.lock" python-version-file: "./tests/.python-version" - name: Restore Python Dependencies working-directory: tests run: | - python3 -m pip install --upgrade pip - python3 -m pip install wheel - python3 -m pip install -r requirements.txt + python -m pip install pipenv + pipenv install --system - uses: ./.github/workflows/actions/quarto-dev diff --git a/tests/Pipfile b/tests/Pipfile new file mode 100644 index 00000000000..fd7347146b9 --- /dev/null +++ b/tests/Pipfile @@ -0,0 +1,15 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +jupyter = "*" +bokeh = "*" +pandas = "*" +matplotlib = "*" + +[dev-packages] + +[requires] +python_version = "3.11" diff --git a/tests/Pipfile.lock b/tests/Pipfile.lock new file mode 100644 index 00000000000..86d5d87e415 --- /dev/null +++ b/tests/Pipfile.lock @@ -0,0 +1,1373 @@ +{ + "_meta": { + "hash": { + "sha256": "71ae4cb4451125861a48c8f6bb4915e9f53327e1995873607cfb2a5cbb8651ae" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.11" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "anyio": { + "hashes": [ + "sha256:25ea0d673ae30af41a0c442f81cf3b38c7e79fdc7b60335a4c14e05eb0947421", + "sha256:fbbe32bd270d2a2ef3ed1c5d45041250284e31fc0a4df4a5a6071842051a51e3" + ], + "markers": "python_full_version >= '3.6.2'", + "version": "==3.6.2" + }, + "argon2-cffi": { + "hashes": [ + "sha256:8c976986f2c5c0e5000919e6de187906cfd81fb1c72bf9d88c01177e77da7f80", + "sha256:d384164d944190a7dd7ef22c6aa3ff197da12962bd04b17f64d4e93d934dba5b" + ], + "markers": "python_version >= '3.6'", + "version": "==21.3.0" + }, + "argon2-cffi-bindings": { + "hashes": [ + "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670", + "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f", + "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583", + "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194", + "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c", + "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a", + "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082", + "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5", + "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f", + "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7", + "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d", + "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f", + "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae", + "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3", + "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86", + "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367", + "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d", + "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93", + "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb", + "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e", + "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351" + ], + "markers": "python_version >= '3.6'", + "version": "==21.2.0" + }, + "arrow": { + "hashes": [ + "sha256:3934b30ca1b9f292376d9db15b19446088d12ec58629bc3f0da28fd55fb633a1", + "sha256:5a49ab92e3b7b71d96cd6bfcc4df14efefc9dfa96ea19045815914a6ab6b1fe2" + ], + "markers": "python_version >= '3.6'", + "version": "==1.2.3" + }, + "asttokens": { + "hashes": [ + "sha256:4622110b2a6f30b77e1473affaa97e711bc2f07d3f10848420ff1898edbe94f3", + "sha256:6b0ac9e93fb0335014d382b8fa9b3afa7df546984258005da0b9e7095b3deb1c" + ], + "version": "==2.2.1" + }, + "attrs": { + "hashes": [ + "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836", + "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99" + ], + "markers": "python_version >= '3.6'", + "version": "==22.2.0" + }, + "backcall": { + "hashes": [ + "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e", + "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255" + ], + "version": "==0.2.0" + }, + "beautifulsoup4": { + "hashes": [ + "sha256:0e79446b10b3ecb499c1556f7e228a53e64a2bfcebd455f370d8927cb5b59e39", + "sha256:bc4bdda6717de5a2987436fb8d72f45dc90dd856bdfd512a1314ce90349a0106" + ], + "markers": "python_full_version >= '3.6.0'", + "version": "==4.11.2" + }, + "bleach": { + "hashes": [ + "sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414", + "sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4" + ], + "markers": "python_version >= '3.7'", + "version": "==6.0.0" + }, + "bokeh": { + "hashes": [ + "sha256:1c28471ef5e6110ba5bed513137fd26054ebc4454bc768650eaeefc53b898a8a", + "sha256:d30e4f6220efc824c5da0dcb58138abed0e6a2d524c942409c8ca1098031e374" + ], + "index": "pypi", + "version": "==3.0.3" + }, + "cffi": { + "hashes": [ + "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5", + "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef", + "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104", + "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426", + "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405", + "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375", + "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a", + "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e", + "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc", + "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf", + "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185", + "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497", + "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3", + "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35", + "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c", + "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83", + "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21", + "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca", + "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984", + "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac", + "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd", + "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee", + "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a", + "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2", + "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192", + "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7", + "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585", + "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f", + "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e", + "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27", + "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b", + "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e", + "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e", + "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d", + "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c", + "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415", + "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82", + "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02", + "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314", + "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325", + "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c", + "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3", + "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914", + "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045", + "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d", + "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9", + "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5", + "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2", + "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c", + "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3", + "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2", + "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8", + "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d", + "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d", + "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9", + "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162", + "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76", + "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4", + "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e", + "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9", + "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6", + "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b", + "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01", + "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0" + ], + "version": "==1.15.1" + }, + "colorama": { + "hashes": [ + "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", + "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" + ], + "markers": "sys_platform == 'win32'", + "version": "==0.4.6" + }, + "comm": { + "hashes": [ + "sha256:3e2f5826578e683999b93716285b3b1f344f157bf75fa9ce0a797564e742f062", + "sha256:9f3abf3515112fa7c55a42a6a5ab358735c9dccc8b5910a9d8e3ef5998130666" + ], + "markers": "python_version >= '3.6'", + "version": "==0.1.2" + }, + "contourpy": { + "hashes": [ + "sha256:031154ed61f7328ad7f97662e48660a150ef84ee1bc8876b6472af88bf5a9b98", + "sha256:0f9d350b639db6c2c233d92c7f213d94d2e444d8e8fc5ca44c9706cf72193772", + "sha256:130230b7e49825c98edf0b428b7aa1125503d91732735ef897786fe5452b1ec2", + "sha256:152fd8f730c31fd67fe0ffebe1df38ab6a669403da93df218801a893645c6ccc", + "sha256:1c71fdd8f1c0f84ffd58fca37d00ca4ebaa9e502fb49825484da075ac0b0b803", + "sha256:24847601071f740837aefb730e01bd169fbcaa610209779a78db7ebb6e6a7051", + "sha256:2e9ebb4425fc1b658e13bace354c48a933b842d53c458f02c86f371cecbedecc", + "sha256:30676ca45084ee61e9c3da589042c24a57592e375d4b138bd84d8709893a1ba4", + "sha256:31a55dccc8426e71817e3fe09b37d6d48ae40aae4ecbc8c7ad59d6893569c436", + "sha256:366a0cf0fc079af5204801786ad7a1c007714ee3909e364dbac1729f5b0849e5", + "sha256:38e2e577f0f092b8e6774459317c05a69935a1755ecfb621c0a98f0e3c09c9a5", + "sha256:3c184ad2433635f216645fdf0493011a4667e8d46b34082f5a3de702b6ec42e3", + "sha256:3caea6365b13119626ee996711ab63e0c9d7496f65641f4459c60a009a1f3e80", + "sha256:3e927b3868bd1e12acee7cc8f3747d815b4ab3e445a28d2e5373a7f4a6e76ba1", + "sha256:4ee3ee247f795a69e53cd91d927146fb16c4e803c7ac86c84104940c7d2cabf0", + "sha256:54d43960d809c4c12508a60b66cb936e7ed57d51fb5e30b513934a4a23874fae", + "sha256:57119b0116e3f408acbdccf9eb6ef19d7fe7baf0d1e9aaa5381489bc1aa56556", + "sha256:58569c491e7f7e874f11519ef46737cea1d6eda1b514e4eb5ac7dab6aa864d02", + "sha256:5a011cf354107b47c58ea932d13b04d93c6d1d69b8b6dce885e642531f847566", + "sha256:5caeacc68642e5f19d707471890f037a13007feba8427eb7f2a60811a1fc1350", + "sha256:5dd34c1ae752515318224cba7fc62b53130c45ac6a1040c8b7c1a223c46e8967", + "sha256:60835badb5ed5f4e194a6f21c09283dd6e007664a86101431bf870d9e86266c4", + "sha256:62398c80ef57589bdbe1eb8537127321c1abcfdf8c5f14f479dbbe27d0322e66", + "sha256:6381fa66866b0ea35e15d197fc06ac3840a9b2643a6475c8fff267db8b9f1e69", + "sha256:64757f6460fc55d7e16ed4f1de193f362104285c667c112b50a804d482777edd", + "sha256:69f8ff4db108815addd900a74df665e135dbbd6547a8a69333a68e1f6e368ac2", + "sha256:6c180d89a28787e4b73b07e9b0e2dac7741261dbdca95f2b489c4f8f887dd810", + "sha256:71b0bf0c30d432278793d2141362ac853859e87de0a7dee24a1cea35231f0d50", + "sha256:769eef00437edf115e24d87f8926955f00f7704bede656ce605097584f9966dc", + "sha256:7f6979d20ee5693a1057ab53e043adffa1e7418d734c1532e2d9e915b08d8ec2", + "sha256:87f4d8941a9564cda3f7fa6a6cd9b32ec575830780677932abdec7bcb61717b0", + "sha256:89ba9bb365446a22411f0673abf6ee1fea3b2cf47b37533b970904880ceb72f3", + "sha256:8acf74b5d383414401926c1598ed77825cd530ac7b463ebc2e4f46638f56cce6", + "sha256:9056c5310eb1daa33fc234ef39ebfb8c8e2533f088bbf0bc7350f70a29bde1ac", + "sha256:95c3acddf921944f241b6773b767f1cbce71d03307270e2d769fd584d5d1092d", + "sha256:9e20e5a1908e18aaa60d9077a6d8753090e3f85ca25da6e25d30dc0a9e84c2c6", + "sha256:a1e97b86f73715e8670ef45292d7cc033548266f07d54e2183ecb3c87598888f", + "sha256:a877ada905f7d69b2a31796c4b66e31a8068b37aa9b78832d41c82fc3e056ddd", + "sha256:a9d7587d2fdc820cc9177139b56795c39fb8560f540bba9ceea215f1f66e1566", + "sha256:abf298af1e7ad44eeb93501e40eb5a67abbf93b5d90e468d01fc0c4451971afa", + "sha256:ae90d5a8590e5310c32a7630b4b8618cef7563cebf649011da80874d0aa8f414", + "sha256:b6d0f9e1d39dbfb3977f9dd79f156c86eb03e57a7face96f199e02b18e58d32a", + "sha256:b8d587cc39057d0afd4166083d289bdeff221ac6d3ee5046aef2d480dc4b503c", + "sha256:c5210e5d5117e9aec8c47d9156d1d3835570dd909a899171b9535cb4a3f32693", + "sha256:cc331c13902d0f50845099434cd936d49d7a2ca76cb654b39691974cb1e4812d", + "sha256:ce41676b3d0dd16dbcfabcc1dc46090aaf4688fd6e819ef343dbda5a57ef0161", + "sha256:d8165a088d31798b59e91117d1f5fc3df8168d8b48c4acc10fc0df0d0bdbcc5e", + "sha256:e7281244c99fd7c6f27c1c6bfafba878517b0b62925a09b586d88ce750a016d2", + "sha256:e96a08b62bb8de960d3a6afbc5ed8421bf1a2d9c85cc4ea73f4bc81b4910500f", + "sha256:ed33433fc3820263a6368e532f19ddb4c5990855e4886088ad84fd7c4e561c71", + "sha256:efb8f6d08ca7998cf59eaf50c9d60717f29a1a0a09caa46460d33b2924839dbd", + "sha256:efe99298ba37e37787f6a2ea868265465410822f7bea163edcc1bd3903354ea9", + "sha256:f99e9486bf1bb979d95d5cffed40689cb595abb2b841f2991fc894b3452290e8", + "sha256:fc1464c97579da9f3ab16763c32e5c5d5bb5fa1ec7ce509a4ca6108b61b84fab", + "sha256:fd7dc0e6812b799a34f6d12fcb1000539098c249c8da54f3566c6a6461d0dbad" + ], + "markers": "python_version >= '3.8'", + "version": "==1.0.7" + }, + "cycler": { + "hashes": [ + "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3", + "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f" + ], + "markers": "python_version >= '3.6'", + "version": "==0.11.0" + }, + "debugpy": { + "hashes": [ + "sha256:0ea1011e94416e90fb3598cc3ef5e08b0a4dd6ce6b9b33ccd436c1dffc8cd664", + "sha256:23363e6d2a04d726bbc1400bd4e9898d54419b36b2cdf7020e3e215e1dcd0f8e", + "sha256:23c29e40e39ad7d869d408ded414f6d46d82f8a93b5857ac3ac1e915893139ca", + "sha256:549ae0cb2d34fc09d1675f9b01942499751d174381b6082279cf19cdb3c47cbe", + "sha256:70ab53918fd907a3ade01909b3ed783287ede362c80c75f41e79596d5ccacd32", + "sha256:72687b62a54d9d9e3fb85e7a37ea67f0e803aaa31be700e61d2f3742a5683917", + "sha256:78739f77c58048ec006e2b3eb2e0cd5a06d5f48c915e2fc7911a337354508110", + "sha256:7aa7e103610e5867d19a7d069e02e72eb2b3045b124d051cfd1538f1d8832d1b", + "sha256:87755e173fcf2ec45f584bb9d61aa7686bb665d861b81faa366d59808bbd3494", + "sha256:9b5d1b13d7c7bf5d7cf700e33c0b8ddb7baf030fcf502f76fc061ddd9405d16c", + "sha256:a771739902b1ae22a120dbbb6bd91b2cae6696c0e318b5007c5348519a4211c6", + "sha256:b9c2130e1c632540fbf9c2c88341493797ddf58016e7cba02e311de9b0a96b67", + "sha256:be596b44448aac14eb3614248c91586e2bc1728e020e82ef3197189aae556115", + "sha256:c05349890804d846eca32ce0623ab66c06f8800db881af7a876dc073ac1c2225", + "sha256:de4a045fbf388e120bb6ec66501458d3134f4729faed26ff95de52a754abddb1", + "sha256:dff595686178b0e75580c24d316aa45a8f4d56e2418063865c114eef651a982e", + "sha256:f6383c29e796203a0bba74a250615ad262c4279d398e89d895a69d3069498305" + ], + "markers": "python_version >= '3.7'", + "version": "==1.6.6" + }, + "decorator": { + "hashes": [ + "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", + "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186" + ], + "markers": "python_version >= '3.5'", + "version": "==5.1.1" + }, + "defusedxml": { + "hashes": [ + "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", + "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==0.7.1" + }, + "executing": { + "hashes": [ + "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc", + "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107" + ], + "version": "==1.2.0" + }, + "fastjsonschema": { + "hashes": [ + "sha256:01e366f25d9047816fe3d288cbfc3e10541daf0af2044763f3d0ade42476da18", + "sha256:21f918e8d9a1a4ba9c22e09574ba72267a6762d47822db9add95f6454e51cc1c" + ], + "version": "==2.16.2" + }, + "fonttools": { + "hashes": [ + "sha256:2bb244009f9bf3fa100fc3ead6aeb99febe5985fa20afbfbaa2f8946c2fbdaf1", + "sha256:820466f43c8be8c3009aef8b87e785014133508f0de64ec469e4efb643ae54fb" + ], + "markers": "python_version >= '3.7'", + "version": "==4.38.0" + }, + "fqdn": { + "hashes": [ + "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f", + "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014" + ], + "version": "==1.5.1" + }, + "idna": { + "hashes": [ + "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", + "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" + ], + "markers": "python_version >= '3.5'", + "version": "==3.4" + }, + "ipykernel": { + "hashes": [ + "sha256:430d00549b6aaf49bd0f5393150691edb1815afa62d457ee6b1a66b25cb17874", + "sha256:6e9213484e4ce1fb14267ee435e18f23cc3a0634e635b9fb4ed4677b84e0fdf8" + ], + "markers": "python_version >= '3.8'", + "version": "==6.21.2" + }, + "ipython": { + "hashes": [ + "sha256:b13a1d6c1f5818bd388db53b7107d17454129a70de2b87481d555daede5eb49e", + "sha256:b38c31e8fc7eff642fc7c597061fff462537cf2314e3225a19c906b7b0d8a345" + ], + "markers": "python_version >= '3.8'", + "version": "==8.10.0" + }, + "ipython-genutils": { + "hashes": [ + "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8", + "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8" + ], + "version": "==0.2.0" + }, + "ipywidgets": { + "hashes": [ + "sha256:c0005a77a47d77889cafed892b58e33b4a2a96712154404c6548ec22272811ea", + "sha256:ebb195e743b16c3947fe8827190fb87b4d00979c0fbf685afe4d2c4927059fa1" + ], + "markers": "python_version >= '3.7'", + "version": "==8.0.4" + }, + "isoduration": { + "hashes": [ + "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9", + "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042" + ], + "version": "==20.11.0" + }, + "jedi": { + "hashes": [ + "sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e", + "sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612" + ], + "markers": "python_version >= '3.6'", + "version": "==0.18.2" + }, + "jinja2": { + "hashes": [ + "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852", + "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61" + ], + "markers": "python_version >= '3.7'", + "version": "==3.1.2" + }, + "jsonpointer": { + "hashes": [ + "sha256:51801e558539b4e9cd268638c078c6c5746c9ac96bc38152d443400e4f3793e9", + "sha256:97cba51526c829282218feb99dab1b1e6bdf8efd1c43dc9d57be093c0d69c99a" + ], + "version": "==2.3" + }, + "jsonschema": { + "hashes": [ + "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d", + "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6" + ], + "markers": "python_version >= '3.7'", + "version": "==4.17.3" + }, + "jupyter": { + "hashes": [ + "sha256:3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7", + "sha256:5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78", + "sha256:d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f" + ], + "index": "pypi", + "version": "==1.0.0" + }, + "jupyter-client": { + "hashes": [ + "sha256:47ac9f586dbcff4d79387ec264faf0fdeb5f14845fa7345fd7d1e378f8096011", + "sha256:c53731eb590b68839b0ce04bf46ff8c4f03278f5d9fe5c3b0f268a57cc2bd97e" + ], + "markers": "python_version >= '3.8'", + "version": "==8.0.2" + }, + "jupyter-console": { + "hashes": [ + "sha256:6b91b7b6e8a715053b536db209a2f4b02429d7b28db27373a56a26b0bebd620b", + "sha256:c575bb6ed56ca78189594176341e7b31426ff30fafcd22bf3dad7be309595b5e" + ], + "markers": "python_version >= '3.7'", + "version": "==6.5.1" + }, + "jupyter-core": { + "hashes": [ + "sha256:1407cdb4c79ee467696c04b76633fc1884015fa109323365a6372c8e890cc83f", + "sha256:4bdc2928c37f6917130c667d8b8708f20aee539d8283c6be72aabd2a4b4c83b0" + ], + "markers": "python_version >= '3.8'", + "version": "==5.2.0" + }, + "jupyter-events": { + "hashes": [ + "sha256:57a2749f87ba387cd1bfd9b22a0875b889237dbf2edc2121ebb22bde47036c17", + "sha256:9a6e9995f75d1b7146b436ea24d696ce3a35bfa8bfe45e0c33c334c79464d0b3" + ], + "markers": "python_version >= '3.7'", + "version": "==0.6.3" + }, + "jupyter-server": { + "hashes": [ + "sha256:5afb8a0cdfee37d02d69bdf470ae9cbb1dee5d4788f9bc6cc8e54bd8c83fb096", + "sha256:854fb7d49f6b7f545d4f8354172b004dcda887ba0699def7112daf785ba3c9ce" + ], + "markers": "python_version >= '3.8'", + "version": "==2.2.1" + }, + "jupyter-server-terminals": { + "hashes": [ + "sha256:57ab779797c25a7ba68e97bcfb5d7740f2b5e8a83b5e8102b10438041a7eac5d", + "sha256:75779164661cec02a8758a5311e18bb8eb70c4e86c6b699403100f1585a12a36" + ], + "markers": "python_version >= '3.8'", + "version": "==0.4.4" + }, + "jupyterlab-pygments": { + "hashes": [ + "sha256:2405800db07c9f770863bcf8049a529c3dd4d3e28536638bd7c1c01d2748309f", + "sha256:7405d7fde60819d905a9fa8ce89e4cd830e318cdad22a0030f7a901da705585d" + ], + "markers": "python_version >= '3.7'", + "version": "==0.2.2" + }, + "jupyterlab-widgets": { + "hashes": [ + "sha256:a04a42e50231b355b7087e16a818f541e53589f7647144ea0344c4bf16f300e5", + "sha256:eeaecdeaf6c03afc960ddae201ced88d5979b4ca9c3891bcb8f6631af705f5ef" + ], + "markers": "python_version >= '3.7'", + "version": "==3.0.5" + }, + "kiwisolver": { + "hashes": [ + "sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b", + "sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166", + "sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c", + "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c", + "sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0", + "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4", + "sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9", + "sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286", + "sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767", + "sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c", + "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6", + "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b", + "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004", + "sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf", + "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494", + "sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac", + "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626", + "sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766", + "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514", + "sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6", + "sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f", + "sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d", + "sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191", + "sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d", + "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51", + "sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f", + "sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8", + "sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454", + "sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb", + "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da", + "sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8", + "sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de", + "sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a", + "sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9", + "sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008", + "sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3", + "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32", + "sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938", + "sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1", + "sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9", + "sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d", + "sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824", + "sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b", + "sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd", + "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2", + "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5", + "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69", + "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3", + "sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae", + "sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597", + "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e", + "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955", + "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca", + "sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a", + "sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea", + "sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede", + "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4", + "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6", + "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686", + "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408", + "sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871", + "sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29", + "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750", + "sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897", + "sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0", + "sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2", + "sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09", + "sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c" + ], + "markers": "python_version >= '3.7'", + "version": "==1.4.4" + }, + "markupsafe": { + "hashes": [ + "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed", + "sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc", + "sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2", + "sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460", + "sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7", + "sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0", + "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1", + "sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa", + "sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03", + "sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323", + "sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65", + "sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013", + "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036", + "sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f", + "sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4", + "sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419", + "sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2", + "sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619", + "sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a", + "sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a", + "sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd", + "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7", + "sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666", + "sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65", + "sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859", + "sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625", + "sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff", + "sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156", + "sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd", + "sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba", + "sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f", + "sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1", + "sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094", + "sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a", + "sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513", + "sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed", + "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d", + "sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3", + "sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147", + "sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c", + "sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603", + "sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601", + "sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a", + "sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1", + "sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d", + "sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3", + "sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54", + "sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2", + "sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6", + "sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58" + ], + "markers": "python_version >= '3.7'", + "version": "==2.1.2" + }, + "matplotlib": { + "hashes": [ + "sha256:01681566e95b9423021b49dea6a2395c16fa054604eacb87f0f4c439750f9114", + "sha256:03eb2c8ff8d85da679b71e14c7c95d16d014c48e0c0bfa14db85f6cdc5c92aad", + "sha256:092e6abc80cdf8a95f7d1813e16c0e99ceda8d5b195a3ab859c680f3487b80a2", + "sha256:0a776462a4a63c0bfc9df106c15a0897aa2dbab6795c693aa366e8e283958854", + "sha256:0dfd4a0cbd151f6439e6d7f8dca5292839ca311e7e650596d073774847ca2e4f", + "sha256:111ef351f28fd823ed7177632070a6badd6f475607122bc9002a526f2502a0b5", + "sha256:21269450243d6928da81a9bed201f0909432a74e7d0d65db5545b9fa8a0d0223", + "sha256:21a8aeac39b4a795e697265d800ce52ab59bdeb6bb23082e2d971f3041074f02", + "sha256:21bd4033c40b95abd5b8453f036ed5aa70856e56ecbd887705c37dce007a4c21", + "sha256:3493b48e56468c39bd9c1532566dff3b8062952721b7521e1f394eb6791495f4", + "sha256:3a10428d4f8d1a478ceabd652e61a175b2fdeed4175ab48da4a7b8deb561e3fa", + "sha256:3d1e52365d8d5af699f04581ca191112e1d1220a9ce4386b57d807124d8b55e6", + "sha256:3da8b9618188346239e51f1ea6c0f8f05c6e218cfcc30b399dd7dd7f52e8bceb", + "sha256:4497d88c559b76da320b7759d64db442178beeea06a52dc0c629086982082dcd", + "sha256:46ca923e980f76d34c1c633343a72bb042d6ba690ecc649aababf5317997171d", + "sha256:4f640534ec2760e270801056bc0d8a10777c48b30966eef78a7c35d8590915ba", + "sha256:51fb664c37714cbaac69c16d6b3719f517a13c96c3f76f4caadd5a0aa7ed0329", + "sha256:56b7b79488209041a9bf7ddc34f1b069274489ce69e34dc63ae241d0d6b4b736", + "sha256:691ef1f15360e439886186d0db77b5345b24da12cbc4fc57b26c4826db4d6cab", + "sha256:71b751d06b2ed1fd017de512d7439c0259822864ea16731522b251a27c0b2ede", + "sha256:7d0dcd1a0bf8d56551e8617d6dc3881d8a1c7fb37d14e5ec12cbb293f3e6170a", + "sha256:827e78239292e561cfb70abf356a9d7eaf5bf6a85c97877f254009f20b892f89", + "sha256:8665855f3919c80551f377bc16df618ceabf3ef65270bc14b60302dce88ca9ab", + "sha256:8f6efd313430d7ef70a38a3276281cb2e8646b3a22b3b21eb227da20e15e6813", + "sha256:9d85355c48ef8b9994293eb7c00f44aa8a43cad7a297fbf0770a25cdb2244b91", + "sha256:a06a6c9822e80f323549c6bc9da96d4f233178212ad9a5f4ab87fd153077a507", + "sha256:b51ab8a5d5d3bbd4527af633a638325f492e09e45e78afdf816ef55217a09664", + "sha256:c0592ba57217c22987b7322df10f75ef95bc44dce781692b4b7524085de66019", + "sha256:c5465735eaaafd1cfaec3fed60aee776aeb3fd3992aa2e49f4635339c931d443", + "sha256:c849aa94ff2a70fb71f318f48a61076d1205c6013b9d3885ade7f992093ac434", + "sha256:c869b646489c6a94375714032e5cec08e3aa8d3f7d4e8ef2b0fb50a52b317ce6", + "sha256:cb52aa97b92acdee090edfb65d1cb84ea60ab38e871ba8321a10bbcebc2a3540", + "sha256:cf119eee4e57389fba5ac8b816934e95c256535e55f0b21628b4205737d1de85", + "sha256:cf6346644e8fe234dc847e6232145dac199a650d3d8025b3ef65107221584ba4", + "sha256:de20eb1247725a2f889173d391a6d9e7e0f2540feda24030748283108b0478ec", + "sha256:eb2e76cd429058d8954121c334dddfcd11a6186c6975bca61f3f248c99031b05", + "sha256:f336e7014889c38c59029ebacc35c59236a852e4b23836708cfd3f43d1eaeed5", + "sha256:f4ddac5f59e78d04b20469bc43853a8e619bb6505c7eac8ffb343ff2c516d72f", + "sha256:f910d924da8b9fb066b5beae0b85e34ed1b6293014892baadcf2a51da1c65807", + "sha256:f91d35b3ef51d29d9c661069b9e4ba431ce283ffc533b981506889e144b5b40e", + "sha256:fb0304c1cd802e9a25743414c887e8a7cd51d96c9ec96d388625d2cd1c137ae3" + ], + "index": "pypi", + "version": "==3.7.0" + }, + "matplotlib-inline": { + "hashes": [ + "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311", + "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304" + ], + "markers": "python_version >= '3.5'", + "version": "==0.1.6" + }, + "mistune": { + "hashes": [ + "sha256:0246113cb2492db875c6be56974a7c893333bf26cd92891c85f63151cee09d34", + "sha256:bad7f5d431886fcbaf5f758118ecff70d31f75231b34024a1341120340a65ce8" + ], + "version": "==2.0.5" + }, + "nbclassic": { + "hashes": [ + "sha256:32c235e1f22f4048f3b877d354c198202898797cf9c2085856827598cead001b", + "sha256:8e8ffce7582bb7a4baf11fa86a3d88b184e8e7df78eed4ead69f15aa4fc0e323" + ], + "markers": "python_version >= '3.7'", + "version": "==0.5.1" + }, + "nbclient": { + "hashes": [ + "sha256:884a3f4a8c4fc24bb9302f263e0af47d97f0d01fe11ba714171b320c8ac09547", + "sha256:d97ac6257de2794f5397609df754fcbca1a603e94e924eb9b99787c031ae2e7c" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==0.7.2" + }, + "nbconvert": { + "hashes": [ + "sha256:495638c5e06005f4a5ce828d8a81d28e34f95c20f4384d5d7a22254b443836e7", + "sha256:a42c3ac137c64f70cbe4d763111bf358641ea53b37a01a5c202ed86374af5234" + ], + "markers": "python_version >= '3.7'", + "version": "==7.2.9" + }, + "nbformat": { + "hashes": [ + "sha256:22a98a6516ca216002b0a34591af5bcb8072ca6c63910baffc901cfa07fefbf0", + "sha256:4b021fca24d3a747bf4e626694033d792d594705829e5e35b14ee3369f9f6477" + ], + "markers": "python_version >= '3.7'", + "version": "==5.7.3" + }, + "nest-asyncio": { + "hashes": [ + "sha256:b9a953fb40dceaa587d109609098db21900182b16440652454a146cffb06e8b8", + "sha256:d267cc1ff794403f7df692964d1d2a3fa9418ffea2a3f6859a439ff482fef290" + ], + "markers": "python_version >= '3.5'", + "version": "==1.5.6" + }, + "notebook": { + "hashes": [ + "sha256:c1897e5317e225fc78b45549a6ab4b668e4c996fd03a04e938fe5e7af2bfffd0", + "sha256:e04f9018ceb86e4fa841e92ea8fb214f8d23c1cedfde530cc96f92446924f0e4" + ], + "markers": "python_version >= '3.7'", + "version": "==6.5.2" + }, + "notebook-shim": { + "hashes": [ + "sha256:090e0baf9a5582ff59b607af523ca2db68ff216da0c69956b62cab2ef4fc9c3f", + "sha256:9c6c30f74c4fbea6fce55c1be58e7fd0409b1c681b075dcedceb005db5026949" + ], + "markers": "python_version >= '3.7'", + "version": "==0.2.2" + }, + "numpy": { + "hashes": [ + "sha256:003a9f530e880cb2cd177cba1af7220b9aa42def9c4afc2a2fc3ee6be7eb2b22", + "sha256:150947adbdfeceec4e5926d956a06865c1c690f2fd902efede4ca6fe2e657c3f", + "sha256:2620e8592136e073bd12ee4536149380695fbe9ebeae845b81237f986479ffc9", + "sha256:2eabd64ddb96a1239791da78fa5f4e1693ae2dadc82a76bc76a14cbb2b966e96", + "sha256:4173bde9fa2a005c2c6e2ea8ac1618e2ed2c1c6ec8a7657237854d42094123a0", + "sha256:4199e7cfc307a778f72d293372736223e39ec9ac096ff0a2e64853b866a8e18a", + "sha256:4cecaed30dc14123020f77b03601559fff3e6cd0c048f8b5289f4eeabb0eb281", + "sha256:557d42778a6869c2162deb40ad82612645e21d79e11c1dc62c6e82a2220ffb04", + "sha256:63e45511ee4d9d976637d11e6c9864eae50e12dc9598f531c035265991910468", + "sha256:6524630f71631be2dabe0c541e7675db82651eb998496bbe16bc4f77f0772253", + "sha256:76807b4063f0002c8532cfeac47a3068a69561e9c8715efdad3c642eb27c0756", + "sha256:7de8fdde0003f4294655aa5d5f0a89c26b9f22c0a58790c38fae1ed392d44a5a", + "sha256:889b2cc88b837d86eda1b17008ebeb679d82875022200c6e8e4ce6cf549b7acb", + "sha256:92011118955724465fb6853def593cf397b4a1367495e0b59a7e69d40c4eb71d", + "sha256:97cf27e51fa078078c649a51d7ade3c92d9e709ba2bfb97493007103c741f1d0", + "sha256:9a23f8440561a633204a67fb44617ce2a299beecf3295f0d13c495518908e910", + "sha256:a51725a815a6188c662fb66fb32077709a9ca38053f0274640293a14fdd22978", + "sha256:a77d3e1163a7770164404607b7ba3967fb49b24782a6ef85d9b5f54126cc39e5", + "sha256:adbdce121896fd3a17a77ab0b0b5eedf05a9834a18699db6829a64e1dfccca7f", + "sha256:c29e6bd0ec49a44d7690ecb623a8eac5ab8a923bce0bea6293953992edf3a76a", + "sha256:c72a6b2f4af1adfe193f7beb91ddf708ff867a3f977ef2ec53c0ffb8283ab9f5", + "sha256:d0a2db9d20117bf523dde15858398e7c0858aadca7c0f088ac0d6edd360e9ad2", + "sha256:e3ab5d32784e843fc0dd3ab6dcafc67ef806e6b6828dc6af2f689be0eb4d781d", + "sha256:e428c4fbfa085f947b536706a2fc349245d7baa8334f0c5723c56a10595f9b95", + "sha256:e8d2859428712785e8a8b7d2b3ef0a1d1565892367b32f915c4a4df44d0e64f5", + "sha256:eef70b4fc1e872ebddc38cddacc87c19a3709c0e3e5d20bf3954c147b1dd941d", + "sha256:f64bb98ac59b3ea3bf74b02f13836eb2e24e48e0ab0145bbda646295769bd780", + "sha256:f9006288bcf4895917d02583cf3411f98631275bc67cce355a7f39f8c14338fa" + ], + "markers": "python_version >= '3.8'", + "version": "==1.24.2" + }, + "packaging": { + "hashes": [ + "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2", + "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97" + ], + "markers": "python_version >= '3.7'", + "version": "==23.0" + }, + "pandas": { + "hashes": [ + "sha256:14e45300521902689a81f3f41386dc86f19b8ba8dd5ac5a3c7010ef8d2932813", + "sha256:26d9c71772c7afb9d5046e6e9cf42d83dd147b5cf5bcb9d97252077118543792", + "sha256:3749077d86e3a2f0ed51367f30bf5b82e131cc0f14260c4d3e499186fccc4406", + "sha256:41179ce559943d83a9b4bbacb736b04c928b095b5f25dd2b7389eda08f46f373", + "sha256:478ff646ca42b20376e4ed3fa2e8d7341e8a63105586efe54fa2508ee087f328", + "sha256:50869a35cbb0f2e0cd5ec04b191e7b12ed688874bd05dd777c19b28cbea90996", + "sha256:565fa34a5434d38e9d250af3c12ff931abaf88050551d9fbcdfafca50d62babf", + "sha256:5f2b952406a1588ad4cad5b3f55f520e82e902388a6d5a4a91baa8d38d23c7f6", + "sha256:5fbcb19d6fceb9e946b3e23258757c7b225ba450990d9ed63ccceeb8cae609f7", + "sha256:6973549c01ca91ec96199e940495219c887ea815b2083722821f1d7abfa2b4dc", + "sha256:74a3fd7e5a7ec052f183273dc7b0acd3a863edf7520f5d3a1765c04ffdb3b0b1", + "sha256:7a0a56cef15fd1586726dace5616db75ebcfec9179a3a55e78f72c5639fa2a23", + "sha256:7cec0bee9f294e5de5bbfc14d0573f65526071029d036b753ee6507d2a21480a", + "sha256:87bd9c03da1ac870a6d2c8902a0e1fd4267ca00f13bc494c9e5a9020920e1d51", + "sha256:972d8a45395f2a2d26733eb8d0f629b2f90bebe8e8eddbb8829b180c09639572", + "sha256:9842b6f4b8479e41968eced654487258ed81df7d1c9b7b870ceea24ed9459b31", + "sha256:9f69c4029613de47816b1bb30ff5ac778686688751a5e9c99ad8c7031f6508e5", + "sha256:a50d9a4336a9621cab7b8eb3fb11adb82de58f9b91d84c2cd526576b881a0c5a", + "sha256:bc4c368f42b551bf72fac35c5128963a171b40dce866fb066540eeaf46faa003", + "sha256:c39a8da13cede5adcd3be1182883aea1c925476f4e84b2807a46e2775306305d", + "sha256:c3ac844a0fe00bfaeb2c9b51ab1424e5c8744f89860b138434a363b1f620f354", + "sha256:c4c00e0b0597c8e4f59e8d461f797e5d70b4d025880516a8261b2817c47759ee", + "sha256:c74a62747864ed568f5a82a49a23a8d7fe171d0c69038b38cedf0976831296fa", + "sha256:dd05f7783b3274aa206a1af06f0ceed3f9b412cf665b7247eacd83be41cf7bf0", + "sha256:dfd681c5dc216037e0b0a2c821f5ed99ba9f03ebcf119c7dac0e9a7b960b9ec9", + "sha256:e474390e60ed609cec869b0da796ad94f420bb057d86784191eefc62b65819ae", + "sha256:f76d097d12c82a535fda9dfe5e8dd4127952b45fea9b0276cb30cca5ea313fbc" + ], + "index": "pypi", + "version": "==1.5.3" + }, + "pandocfilters": { + "hashes": [ + "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38", + "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.5.0" + }, + "parso": { + "hashes": [ + "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0", + "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75" + ], + "markers": "python_version >= '3.6'", + "version": "==0.8.3" + }, + "pickleshare": { + "hashes": [ + "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca", + "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56" + ], + "version": "==0.7.5" + }, + "pillow": { + "hashes": [ + "sha256:013016af6b3a12a2f40b704677f8b51f72cb007dac785a9933d5c86a72a7fe33", + "sha256:0845adc64fe9886db00f5ab68c4a8cd933ab749a87747555cec1c95acea64b0b", + "sha256:0884ba7b515163a1a05440a138adeb722b8a6ae2c2b33aea93ea3118dd3a899e", + "sha256:09b89ddc95c248ee788328528e6a2996e09eaccddeeb82a5356e92645733be35", + "sha256:0dd4c681b82214b36273c18ca7ee87065a50e013112eea7d78c7a1b89a739153", + "sha256:0e51f608da093e5d9038c592b5b575cadc12fd748af1479b5e858045fff955a9", + "sha256:0f3269304c1a7ce82f1759c12ce731ef9b6e95b6df829dccd9fe42912cc48569", + "sha256:16a8df99701f9095bea8a6c4b3197da105df6f74e6176c5b410bc2df2fd29a57", + "sha256:19005a8e58b7c1796bc0167862b1f54a64d3b44ee5d48152b06bb861458bc0f8", + "sha256:1b4b4e9dda4f4e4c4e6896f93e84a8f0bcca3b059de9ddf67dac3c334b1195e1", + "sha256:28676836c7796805914b76b1837a40f76827ee0d5398f72f7dcc634bae7c6264", + "sha256:2968c58feca624bb6c8502f9564dd187d0e1389964898f5e9e1fbc8533169157", + "sha256:3f4cc516e0b264c8d4ccd6b6cbc69a07c6d582d8337df79be1e15a5056b258c9", + "sha256:3fa1284762aacca6dc97474ee9c16f83990b8eeb6697f2ba17140d54b453e133", + "sha256:43521ce2c4b865d385e78579a082b6ad1166ebed2b1a2293c3be1d68dd7ca3b9", + "sha256:451f10ef963918e65b8869e17d67db5e2f4ab40e716ee6ce7129b0cde2876eab", + "sha256:46c259e87199041583658457372a183636ae8cd56dbf3f0755e0f376a7f9d0e6", + "sha256:46f39cab8bbf4a384ba7cb0bc8bae7b7062b6a11cfac1ca4bc144dea90d4a9f5", + "sha256:519e14e2c49fcf7616d6d2cfc5c70adae95682ae20f0395e9280db85e8d6c4df", + "sha256:53dcb50fbdc3fb2c55431a9b30caeb2f7027fcd2aeb501459464f0214200a503", + "sha256:54614444887e0d3043557d9dbc697dbb16cfb5a35d672b7a0fcc1ed0cf1c600b", + "sha256:575d8912dca808edd9acd6f7795199332696d3469665ef26163cd090fa1f8bfa", + "sha256:5dd5a9c3091a0f414a963d427f920368e2b6a4c2f7527fdd82cde8ef0bc7a327", + "sha256:5f532a2ad4d174eb73494e7397988e22bf427f91acc8e6ebf5bb10597b49c493", + "sha256:60e7da3a3ad1812c128750fc1bc14a7ceeb8d29f77e0a2356a8fb2aa8925287d", + "sha256:653d7fb2df65efefbcbf81ef5fe5e5be931f1ee4332c2893ca638c9b11a409c4", + "sha256:6663977496d616b618b6cfa43ec86e479ee62b942e1da76a2c3daa1c75933ef4", + "sha256:6abfb51a82e919e3933eb137e17c4ae9c0475a25508ea88993bb59faf82f3b35", + "sha256:6c6b1389ed66cdd174d040105123a5a1bc91d0aa7059c7261d20e583b6d8cbd2", + "sha256:6d9dfb9959a3b0039ee06c1a1a90dc23bac3b430842dcb97908ddde05870601c", + "sha256:765cb54c0b8724a7c12c55146ae4647e0274a839fb6de7bcba841e04298e1011", + "sha256:7a21222644ab69ddd9967cfe6f2bb420b460dae4289c9d40ff9a4896e7c35c9a", + "sha256:7ac7594397698f77bce84382929747130765f66406dc2cd8b4ab4da68ade4c6e", + "sha256:7cfc287da09f9d2a7ec146ee4d72d6ea1342e770d975e49a8621bf54eaa8f30f", + "sha256:83125753a60cfc8c412de5896d10a0a405e0bd88d0470ad82e0869ddf0cb3848", + "sha256:847b114580c5cc9ebaf216dd8c8dbc6b00a3b7ab0131e173d7120e6deade1f57", + "sha256:87708d78a14d56a990fbf4f9cb350b7d89ee8988705e58e39bdf4d82c149210f", + "sha256:8a2b5874d17e72dfb80d917213abd55d7e1ed2479f38f001f264f7ce7bae757c", + "sha256:8f127e7b028900421cad64f51f75c051b628db17fb00e099eb148761eed598c9", + "sha256:94cdff45173b1919350601f82d61365e792895e3c3a3443cf99819e6fbf717a5", + "sha256:99d92d148dd03fd19d16175b6d355cc1b01faf80dae93c6c3eb4163709edc0a9", + "sha256:9a3049a10261d7f2b6514d35bbb7a4dfc3ece4c4de14ef5876c4b7a23a0e566d", + "sha256:9d9a62576b68cd90f7075876f4e8444487db5eeea0e4df3ba298ee38a8d067b0", + "sha256:9e5f94742033898bfe84c93c831a6f552bb629448d4072dd312306bab3bd96f1", + "sha256:a1c2d7780448eb93fbcc3789bf3916aa5720d942e37945f4056680317f1cd23e", + "sha256:a2e0f87144fcbbe54297cae708c5e7f9da21a4646523456b00cc956bd4c65815", + "sha256:a4dfdae195335abb4e89cc9762b2edc524f3c6e80d647a9a81bf81e17e3fb6f0", + "sha256:a96e6e23f2b79433390273eaf8cc94fec9c6370842e577ab10dabdcc7ea0a66b", + "sha256:aabdab8ec1e7ca7f1434d042bf8b1e92056245fb179790dc97ed040361f16bfd", + "sha256:b222090c455d6d1a64e6b7bb5f4035c4dff479e22455c9eaa1bdd4c75b52c80c", + "sha256:b52ff4f4e002f828ea6483faf4c4e8deea8d743cf801b74910243c58acc6eda3", + "sha256:b70756ec9417c34e097f987b4d8c510975216ad26ba6e57ccb53bc758f490dab", + "sha256:b8c2f6eb0df979ee99433d8b3f6d193d9590f735cf12274c108bd954e30ca858", + "sha256:b9b752ab91e78234941e44abdecc07f1f0d8f51fb62941d32995b8161f68cfe5", + "sha256:ba6612b6548220ff5e9df85261bddc811a057b0b465a1226b39bfb8550616aee", + "sha256:bd752c5ff1b4a870b7661234694f24b1d2b9076b8bf337321a814c612665f343", + "sha256:c3c4ed2ff6760e98d262e0cc9c9a7f7b8a9f61aa4d47c58835cdaf7b0b8811bb", + "sha256:c5c1362c14aee73f50143d74389b2c158707b4abce2cb055b7ad37ce60738d47", + "sha256:cb362e3b0976dc994857391b776ddaa8c13c28a16f80ac6522c23d5257156bed", + "sha256:d197df5489004db87d90b918033edbeee0bd6df3848a204bca3ff0a903bef837", + "sha256:d3b56206244dc8711f7e8b7d6cad4663917cd5b2d950799425076681e8766286", + "sha256:d5b2f8a31bd43e0f18172d8ac82347c8f37ef3e0b414431157718aa234991b28", + "sha256:d7081c084ceb58278dd3cf81f836bc818978c0ccc770cbbb202125ddabec6628", + "sha256:db74f5562c09953b2c5f8ec4b7dfd3f5421f31811e97d1dbc0a7c93d6e3a24df", + "sha256:df41112ccce5d47770a0c13651479fbcd8793f34232a2dd9faeccb75eb5d0d0d", + "sha256:e1339790c083c5a4de48f688b4841f18df839eb3c9584a770cbd818b33e26d5d", + "sha256:e621b0246192d3b9cb1dc62c78cfa4c6f6d2ddc0ec207d43c0dedecb914f152a", + "sha256:e8c5cf126889a4de385c02a2c3d3aba4b00f70234bfddae82a5eaa3ee6d5e3e6", + "sha256:e9d7747847c53a16a729b6ee5e737cf170f7a16611c143d95aa60a109a59c336", + "sha256:eaef5d2de3c7e9b21f1e762f289d17b726c2239a42b11e25446abf82b26ac132", + "sha256:ed3e4b4e1e6de75fdc16d3259098de7c6571b1a6cc863b1a49e7d3d53e036070", + "sha256:ef21af928e807f10bf4141cad4746eee692a0dd3ff56cfb25fce076ec3cc8abe", + "sha256:f09598b416ba39a8f489c124447b007fe865f786a89dbfa48bb5cf395693132a", + "sha256:f0caf4a5dcf610d96c3bd32932bfac8aee61c96e60481c2a0ea58da435e25acd", + "sha256:f6e78171be3fb7941f9910ea15b4b14ec27725865a73c15277bc39f5ca4f8391", + "sha256:f715c32e774a60a337b2bb8ad9839b4abf75b267a0f18806f6f4f5f1688c4b5a", + "sha256:fb5c1ad6bad98c57482236a21bf985ab0ef42bd51f7ad4e4538e89a997624e12" + ], + "markers": "python_version >= '3.7'", + "version": "==9.4.0" + }, + "platformdirs": { + "hashes": [ + "sha256:8a1228abb1ef82d788f74139988b137e78692984ec7b08eaa6c65f1723af28f9", + "sha256:b1d5eb14f221506f50d6604a561f4c5786d9e80355219694a1b244bcd96f4567" + ], + "markers": "python_version >= '3.7'", + "version": "==3.0.0" + }, + "prometheus-client": { + "hashes": [ + "sha256:0836af6eb2c8f4fed712b2f279f6c0a8bbab29f9f4aa15276b91c7cb0d1616ab", + "sha256:a03e35b359f14dd1630898543e2120addfdeacd1a6069c1367ae90fd93ad3f48" + ], + "markers": "python_version >= '3.6'", + "version": "==0.16.0" + }, + "prompt-toolkit": { + "hashes": [ + "sha256:3e163f254bef5a03b146397d7c1963bd3e2812f0964bb9a24e6ec761fd28db63", + "sha256:aa64ad242a462c5ff0363a7b9cfe696c20d55d9fc60c11fd8e632d064804d305" + ], + "markers": "python_full_version >= '3.6.2'", + "version": "==3.0.36" + }, + "psutil": { + "hashes": [ + "sha256:149555f59a69b33f056ba1c4eb22bb7bf24332ce631c44a319cec09f876aaeff", + "sha256:16653106f3b59386ffe10e0bad3bb6299e169d5327d3f187614b1cb8f24cf2e1", + "sha256:3d7f9739eb435d4b1338944abe23f49584bde5395f27487d2ee25ad9a8774a62", + "sha256:3ff89f9b835100a825b14c2808a106b6fdcc4b15483141482a12c725e7f78549", + "sha256:54c0d3d8e0078b7666984e11b12b88af2db11d11249a8ac8920dd5ef68a66e08", + "sha256:54d5b184728298f2ca8567bf83c422b706200bcbbfafdc06718264f9393cfeb7", + "sha256:6001c809253a29599bc0dfd5179d9f8a5779f9dffea1da0f13c53ee568115e1e", + "sha256:68908971daf802203f3d37e78d3f8831b6d1014864d7a85937941bb35f09aefe", + "sha256:6b92c532979bafc2df23ddc785ed116fced1f492ad90a6830cf24f4d1ea27d24", + "sha256:852dd5d9f8a47169fe62fd4a971aa07859476c2ba22c2254d4a1baa4e10b95ad", + "sha256:9120cd39dca5c5e1c54b59a41d205023d436799b1c8c4d3ff71af18535728e94", + "sha256:c1ca331af862803a42677c120aff8a814a804e09832f166f226bfd22b56feee8", + "sha256:efeae04f9516907be44904cc7ce08defb6b665128992a56957abc9b61dca94b7", + "sha256:fd8522436a6ada7b4aad6638662966de0d61d241cb821239b2ae7013d41a43d4" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==5.9.4" + }, + "pure-eval": { + "hashes": [ + "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350", + "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3" + ], + "version": "==0.2.2" + }, + "pycparser": { + "hashes": [ + "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", + "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206" + ], + "version": "==2.21" + }, + "pygments": { + "hashes": [ + "sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297", + "sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717" + ], + "markers": "python_version >= '3.6'", + "version": "==2.14.0" + }, + "pyparsing": { + "hashes": [ + "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb", + "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc" + ], + "markers": "python_full_version >= '3.6.8'", + "version": "==3.0.9" + }, + "pyrsistent": { + "hashes": [ + "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8", + "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440", + "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a", + "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c", + "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3", + "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393", + "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9", + "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da", + "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf", + "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64", + "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a", + "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3", + "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98", + "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2", + "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8", + "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf", + "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc", + "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7", + "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28", + "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2", + "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b", + "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a", + "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64", + "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19", + "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1", + "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9", + "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c" + ], + "markers": "python_version >= '3.7'", + "version": "==0.19.3" + }, + "python-dateutil": { + "hashes": [ + "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", + "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==2.8.2" + }, + "python-json-logger": { + "hashes": [ + "sha256:3af8e5b907b4a5b53cae249205ee3a3d3472bd7ad9ddfaec136eec2f2faf4995", + "sha256:ed33182c2b438a366775c25c1219ebbd5bd7f71694c644d6b3b3861e19565ae3" + ], + "markers": "python_version >= '3.6'", + "version": "==2.0.6" + }, + "pytz": { + "hashes": [ + "sha256:01a0681c4b9684a28304615eba55d1ab31ae00bf68ec157ec3708a8182dbbcd0", + "sha256:78f4f37d8198e0627c5f1143240bb0206b8691d8d7ac6d78fee88b78733f8c4a" + ], + "version": "==2022.7.1" + }, + "pywin32": { + "hashes": [ + "sha256:109f98980bfb27e78f4df8a51a8198e10b0f347257d1e265bb1a32993d0c973d", + "sha256:13362cc5aa93c2beaf489c9c9017c793722aeb56d3e5166dadd5ef82da021fe1", + "sha256:19ca459cd2e66c0e2cc9a09d589f71d827f26d47fe4a9d09175f6aa0256b51c2", + "sha256:326f42ab4cfff56e77e3e595aeaf6c216712bbdd91e464d167c6434b28d65990", + "sha256:421f6cd86e84bbb696d54563c48014b12a23ef95a14e0bdba526be756d89f116", + "sha256:48d8b1659284f3c17b68587af047d110d8c44837736b8932c034091683e05863", + "sha256:4ecd404b2c6eceaca52f8b2e3e91b2187850a1ad3f8b746d0796a98b4cea04db", + "sha256:50768c6b7c3f0b38b7fb14dd4104da93ebced5f1a50dc0e834594bff6fbe1271", + "sha256:56d7a9c6e1a6835f521788f53b5af7912090674bb84ef5611663ee1595860fc7", + "sha256:73e819c6bed89f44ff1d690498c0a811948f73777e5f97c494c152b850fad478", + "sha256:742eb905ce2187133a29365b428e6c3b9001d79accdc30aa8969afba1d8470f4", + "sha256:9d968c677ac4d5cbdaa62fd3014ab241718e619d8e36ef8e11fb930515a1e918", + "sha256:9dd98384da775afa009bc04863426cb30596fd78c6f8e4e2e5bbf4edf8029504", + "sha256:a55db448124d1c1484df22fa8bbcbc45c64da5e6eae74ab095b9ea62e6d00496" + ], + "markers": "sys_platform == 'win32' and platform_python_implementation != 'PyPy'", + "version": "==305" + }, + "pywinpty": { + "hashes": [ + "sha256:38cb924f2778b5751ef91a75febd114776b3af0ae411bc667be45dd84fc881d3", + "sha256:3c46aef80dd50979aff93de199e4a00a8ee033ba7a03cadf0a91fed45f0c39d7", + "sha256:4c7d06ad10f6e92bc850a467f26d98f4f30e73d2fe5926536308c6ae0566bc16", + "sha256:7ffbd66310b83e42028fc9df7746118978d94fba8c1ebf15a7c1275fdd80b28a", + "sha256:902d79444b29ad1833b8d5c3c9aabdfd428f4f068504430df18074007c8c0de8", + "sha256:cdbb5694cf8c7242c2ecfaca35c545d31fa5d5814c3d67a4e628f803f680ebea" + ], + "markers": "os_name == 'nt'", + "version": "==2.0.10" + }, + "pyyaml": { + "hashes": [ + "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf", + "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293", + "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b", + "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57", + "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b", + "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4", + "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07", + "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba", + "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9", + "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287", + "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513", + "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0", + "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782", + "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0", + "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92", + "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f", + "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2", + "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc", + "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1", + "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c", + "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86", + "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4", + "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c", + "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34", + "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b", + "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d", + "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c", + "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb", + "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7", + "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737", + "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3", + "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d", + "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358", + "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53", + "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78", + "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803", + "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a", + "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f", + "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174", + "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5" + ], + "markers": "python_version >= '3.6'", + "version": "==6.0" + }, + "pyzmq": { + "hashes": [ + "sha256:00c94fd4c9dd3c95aace0c629a7fa713627a5c80c1819326b642adf6c4b8e2a2", + "sha256:01d53958c787cfea34091fcb8ef36003dbb7913b8e9f8f62a0715234ebc98b70", + "sha256:0282bba9aee6e0346aa27d6c69b5f7df72b5a964c91958fc9e0c62dcae5fdcdc", + "sha256:02f5cb60a7da1edd5591a15efa654ffe2303297a41e1b40c3c8942f8f11fc17c", + "sha256:0645b5a2d2a06fd8eb738018490c514907f7488bf9359c6ee9d92f62e844b76f", + "sha256:0a154ef810d44f9d28868be04641f837374a64e7449df98d9208e76c260c7ef1", + "sha256:0a90b2480a26aef7c13cff18703ba8d68e181facb40f78873df79e6d42c1facc", + "sha256:0e8d00228db627ddd1b418c7afd81820b38575f237128c9650365f2dd6ac3443", + "sha256:17e1cb97d573ea84d7cd97188b42ca6f611ab3ee600f6a75041294ede58e3d20", + "sha256:183e18742be3621acf8908903f689ec520aee3f08449bfd29f583010ca33022b", + "sha256:1f6116991568aac48b94d6d8aaed6157d407942ea385335a6ed313692777fb9d", + "sha256:20638121b0bdc80777ce0ec8c1f14f1ffec0697a1f88f0b564fa4a23078791c4", + "sha256:2754fa68da08a854f4816e05160137fa938a2347276471103d31e04bcee5365c", + "sha256:28bcb2e66224a7ac2843eb632e4109d6b161479e7a2baf24e37210461485b4f1", + "sha256:293a7c2128690f496057f1f1eb6074f8746058d13588389981089ec45d8fdc77", + "sha256:2a73af6504e0d2805e926abf136ebf536735a13c22f709be7113c2ec65b4bec3", + "sha256:2d05d904f03ddf1e0d83d97341354dfe52244a619b5a1440a5f47a5b3451e84e", + "sha256:2e7b87638ee30ab13230e37ce5331b3e730b1e0dda30120b9eeec3540ed292c8", + "sha256:3100dddcada66ec5940ed6391ebf9d003cc3ede3d320748b2737553019f58230", + "sha256:31e523d067ce44a04e876bed3ff9ea1ff8d1b6636d16e5fcace9d22f8c564369", + "sha256:3594c0ff604e685d7e907860b61d0e10e46c74a9ffca168f6e9e50ea934ee440", + "sha256:3670e8c5644768f214a3b598fe46378a4a6f096d5fb82a67dfd3440028460565", + "sha256:4046d03100aca266e70d54a35694cb35d6654cfbef633e848b3c4a8d64b9d187", + "sha256:4725412e27612f0d7d7c2f794d89807ad0227c2fc01dd6146b39ada49c748ef9", + "sha256:484c2c4ee02c1edc07039f42130bd16e804b1fe81c4f428e0042e03967f40c20", + "sha256:487305c2a011fdcf3db1f24e8814bb76d23bc4d2f46e145bc80316a59a9aa07d", + "sha256:4a1bc30f0c18444d51e9b0d0dd39e3a4e7c53ee74190bebef238cd58de577ea9", + "sha256:4c25c95416133942280faaf068d0fddfd642b927fb28aaf4ab201a738e597c1e", + "sha256:4cbb885f347eba7ab7681c450dee5b14aed9f153eec224ec0c3f299273d9241f", + "sha256:4d3d604fe0a67afd1aff906e54da557a5203368a99dcc50a70eef374f1d2abef", + "sha256:4e295f7928a31ae0f657e848c5045ba6d693fe8921205f408ca3804b1b236968", + "sha256:5049e75cc99db65754a3da5f079230fb8889230cf09462ec972d884d1704a3ed", + "sha256:5050f5c50b58a6e38ccaf9263a356f74ef1040f5ca4030225d1cb1a858c5b7b6", + "sha256:526f884a27e8bba62fe1f4e07c62be2cfe492b6d432a8fdc4210397f8cf15331", + "sha256:531866c491aee5a1e967c286cfa470dffac1e2a203b1afda52d62b58782651e9", + "sha256:5605621f2181f20b71f13f698944deb26a0a71af4aaf435b34dd90146092d530", + "sha256:58fc3ad5e1cfd2e6d24741fbb1e216b388115d31b0ca6670f894187f280b6ba6", + "sha256:60ecbfe7669d3808ffa8a7dd1487d6eb8a4015b07235e3b723d4b2a2d4de7203", + "sha256:610d2d112acd4e5501fac31010064a6c6efd716ceb968e443cae0059eb7b86de", + "sha256:6136bfb0e5a9cf8c60c6ac763eb21f82940a77e6758ea53516c8c7074f4ff948", + "sha256:62b9e80890c0d2408eb42d5d7e1fc62a5ce71be3288684788f74cf3e59ffd6e2", + "sha256:656281d496aaf9ca4fd4cea84e6d893e3361057c4707bd38618f7e811759103c", + "sha256:66509c48f7446b640eeae24b60c9c1461799a27b1b0754e438582e36b5af3315", + "sha256:6bf3842af37af43fa953e96074ebbb5315f6a297198f805d019d788a1021dbc8", + "sha256:731b208bc9412deeb553c9519dca47136b5a01ca66667cafd8733211941b17e4", + "sha256:75243e422e85a62f0ab7953dc315452a56b2c6a7e7d1a3c3109ac3cc57ed6b47", + "sha256:7877264aa851c19404b1bb9dbe6eed21ea0c13698be1eda3784aab3036d1c861", + "sha256:81f99fb1224d36eb91557afec8cdc2264e856f3464500b55749020ce4c848ef2", + "sha256:8539216173135e9e89f6b1cc392e74e6b935b91e8c76106cf50e7a02ab02efe5", + "sha256:85456f0d8f3268eecd63dede3b99d5bd8d3b306310c37d4c15141111d22baeaf", + "sha256:866eabf7c1315ef2e93e34230db7cbf672e0d7c626b37c11f7e870c8612c3dcc", + "sha256:926236ca003aec70574754f39703528947211a406f5c6c8b3e50eca04a9e87fc", + "sha256:930e6ad4f2eaac31a3d0c2130619d25db754b267487ebc186c6ad18af2a74018", + "sha256:94f0a7289d0f5c80807c37ebb404205e7deb737e8763eb176f4770839ee2a287", + "sha256:9a2d5e419bd39a1edb6cdd326d831f0120ddb9b1ff397e7d73541bf393294973", + "sha256:9ca6db34b26c4d3e9b0728841ec9aa39484eee272caa97972ec8c8e231b20c7e", + "sha256:9f72ea279b2941a5203e935a4588b9ba8a48aeb9a926d9dfa1986278bd362cb8", + "sha256:a0e7ef9ac807db50b4eb6f534c5dcc22f998f5dae920cc28873d2c1d080a4fc9", + "sha256:a1cd4a95f176cdc0ee0a82d49d5830f13ae6015d89decbf834c273bc33eeb3d3", + "sha256:a9c464cc508177c09a5a6122b67f978f20e2954a21362bf095a0da4647e3e908", + "sha256:ac97e7d647d5519bcef48dd8d3d331f72975afa5c4496c95f6e854686f45e2d9", + "sha256:af1fbfb7ad6ac0009ccee33c90a1d303431c7fb594335eb97760988727a37577", + "sha256:b055a1cddf8035966ad13aa51edae5dc8f1bba0b5d5e06f7a843d8b83dc9b66b", + "sha256:b6f75b4b8574f3a8a0d6b4b52606fc75b82cb4391471be48ab0b8677c82f9ed4", + "sha256:b90bb8dfbbd138558f1f284fecfe328f7653616ff9a972433a00711d9475d1a9", + "sha256:be05504af0619d1cffa500af1e0ede69fb683f301003851f5993b5247cc2c576", + "sha256:c21a5f4e54a807df5afdef52b6d24ec1580153a6bcf0607f70a6e1d9fa74c5c3", + "sha256:c48f257da280b3be6c94e05bd575eddb1373419dbb1a72c3ce64e88f29d1cd6d", + "sha256:cac602e02341eaaf4edfd3e29bd3fdef672e61d4e6dfe5c1d065172aee00acee", + "sha256:ccb3e1a863222afdbda42b7ca8ac8569959593d7abd44f5a709177d6fa27d266", + "sha256:e1081d7030a1229c8ff90120346fb7599b54f552e98fcea5170544e7c6725aab", + "sha256:e14df47c1265356715d3d66e90282a645ebc077b70b3806cf47efcb7d1d630cb", + "sha256:e4bba04ea779a3d7ef25a821bb63fd0939142c88e7813e5bd9c6265a20c523a2", + "sha256:e99629a976809fe102ef73e856cf4b2660acd82a412a51e80ba2215e523dfd0a", + "sha256:f330a1a2c7f89fd4b0aa4dcb7bf50243bf1c8da9a2f1efc31daf57a2046b31f2", + "sha256:f3f96d452e9580cb961ece2e5a788e64abaecb1232a80e61deffb28e105ff84a", + "sha256:fc7c1421c5b1c916acf3128bf3cc7ea7f5018b58c69a6866d70c14190e600ce9" + ], + "markers": "python_version >= '3.6'", + "version": "==25.0.0" + }, + "qtconsole": { + "hashes": [ + "sha256:57748ea2fd26320a0b77adba20131cfbb13818c7c96d83fafcb110ff55f58b35", + "sha256:be13560c19bdb3b54ed9741a915aa701a68d424519e8341ac479a91209e694b2" + ], + "markers": "python_version >= '3.7'", + "version": "==5.4.0" + }, + "qtpy": { + "hashes": [ + "sha256:0603c9c83ccc035a4717a12908bf6bc6cb22509827ea2ec0e94c2da7c9ed57c5", + "sha256:8d6d544fc20facd27360ea189592e6135c614785f0dec0b4f083289de6beb408" + ], + "markers": "python_version >= '3.7'", + "version": "==2.3.0" + }, + "rfc3339-validator": { + "hashes": [ + "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b", + "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==0.1.4" + }, + "rfc3986-validator": { + "hashes": [ + "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9", + "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==0.1.1" + }, + "send2trash": { + "hashes": [ + "sha256:d2c24762fd3759860a0aff155e45871447ea58d2be6bdd39b5c8f966a0c99c2d", + "sha256:f20eaadfdb517eaca5ce077640cb261c7d2698385a6a0f072a4a5447fd49fa08" + ], + "version": "==1.8.0" + }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.16.0" + }, + "sniffio": { + "hashes": [ + "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101", + "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384" + ], + "markers": "python_version >= '3.7'", + "version": "==1.3.0" + }, + "soupsieve": { + "hashes": [ + "sha256:49e5368c2cda80ee7e84da9dbe3e110b70a4575f196efb74e51b94549d921955", + "sha256:e28dba9ca6c7c00173e34e4ba57448f0688bb681b7c5e8bf4971daafc093d69a" + ], + "markers": "python_version >= '3.7'", + "version": "==2.4" + }, + "stack-data": { + "hashes": [ + "sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815", + "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8" + ], + "version": "==0.6.2" + }, + "terminado": { + "hashes": [ + "sha256:6ccbbcd3a4f8a25a5ec04991f39a0b8db52dfcd487ea0e578d977e6752380333", + "sha256:8650d44334eba354dd591129ca3124a6ba42c3d5b70df5051b6921d506fdaeae" + ], + "markers": "python_version >= '3.7'", + "version": "==0.17.1" + }, + "tinycss2": { + "hashes": [ + "sha256:2b80a96d41e7c3914b8cda8bc7f705a4d9c49275616e886103dd839dfc847847", + "sha256:8cff3a8f066c2ec677c06dbc7b45619804a6938478d9d73c284b29d14ecb0627" + ], + "markers": "python_version >= '3.7'", + "version": "==1.2.1" + }, + "tornado": { + "hashes": [ + "sha256:1d54d13ab8414ed44de07efecb97d4ef7c39f7438cf5e976ccd356bebb1b5fca", + "sha256:20f638fd8cc85f3cbae3c732326e96addff0a15e22d80f049e00121651e82e72", + "sha256:5c87076709343557ef8032934ce5f637dbb552efa7b21d08e89ae7619ed0eb23", + "sha256:5f8c52d219d4995388119af7ccaa0bcec289535747620116a58d830e7c25d8a8", + "sha256:6fdfabffd8dfcb6cf887428849d30cf19a3ea34c2c248461e1f7d718ad30b66b", + "sha256:87dcafae3e884462f90c90ecc200defe5e580a7fbbb4365eda7c7c1eb809ebc9", + "sha256:9b630419bde84ec666bfd7ea0a4cb2a8a651c2d5cccdbdd1972a0c859dfc3c13", + "sha256:b8150f721c101abdef99073bf66d3903e292d851bee51910839831caba341a75", + "sha256:ba09ef14ca9893954244fd872798b4ccb2367c165946ce2dd7376aebdde8e3ac", + "sha256:d3a2f5999215a3a06a4fc218026cd84c61b8b2b40ac5296a6db1f1451ef04c1e", + "sha256:e5f923aa6a47e133d1cf87d60700889d7eae68988704e20c75fb2d65677a8e4b" + ], + "markers": "python_version >= '3.7'", + "version": "==6.2" + }, + "traitlets": { + "hashes": [ + "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8", + "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9" + ], + "markers": "python_version >= '3.7'", + "version": "==5.9.0" + }, + "uri-template": { + "hashes": [ + "sha256:934e4d09d108b70eb8a24410af8615294d09d279ce0e7cbcdaef1bd21f932b06", + "sha256:f1699c77b73b925cf4937eae31ab282a86dc885c333f2e942513f08f691fc7db" + ], + "version": "==1.2.0" + }, + "wcwidth": { + "hashes": [ + "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e", + "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0" + ], + "version": "==0.2.6" + }, + "webcolors": { + "hashes": [ + "sha256:16d043d3a08fd6a1b1b7e3e9e62640d09790dce80d2bdd4792a175b35fe794a9", + "sha256:d98743d81d498a2d3eaf165196e65481f0d2ea85281463d856b1e51b09f62dce" + ], + "version": "==1.12" + }, + "webencodings": { + "hashes": [ + "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", + "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923" + ], + "version": "==0.5.1" + }, + "websocket-client": { + "hashes": [ + "sha256:3f09e6d8230892547132177f575a4e3e73cfdf06526e20cc02aa1c3b47184d40", + "sha256:cdf5877568b7e83aa7cf2244ab56a3213de587bbe0ce9d8b9600fc77b455d89e" + ], + "markers": "python_version >= '3.7'", + "version": "==1.5.1" + }, + "widgetsnbextension": { + "hashes": [ + "sha256:003f716d930d385be3fd9de42dd9bf008e30053f73bddde235d14fbeaeff19af", + "sha256:eaaaf434fb9b08bd197b2a14ffe45ddb5ac3897593d43c69287091e5f3147bf7" + ], + "markers": "python_version >= '3.7'", + "version": "==4.0.5" + }, + "xyzservices": { + "hashes": [ + "sha256:5547b3d6bc06a60561d039fc9ef5fd521d8bea9b6b3d617410fd764b30c6c2bd", + "sha256:55651961708b9a14849978b339df76008c886df7a8326308a5549bae5516260c" + ], + "markers": "python_version >= '3.7'", + "version": "==2022.9.0" + } + }, + "develop": {} +} diff --git a/tests/configure-test.ps1 b/tests/configure-test.ps1 index 700cc1db70b..f63f6906129 100644 --- a/tests/configure-test.ps1 +++ b/tests/configure-test.ps1 @@ -4,13 +4,17 @@ try { $null = gcm py -ea stop; $py=$true} catch { Write-Host -ForegroundColor red "Missing Python launcher - py.exe is required on Windows" } -try { $null = gcm python3 -ea stop; $python=$true } catch { - Write-Host -ForegroundColor red "No python found in PATH - Install python3" +try { $null = gcm python -ea stop; $python=$true } catch { + Write-Host -ForegroundColor red "No python found in PATH - Install python" +} + +try { $null = gcm pipenv -ea stop; $pipenv=$true } catch { + Write-Host -ForegroundColor red "No python found in PATH - Install python" } If ( $py -and $python -and $env:VIRTUAL_ENV -eq $null) { - Write-Host "Setting up virtual environment in .venv" - python3 -m venv .venv + Write-Host "Setting up python environnement with pipenv" + pipenv install } try {$null = gcm julia -ea stop; julia=$true } catch { diff --git a/tests/requirements.txt b/tests/requirements.txt deleted file mode 100644 index 524b15b4ce7..00000000000 --- a/tests/requirements.txt +++ /dev/null @@ -1,102 +0,0 @@ -anyio==3.6.2 -appnope==0.1.3 -argon2-cffi==21.3.0 -argon2-cffi-bindings==21.2.0 -arrow==1.2.3 -asttokens==2.2.1 -async-generator==1.10 -attrs==22.2.0 -backcall==0.2.0 -beautifulsoup4==4.11.1 -bleach==6.0.0 -bokeh==3.0.3 -cffi==1.15.1 -colorama==0.4.6; platform_system == "Windows" -comm==0.1.2 -contourpy==1.0.7 -cycler==0.11.0 -debugpy==1.6.6 -decorator==5.1.1 -defusedxml==0.7.1 -entrypoints==0.4 -executing==1.2.0 -fastjsonschema==2.16.2 -fonttools==4.38.0 -fqdn==1.5.1 -idna==3.4 -ipykernel==6.20.2 -ipython==8.8.0 -ipython-genutils==0.2.0 -ipywidgets==8.0.4 -isoduration==20.11.0 -jedi==0.18.2 -Jinja2==3.1.2 -jsonpointer==2.3 -jsonschema==4.17.3 -jupyter==1.0.0 -jupyter-console==6.4.4 -jupyter-events==0.6.3 -jupyter_client==7.4.9 -jupyter_core==5.1.5 -jupyter_server==2.1.0 -jupyter_server_terminals==0.4.4 -jupyterlab-pygments==0.2.2 -jupyterlab-widgets==3.0.5 -kiwisolver==1.4.4 -MarkupSafe==2.1.2 -matplotlib==3.6.3 -matplotlib-inline==0.1.6 -mistune==2.0.4 -nbclassic==0.4.8 -nbclient==0.7.2 -nbconvert==7.2.9 -nbformat==5.7.3 -nest-asyncio==1.5.6 -notebook==6.5.2 -notebook_shim==0.2.2 -numpy==1.24.1 -packaging==23.0 -pandas==1.5.3 -pandocfilters==1.5.0 -parso==0.8.3 -pexpect==4.8.0 -pickleshare==0.7.5 -Pillow==9.4.0 -platformdirs==2.6.2 -prometheus-client==0.16.0 -prompt-toolkit==3.0.36 -psutil==5.9.4 -ptyprocess==0.7.0 -pure-eval==0.2.2 -pycparser==2.21 -Pygments==2.14.0 -pyparsing==3.0.9 -pyrsistent==0.19.3 -python-dateutil==2.8.2 -python-json-logger==2.0.4 -pytz==2022.7.1 -pywin32==305; platform_system == "Windows" -pywinpty==2.0.10; platform_system == "Windows" -PyYAML==6.0 -pyzmq==25.0.0 -qtconsole==5.4.0 -QtPy==2.3.0 -rfc3339-validator==0.1.4 -rfc3986-validator==0.1.1 -Send2Trash==1.8.0 -six==1.16.0 -sniffio==1.3.0 -soupsieve==2.3.2.post1 -stack-data==0.6.2 -terminado==0.17.1 -testpath==0.6.0 -tinycss2==1.2.1 -tornado==6.2 -traitlets==5.8.1 -uri-template==1.2.0 -wcwidth==0.2.6 -webcolors==1.12 -webencodings==0.5.1 -websocket-client==1.4.2 -widgetsnbextension==4.0.5 -xyzservices==2022.9.0 diff --git a/tests/run-tests.ps1 b/tests/run-tests.ps1 index ac6e21bf5b5..276a06e4c4e 100644 --- a/tests/run-tests.ps1 +++ b/tests/run-tests.ps1 @@ -46,7 +46,7 @@ Write-Host "> Restoring python environment in virtualenv..." If ($QUARTO_TESTS_VIRTUALENV -ne "FALSE") { $Env:QUARTO_PYTHON=$null - py -m pip install -r requirements.txt --prefer-binary -q + pipenv install --extra-pip-args="--prefer-binary" } else { Write-Host -ForegroundColor "red" ">> No testing with Python" } diff --git a/tests/run-tests.sh b/tests/run-tests.sh index 4ccd71d40b1..a7593efe7ef 100755 --- a/tests/run-tests.sh +++ b/tests/run-tests.sh @@ -32,7 +32,7 @@ Rscript -e "renv::restore()" # Ensure that we've actived the python env if [[ $QUARTO_TESTS_VIRTUALENV != "FALSE" ]]; then - python3 -m pip install -r requirements.txt --prefer-binary -q + pipenv install --extra-pip-args="--prefer-binary" fi # Ensure that tinytex is installed From 493afbf0d2ed0d04d277254933a47ff41fa09f3a Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 15 Feb 2023 15:02:08 +0100 Subject: [PATCH 73/99] [test environment] Add the Julia Manifest of locked packages --- tests/Manifest.toml | 963 +++++++++++++++++++++++++++++++++++++++ tests/configure-test.ps1 | 2 +- 2 files changed, 964 insertions(+), 1 deletion(-) create mode 100644 tests/Manifest.toml diff --git a/tests/Manifest.toml b/tests/Manifest.toml new file mode 100644 index 00000000000..9663ec54294 --- /dev/null +++ b/tests/Manifest.toml @@ -0,0 +1,963 @@ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.8.5" +manifest_format = "2.0" +project_hash = "0af1d64f93f9c216a25d220e89fda045c4edc0aa" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.BitFlags]] +git-tree-sha1 = "43b1a4a8f797c1cddadf60499a8a077d4af2cd2d" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.7" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "19a35467a82e236ff51bc17a3a44b69ef35185a2" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.8+0" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "4b859a208b2397a7a623a03449e4636bdb17bcf2" +uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" +version = "1.16.1+1" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "c6d890a52d2c4d55d326439580c3b8d0875a77d9" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.15.7" + +[[deps.ChangesOfVariables]] +deps = ["ChainRulesCore", "LinearAlgebra", "Test"] +git-tree-sha1 = "844b061c104c408b24537482469400af6075aae4" +uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" +version = "0.1.5" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "9c209fb7536406834aa938fb149964b985de6c83" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.1" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "Random", "SnoopPrecompile"] +git-tree-sha1 = "aa3edc8f8dea6cbfa176ee12f7c2fc82f0608ed3" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.20.0" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "eb7f0f8307f71fac7c606984ea5fb2817275d6e4" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.4" + +[[deps.ColorVectorSpace]] +deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "SpecialFunctions", "Statistics", "TensorCore"] +git-tree-sha1 = "600cc5508d66b78aae350f7accdb58763ac18589" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.9.10" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "fc08e5930ee9a4e03f84bfb5211cb54e7769758a" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.10" + +[[deps.Compat]] +deps = ["Dates", "LinearAlgebra", "UUIDs"] +git-tree-sha1 = "61fdd77467a5c3ad071ef8277ac6bd6af7dd4c04" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.6.0" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.0.1+0" + +[[deps.Conda]] +deps = ["Downloads", "JSON", "VersionParsing"] +git-tree-sha1 = "e32a90da027ca45d84678b826fffd3110bb3fc90" +uuid = "8f4d0f93-b110-5947-807f-2305c1781a2d" +version = "1.8.0" + +[[deps.Contour]] +git-tree-sha1 = "d05d9e7b7aedff4e5b51a029dced05cfb6125781" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.6.2" + +[[deps.DataAPI]] +git-tree-sha1 = "e8119c1a33d267e16108be441a287a6981ba1630" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.14.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "d1fff3a548102f48987a52a2e0d114fa97d730f0" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.13" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.DelimitedFiles]] +deps = ["Mmap"] +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.3" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "bad72f730e9e91c08d9427d5e8db95478a3c323d" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.4.8+0" + +[[deps.FFMPEG]] +deps = ["FFMPEG_jll"] +git-tree-sha1 = "b57e3acbe22f8484b4b5ff66a7499717fe1a9cc8" +uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" +version = "0.4.1" + +[[deps.FFMPEG_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Pkg", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "74faea50c1d007c85837327f6775bea60b5492dd" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.2+2" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "21efd19106a55620a188615da6d3d06cd7f6ee03" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.13.93+0" + +[[deps.Formatting]] +deps = ["Printf"] +git-tree-sha1 = "8339d61043228fdd3eb658d86c926cb282ae72a8" +uuid = "59287772-0a20-5a39-b81b-1366585eb4c0" +version = "0.4.2" + +[[deps.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "87eb71354d8ec1a96d4a7636bd57a7347dde3ef9" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.10.4+0" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "aa31987c2ba8704e23c6c8ba8a4f769d5d7e4f91" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.10+0" + +[[deps.GLFW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pkg", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] +git-tree-sha1 = "d972031d28c8c8d9d7b41a536ad7bb0c2579caca" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.3.8+0" + +[[deps.GR]] +deps = ["Artifacts", "Base64", "DelimitedFiles", "Downloads", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Pkg", "Preferences", "Printf", "Random", "Serialization", "Sockets", "TOML", "Tar", "Test", "UUIDs", "p7zip_jll"] +git-tree-sha1 = "660b2ea2ec2b010bb02823c6d0ff6afd9bdc5c16" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.71.7" + +[[deps.GR_jll]] +deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Qt5Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "d5e1fd17ac7f3aa4c5287a61ee28d4f8b8e98873" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.71.7+0" + +[[deps.Gettext_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" +uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" +version = "0.21.0+0" + +[[deps.Glib_jll]] +deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "d3b3624125c1474292d0d8ed0f65554ac37ddb23" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.74.0+2" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.14+0" + +[[deps.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "Dates", "IniFile", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "37e4657cd56b11abe3d10cd4a1ec5fbdb4180263" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.7.4" + +[[deps.HarfBuzz_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg"] +git-tree-sha1 = "129acf094d168394e80ee1dc4bc06ec835e510a3" +uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" +version = "2.8.1+1" + +[[deps.IJulia]] +deps = ["Base64", "Conda", "Dates", "InteractiveUtils", "JSON", "Libdl", "Logging", "Markdown", "MbedTLS", "Pkg", "Printf", "REPL", "Random", "SoftGlobalScope", "Test", "UUIDs", "ZMQ"] +git-tree-sha1 = "59e19713542dd9dd02f31d59edbada69530d6a14" +uuid = "7073ff75-c697-5162-941a-fcdaad2a7d2a" +version = "1.24.0" + +[[deps.IniFile]] +git-tree-sha1 = "f550e6e32074c939295eb5ea6de31849ac2c9625" +uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f" +version = "0.5.1" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.InverseFunctions]] +deps = ["Test"] +git-tree-sha1 = "49510dfcb407e572524ba94aeae2fced1f3feb0f" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.8" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "7fd44fd4ff43fc60815f8e764c0f352b83c49151" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.1.1" + +[[deps.JLFzf]] +deps = ["Pipe", "REPL", "Random", "fzf_jll"] +git-tree-sha1 = "f377670cda23b6b7c1c0b3893e37451c5c1a2185" +uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" +version = "0.1.5" + +[[deps.JLLWrappers]] +deps = ["Preferences"] +git-tree-sha1 = "abc9885a7ca2052a736a600f7fa66209f96506e1" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.4.1" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "3c837543ddb02250ef42f4738347454f95079d4e" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.3" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b53380851c6e6664204efb2e62cd24fa5c47e4ba" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "2.1.2+0" + +[[deps.LAME_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "f6250b16881adf048549549fba48b1161acdac8c" +uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" +version = "3.100.1+0" + +[[deps.LERC_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "bf36f528eec6634efc60d7ec062008f171071434" +uuid = "88015f11-f218-50d7-93a8-a6af411a945d" +version = "3.0.0+1" + +[[deps.LZO_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e5b909bcf985c5e2605737d2ce278ed791b89be6" +uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" +version = "2.10.1+0" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "f2355693d6778a178ade15952b7ac47a4ff97996" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.3.0" + +[[deps.Latexify]] +deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Printf", "Requires"] +git-tree-sha1 = "2422f47b34d4b127720a18f86fa7b1aa2e141f29" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.15.18" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.2.2+1" + +[[deps.Libgcrypt_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll", "Pkg"] +git-tree-sha1 = "64613c82a59c120435c067c2b809fc61cf5166ae" +uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" +version = "1.8.7+0" + +[[deps.Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "6f73d1dd803986947b2c750138528a999a6c7733" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.6.0+0" + +[[deps.Libgpg_error_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "c333716e46366857753e273ce6a69ee0945a6db9" +uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" +version = "1.42.0+0" + +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "c7cb1f5d892775ba13767a87c7ada0b980ea0a71" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.16.1+2" + +[[deps.Libmount_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "9c30530bf0effd46e15e0fdcf2b8636e78cbbd73" +uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" +version = "2.35.0+0" + +[[deps.Libtiff_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "Pkg", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "3eb79b0ca5764d4799c06699573fd8f533259713" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.4.0+0" + +[[deps.Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "7f3efec06033682db852f8b3bc3c1d2b0a0ab066" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.36.0+0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.LogExpFunctions]] +deps = ["ChainRulesCore", "ChangesOfVariables", "DocStringExtensions", "InverseFunctions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "680e733c3a0a9cea9e935c8c2184aea6a63fa0b5" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.21" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "cedb76b37bc5a6c702ade66be44f831fa23c681e" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "1.0.0" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "42324d08725e200c23d4dfb549e0d5d89dede2d2" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.10" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "Random", "Sockets"] +git-tree-sha1 = "03a9b9718f5682ecb107ac9f7308991db4ce395b" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.7" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.0+0" + +[[deps.Measures]] +git-tree-sha1 = "c13304c81eec1ed3af7fc20e75fb6b26092a1102" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.2" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "f66bdc5de519e8f8ae43bdc598782d35a25b1272" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.1.0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.2.1" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "a7c3d1da1189a1c2fe843a3bfa04d18d20eb3211" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.0.1" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.20+0" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+0" + +[[deps.OpenSSL]] +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "6503b77492fd7fcb9379bf73cd31035670e3c509" +uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" +version = "1.3.3" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "9ff31d101d987eb9d66bd8b176ac7c277beccd09" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "1.1.20+0" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.5+0" + +[[deps.Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.3.2+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.4.1" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.40.0+0" + +[[deps.Parsers]] +deps = ["Dates", "SnoopPrecompile"] +git-tree-sha1 = "6f4fbcd1ad45905a5dee3f4256fabb49aa2110c6" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.5.7" + +[[deps.Pipe]] +git-tree-sha1 = "6842804e7867b115ca9de748a0cf6b364523c16d" +uuid = "b98c9c47-44ae-5843-9183-064241ee97a0" +version = "1.3.0" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b4f5d02549a10e20780a24fce72bea96b6329e29" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.40.1+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.8.0" + +[[deps.PlotThemes]] +deps = ["PlotUtils", "Statistics"] +git-tree-sha1 = "1f03a2d339f42dca4a4da149c7e15e9b896ad899" +uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" +version = "3.1.0" + +[[deps.PlotUtils]] +deps = ["ColorSchemes", "Colors", "Dates", "Printf", "Random", "Reexport", "SnoopPrecompile", "Statistics"] +git-tree-sha1 = "c95373e73290cf50a8a22c3375e4625ded5c5280" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.3.4" + +[[deps.Plots]] +deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "Preferences", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SnoopPrecompile", "SparseArrays", "Statistics", "StatsBase", "UUIDs", "UnicodeFun", "Unzip"] +git-tree-sha1 = "8ac949bd0ebc46a44afb1fdca1094554a84b086e" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.38.5" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "47e5f437cc0e7ef2ce8406ce1e7e24d44915f88d" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.3.0" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.Qt5Base_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "xkbcommon_jll"] +git-tree-sha1 = "0c03844e2231e12fda4d0086fd7cbe4098ee8dc5" +uuid = "ea2cea3b-5b76-57ae-a6ef-0a8af62496e1" +version = "5.15.3+2" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.RecipesBase]] +deps = ["SnoopPrecompile"] +git-tree-sha1 = "261dddd3b862bd2c940cf6ca4d1c8fe593e457c8" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.3.3" + +[[deps.RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "RecipesBase", "SnoopPrecompile"] +git-tree-sha1 = "e974477be88cb5e3040009f3767611bc6357846f" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.6.11" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "90bc7a7c96410424509e4263e277e43250c05691" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "1.0.0" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "f94f779c94e58bf9ea243e77a37e16d9de9126bd" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.1.1" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.Showoff]] +deps = ["Dates", "Grisu"] +git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" +uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" +version = "1.0.3" + +[[deps.SimpleBufferStream]] +git-tree-sha1 = "874e8867b33a00e784c8a7e4b60afe9e037b74e1" +uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" +version = "1.1.0" + +[[deps.SnoopPrecompile]] +deps = ["Preferences"] +git-tree-sha1 = "e760a70afdcd461cf01a575947738d359234665c" +uuid = "66db9d55-30c0-4569-8b51-7e840670fc0c" +version = "1.0.3" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SoftGlobalScope]] +deps = ["REPL"] +git-tree-sha1 = "986ec2b6162ccb95de5892ed17832f95badf770c" +uuid = "b85f4697-e234-5449-a836-ec8e2f98b302" +version = "1.1.0" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "a4ada03f999bd01b3a25dcaa30b2d929fe537e00" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.1.0" + +[[deps.SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.SpecialFunctions]] +deps = ["ChainRulesCore", "IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "d75bda01f8c31ebb72df80a46c88b25d1c79c56d" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.1.7" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "f9af7f195fb13589dd2e2d57fdb401717d2eb1f6" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.5.0" + +[[deps.StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "d1bf48bfcc554a3761a133fe3a9bb01488e06916" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.33.21" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.0" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.1" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.TranscodingStreams]] +deps = ["Random", "Test"] +git-tree-sha1 = "94f38103c984f89cf77c402f2a68dbd870f8165f" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.9.11" + +[[deps.URIs]] +git-tree-sha1 = "074f993b0ca030848b897beff716d93aca60f06a" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.4.2" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.UnicodeFun]] +deps = ["REPL"] +git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" +uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" +version = "0.4.1" + +[[deps.Unzip]] +git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" +uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" +version = "0.2.0" + +[[deps.VersionParsing]] +git-tree-sha1 = "58d6e80b4ee071f5efd07fda82cb9fbe17200868" +uuid = "81def892-9a0e-5fdd-b105-ffc91e053289" +version = "1.3.0" + +[[deps.Wayland_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "ed8d92d9774b077c53e1da50fd81a36af3744c1c" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.21.0+0" + +[[deps.Wayland_protocols_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4528479aa01ee1b3b4cd0e6faef0e04cf16466da" +uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" +version = "1.25.0+0" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "93c41695bc1c08c46c5899f4fe06d6ead504bb73" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.10.3+0" + +[[deps.XSLT_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "Pkg", "XML2_jll", "Zlib_jll"] +git-tree-sha1 = "91844873c4085240b95e795f692c4cec4d805f8a" +uuid = "aed1982a-8fda-507f-9586-7b0439959a61" +version = "1.1.34+0" + +[[deps.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "5be649d550f3f4b95308bf0183b82e2582876527" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.6.9+4" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4e490d5c960c314f33885790ed410ff3a94ce67e" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.9+4" + +[[deps.Xorg_libXcursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "12e0eb3bc634fa2080c1c37fccf56f7c22989afd" +uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" +version = "1.2.0+4" + +[[deps.Xorg_libXdmcp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fe47bd2247248125c428978740e18a681372dd4" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.3+4" + +[[deps.Xorg_libXext_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "b7c0aa8c376b31e4852b360222848637f481f8c3" +uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" +version = "1.3.4+4" + +[[deps.Xorg_libXfixes_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "0e0dc7431e7a0587559f9294aeec269471c991a4" +uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" +version = "5.0.3+4" + +[[deps.Xorg_libXi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] +git-tree-sha1 = "89b52bc2160aadc84d707093930ef0bffa641246" +uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" +version = "1.7.10+4" + +[[deps.Xorg_libXinerama_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll"] +git-tree-sha1 = "26be8b1c342929259317d8b9f7b53bf2bb73b123" +uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" +version = "1.1.4+4" + +[[deps.Xorg_libXrandr_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "34cea83cb726fb58f325887bf0612c6b3fb17631" +uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" +version = "1.5.2+4" + +[[deps.Xorg_libXrender_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "19560f30fd49f4d4efbe7002a1037f8c43d43b96" +uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" +version = "0.9.10+4" + +[[deps.Xorg_libpthread_stubs_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "6783737e45d3c59a4a4c4091f5f88cdcf0908cbb" +uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" +version = "0.1.0+3" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] +git-tree-sha1 = "daf17f441228e7a3833846cd048892861cff16d6" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.13.0+3" + +[[deps.Xorg_libxkbfile_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "926af861744212db0eb001d9e40b5d16292080b2" +uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" +version = "1.1.0+4" + +[[deps.Xorg_xcb_util_image_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "0fab0a40349ba1cba2c1da699243396ff8e94b97" +uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll"] +git-tree-sha1 = "e7fd7b2881fa2eaa72717420894d3938177862d1" +uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_keysyms_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "d1151e2c45a544f32441a567d1690e701ec89b00" +uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_renderutil_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "dfd7a8f38d4613b6a575253b3174dd991ca6183e" +uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" +version = "0.3.9+1" + +[[deps.Xorg_xcb_util_wm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "e78d10aab01a4a154142c5006ed44fd9e8e31b67" +uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" +version = "0.4.1+1" + +[[deps.Xorg_xkbcomp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "4bcbf660f6c2e714f87e960a171b119d06ee163b" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.2+4" + +[[deps.Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "5c8424f8a67c3f2209646d4425f3d415fee5931d" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.27.0+4" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "79c31e7844f6ecf779705fbc12146eb190b7d845" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.4.0+3" + +[[deps.ZMQ]] +deps = ["FileWatching", "Sockets", "ZeroMQ_jll"] +git-tree-sha1 = "356d2bdcc0bce90aabee1d1c0f6d6f301eda8f77" +uuid = "c2297ded-f4af-51ae-bb23-16f91089e4e1" +version = "1.2.2" + +[[deps.ZeroMQ_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "libsodium_jll"] +git-tree-sha1 = "fe5c65a526f066fb3000da137d5785d9649a8a47" +uuid = "8f1865be-045e-5c20-9c9f-bfbfb0764568" +version = "4.3.4+0" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.12+3" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "c6edfe154ad7b313c01aceca188c05c835c67360" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.4+0" + +[[deps.fzf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "868e669ccb12ba16eaf50cb2957ee2ff61261c56" +uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" +version = "0.29.0+0" + +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "3a2ea60308f0996d26f1e5354e10c24e9ef905d4" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.4.0+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.1+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl", "OpenBLAS_jll"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.1.1+0" + +[[deps.libfdk_aac_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "daacc84a041563f965be61859a36e17c4e4fcd55" +uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" +version = "2.0.2+0" + +[[deps.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "94d180a6d2b5e55e447e2d27a29ed04fe79eb30c" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.38+0" + +[[deps.libsodium_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "848ab3d00fe39d6fbc2a8641048f8f272af1c51e" +uuid = "a9144af2-ca23-56d9-984f-0d03f7b5ccf8" +version = "1.0.20+0" + +[[deps.libvorbis_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] +git-tree-sha1 = "b910cb81ef3fe6e78bf6acee440bda86fd6ae00c" +uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" +version = "1.3.7+1" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" + +[[deps.xkbcommon_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "9ebfc140cc56e8c2156a15ceac2f0302e327ac0a" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "1.4.1+0" diff --git a/tests/configure-test.ps1 b/tests/configure-test.ps1 index f63f6906129..043cfda0cbc 100644 --- a/tests/configure-test.ps1 +++ b/tests/configure-test.ps1 @@ -17,7 +17,7 @@ If ( $py -and $python -and $env:VIRTUAL_ENV -eq $null) { pipenv install } -try {$null = gcm julia -ea stop; julia=$true } catch { +try {$null = gcm julia -ea stop; $julia=$true } catch { Write-Host -ForegroundColor red "Missing Julia - An installation is required" } From f9e666c6aecfbe95529a88e98455087c5d2d8620 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 15 Feb 2023 15:54:46 +0100 Subject: [PATCH 74/99] [gha] Fix linux by installing missing curl deps --- .github/workflows/test-smokes.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index e8f9d7a184f..23249f8d505 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -72,6 +72,11 @@ jobs: restore-keys: | ${{ steps.get-version.outputs.os-version }}-${{ steps.get-version.outputs.r-version }}-renv-1- + - name: Install missing system deps + if: runner.os == 'Linux' + run: | + sudo apt-get update -y && sudo apt-get install -y libcurl4-openssl-dev + - name: Restore R packages working-directory: tests env: From a0c5ba6bd6dfe3df60e9acdfd9b0a2e1219af5da Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 15 Feb 2023 16:12:21 +0100 Subject: [PATCH 75/99] [gha] PAK does not work for renv::restore() yet --- .github/workflows/test-smokes.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index 23249f8d505..ed9d1c97503 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -79,8 +79,6 @@ jobs: - name: Restore R packages working-directory: tests - env: - RENV_CONFIG_PAK_ENABLED: TRUE run: | if (!requireNamespace('renv', quietly = TRUE)) install.packages('renv') renv::restore() From 773456480dbabb7bfdbe581c728f754fbadf6956 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 15 Feb 2023 15:44:33 +0100 Subject: [PATCH 76/99] Update helper configuration script --- tests/.gitignore | 3 ++- tests/configure-test.ps1 | 4 ++-- tests/configure-test.sh | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 3 deletions(-) create mode 100755 tests/configure-test.sh diff --git a/tests/.gitignore b/tests/.gitignore index bb5bf639eda..57bd231639e 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -7,4 +7,5 @@ ENV/ env.bak/ venv.bak/ -bin/ \ No newline at end of file +bin/ +/.luarc.json diff --git a/tests/configure-test.ps1 b/tests/configure-test.ps1 index 043cfda0cbc..663b2c3ba08 100644 --- a/tests/configure-test.ps1 +++ b/tests/configure-test.ps1 @@ -9,7 +9,7 @@ try { $null = gcm python -ea stop; $python=$true } catch { } try { $null = gcm pipenv -ea stop; $pipenv=$true } catch { - Write-Host -ForegroundColor red "No python found in PATH - Install python" + Write-Host -ForegroundColor red "No pipenv found in PATH - Install pipenv running ``pip install pipenv``" } If ( $py -and $python -and $env:VIRTUAL_ENV -eq $null) { @@ -23,7 +23,7 @@ try {$null = gcm julia -ea stop; $julia=$true } catch { If ($julia) { # TODO: Check to do equivalent of virtualenv - Write-Host "Setting up Julia global environment" + Write-Host "Setting up Julia environment" julia --color=yes --project=. -e 'import Pkg; Pkg.instantiate(); Pkg.build("IJulia"); Pkg.precompile()' } diff --git a/tests/configure-test.sh b/tests/configure-test.sh new file mode 100755 index 00000000000..7aab19345f0 --- /dev/null +++ b/tests/configure-test.sh @@ -0,0 +1,37 @@ +# Check python test environment --- +python_exists=$(which python) +if [ -z $python_exists ] +then + echo "No python found in PATH - Install python." +else + pipenv_exist=$(which pipenv) + if [ -z $pipenv_exist ] + then + echo "No pipenv found in PATH - Install pipenv running \`pip install pipenv\`." + else + echo "Setting up python environnement with pipenv" + pipenv install + fi +fi + +# Check Julia environment +julia_exists=$(which julia) +if [ -z $julia_exists ] +then + echo "No julia found in PATH - Install Julia." +else + echo "Setting up Julia environment" + julia --color=yes --project=. -e 'import Pkg; Pkg.instantiate(); Pkg.build("IJulia"); Pkg.precompile()' +fi + +# Update tinytex +if [ -z $GH_TOKEN ] && [ -n $(which gh) ] +then + echo "Setting GH_TOKEN env var for Github Download." + export GH_TOKEN=$(gh auth token) +fi + +if [ -n $(which quarto) ] +then + quarto install tinytex +fi From 2bccf18360feb6b4991b8f41149c252234211050 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 15 Feb 2023 16:37:59 +0100 Subject: [PATCH 77/99] [test environment] pexpect module is required for quarto check on Linux It is not needed on Windows it seems --- tests/Pipfile | 1 + tests/Pipfile.lock | 63 ++++++++++++++-------------------------------- 2 files changed, 20 insertions(+), 44 deletions(-) diff --git a/tests/Pipfile b/tests/Pipfile index fd7347146b9..27a174a785e 100644 --- a/tests/Pipfile +++ b/tests/Pipfile @@ -8,6 +8,7 @@ jupyter = "*" bokeh = "*" pandas = "*" matplotlib = "*" +pexpect = {version = "*", sys_platform = "!= 'win32'"} [dev-packages] diff --git a/tests/Pipfile.lock b/tests/Pipfile.lock index 86d5d87e415..edff4066b60 100644 --- a/tests/Pipfile.lock +++ b/tests/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "71ae4cb4451125861a48c8f6bb4915e9f53327e1995873607cfb2a5cbb8651ae" + "sha256": "4f8e8d89512ec05ea037fc84340d2c6966d217d276f7a0ffdeb203d0ee013838" }, "pipfile-spec": 6, "requires": { @@ -182,14 +182,6 @@ ], "version": "==1.15.1" }, - "colorama": { - "hashes": [ - "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", - "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" - ], - "markers": "sys_platform == 'win32'", - "version": "==0.4.6" - }, "comm": { "hashes": [ "sha256:3e2f5826578e683999b93716285b3b1f344f157bf75fa9ce0a797564e742f062", @@ -455,11 +447,11 @@ }, "jupyter-server": { "hashes": [ - "sha256:5afb8a0cdfee37d02d69bdf470ae9cbb1dee5d4788f9bc6cc8e54bd8c83fb096", - "sha256:854fb7d49f6b7f545d4f8354172b004dcda887ba0699def7112daf785ba3c9ce" + "sha256:29d6657bfb160b0e39b9030d67f33f918a188f2eba28065314a933b327fef872", + "sha256:b15078954120886d580e19d1746e2b62a3dc7bd082cb4716115c25fcd7061b00" ], "markers": "python_version >= '3.8'", - "version": "==2.2.1" + "version": "==2.3.0" }, "jupyter-server-terminals": { "hashes": [ @@ -824,6 +816,14 @@ "markers": "python_version >= '3.6'", "version": "==0.8.3" }, + "pexpect": { + "hashes": [ + "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937", + "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c" + ], + "index": "pypi", + "version": "==4.8.0" + }, "pickleshare": { "hashes": [ "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca", @@ -958,6 +958,13 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==5.9.4" }, + "ptyprocess": { + "hashes": [ + "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", + "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220" + ], + "version": "==0.7.0" + }, "pure-eval": { "hashes": [ "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350", @@ -1044,38 +1051,6 @@ ], "version": "==2022.7.1" }, - "pywin32": { - "hashes": [ - "sha256:109f98980bfb27e78f4df8a51a8198e10b0f347257d1e265bb1a32993d0c973d", - "sha256:13362cc5aa93c2beaf489c9c9017c793722aeb56d3e5166dadd5ef82da021fe1", - "sha256:19ca459cd2e66c0e2cc9a09d589f71d827f26d47fe4a9d09175f6aa0256b51c2", - "sha256:326f42ab4cfff56e77e3e595aeaf6c216712bbdd91e464d167c6434b28d65990", - "sha256:421f6cd86e84bbb696d54563c48014b12a23ef95a14e0bdba526be756d89f116", - "sha256:48d8b1659284f3c17b68587af047d110d8c44837736b8932c034091683e05863", - "sha256:4ecd404b2c6eceaca52f8b2e3e91b2187850a1ad3f8b746d0796a98b4cea04db", - "sha256:50768c6b7c3f0b38b7fb14dd4104da93ebced5f1a50dc0e834594bff6fbe1271", - "sha256:56d7a9c6e1a6835f521788f53b5af7912090674bb84ef5611663ee1595860fc7", - "sha256:73e819c6bed89f44ff1d690498c0a811948f73777e5f97c494c152b850fad478", - "sha256:742eb905ce2187133a29365b428e6c3b9001d79accdc30aa8969afba1d8470f4", - "sha256:9d968c677ac4d5cbdaa62fd3014ab241718e619d8e36ef8e11fb930515a1e918", - "sha256:9dd98384da775afa009bc04863426cb30596fd78c6f8e4e2e5bbf4edf8029504", - "sha256:a55db448124d1c1484df22fa8bbcbc45c64da5e6eae74ab095b9ea62e6d00496" - ], - "markers": "sys_platform == 'win32' and platform_python_implementation != 'PyPy'", - "version": "==305" - }, - "pywinpty": { - "hashes": [ - "sha256:38cb924f2778b5751ef91a75febd114776b3af0ae411bc667be45dd84fc881d3", - "sha256:3c46aef80dd50979aff93de199e4a00a8ee033ba7a03cadf0a91fed45f0c39d7", - "sha256:4c7d06ad10f6e92bc850a467f26d98f4f30e73d2fe5926536308c6ae0566bc16", - "sha256:7ffbd66310b83e42028fc9df7746118978d94fba8c1ebf15a7c1275fdd80b28a", - "sha256:902d79444b29ad1833b8d5c3c9aabdfd428f4f068504430df18074007c8c0de8", - "sha256:cdbb5694cf8c7242c2ecfaca35c545d31fa5d5814c3d67a4e628f803f680ebea" - ], - "markers": "os_name == 'nt'", - "version": "==2.0.10" - }, "pyyaml": { "hashes": [ "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf", From 8c52871f2856ca966d7710cb28f7227f692ee2d0 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 15 Feb 2023 16:43:01 +0100 Subject: [PATCH 78/99] [test environment] update configuration file --- tests/{configure-test.ps1 => configure-test-env.ps1} | 2 +- tests/{configure-test.sh => configure-test-env.sh} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename tests/{configure-test.ps1 => configure-test-env.ps1} (95%) rename tests/{configure-test.sh => configure-test-env.sh} (100%) mode change 100755 => 100644 diff --git a/tests/configure-test.ps1 b/tests/configure-test-env.ps1 similarity index 95% rename from tests/configure-test.ps1 rename to tests/configure-test-env.ps1 index 663b2c3ba08..59db4e2d8e9 100644 --- a/tests/configure-test.ps1 +++ b/tests/configure-test-env.ps1 @@ -12,7 +12,7 @@ try { $null = gcm pipenv -ea stop; $pipenv=$true } catch { Write-Host -ForegroundColor red "No pipenv found in PATH - Install pipenv running ``pip install pipenv``" } -If ( $py -and $python -and $env:VIRTUAL_ENV -eq $null) { +If ( $py -and $python -and $pipenv) { Write-Host "Setting up python environnement with pipenv" pipenv install } diff --git a/tests/configure-test.sh b/tests/configure-test-env.sh old mode 100755 new mode 100644 similarity index 100% rename from tests/configure-test.sh rename to tests/configure-test-env.sh From ee07cd19bd3e482255e9a43acc3bfb5bea378f0b Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 15 Feb 2023 16:43:23 +0100 Subject: [PATCH 79/99] [test environment] Update python lock file on windows --- tests/Pipfile.lock | 51 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/tests/Pipfile.lock b/tests/Pipfile.lock index edff4066b60..53398c78e2c 100644 --- a/tests/Pipfile.lock +++ b/tests/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "4f8e8d89512ec05ea037fc84340d2c6966d217d276f7a0ffdeb203d0ee013838" + "sha256": "1302abafbe0b0d6d8067e1e59cc61440c364478be2313586bcb732b759472602" }, "pipfile-spec": 6, "requires": { @@ -182,6 +182,14 @@ ], "version": "==1.15.1" }, + "colorama": { + "hashes": [ + "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", + "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" + ], + "markers": "sys_platform == 'win32'", + "version": "==0.4.6" + }, "comm": { "hashes": [ "sha256:3e2f5826578e683999b93716285b3b1f344f157bf75fa9ce0a797564e742f062", @@ -821,7 +829,7 @@ "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937", "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c" ], - "index": "pypi", + "markers": "sys_platform != 'win32'", "version": "==4.8.0" }, "pickleshare": { @@ -958,13 +966,6 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==5.9.4" }, - "ptyprocess": { - "hashes": [ - "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", - "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220" - ], - "version": "==0.7.0" - }, "pure-eval": { "hashes": [ "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350", @@ -1051,6 +1052,38 @@ ], "version": "==2022.7.1" }, + "pywin32": { + "hashes": [ + "sha256:109f98980bfb27e78f4df8a51a8198e10b0f347257d1e265bb1a32993d0c973d", + "sha256:13362cc5aa93c2beaf489c9c9017c793722aeb56d3e5166dadd5ef82da021fe1", + "sha256:19ca459cd2e66c0e2cc9a09d589f71d827f26d47fe4a9d09175f6aa0256b51c2", + "sha256:326f42ab4cfff56e77e3e595aeaf6c216712bbdd91e464d167c6434b28d65990", + "sha256:421f6cd86e84bbb696d54563c48014b12a23ef95a14e0bdba526be756d89f116", + "sha256:48d8b1659284f3c17b68587af047d110d8c44837736b8932c034091683e05863", + "sha256:4ecd404b2c6eceaca52f8b2e3e91b2187850a1ad3f8b746d0796a98b4cea04db", + "sha256:50768c6b7c3f0b38b7fb14dd4104da93ebced5f1a50dc0e834594bff6fbe1271", + "sha256:56d7a9c6e1a6835f521788f53b5af7912090674bb84ef5611663ee1595860fc7", + "sha256:73e819c6bed89f44ff1d690498c0a811948f73777e5f97c494c152b850fad478", + "sha256:742eb905ce2187133a29365b428e6c3b9001d79accdc30aa8969afba1d8470f4", + "sha256:9d968c677ac4d5cbdaa62fd3014ab241718e619d8e36ef8e11fb930515a1e918", + "sha256:9dd98384da775afa009bc04863426cb30596fd78c6f8e4e2e5bbf4edf8029504", + "sha256:a55db448124d1c1484df22fa8bbcbc45c64da5e6eae74ab095b9ea62e6d00496" + ], + "markers": "sys_platform == 'win32' and platform_python_implementation != 'PyPy'", + "version": "==305" + }, + "pywinpty": { + "hashes": [ + "sha256:38cb924f2778b5751ef91a75febd114776b3af0ae411bc667be45dd84fc881d3", + "sha256:3c46aef80dd50979aff93de199e4a00a8ee033ba7a03cadf0a91fed45f0c39d7", + "sha256:4c7d06ad10f6e92bc850a467f26d98f4f30e73d2fe5926536308c6ae0566bc16", + "sha256:7ffbd66310b83e42028fc9df7746118978d94fba8c1ebf15a7c1275fdd80b28a", + "sha256:902d79444b29ad1833b8d5c3c9aabdfd428f4f068504430df18074007c8c0de8", + "sha256:cdbb5694cf8c7242c2ecfaca35c545d31fa5d5814c3d67a4e628f803f680ebea" + ], + "markers": "os_name == 'nt'", + "version": "==2.0.10" + }, "pyyaml": { "hashes": [ "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf", From 76b19f242d9baeef41d50f056324c556b8337360 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 15 Feb 2023 16:48:59 +0100 Subject: [PATCH 80/99] [test environment] Also check and configure R environment --- tests/configure-test-env.ps1 | 10 ++++++++++ tests/configure-test-env.sh | 11 +++++++++++ 2 files changed, 21 insertions(+) diff --git a/tests/configure-test-env.ps1 b/tests/configure-test-env.ps1 index 59db4e2d8e9..e6cabe04a96 100644 --- a/tests/configure-test-env.ps1 +++ b/tests/configure-test-env.ps1 @@ -1,3 +1,12 @@ +# Check R environment --- +try { $null = gcm Rscript -ea stop; $r=$true} catch { + Write-Host -ForegroundColor red "Missing Rscript - Install R" +} + +If ($r) { + renv::restore(repos = c(RSPM = "https://packagemanager.posit.co/cran/latest")) +} + # Check python test environment --- try { $null = gcm py -ea stop; $py=$true} catch { @@ -17,6 +26,7 @@ If ( $py -and $python -and $pipenv) { pipenv install } +# Check Julia environment --- try {$null = gcm julia -ea stop; $julia=$true } catch { Write-Host -ForegroundColor red "Missing Julia - An installation is required" } diff --git a/tests/configure-test-env.sh b/tests/configure-test-env.sh index 7aab19345f0..9d2fbbf2bc6 100644 --- a/tests/configure-test-env.sh +++ b/tests/configure-test-env.sh @@ -1,3 +1,14 @@ +# Check R environment --- +r_exists=$(which Rscript) + +if [ -z $r_exists ] +then + echo "No Rscript found in PATH - Install R" +else + Rscript -e 'renv::restore(repos = c(RSPM = "https://packagemanager.posit.co/cran/latest"))' +fi + + # Check python test environment --- python_exists=$(which python) if [ -z $python_exists ] From ee32eeb22a1f8dd5e474b89d1a7c25cd3b82b9ab Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 15 Feb 2023 17:15:50 +0100 Subject: [PATCH 81/99] [test environment] Let install pipenv for the developer --- tests/configure-test-env.ps1 | 19 +++++++++++++------ tests/configure-test-env.sh | 9 +++++---- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/tests/configure-test-env.ps1 b/tests/configure-test-env.ps1 index e6cabe04a96..f3fb64c2af0 100644 --- a/tests/configure-test-env.ps1 +++ b/tests/configure-test-env.ps1 @@ -4,7 +4,7 @@ try { $null = gcm Rscript -ea stop; $r=$true} catch { } If ($r) { - renv::restore(repos = c(RSPM = "https://packagemanager.posit.co/cran/latest")) + Rscript -e "renv::restore(repos = c(RSPM = 'https://packagemanager.posit.co/cran/latest'))" } # Check python test environment --- @@ -17,13 +17,20 @@ try { $null = gcm python -ea stop; $python=$true } catch { Write-Host -ForegroundColor red "No python found in PATH - Install python" } -try { $null = gcm pipenv -ea stop; $pipenv=$true } catch { - Write-Host -ForegroundColor red "No pipenv found in PATH - Install pipenv running ``pip install pipenv``" -} - -If ( $py -and $python -and $pipenv) { +If ( $py -and $python) { Write-Host "Setting up python environnement with pipenv" + try { $null = gcm pipenv -ea stop; $pipenv=$true } catch { + Write-Host -ForegroundColor red "No pipenv found in PATH - Installing pipenv running ``pip install pipenv``" + } + If ($null -eq $pipenv) { + python -m pip install pipenv + try { $null = gcm pyenv -ea stop; $pyenv=$true } catch { } + If ($pyenv) { + pyenv rehash + } + } pipenv install + $pipenv=$true } # Check Julia environment --- diff --git a/tests/configure-test-env.sh b/tests/configure-test-env.sh index 9d2fbbf2bc6..7106372c431 100644 --- a/tests/configure-test-env.sh +++ b/tests/configure-test-env.sh @@ -18,11 +18,12 @@ else pipenv_exist=$(which pipenv) if [ -z $pipenv_exist ] then - echo "No pipenv found in PATH - Install pipenv running \`pip install pipenv\`." - else - echo "Setting up python environnement with pipenv" - pipenv install + python -m pip install pipenv fi + # specific for pyenv shim + [ -n $(which pyenv) ] && pyenv rehash + echo "Setting up python environnement with pipenv" + pipenv install fi # Check Julia environment From bd05799f1a37e45b5c73350f03235b8ba9f9d837 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 15 Feb 2023 17:18:40 +0100 Subject: [PATCH 82/99] [test environment] script should be executable --- tests/configure-test-env.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 tests/configure-test-env.sh diff --git a/tests/configure-test-env.sh b/tests/configure-test-env.sh old mode 100644 new mode 100755 From fabd94a294dff9335b5537078ac34c42ebd6fbfd Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 15 Feb 2023 17:24:03 +0100 Subject: [PATCH 83/99] [test environment] Add logging to configure script --- tests/configure-test-env.ps1 | 6 +++++- tests/configure-test-env.sh | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/tests/configure-test-env.ps1 b/tests/configure-test-env.ps1 index f3fb64c2af0..4c389839f65 100644 --- a/tests/configure-test-env.ps1 +++ b/tests/configure-test-env.ps1 @@ -1,4 +1,5 @@ # Check R environment --- +Write-Host -ForegroundColor green ">>>> Configuring R environment" try { $null = gcm Rscript -ea stop; $r=$true} catch { Write-Host -ForegroundColor red "Missing Rscript - Install R" } @@ -8,7 +9,7 @@ If ($r) { } # Check python test environment --- - +Write-Host -ForegroundColor green ">>>> Configuring python environment" try { $null = gcm py -ea stop; $py=$true} catch { Write-Host -ForegroundColor red "Missing Python launcher - py.exe is required on Windows" } @@ -34,6 +35,7 @@ If ( $py -and $python) { } # Check Julia environment --- +Write-Host -ForegroundColor green ">>>> Configuring Julia environment" try {$null = gcm julia -ea stop; $julia=$true } catch { Write-Host -ForegroundColor red "Missing Julia - An installation is required" } @@ -44,6 +46,8 @@ If ($julia) { julia --color=yes --project=. -e 'import Pkg; Pkg.instantiate(); Pkg.build("IJulia"); Pkg.precompile()' } +# Check TinyTeX +Write-Host -ForegroundColor green ">>>> Configuring TinyTeX environment" If ([string]::IsNullOrEmpty($env:GH_TOKEN)) { try { $null = gcm gh -ea stop ; $ghtoken=$(gh auth token) } catch {} If (-not ([string]::IsNullOrEmpty($ghtoken))) { diff --git a/tests/configure-test-env.sh b/tests/configure-test-env.sh index 7106372c431..90beee63fd8 100755 --- a/tests/configure-test-env.sh +++ b/tests/configure-test-env.sh @@ -1,4 +1,6 @@ # Check R environment --- + +echo ">>>> Configuring R environment" r_exists=$(which Rscript) if [ -z $r_exists ] @@ -10,6 +12,7 @@ fi # Check python test environment --- +echo ">>>> Configuring Python environment" python_exists=$(which python) if [ -z $python_exists ] then @@ -26,7 +29,8 @@ else pipenv install fi -# Check Julia environment +# Check Julia environment --- +echo ">>>> Configuring Julia environment" julia_exists=$(which julia) if [ -z $julia_exists ] then @@ -37,6 +41,7 @@ else fi # Update tinytex +echo ">>>> Configuring TinyTeX environment" if [ -z $GH_TOKEN ] && [ -n $(which gh) ] then echo "Setting GH_TOKEN env var for Github Download." From db9fbbcd17e14e8c89e28ef442421a8de96dc3db Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 15 Feb 2023 18:19:01 +0100 Subject: [PATCH 84/99] [test environment] ptyprocess seems required on Linux in GHA --- tests/Pipfile | 2 +- tests/Pipfile.lock | 51 +++++++++------------------------------------- 2 files changed, 11 insertions(+), 42 deletions(-) diff --git a/tests/Pipfile b/tests/Pipfile index 27a174a785e..71bad44b202 100644 --- a/tests/Pipfile +++ b/tests/Pipfile @@ -9,7 +9,7 @@ bokeh = "*" pandas = "*" matplotlib = "*" pexpect = {version = "*", sys_platform = "!= 'win32'"} - +ptyprocess = {version = "*", sys_platform = "!= 'win32'"} [dev-packages] [requires] diff --git a/tests/Pipfile.lock b/tests/Pipfile.lock index 53398c78e2c..3f2566e831a 100644 --- a/tests/Pipfile.lock +++ b/tests/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "1302abafbe0b0d6d8067e1e59cc61440c364478be2313586bcb732b759472602" + "sha256": "3dc9d3d9d6958591a78bf49911eeb22f0980b5585e72df28f1be23c3b62f7368" }, "pipfile-spec": 6, "requires": { @@ -182,14 +182,6 @@ ], "version": "==1.15.1" }, - "colorama": { - "hashes": [ - "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", - "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" - ], - "markers": "sys_platform == 'win32'", - "version": "==0.4.6" - }, "comm": { "hashes": [ "sha256:3e2f5826578e683999b93716285b3b1f344f157bf75fa9ce0a797564e742f062", @@ -829,6 +821,7 @@ "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937", "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c" ], + "index": "pypi", "markers": "sys_platform != 'win32'", "version": "==4.8.0" }, @@ -966,6 +959,14 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==5.9.4" }, + "ptyprocess": { + "hashes": [ + "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", + "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220" + ], + "index": "pypi", + "version": "==0.7.0" + }, "pure-eval": { "hashes": [ "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350", @@ -1052,38 +1053,6 @@ ], "version": "==2022.7.1" }, - "pywin32": { - "hashes": [ - "sha256:109f98980bfb27e78f4df8a51a8198e10b0f347257d1e265bb1a32993d0c973d", - "sha256:13362cc5aa93c2beaf489c9c9017c793722aeb56d3e5166dadd5ef82da021fe1", - "sha256:19ca459cd2e66c0e2cc9a09d589f71d827f26d47fe4a9d09175f6aa0256b51c2", - "sha256:326f42ab4cfff56e77e3e595aeaf6c216712bbdd91e464d167c6434b28d65990", - "sha256:421f6cd86e84bbb696d54563c48014b12a23ef95a14e0bdba526be756d89f116", - "sha256:48d8b1659284f3c17b68587af047d110d8c44837736b8932c034091683e05863", - "sha256:4ecd404b2c6eceaca52f8b2e3e91b2187850a1ad3f8b746d0796a98b4cea04db", - "sha256:50768c6b7c3f0b38b7fb14dd4104da93ebced5f1a50dc0e834594bff6fbe1271", - "sha256:56d7a9c6e1a6835f521788f53b5af7912090674bb84ef5611663ee1595860fc7", - "sha256:73e819c6bed89f44ff1d690498c0a811948f73777e5f97c494c152b850fad478", - "sha256:742eb905ce2187133a29365b428e6c3b9001d79accdc30aa8969afba1d8470f4", - "sha256:9d968c677ac4d5cbdaa62fd3014ab241718e619d8e36ef8e11fb930515a1e918", - "sha256:9dd98384da775afa009bc04863426cb30596fd78c6f8e4e2e5bbf4edf8029504", - "sha256:a55db448124d1c1484df22fa8bbcbc45c64da5e6eae74ab095b9ea62e6d00496" - ], - "markers": "sys_platform == 'win32' and platform_python_implementation != 'PyPy'", - "version": "==305" - }, - "pywinpty": { - "hashes": [ - "sha256:38cb924f2778b5751ef91a75febd114776b3af0ae411bc667be45dd84fc881d3", - "sha256:3c46aef80dd50979aff93de199e4a00a8ee033ba7a03cadf0a91fed45f0c39d7", - "sha256:4c7d06ad10f6e92bc850a467f26d98f4f30e73d2fe5926536308c6ae0566bc16", - "sha256:7ffbd66310b83e42028fc9df7746118978d94fba8c1ebf15a7c1275fdd80b28a", - "sha256:902d79444b29ad1833b8d5c3c9aabdfd428f4f068504430df18074007c8c0de8", - "sha256:cdbb5694cf8c7242c2ecfaca35c545d31fa5d5814c3d67a4e628f803f680ebea" - ], - "markers": "os_name == 'nt'", - "version": "==2.0.10" - }, "pyyaml": { "hashes": [ "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf", From 9da0c0fef4326c12adb8a2916b3cc38b9396f61c Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 15 Feb 2023 18:21:27 +0100 Subject: [PATCH 85/99] [test environment] Windows adjustement in pipfile.lock --- tests/Pipfile.lock | 45 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/tests/Pipfile.lock b/tests/Pipfile.lock index 3f2566e831a..bac9ea9b948 100644 --- a/tests/Pipfile.lock +++ b/tests/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "3dc9d3d9d6958591a78bf49911eeb22f0980b5585e72df28f1be23c3b62f7368" + "sha256": "6896de720cd90e2fa21a54d1a7997fce599a561a28630f6f7968d2accd0ded54" }, "pipfile-spec": 6, "requires": { @@ -182,6 +182,14 @@ ], "version": "==1.15.1" }, + "colorama": { + "hashes": [ + "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", + "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" + ], + "markers": "sys_platform == 'win32'", + "version": "==0.4.6" + }, "comm": { "hashes": [ "sha256:3e2f5826578e683999b93716285b3b1f344f157bf75fa9ce0a797564e742f062", @@ -821,7 +829,6 @@ "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937", "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c" ], - "index": "pypi", "markers": "sys_platform != 'win32'", "version": "==4.8.0" }, @@ -964,7 +971,7 @@ "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220" ], - "index": "pypi", + "markers": "sys_platform != 'win32'", "version": "==0.7.0" }, "pure-eval": { @@ -1053,6 +1060,38 @@ ], "version": "==2022.7.1" }, + "pywin32": { + "hashes": [ + "sha256:109f98980bfb27e78f4df8a51a8198e10b0f347257d1e265bb1a32993d0c973d", + "sha256:13362cc5aa93c2beaf489c9c9017c793722aeb56d3e5166dadd5ef82da021fe1", + "sha256:19ca459cd2e66c0e2cc9a09d589f71d827f26d47fe4a9d09175f6aa0256b51c2", + "sha256:326f42ab4cfff56e77e3e595aeaf6c216712bbdd91e464d167c6434b28d65990", + "sha256:421f6cd86e84bbb696d54563c48014b12a23ef95a14e0bdba526be756d89f116", + "sha256:48d8b1659284f3c17b68587af047d110d8c44837736b8932c034091683e05863", + "sha256:4ecd404b2c6eceaca52f8b2e3e91b2187850a1ad3f8b746d0796a98b4cea04db", + "sha256:50768c6b7c3f0b38b7fb14dd4104da93ebced5f1a50dc0e834594bff6fbe1271", + "sha256:56d7a9c6e1a6835f521788f53b5af7912090674bb84ef5611663ee1595860fc7", + "sha256:73e819c6bed89f44ff1d690498c0a811948f73777e5f97c494c152b850fad478", + "sha256:742eb905ce2187133a29365b428e6c3b9001d79accdc30aa8969afba1d8470f4", + "sha256:9d968c677ac4d5cbdaa62fd3014ab241718e619d8e36ef8e11fb930515a1e918", + "sha256:9dd98384da775afa009bc04863426cb30596fd78c6f8e4e2e5bbf4edf8029504", + "sha256:a55db448124d1c1484df22fa8bbcbc45c64da5e6eae74ab095b9ea62e6d00496" + ], + "markers": "sys_platform == 'win32' and platform_python_implementation != 'PyPy'", + "version": "==305" + }, + "pywinpty": { + "hashes": [ + "sha256:38cb924f2778b5751ef91a75febd114776b3af0ae411bc667be45dd84fc881d3", + "sha256:3c46aef80dd50979aff93de199e4a00a8ee033ba7a03cadf0a91fed45f0c39d7", + "sha256:4c7d06ad10f6e92bc850a467f26d98f4f30e73d2fe5926536308c6ae0566bc16", + "sha256:7ffbd66310b83e42028fc9df7746118978d94fba8c1ebf15a7c1275fdd80b28a", + "sha256:902d79444b29ad1833b8d5c3c9aabdfd428f4f068504430df18074007c8c0de8", + "sha256:cdbb5694cf8c7242c2ecfaca35c545d31fa5d5814c3d67a4e628f803f680ebea" + ], + "markers": "os_name == 'nt'", + "version": "==2.0.10" + }, "pyyaml": { "hashes": [ "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf", From 0ae836f586e8ed36f9d18a92794bef4c7274cc64 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 15 Feb 2023 20:23:29 +0100 Subject: [PATCH 86/99] [gha] Clean workflow and reactivate other workflows --- .github/workflows/performance-check.yml | 3 +-- .github/workflows/test-bundle.yml | 1 - .github/workflows/test-quarto-latexmk.yml | 1 - .github/workflows/test-smokes.yml | 4 ---- 4 files changed, 1 insertion(+), 8 deletions(-) diff --git a/.github/workflows/performance-check.yml b/.github/workflows/performance-check.yml index 190ebd1e47f..d17abc05fce 100644 --- a/.github/workflows/performance-check.yml +++ b/.github/workflows/performance-check.yml @@ -12,7 +12,6 @@ on: jobs: test-bundle: - if: false runs-on: ubuntu-latest steps: @@ -49,7 +48,7 @@ jobs: # move the TS file so quarto command will use bundled JS mv src/quarto.ts src/quarto1.ts - + pushd package/pkg-working/bin # test a bare quarto command diff --git a/.github/workflows/test-bundle.yml b/.github/workflows/test-bundle.yml index bcb617ea3f5..123149a7161 100644 --- a/.github/workflows/test-bundle.yml +++ b/.github/workflows/test-bundle.yml @@ -12,7 +12,6 @@ on: jobs: test-bundle: - if: false runs-on: ubuntu-latest steps: diff --git a/.github/workflows/test-quarto-latexmk.yml b/.github/workflows/test-quarto-latexmk.yml index 5e0519478d0..eeb3e89f0e2 100644 --- a/.github/workflows/test-quarto-latexmk.yml +++ b/.github/workflows/test-quarto-latexmk.yml @@ -9,7 +9,6 @@ name: Test quarto-latexmk jobs: quarto-latexmk: - if: false runs-on: ${{ matrix.config.os }} name: ${{ matrix.config.os }} diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index ed9d1c97503..23e982b3a10 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -120,10 +120,6 @@ jobs: run: | julia --color=yes --project=. -e "import Pkg; Pkg.instantiate(); Pkg.build(\"IJulia\"); Pkg.precompile()" - - name: Setup tmate session - if: false - uses: mxschmitt/action-tmate@v3 - - name: Smoke Test Commits if: github.event.before != '' env: From 576f48f0f34b95f26c454b47291dae83a4f6aa22 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 15 Feb 2023 20:51:08 +0100 Subject: [PATCH 87/99] [test envrionment] Initiate a README for tests [skip ci] --- tests/README.md | 100 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 tests/README.md diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 00000000000..d45f0701b5d --- /dev/null +++ b/tests/README.md @@ -0,0 +1,100 @@ +# Running tests for Quarto + +The `tests/` folder is the place for everything related to testing of `quarto-cli`. + +We run several type of tests + +- Unit tests, located in `unit/` folder +- Integration tests, located in `integration/` folder +- smoke tests localed in `smoke` folder + +Tests are run in our CI workflow on GHA at each commit, and for each PR. + +## How the tests are created and organized ? + +Tests are running through `Deno.test()` framework, adapted for our Quarto project and all written in Typescript. Infrastructure are in `tests.ts`, `tests.deps.ts` `verify.ts` and `utils.ts` which contains the helper functions that can be used. + +- `unit/` and `integration/`, `smoke/`contain some `.ts` script representing each tests. +- `docs/` is a special folder containing of the necessary files and projects used for the tests. + +## Running the tests locally + +### Requirement + +Running tests require to have a local environment setup with Quarto development, TinyTeX, R, Python and Julia. + +To help with this configuration, the `tests/` folder contains `configure-test-env.sh` and `configure-test-env.ps1`. It will check for the tools and update the dependencies to what is used by Quarto tests. + +To manage dependencies: + +- For R, we use **renv** - `renv.lock` and `renv/` folders are the files used to recreate the environment for R. The package will be installed if not already. +- For Python, we use `pipenv` to manage dependencies and recreate easily on all OS. `pipenv` will be installed if not already. +- Julia uses built-in package manager - we provide `Projec.toml` and `Manifest.toml` to recreate the environment. + +### How-to + +Tests are run using `run-tests.sh` on UNIX, and `run-tests.ps1` on Windows + +**IMPORTANT: This command must be run in a shell where Python virtual environment is activated**. +To do that, run: + +``` +pipenv shell +``` + +```bash +# run all tests +./run-tests.sh + +# run a specific tests file +./run-tests.sh smoke/extensions/extension-render-doc.test.ts +``` + +```powershell +# run all tests +./run-tests.ps1 + +# run a specific tests file +./run-tests.ps1 smoke/extensions/extension-render-doc.test.ts +``` + +- `docs/smoke-all/` is a specific folder to run some tests written directly within `.qmd` or `.ipynb` files. They are run through the `smoke/smoke-all.tests.ts` + +```bash +# run tests for all documents in docs/smoke-all/ +./run-tests.sh smoke/smoke-all.tests.ts + +# run tests for some `.qmd` document in a specific place (using glob) +./run-tests.sh smoke/smoke-all.test.ts -- docs/smoke-all/2022/**/*.qmd + +# run test for a specific document +./run-tests.sh smoke/smoke-all.test.ts -- docs/smoke-all/2023/01/04/issue-3847.qmd +``` + +```powershell +# run tests for all documents in docs/smoke-all/ +./run-tests.ps1 smoke/smoke-all.tests.ts + +# run tests for some `.qmd` document in a specific place (using glob) +./run-tests.ps1 smoke/smoke-all.test.ts -- docs/smoke-all/2022/**/*.qmd + +# run test for a specific document +./run-tests.ps1 smoke/smoke-all.test.ts -- docs/smoke-all/2023/01/04/issue-3847.qmd +``` + +## Debugging within tests + +`.vscode/launch.json` has a `Run Quarto test` configuration that can be used to debug when running tests. One need to modify the `program` and `args` fields to match the test to run. + +Example: + +```json +"program": "smoke/smoke-all.test.ts", // test script here +"args": ["--", "tests/docs/smoke-all/2023/01/04/issue-3847.qmd"], // args to the script here, like in command line smoke/smoke-all.test.t -- .\docs\smoke-all\2023\01\19\2107.qmd +``` + +## Parallel testing + +**WIP** + +This lives in `run-parallel-tests.ts` and called through `run-parallel-tests.sh`. From 1aca02d5b1e6c3404e9f785d5c74899ec315f4a2 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 15 Feb 2023 22:40:54 +0100 Subject: [PATCH 88/99] [test environment] Auto activate the virtualenv when running tests --- tests/run-tests.ps1 | 13 +++++++++++++ tests/run-tests.sh | 15 +++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/tests/run-tests.ps1 b/tests/run-tests.ps1 index 276a06e4c4e..f94ae52f062 100644 --- a/tests/run-tests.ps1 +++ b/tests/run-tests.ps1 @@ -102,6 +102,13 @@ If ($QUARTO_DENO_EXTRA_OPTIONS -ne $null) { $DENO_ARGS += -split $QUARTO_IMPORT_ARGMAP $DENO_ARGS += $customArgs +# Activate python virtualenv +If ($null -eq $Env:VIRTUAL_ENV) { + Write-Host "> Activating virtualenv for Python tests" + $quarto_venv_activated = $true + . "$(pipenv --venv)/Scripts/activate.ps1" +} + Write-Host "> Running tests with `"$QUARTO_DENO $DENO_ARGS`" " & $QUARTO_DENO $DENO_ARGS @@ -111,4 +118,10 @@ $DENO_EXIT_CODE = $LASTEXITCODE # Add Coverage handling +If($null -ne $Env:VIRTUAL_ENV -and $quarto_venv_activated) { + Write-Host "> Exiting virtualenv activated for tests" + deactivate + Remove-Variable quarto_venv_activated +} + Exit $DENO_EXIT_CODE diff --git a/tests/run-tests.sh b/tests/run-tests.sh index a7593efe7ef..caaf30c3463 100755 --- a/tests/run-tests.sh +++ b/tests/run-tests.sh @@ -38,6 +38,14 @@ fi # Ensure that tinytex is installed quarto install tinytex --no-prompt +# Activating python virtualenv +if [[ -z $VIRTUAL_ENV ]] +then + echo "> Activating virtualenv for Python tests" + source "$(pipenv --venv)/bin/activate" + quarto_venv_activated="true" +fi + if [ "$QUARTO_TEST_TIMING" != "" ]; then QUARTO_DENO_OPTIONS="--config test-conf.json --unstable --allow-read --allow-write --allow-run --allow-env --allow-net --no-check" rm -f timing.txt @@ -55,6 +63,13 @@ fi SUCCESS=$? +if [[ -n $VIRTUAL_ENV ]] && [[ $quarto_venv_activated == "true" ]] +then + echo "> Exiting virtualenv activated for tests" + deactivate + unset quarto_venv_activated +fi + # Generates the coverage report if [[ $@ == *"--coverage"* ]]; then From cc385a8652ed197e6883f0dc3b9146b77f812697 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 15 Feb 2023 23:10:29 +0100 Subject: [PATCH 89/99] [test environment] Run configuration as part of running tests --- tests/run-tests.ps1 | 27 +++------------------------ tests/run-tests.sh | 14 ++++---------- 2 files changed, 7 insertions(+), 34 deletions(-) diff --git a/tests/run-tests.ps1 b/tests/run-tests.ps1 index f94ae52f062..71610398df3 100644 --- a/tests/run-tests.ps1 +++ b/tests/run-tests.ps1 @@ -33,30 +33,9 @@ $QUARTO_SHARE_PATH = Join-Path $QUARTO_ROOT "src" "resources" # ----- Restoring tests environnment --------- -Write-Host "> Restoring R environment with renv..." - -# Ensure that we've restored the renv environment for tests with R -Rscript -e "if (!requireNamespace('renv', quietly = TRUE)) install.packages('renv')" -Rscript -e "renv::restore()" - -Write-Host "> Restoring python environment in virtualenv..." - -# Ensure that we've actived the python env and restore it -# FIX: Testing python require a re-design of the environment -If ($QUARTO_TESTS_VIRTUALENV -ne "FALSE") - { - $Env:QUARTO_PYTHON=$null - pipenv install --extra-pip-args="--prefer-binary" - } else { - Write-Host -ForegroundColor "red" ">> No testing with Python" - } - -Write-Host "> Updating TinyTeX..." -# Ensure that tinytex is installed and updated to latest version -try { - quarto install tinytex --no-prompt -} catch { - Write-Host "Updating TinyTeX failed." +If ( $null -eq $Env:GITHUB_ACTION -and $null -eq $Env:QUARTO_TESTS_NO_CONFIG ) { + Write-Host "> Checking and configuring environment for tests" + . ./configure-test-env.ps1 } # ----- Preparing running tests ------------ diff --git a/tests/run-tests.sh b/tests/run-tests.sh index caaf30c3463..b7a62fcc86d 100755 --- a/tests/run-tests.sh +++ b/tests/run-tests.sh @@ -26,18 +26,12 @@ export QUARTO_DEBUG=true QUARTO_DENO_OPTIONS="--config test-conf.json --unstable --allow-read --allow-write --allow-run --allow-env --allow-net --check" -# Ensure that we've restored the renv -Rscript -e "if (!requireNamespace('renv', quietly = TRUE)) install.packages('renv')" -Rscript -e "renv::restore()" - -# Ensure that we've actived the python env -if [[ $QUARTO_TESTS_VIRTUALENV != "FALSE" ]]; then - pipenv install --extra-pip-args="--prefer-binary" +if [[ -z $GITHUB_ACTION ]] && [[ -z $QUARTO_TESTS_NO_CONFIG ]] +then + echo "> Checking and configuring environment for tests" + source configure-test-env.sh fi -# Ensure that tinytex is installed -quarto install tinytex --no-prompt - # Activating python virtualenv if [[ -z $VIRTUAL_ENV ]] then From 3a0ff79611e1eca06ad9ac87afc904884ba5d311 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 15 Feb 2023 23:17:03 +0100 Subject: [PATCH 90/99] [test environment] Improve documentation in README --- tests/README.md | 81 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 73 insertions(+), 8 deletions(-) diff --git a/tests/README.md b/tests/README.md index d45f0701b5d..30da8800197 100644 --- a/tests/README.md +++ b/tests/README.md @@ -31,16 +31,12 @@ To manage dependencies: - For Python, we use `pipenv` to manage dependencies and recreate easily on all OS. `pipenv` will be installed if not already. - Julia uses built-in package manager - we provide `Projec.toml` and `Manifest.toml` to recreate the environment. -### How-to +### How to run tests locally ? -Tests are run using `run-tests.sh` on UNIX, and `run-tests.ps1` on Windows +Tests are run using `run-tests.sh` on UNIX, and `run-tests.ps1` on Windows. -**IMPORTANT: This command must be run in a shell where Python virtual environment is activated**. -To do that, run: - -``` -pipenv shell -``` +Those files will run `configure-test-env` scripts to check for requirements and set up dependencies (except on Github Action as this is done in the workflow file directly). +You can prevent test configuration locally by setting `QUARTO_TESTS_NO_CONFIG` environment variable to a non-empty value. ```bash # run all tests @@ -71,6 +67,41 @@ pipenv shell ./run-tests.sh smoke/smoke-all.test.ts -- docs/smoke-all/2023/01/04/issue-3847.qmd ``` +
Examples of tests output after it ran + +```bash +$ ./run-tests.sh smoke/smoke-all.test.ts -- docs/smoke-all/2023/01/04/issue-3847.qmd +> Checking and configuring environment for tests +>>>> Configuring R environment +* The library is already synchronized with the lockfile. +>>>> Configuring Python environment +Setting up python environnement with pipenv +Installing dependencies from Pipfile.lock (0ded54)... +To activate this project's virtualenv, run pipenv shell. +Alternatively, run a command inside the virtualenv with pipenv run. +>>>> Configuring Julia environment +Setting up Julia environment + Building Conda ─→ `~/.julia/scratchspaces/44cfe95a-1eb2-52ea-b672-e2afdf69b78f/e32a90da027ca45d84678b826fffd3110bb3fc90/build.log` + Building IJulia → `~/.julia/scratchspaces/44cfe95a-1eb2-52ea-b672-e2afdf69b78f/59e19713542dd9dd02f31d59edbada69530d6a14/build.log` +>>>> Configuring TinyTeX environment +Setting GH_TOKEN env var for Github Download. +tinytex is already installed and up to date. +> Activating virtualenv for Python tests +Check file:///home/cderv/project/quarto-cli/tests/smoke/smoke-all.test.ts +running 1 test from ./smoke/smoke-all.test.ts +[smoke] > quarto render docs/smoke-all/2023/01/04/issue-3847.qmd --to html ... +------- output ------- +[verify] > No Errors or Warnings +----- output end ----- +[smoke] > quarto render docs/smoke-all/2023/01/04/issue-3847.qmd --to html ... ok (320ms) + +ok | 1 passed | 0 failed (1s) + +> Exiting virtualenv activated for tests +``` + +
+ ```powershell # run tests for all documents in docs/smoke-all/ ./run-tests.ps1 smoke/smoke-all.tests.ts @@ -82,6 +113,40 @@ pipenv shell ./run-tests.ps1 smoke/smoke-all.test.ts -- docs/smoke-all/2023/01/04/issue-3847.qmd ``` +
Examples of tests output after it ran + +```powershell + ./run-tests.ps1 smoke/smoke-all.test.ts -- docs/smoke-all/2023/01/04/issue-3847.qmd +> Setting all the paths required... +> Checking and configuring environment for tests +>>>> Configuring R environment +* The library is already synchronized with the lockfile. +>>>> Configuring python environment +Setting up python environnement with pipenv +Installing dependencies from Pipfile.lock (0ded54)... +To activate this project's virtualenv, run pipenv shell. +Alternatively, run a command inside the virtualenv with pipenv run. +>>>> Configuring Julia environment +Setting up Julia environment + Building Conda ─→ `C:\Users\chris\.julia\scratchspaces\44cfe95a-1eb2-52ea-b672-e2afdf69b78f\e32a90da027ca45d84678b826fffd3110bb3fc90\build.log` + Building IJulia → `C:\Users\chris\.julia\scratchspaces\44cfe95a-1eb2-52ea-b672-e2afdf69b78f\59e19713542dd9dd02f31d59edbada69530d6a14\build.log` +>>>> Configuring TinyTeX environment +tinytex is already installed and up to date. +> Preparing running tests... +> Activating virtualenv for Python tests +> Running tests with "C:\Users\chris\Documents\DEV_R\quarto-cli\package\dist\bin\tools\deno.exe test --config test-conf.json --unstable --allow-read --allow-write --allow-run --allow-env --allow-net --check --importmap=C:\Users\chris\Documents\DEV_R\quarto-cli\src\dev_import_map.json smoke/smoke-all.test.ts -- docs/smoke-all/2023/01/04/issue-3847.qmd" +running 1 test from ./smoke/smoke-all.test.ts +[smoke] > quarto render docs\smoke-all\2023\01\04\issue-3847.qmd --to html ... +------- output ------- +[verify] > No Errors or Warnings +----- output end ----- +[smoke] > quarto render docs\smoke-all\2023\01\04\issue-3847.qmd --to html ... ok (650ms) + +ok | 1 passed | 0 failed (2s) +``` + +
+ ## Debugging within tests `.vscode/launch.json` has a `Run Quarto test` configuration that can be used to debug when running tests. One need to modify the `program` and `args` fields to match the test to run. From e7cb9b7d64732d9132e56a099da67f6cae2cba53 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 16 Feb 2023 16:55:40 +0100 Subject: [PATCH 91/99] [test environment] Don't use which to find if a command is available --- tests/configure-test-env.sh | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/configure-test-env.sh b/tests/configure-test-env.sh index 90beee63fd8..9a9ad7193d2 100755 --- a/tests/configure-test-env.sh +++ b/tests/configure-test-env.sh @@ -1,7 +1,7 @@ # Check R environment --- echo ">>>> Configuring R environment" -r_exists=$(which Rscript) +r_exists=$(command -v Rscript) if [ -z $r_exists ] then @@ -13,25 +13,25 @@ fi # Check python test environment --- echo ">>>> Configuring Python environment" -python_exists=$(which python) +python_exists=$(command -v python) if [ -z $python_exists ] then echo "No python found in PATH - Install python." else - pipenv_exist=$(which pipenv) + pipenv_exist=$(command -v pipenv) if [ -z $pipenv_exist ] then python -m pip install pipenv fi # specific for pyenv shim - [ -n $(which pyenv) ] && pyenv rehash + [ -n $(command -v pyenv) ] && pyenv rehash echo "Setting up python environnement with pipenv" pipenv install fi # Check Julia environment --- echo ">>>> Configuring Julia environment" -julia_exists=$(which julia) +julia_exists=$(command -v julia) if [ -z $julia_exists ] then echo "No julia found in PATH - Install Julia." @@ -42,13 +42,13 @@ fi # Update tinytex echo ">>>> Configuring TinyTeX environment" -if [ -z $GH_TOKEN ] && [ -n $(which gh) ] +if [ -z $GH_TOKEN ] && [ -n $(command -v gh) ] then echo "Setting GH_TOKEN env var for Github Download." export GH_TOKEN=$(gh auth token) fi -if [ -n $(which quarto) ] +if [ -n $(command -v quarto) ] then quarto install tinytex fi From 3e66c4eee5fbe81ba4dfceb6e5b2c55d07631f57 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 16 Feb 2023 17:03:36 +0100 Subject: [PATCH 92/99] [gha] Don't run playwright tests on windows this will save us some time on workflow --- .github/workflows/test-smokes.yml | 3 + tests/integration/playwright-tests.test.ts | 91 ++++++++++++---------- 2 files changed, 54 insertions(+), 40 deletions(-) diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index 23e982b3a10..8dfc379e042 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -39,16 +39,19 @@ jobs: r-version: "4.2.2" - name: Install node (for Playwright) + if: runner.os != 'Windows' uses: actions/setup-node@v3 with: node-version: 16 - name: Install node dependencies + if: runner.os != 'Windows' run: yarn working-directory: ./tests/integration/playwright shell: bash - name: Install Playwright Browsers + if: runner.os != 'Windows' run: npx playwright install --with-deps working-directory: ./tests/integration/playwright diff --git a/tests/integration/playwright-tests.test.ts b/tests/integration/playwright-tests.test.ts index b0b473a72f3..9cc76a4db0c 100644 --- a/tests/integration/playwright-tests.test.ts +++ b/tests/integration/playwright-tests.test.ts @@ -14,58 +14,69 @@ import { import { cleanoutput } from "../smoke/render/render.ts"; import { execProcess } from "../../src/core/process.ts"; import { quartoDevCmd } from "../utils.ts"; +import { warning } from "log/mod.ts"; async function fullInit() { await initYamlIntelligenceResourcesFromFilesystem(); } -const globOutput = Deno.args.length - ? expandGlobSync(Deno.args[0]) - : expandGlobSync( - "docs/playwright/**/*.qmd", - ); +// TODO: See if we need to run this on Windows too +// Skipping for now to save ~10min of installation on GHA +if (Deno.build.os === "windows") { + warning("Skipping playwright test on windows"); +} else { + const globOutput = Deno.args.length + ? expandGlobSync(Deno.args[0]) + : expandGlobSync( + "docs/playwright/**/*.qmd", + ); -setInitializer(fullInit); -await initState(); + setInitializer(fullInit); + await initState(); -// const promises = []; -const fileNames = []; + // const promises = []; + const fileNames = []; -for (const { path: fileName } of globOutput) { - const input = fileName; + for (const { path: fileName } of globOutput) { + const input = fileName; - // sigh, we have a race condition somewhere in - // mediabag inspection if we don't wait all renders - // individually. This is very slow.. - await execProcess({ - cmd: [quartoDevCmd(), "render", input, "--to", "html"], - }); - fileNames.push(fileName); -} - -// start a web server -// This is attempt #3 -// attempt #1 through Deno.server causes hangs on repeated requests -// attempt #2 through http/server causes a deno vendor crash: https://github.com/denoland/deno/issues/16861 + // sigh, we have a race condition somewhere in + // mediabag inspection if we don't wait all renders + // individually. This is very slow.. + await execProcess({ + cmd: [quartoDevCmd(), "render", input, "--to", "html"], + }); + fileNames.push(fileName); + } -// we'll just use python :facepalm: + // start a web server + // This is attempt #3 + // attempt #1 through Deno.server causes hangs on repeated requests + // attempt #2 through http/server causes a deno vendor crash: https://github.com/denoland/deno/issues/16861 -const proc = Deno.run({ - cmd: ["python", "-m", "http.server", "8080"], - cwd: "docs/playwright", -}); + // we'll just use python :facepalm: -try { - // run playwright - await execProcess({ - cmd: [Deno.build.os == "windows" ? "npx.cmd" : "npx", "playwright", "test"], - cwd: "integration/playwright", + const proc = Deno.run({ + cmd: ["python", "-m", "http.server", "8080"], + cwd: "docs/playwright", }); -} finally { - // cleanup - proc.kill(); - proc.close(); - for (const fileName of fileNames) { - cleanoutput(fileName, "html"); + + try { + // run playwright + await execProcess({ + cmd: [ + Deno.build.os == "windows" ? "npx.cmd" : "npx", + "playwright", + "test", + ], + cwd: "integration/playwright", + }); + } finally { + // cleanup + proc.kill(); + proc.close(); + for (const fileName of fileNames) { + cleanoutput(fileName, "html"); + } } } From 9b267da371ea515f8367002a757385573338632c Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 16 Feb 2023 17:10:34 +0100 Subject: [PATCH 93/99] [test environment] Be more clear on what check if something is missing --- tests/configure-test-env.ps1 | 8 ++++---- tests/configure-test-env.sh | 8 +++++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/tests/configure-test-env.ps1 b/tests/configure-test-env.ps1 index 4c389839f65..5b6ae0fb772 100644 --- a/tests/configure-test-env.ps1 +++ b/tests/configure-test-env.ps1 @@ -1,7 +1,7 @@ # Check R environment --- Write-Host -ForegroundColor green ">>>> Configuring R environment" try { $null = gcm Rscript -ea stop; $r=$true} catch { - Write-Host -ForegroundColor red "Missing Rscript - Install R" + Write-Host -ForegroundColor red "No Rscript found in PATH - Check your PATH or install R and add to PATH" } If ($r) { @@ -11,11 +11,11 @@ If ($r) { # Check python test environment --- Write-Host -ForegroundColor green ">>>> Configuring python environment" try { $null = gcm py -ea stop; $py=$true} catch { - Write-Host -ForegroundColor red "Missing Python launcher - py.exe is required on Windows" + Write-Host -ForegroundColor red "Missing Python launcher - py.exe is required on Windows - it should be installed with Python for Windows." } try { $null = gcm python -ea stop; $python=$true } catch { - Write-Host -ForegroundColor red "No python found in PATH - Install python" + Write-Host -ForegroundColor red "No python found in PATH - Check your PATH or install python add to PATH." } If ( $py -and $python) { @@ -37,7 +37,7 @@ If ( $py -and $python) { # Check Julia environment --- Write-Host -ForegroundColor green ">>>> Configuring Julia environment" try {$null = gcm julia -ea stop; $julia=$true } catch { - Write-Host -ForegroundColor red "Missing Julia - An installation is required" + Write-Host -ForegroundColor red "No julia found in PATH - Check your PATH or install Julia and add to PATH." } If ($julia) { diff --git a/tests/configure-test-env.sh b/tests/configure-test-env.sh index 9a9ad7193d2..e7490ebfd82 100755 --- a/tests/configure-test-env.sh +++ b/tests/configure-test-env.sh @@ -5,7 +5,7 @@ r_exists=$(command -v Rscript) if [ -z $r_exists ] then - echo "No Rscript found in PATH - Install R" + echo "No Rscript found in PATH - Check your PATH or install R and add to PATH." else Rscript -e 'renv::restore(repos = c(RSPM = "https://packagemanager.posit.co/cran/latest"))' fi @@ -16,12 +16,14 @@ echo ">>>> Configuring Python environment" python_exists=$(command -v python) if [ -z $python_exists ] then - echo "No python found in PATH - Install python." + echo "No python found in PATH - Check your PATH or install python add to PATH." else pipenv_exist=$(command -v pipenv) if [ -z $pipenv_exist ] then + echo "No pipenv found - Installing pipenv running ``pip install pipenv``..." python -m pip install pipenv + echo "...pipenv installed" fi # specific for pyenv shim [ -n $(command -v pyenv) ] && pyenv rehash @@ -34,7 +36,7 @@ echo ">>>> Configuring Julia environment" julia_exists=$(command -v julia) if [ -z $julia_exists ] then - echo "No julia found in PATH - Install Julia." + echo "No julia found in PATH - Check your PATH or install julia and add to PATH." else echo "Setting up Julia environment" julia --color=yes --project=. -e 'import Pkg; Pkg.instantiate(); Pkg.build("IJulia"); Pkg.precompile()' From 35b0c94a174b2c60ce167937d8352311ac268e24 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 16 Feb 2023 17:17:51 +0100 Subject: [PATCH 94/99] [test environment] Update README.md with more info on requirements [skip ci] --- tests/README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tests/README.md b/tests/README.md index 30da8800197..46fe4af992f 100644 --- a/tests/README.md +++ b/tests/README.md @@ -19,7 +19,16 @@ Tests are running through `Deno.test()` framework, adapted for our Quarto projec ## Running the tests locally -### Requirement +### Dependencies requirements + +Here are what is expected in the environment for the tests : + +- R should be installed and in PATH + - On Windows, Rtools should be to (for source package) e.g `winget install --id RProject.Rtools` +- Python should be installed and in PATH + - On Windows, one can use [`pyenv-win`](https://pyenv-win.github.io/pyenv-win/) to manage version or install from https://www.python.org/ manually or using `winget`. +- Julia should be installed and in PATH + - On Windows, one way is using `winget install --id Julialang.Julia` and then add `%LOCALAPPDATA%/Programs/Julia/bin` to PATH Running tests require to have a local environment setup with Quarto development, TinyTeX, R, Python and Julia. From bdfc2cbb51f548ec839da78b1d6353fd59a043bd Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 16 Feb 2023 17:21:30 +0100 Subject: [PATCH 95/99] [fix] Move the exception at upper level --- tests/integration/playwright-tests.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/playwright-tests.test.ts b/tests/integration/playwright-tests.test.ts index 9cc76a4db0c..bf4f9c6c9ca 100644 --- a/tests/integration/playwright-tests.test.ts +++ b/tests/integration/playwright-tests.test.ts @@ -65,7 +65,7 @@ if (Deno.build.os === "windows") { // run playwright await execProcess({ cmd: [ - Deno.build.os == "windows" ? "npx.cmd" : "npx", + "npx", // Deno.build.os == "windows" ? "npx.cmd" : "npx", "playwright", "test", ], From 8b0c13f95f0efb39e8d138d980ce417af95b8a87 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Fri, 17 Feb 2023 00:10:10 +0100 Subject: [PATCH 96/99] [test environment] Add a mechanism to work within an existing python virtualenv shell This relies on pipenv features to ignore virtualenv and create a new one. Add a mechanism to skip using pipenv --- tests/configure-test-env.ps1 | 3 +++ tests/configure-test-env.sh | 3 +++ tests/run-tests.ps1 | 17 +++++++++++++---- tests/run-tests.sh | 15 ++++++++++++--- 4 files changed, 31 insertions(+), 7 deletions(-) diff --git a/tests/configure-test-env.ps1 b/tests/configure-test-env.ps1 index 5b6ae0fb772..db90ba5b7da 100644 --- a/tests/configure-test-env.ps1 +++ b/tests/configure-test-env.ps1 @@ -30,6 +30,9 @@ If ( $py -and $python) { pyenv rehash } } + # our default is pipenv to use its own virtualenv and be in project directory + $Env:PIPENV_IGNORE_VIRTUALENVS=1 + $Env:PIPENV_VENV_IN_PROJECT=1 pipenv install $pipenv=$true } diff --git a/tests/configure-test-env.sh b/tests/configure-test-env.sh index e7490ebfd82..81ee6c96cc6 100755 --- a/tests/configure-test-env.sh +++ b/tests/configure-test-env.sh @@ -28,6 +28,9 @@ else # specific for pyenv shim [ -n $(command -v pyenv) ] && pyenv rehash echo "Setting up python environnement with pipenv" + # our default is pipenv to use its own virtualenv and be in project directory + export PIPENV_IGNORE_VIRTUALENVS=1 + export PIPENV_VENV_IN_PROJECT=1 pipenv install fi diff --git a/tests/run-tests.ps1 b/tests/run-tests.ps1 index 71610398df3..7018a2b6ed0 100644 --- a/tests/run-tests.ps1 +++ b/tests/run-tests.ps1 @@ -82,12 +82,16 @@ $DENO_ARGS += -split $QUARTO_IMPORT_ARGMAP $DENO_ARGS += $customArgs # Activate python virtualenv -If ($null -eq $Env:VIRTUAL_ENV) { - Write-Host "> Activating virtualenv for Python tests" - $quarto_venv_activated = $true +# set QUARTO_TESTS_FORCE_NO_PIPENV env var to not activate the virtalenv manage by pipenv for the project +If ($null -eq $Env:QUARTO_TESTS_FORCE_NO_PIPENV) { + # Save possible activated virtualenv for later restauration + $OLD_VIRTUAL_ENV=$VIRTUAL_ENV + Write-Host "> Activating virtualenv for Python tests in Quarto" . "$(pipenv --venv)/Scripts/activate.ps1" + $quarto_venv_activated = $true } + Write-Host "> Running tests with `"$QUARTO_DENO $DENO_ARGS`" " & $QUARTO_DENO $DENO_ARGS @@ -97,10 +101,15 @@ $DENO_EXIT_CODE = $LASTEXITCODE # Add Coverage handling -If($null -ne $Env:VIRTUAL_ENV -and $quarto_venv_activated) { +If($quarto_venv_activated) { Write-Host "> Exiting virtualenv activated for tests" deactivate Remove-Variable quarto_venv_activated } +If($null -ne $OLD_VIRTUAL_ENV) { + Write-Host "> Reactivating original virtualenv" + . "$OLD_VIRTUAL_ENV/Scripts/activate.ps1" + Remove-Variable OLD_VIRTUAL_ENV +} Exit $DENO_EXIT_CODE diff --git a/tests/run-tests.sh b/tests/run-tests.sh index b7a62fcc86d..2fe9da4c317 100755 --- a/tests/run-tests.sh +++ b/tests/run-tests.sh @@ -33,9 +33,12 @@ then fi # Activating python virtualenv -if [[ -z $VIRTUAL_ENV ]] +# set QUARTO_TESTS_FORCE_NO_PIPENV env var to not activate the virtalenv manage by pipenv for the project +if [[ -z $QUARTO_TESTS_FORCE_NO_PIPENV ]] then - echo "> Activating virtualenv for Python tests" + # Save possible activated virtualenv for later restauration + OLD_VIRTUAL_ENV=$VIRTUAL_ENV + echo "> Activating virtualenv for Python tests in Quarto" source "$(pipenv --venv)/bin/activate" quarto_venv_activated="true" fi @@ -57,12 +60,18 @@ fi SUCCESS=$? -if [[ -n $VIRTUAL_ENV ]] && [[ $quarto_venv_activated == "true" ]] +if [[ $quarto_venv_activated == "true" ]] then echo "> Exiting virtualenv activated for tests" deactivate unset quarto_venv_activated fi +if [[ -n $OLD_VIRTUAL_ENV ]] +then + echo "> Reactivating original virtualenv" + source $OLD_VIRTUAL_ENV/bin/activate + unset OLD_VIRTUAL_ENV +fi # Generates the coverage report if [[ $@ == *"--coverage"* ]]; then From 6021f500a6e39d0d158870d78e6cd8a535798d09 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Fri, 17 Feb 2023 00:28:47 +0100 Subject: [PATCH 97/99] [test environment] Update documentation in README [skip ci] --- tests/README.md | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/tests/README.md b/tests/README.md index 46fe4af992f..2cb3d445e3f 100644 --- a/tests/README.md +++ b/tests/README.md @@ -33,12 +33,35 @@ Here are what is expected in the environment for the tests : Running tests require to have a local environment setup with Quarto development, TinyTeX, R, Python and Julia. To help with this configuration, the `tests/` folder contains `configure-test-env.sh` and `configure-test-env.ps1`. It will check for the tools and update the dependencies to what is used by Quarto tests. +Running the script at least one will insure you are correctly setup. Then, it is run as part of running the tests so that dependencies are always updated. Set `QUARTO_TESTS_NO_CONFIG` to skip this step when running tests. -To manage dependencies: +Dependencies are managed using the following tools: -- For R, we use **renv** - `renv.lock` and `renv/` folders are the files used to recreate the environment for R. The package will be installed if not already. -- For Python, we use `pipenv` to manage dependencies and recreate easily on all OS. `pipenv` will be installed if not already. -- Julia uses built-in package manager - we provide `Projec.toml` and `Manifest.toml` to recreate the environment. +#### R + +We use [**renv**](https://rstudio.github.io/renv/). `renv.lock` and `renv/` folders are the files used to recreate the environment for R. + +Updating `renv.lock` is done using `renv::snapshot()`. File shouldn't be modified manually. + +See [documentation](https://rstudio.github.io/renv/) if you need to tweak the R environment. + +#### Python + +We use [**pipenv**](https://pipenv.pypa.io/en/latest/) to manage dependencies and recreate easily on all OS. `pipenv` will be installed as part of the configuration if not already. +A virtual environment will be created locally in `.venv` folder (ignored on git) and activated when running tests. `pipenv run` and `pipenv shell` can help activating the environment outside of running tests. + +`Pipfile` contains our requirement for the tests project. It can be manually updated but it is best to just use `pipenv` commands. For instance, adding a new dependency can be done with `pipenv install plotly` and it will update the file. +It will also update the `Pipfile.lock` - this file should never be updated manually. + +See other [`pipenv` command](https://pipenv.pypa.io/en/latest/#basic-commands-and-concepts) if you need to tweak the python environment. + +#### Julia + +Julia uses built-in package manager [**Pkg.jl**](https://pkgdocs.julialang.org/v1/)- we provide `Project.toml` and `Manifest.toml` to recreate the environment. + +`Project.toml` contains our direct dependency and `Manifest.toml` is the lock file that will be created (`Pkg.resolve()`). + +See [documentation](https://pkgdocs.julialang.org/v1/managing-packages/) on how to add, remove, update if you need to tweak the Julia environment. ### How to run tests locally ? From 7548164a0b6b2b090f25af8e488e3561b00a9e04 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Fri, 17 Feb 2023 10:03:04 +0100 Subject: [PATCH 98/99] Revert "[gha] Don't run playwright tests on windows" This reverts commit 3e66c4eee5fbe81ba4dfceb6e5b2c55d07631f57. --- .github/workflows/test-smokes.yml | 3 - tests/integration/playwright-tests.test.ts | 91 ++++++++++------------ 2 files changed, 40 insertions(+), 54 deletions(-) diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index 8dfc379e042..23e982b3a10 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -39,19 +39,16 @@ jobs: r-version: "4.2.2" - name: Install node (for Playwright) - if: runner.os != 'Windows' uses: actions/setup-node@v3 with: node-version: 16 - name: Install node dependencies - if: runner.os != 'Windows' run: yarn working-directory: ./tests/integration/playwright shell: bash - name: Install Playwright Browsers - if: runner.os != 'Windows' run: npx playwright install --with-deps working-directory: ./tests/integration/playwright diff --git a/tests/integration/playwright-tests.test.ts b/tests/integration/playwright-tests.test.ts index bf4f9c6c9ca..b0b473a72f3 100644 --- a/tests/integration/playwright-tests.test.ts +++ b/tests/integration/playwright-tests.test.ts @@ -14,69 +14,58 @@ import { import { cleanoutput } from "../smoke/render/render.ts"; import { execProcess } from "../../src/core/process.ts"; import { quartoDevCmd } from "../utils.ts"; -import { warning } from "log/mod.ts"; async function fullInit() { await initYamlIntelligenceResourcesFromFilesystem(); } -// TODO: See if we need to run this on Windows too -// Skipping for now to save ~10min of installation on GHA -if (Deno.build.os === "windows") { - warning("Skipping playwright test on windows"); -} else { - const globOutput = Deno.args.length - ? expandGlobSync(Deno.args[0]) - : expandGlobSync( - "docs/playwright/**/*.qmd", - ); +const globOutput = Deno.args.length + ? expandGlobSync(Deno.args[0]) + : expandGlobSync( + "docs/playwright/**/*.qmd", + ); - setInitializer(fullInit); - await initState(); +setInitializer(fullInit); +await initState(); - // const promises = []; - const fileNames = []; +// const promises = []; +const fileNames = []; - for (const { path: fileName } of globOutput) { - const input = fileName; +for (const { path: fileName } of globOutput) { + const input = fileName; - // sigh, we have a race condition somewhere in - // mediabag inspection if we don't wait all renders - // individually. This is very slow.. - await execProcess({ - cmd: [quartoDevCmd(), "render", input, "--to", "html"], - }); - fileNames.push(fileName); - } + // sigh, we have a race condition somewhere in + // mediabag inspection if we don't wait all renders + // individually. This is very slow.. + await execProcess({ + cmd: [quartoDevCmd(), "render", input, "--to", "html"], + }); + fileNames.push(fileName); +} - // start a web server - // This is attempt #3 - // attempt #1 through Deno.server causes hangs on repeated requests - // attempt #2 through http/server causes a deno vendor crash: https://github.com/denoland/deno/issues/16861 +// start a web server +// This is attempt #3 +// attempt #1 through Deno.server causes hangs on repeated requests +// attempt #2 through http/server causes a deno vendor crash: https://github.com/denoland/deno/issues/16861 - // we'll just use python :facepalm: +// we'll just use python :facepalm: - const proc = Deno.run({ - cmd: ["python", "-m", "http.server", "8080"], - cwd: "docs/playwright", - }); +const proc = Deno.run({ + cmd: ["python", "-m", "http.server", "8080"], + cwd: "docs/playwright", +}); - try { - // run playwright - await execProcess({ - cmd: [ - "npx", // Deno.build.os == "windows" ? "npx.cmd" : "npx", - "playwright", - "test", - ], - cwd: "integration/playwright", - }); - } finally { - // cleanup - proc.kill(); - proc.close(); - for (const fileName of fileNames) { - cleanoutput(fileName, "html"); - } +try { + // run playwright + await execProcess({ + cmd: [Deno.build.os == "windows" ? "npx.cmd" : "npx", "playwright", "test"], + cwd: "integration/playwright", + }); +} finally { + // cleanup + proc.kill(); + proc.close(); + for (const fileName of fileNames) { + cleanoutput(fileName, "html"); } } From 72ac8bae0c4f4bfe50ba8ff040ea73826cbf1ec3 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Fri, 17 Feb 2023 10:05:30 +0100 Subject: [PATCH 99/99] [gha] Run playwright on Windows at least once a day by scheduling workflow --- .github/workflows/test-smokes.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index 23e982b3a10..e26ad495f8a 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -8,6 +8,8 @@ on: push: # only trigger on branches, not on tags branches: [main] + schedule: + - cron: "0 6 * * *" jobs: run-smokes: @@ -15,7 +17,6 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, windows-latest] - # os: [windows-latest] runs-on: ${{ matrix.os }} steps: @@ -39,16 +40,19 @@ jobs: r-version: "4.2.2" - name: Install node (for Playwright) + if: ${{ runner.os != 'Windows' || github.event_name == 'schedule' }} uses: actions/setup-node@v3 with: node-version: 16 - name: Install node dependencies + if: ${{ runner.os != 'Windows' || github.event_name == 'schedule' }} run: yarn working-directory: ./tests/integration/playwright shell: bash - name: Install Playwright Browsers + if: ${{ runner.os != 'Windows' || github.event_name == 'schedule' }} run: npx playwright install --with-deps working-directory: ./tests/integration/playwright