diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 4406430e7c..0000000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,507 +0,0 @@ -version: 2.1 - -orbs: - win: circleci/windows@5.0.0 - percy: percy/agent@0.1.3 - browser-tools: circleci/browser-tools@1.5.1 - -jobs: - artifacts: - docker: - - image: cimg/python:3.12.10 - auth: - username: dashautomation - password: $DASH_PAT_DOCKERHUB - environment: - PYVERSION: python312 - PERCY_ENABLE: 0 - steps: - - checkout - - run: echo $PYVERSION > ver.txt - - run: cat requirements/*.txt > requirements-all.txt - - restore_cache: - key: dep-{{ checksum ".circleci/config.yml" }}-{{ checksum "ver.txt" }}-{{ checksum "requirements-all.txt" }} - - attach_workspace: - at: ~/dash - - store_artifacts: - path: ~/dash/dash-main - destination: /tmp/dash-main - - install-dependencies-312: &install-dependencies - working_directory: ~/dash - docker: - - image: cimg/python:3.12.10-node - auth: - username: dashautomation - password: $DASH_PAT_DOCKERHUB - environment: - PYVERSION: python312 - PERCY_ENABLE: 0 - - steps: - - checkout - - run: echo $PYVERSION > ver.txt - - run: cat requirements/*.txt > requirements-all.txt - - restore_cache: - key: dep-{{ checksum ".circleci/config.yml" }}-{{ checksum "ver.txt" }}-{{ checksum "requirements-all.txt" }} - - run: - name: ๐ Build Component Packages & Update Dependencies/Artifacts - command: | - python -m venv venv && . venv/bin/activate - pip install "pip<25.0" - pip install --upgrade wheel setuptools - set -eo pipefail - pip install -e .[ci,dev,testing,celery,diskcache] --progress-bar off - pip list | grep dash - npm ci - npm run build.sequential - python setup.py sdist - mkdir dash-package && cp dist/*.tar.gz dash-package/dash-package.tar.gz - ls -la dash-package - no_output_timeout: 30m - - run: - name: Display npm logs - command: | - if [ -d "/home/circleci/.npm/_logs" ] - then - cat /home/circleci/.npm/_logs/* - fi - - save_cache: - key: dep-{{ checksum ".circleci/config.yml" }}-{{ checksum "ver.txt" }}-{{ checksum "requirements-all.txt" }} - paths: - - venv - - persist_to_workspace: - root: ~/dash - paths: - - dash-package - - install-dependencies-38: - <<: *install-dependencies - docker: - - image: cimg/python:3.8.18-node - auth: - username: dashautomation - password: $DASH_PAT_DOCKERHUB - environment: - PYVERSION: python38 - PERCY_ENABLE: 0 - - lint-unit-312: &lint-unit - working_directory: ~/dash - docker: - - image: cimg/python:3.12.10-browsers - auth: - username: dashautomation - password: $DASH_PAT_DOCKERHUB - environment: - PYVERSION: python312 - PERCY_ENABLE: 0 - - steps: - - checkout - - run: - name: Add chrome keys & update. - command: | - wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add - - sudo apt-get update - - run: echo $PYVERSION > ver.txt - - run: cat requirements/*.txt > requirements-all.txt - - restore_cache: - key: dep-{{ checksum ".circleci/config.yml" }}-{{ checksum "ver.txt" }}-{{ checksum "requirements-all.txt" }} - - browser-tools/install-browser-tools: - chrome-version: 120.0.6099.71 - - run: - name: ๏ธ๏ธ๐๏ธ pip dev requirements - command: | - python -m venv venv && . venv/bin/activate - pip install --upgrade pip wheel - pip install -e .[ci,dev,testing] --no-cache-dir --progress-bar off - - run: - name: ๐ธ Python & JS Lint - command: | - . venv/bin/activate - set -eo pipefail - pip install -e . --progress-bar off && pip list | grep dash - npm ci npm run initialize - npm run build.sequential - npm run lint - - run: - name: ๐ Python Unit Tests & โ JS Unit Tests - command: | - . venv/bin/activate - npm run citest.unit - - lint-unit-38: - <<: *lint-unit - docker: - - image: cimg/python:3.8.18-browsers - auth: - username: dashautomation - password: $DASH_PAT_DOCKERHUB - environment: - PYVERSION: python38 - PERCY_ENABLE: 0 - - build-windows-312: - working_directory: ~/dash - executor: - name: win/default - shell: bash.exe - environment: - PERCY_ENABLE: 0 - steps: - - checkout - - run: - name: pip - command: | - python -m venv venv && . venv/Scripts/activate - pip install --no-cache-dir --upgrade -e .[ci,dev] --progress-bar off - - run: - command: | - nvm install 24 && nvm use 24 - - run: - name: npm prereqs - command: | - nvm use 24 - npm ci - cd dash/dash-renderer && npm i && cd ../../ - cd components/dash-html-components && npm i && npm run extract && cd ../../ - - run: - name: ๏ธ๏ธ๐๏ธ build dash - command: | - nvm use 24 - . venv/Scripts/activate - npm run private::build.jupyterlab && npm run private::build.renderer - cd components/dash-html-components && npm run build - no_output_timeout: 30m - - test-312: &test - working_directory: ~/dash - docker: - - image: cimg/python:3.12.10-browsers - auth: - username: dashautomation - password: $DASH_PAT_DOCKERHUB - environment: - PERCY_ENABLE: 1 - PERCY_PARALLEL_TOTAL: -1 - PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: True - PYVERSION: python312 - parallelism: 3 - steps: - - checkout: - path: ~/dash - - run: - name: Add chrome keys & update. - command: | - wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add - - sudo apt-get update - - run: echo $PYVERSION > ver.txt - - run: cat requirements/*.txt > requirements-all.txt - - run: cat requirements-all.txt - - restore_cache: - key: dep-{{ checksum ".circleci/config.yml" }}-{{ checksum "ver.txt" }}-{{ checksum "requirements-all.txt" }} - - browser-tools/install-browser-tools: - chrome-version: 120.0.6099.71 - install-firefox: false - install-geckodriver: false - - attach_workspace: - at: ~/dash - - run: - name: ๏ธ๏ธ๐๏ธ Install package - command: | - . venv/bin/activate - pip install "pip<25" - npm ci - pip install dash-package/dash-package.tar.gz[ci,dev,testing,celery,diskcache] --progress-bar off - pip list - - run: - name: ๐งช Run Integration Tests - command: | - . venv/bin/activate - npm run citest.integration - - store_artifacts: - path: test-reports - - store_test_results: - path: test-reports - - store_artifacts: - path: /tmp/dash_artifacts - - test-38: - <<: *test - docker: - - image: cimg/python:3.8.18-browsers - auth: - username: dashautomation - password: $DASH_PAT_DOCKERHUB - environment: - PERCY_ENABLE: 0 - PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: True - PYVERSION: python38 - - dcc-lint-unit-312: &dcc-lint-unit - working_directory: ~/dash - docker: - - image: cimg/python:3.12.10-node - auth: - username: dashautomation - password: $DASH_PAT_DOCKERHUB - environment: - PYVERSION: python312 - PERCY_ENABLE: 0 - steps: - - checkout: - path: ~/dash - - run: echo $PYVERSION > ver.txt - - run: cat requirements/*.txt > requirements-all.txt - - restore_cache: - key: dep-{{ checksum ".circleci/config.yml" }}-{{ checksum "ver.txt" }}-{{ checksum "requirements-all.txt" }} - - run: - name: ๐ธ Lint - command: | - . venv/bin/activate - set -eo pipefail - cd components/dash-core-components - npm ci - npm run lint - - dcc-lint-unit-38: - <<: *dcc-lint-unit - docker: - - image: cimg/python:3.8.18-node - auth: - username: dashautomation - password: $DASH_PAT_DOCKERHUB - environment: - PYVERSION: python38 - PERCY_ENABLE: 0 - - dcc-312: &dcc-test - working_directory: ~/dash - docker: - - image: cimg/python:3.12.10-browsers - auth: - username: dashautomation - password: $DASH_PAT_DOCKERHUB - environment: - PYVERSION: python312 - PERCY_PARALLEL_TOTAL: -1 - PERCY_ENABLE: 1 - parallelism: 3 - steps: - - checkout: - path: ~/dash - - run: - name: Add chrome keys & update. - command: | - wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add - - sudo apt-get update - - run: echo $PYVERSION > ver.txt - - run: cat requirements/*.txt > requirements-all.txt - - restore_cache: - key: dep-{{ checksum ".circleci/config.yml" }}-{{ checksum "ver.txt" }}-{{ checksum "requirements-all.txt" }} - - browser-tools/install-browser-tools: - chrome-version: 120.0.6099.71 - install-firefox: false - install-geckodriver: false - - attach_workspace: - at: ~/dash - - run: - name: ๏ธ๏ธ๐๏ธ Install package - command: | - . venv/bin/activate - pip install dash-package/dash-package.tar.gz[ci,dev,testing,celery,diskcache] --progress-bar off - pip list | grep dash - - run: - name: ๐งช Run Integration Tests - command: | - . venv/bin/activate && rm -rf components/dash-core-components/dash_core_components - cd components/dash-core-components - npm ci - npm run test:jest - TESTFILES=$(circleci tests glob "tests/integration/**/test_*.py" | circleci tests split --split-by=timings) - pytest --headless --nopercyfinalize --junitxml=test-reports/junit_intg.xml --junitprefix="components.dash-core-components" ${TESTFILES} - - store_artifacts: - path: ~/dash/components/dash-core-components/test-reports - - store_test_results: - path: ~/dash/components/dash-core-components/test-reports - - store_artifacts: - path: /tmp/dash_artifacts - - dcc-38: - <<: *dcc-test - docker: - - image: cimg/python:3.8.18-browsers - auth: - username: dashautomation - password: $DASH_PAT_DOCKERHUB - environment: - PYVERSION: python38 - PERCY_ENABLE: 0 - - html-312: &html-test - working_directory: ~/dash - docker: - - image: cimg/python:3.12.10-browsers - auth: - username: dashautomation - password: $DASH_PAT_DOCKERHUB - environment: - PYVERSION: python312 - PERCY_ENABLE: 1 - PERCY_PARALLEL_TOTAL: -1 - - steps: - - checkout: - path: ~/dash - - run: - name: Add chrome keys & update. - command: | - wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add - - sudo apt-get update - - run: echo $PYVERSION > ver.txt - - run: cat requirements/*.txt > requirements-all.txt - - restore_cache: - key: dep-{{ checksum ".circleci/config.yml" }}-{{ checksum "ver.txt" }}-{{ checksum "requirements-all.txt" }} - - restore_cache: - key: html-{{ checksum "components/dash-html-components/package.json" }}-{{ checksum "components/dash-html-components/package-lock.json" }} - - browser-tools/install-browser-tools: - chrome-version: 120.0.6099.71 - install-firefox: false - install-geckodriver: false - - attach_workspace: - at: ~/dash - - run: - name: ๏ธ๏ธ๐๏ธ Install package and html - command: | - . venv/bin/activate - pip install dash-package/dash-package.tar.gz[ci,dev,testing,celery,diskcache] --progress-bar off - pip list | grep dash - cd components/dash-html-components - npm ci - npm run prebuild - - save_cache: - key: html-{{ checksum "components/dash-html-components/package.json" }}-{{ checksum "components/dash-html-components/package-lock.json" }} - paths: - - components/dash-html-components/node_modules - - run: - name: ๐งช Run tests - command: | - . venv/bin/activate - cd components/dash-html-components - npm run test - - store_artifacts: - path: ~/dash/components/dash-html-components/test-reports - - store_test_results: - path: ~/dash/components/dash-html-components/test-reports - - store_artifacts: - path: /tmp/dash_artifacts - - html-38: - <<: *html-test - docker: - - image: cimg/python:3.8.18-browsers - auth: - username: dashautomation - password: $DASH_PAT_DOCKERHUB - environment: - PYVERSION: python38 - PERCY_ENABLE: 0 - - table-visual-test: - working_directory: ~/dash/components/dash-table - docker: - - image: cimg/node:lts-browsers - environment: - PERCY_TOKEN: $PERCY_TOKEN_TABLE - - steps: - - checkout: - path: ~/dash - - run: - name: Add chrome keys & update. - command: | - wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add - - sudo apt-get update - - restore_cache: - key: dep-{{ .Branch }}-{{ checksum "package-lock.json" }}-{{ checksum "package.json" }} - - browser-tools/install-browser-tools: - install-firefox: false - install-geckodriver: false - - run: - name: Install package.json - command: npm ci - - save_cache: - key: dep-{{ .Branch }}-{{ checksum "package-lock.json" }}-{{ checksum "package.json" }} - paths: - - node_modules - - run: - name: Run build:js - command: npm run private::build:js - - run: - name: Run visual tests - command: PERCY_TOKEN=$PERCY_TOKEN_TABLE npm run test.visual - - store_artifacts: - path: storybook-static - -workflows: - version: 2 - tests: - jobs: - - install-dependencies-312 - - install-dependencies-38 - - - build-windows-312 - - - lint-unit-312: - requires: - - install-dependencies-312 - - lint-unit-38: - requires: - - install-dependencies-38 - - - test-312: - requires: - - install-dependencies-312 - - test-38: - requires: - - install-dependencies-38 - - - dcc-lint-unit-312: - requires: - - install-dependencies-312 - - dcc-lint-unit-38: - requires: - - install-dependencies-38 - - - dcc-312: - requires: - - install-dependencies-312 - - dcc-38: - requires: - - install-dependencies-38 - - - html-312: - requires: - - install-dependencies-312 - - html-38: - requires: - - install-dependencies-38 - - - table-visual-test - - - percy/finalize_all: - requires: - - test-312 - - dcc-312 - - html-312 - - artifacts: - requires: - - percy/finalize_all - filters: - branches: - only: - - master - - dev - tags: - only: /v*/ diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index ac31ffa6dc..d0dee4bae0 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -14,9 +14,10 @@ jobs: name: Detect Relevant Path Changes runs-on: ubuntu-latest outputs: - # This output will be 'true' if files in the 'table_related_paths' list changed, 'false' otherwise. table_paths_changed: ${{ steps.filter.outputs.table_related_paths }} background_cb_changed: ${{ steps.filter.outputs.background_paths }} + dcc_paths_changed: ${{ steps.filter.outputs.dcc_related_paths }} + html_paths_changed: ${{ steps.filter.outputs.html_related_paths }} steps: - name: Checkout repository uses: actions/checkout@v4 @@ -29,6 +30,12 @@ jobs: table_related_paths: - 'components/dash-table/**' - 'dash/dash-renderer/**' + dcc_related_paths: + - 'components/dash-core-components/**' + - 'dash/dash-renderer/**' + html_related_paths: + - 'components/dash-html-components/**' + - 'dash/dash-renderer/**' background_paths: - 'dash/background_callback/**' - 'dash/dash-renderer/**' @@ -38,6 +45,71 @@ jobs: - 'tests/async_tests/**' - 'requirements/**' + lint-unit: + name: Lint & Unit Tests (Python ${{ matrix.python-version }}) + needs: build + runs-on: ubuntu-latest + timeout-minutes: 30 + strategy: + fail-fast: false + matrix: + python-version: ["3.8", "3.12"] + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '24' + cache: 'npm' + + - name: Install Node.js dependencies + run: npm ci + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + cache: 'pip' + cache-dependency-path: requirements/*.txt + + - name: Download built Dash packages + uses: actions/download-artifact@v4 + with: + name: dash-packages + path: packages/ + + - name: Download built component folders for linting + uses: actions/download-artifact@v4 + with: + name: dash-components + path: ${{ github.workspace }}/dash + + - name: Install Dash packages + run: | + python -m pip install --upgrade pip wheel + python -m pip install "setuptools<80.0.0" + find packages -name dash-*.whl -print -exec sh -c 'pip install "{}[dev,ci,testing]"' \; + + - name: Install dash-renderer dependencies + working-directory: dash/dash-renderer + run: npm ci + + - name: Setup virtual display + run: | + sudo apt-get update + sudo apt-get install -y xvfb + sudo Xvfb :99 -ac -screen 0 1280x1024x24 & + echo "DISPLAY=:99" >> $GITHUB_ENV + + - name: Run lint + run: npm run lint + + - name: Run unit tests + run: npm run citest.unit + build: name: Build Dash Package runs-on: ubuntu-latest @@ -53,7 +125,7 @@ jobs: - name: Set up Node.js for frontend build uses: actions/setup-node@v4 with: - node-version: '20' + node-version: '24' cache: npm - name: Install NPM dependencies @@ -91,6 +163,16 @@ jobs: path: packages/ # Upload the contents of the dist directory retention-days: 1 # Keep artifact for 1 day (adjust as needed) + - name: Upload built component folders for linting + uses: actions/upload-artifact@v4 + with: + name: dash-components + path: | + dash/dcc/ + dash/html/ + dash/dash_table/ + retention-days: 1 + test-typing: name: Typing Tests runs-on: ubuntu-latest @@ -107,7 +189,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v4 with: - node-version: '20' + node-version: '24' cache: 'npm' - name: Install Node.js dependencies @@ -118,6 +200,7 @@ jobs: with: python-version: '3.12' cache: 'pip' + cache-dependency-path: requirements/*.txt - name: Download built Dash packages uses: actions/download-artifact@v4 @@ -174,7 +257,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v4 with: - node-version: '20' + node-version: '24' cache: 'npm' - name: Install Node.js dependencies @@ -185,6 +268,7 @@ jobs: with: python-version: ${{ matrix.python-version }} cache: 'pip' + cache-dependency-path: requirements/*.txt - name: Download built Dash packages uses: actions/download-artifact@v4 @@ -196,60 +280,12 @@ jobs: run: | python -m pip install --upgrade pip wheel python -m pip install "setuptools<78.0.0" - python -m pip install "selenium==4.32.0" find packages -name dash-*.whl -print -exec sh -c 'pip install "{}[async,ci,testing,dev,celery,diskcache]"' \; - - name: Install Google Chrome - run: | - sudo apt-get update - # Attempt to install a specific recent, stable version or just google-chrome-stable - # For more deterministic builds, you might consider a specific version if available via apt, - # or using a Docker image with Chrome pre-installed if extreme consistency is needed. - sudo apt-get install -y google-chrome-stable - - - name: Install ChromeDriver - run: | - echo "Determining Chrome version..." - CHROME_BROWSER_VERSION=$(google-chrome --version) - echo "Installed Chrome Browser version: $CHROME_BROWSER_VERSION" - # Extract the major version number (e.g., 124 from "Google Chrome 124.0.6367.207") - CHROME_MAJOR_VERSION=$(echo "$CHROME_BROWSER_VERSION" | cut -f 3 -d ' ' | cut -f 1 -d '.') - echo "Detected Chrome Major version: $CHROME_MAJOR_VERSION" - - # For Chrome 115 and later, use the new Chrome for Testing (CfT) JSON endpoints - if [ "$CHROME_MAJOR_VERSION" -ge 115 ]; then - echo "Fetching ChromeDriver version for Chrome $CHROME_MAJOR_VERSION using CfT endpoint..." - # Get the latest known good version of chromedriver for this major Chrome version - CHROMEDRIVER_VERSION_STRING=$(curl -sS "https://googlechromelabs.github.io/chrome-for-testing/LATEST_RELEASE_${CHROME_MAJOR_VERSION}") - if [ -z "$CHROMEDRIVER_VERSION_STRING" ]; then - echo "Could not automatically find ChromeDriver version for Chrome $CHROME_MAJOR_VERSION via LATEST_RELEASE. Please check CfT endpoints." - # As a fallback, attempt to fetch the known good versions and pick the latest chromedriver. - # This is more complex and might require parsing JSON with jq. - # For simplicity, we'll rely on LATEST_RELEASE_ for now. - # If that fails consistently, you might need a more robust script or a fixed ChromeDriver version. - # Alternative: List all known good versions - # curl -sS "https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json" - exit 1 - fi - CHROMEDRIVER_URL="https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/${CHROMEDRIVER_VERSION_STRING}/linux64/chromedriver-linux64.zip" - else - # For older Chrome versions (less common now) - echo "Fetching ChromeDriver version for Chrome $CHROME_MAJOR_VERSION using older method..." - CHROMEDRIVER_VERSION_STRING=$(curl -sS "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_${CHROME_MAJOR_VERSION}") - CHROMEDRIVER_URL="https://chromedriver.storage.googleapis.com/${CHROMEDRIVER_VERSION_STRING}/chromedriver_linux64.zip" - fi - - echo "Using ChromeDriver version string: $CHROMEDRIVER_VERSION_STRING" - echo "Downloading ChromeDriver from: $CHROMEDRIVER_URL" - - wget -q -O chromedriver.zip "$CHROMEDRIVER_URL" - unzip -o chromedriver.zip -d /tmp/ # Unzip to /tmp - # The zip for CfT often contains a directory like chromedriver-linux64/ - sudo mv /tmp/chromedriver-linux64/chromedriver /usr/local/bin/chromedriver || sudo mv /tmp/chromedriver /usr/local/bin/chromedriver - sudo chmod +x /usr/local/bin/chromedriver - # Add /usr/local/bin to GITHUB_PATH to ensure chromedriver is found - echo "/usr/local/bin" >> $GITHUB_PATH - shell: bash + - name: Setup Chrome and ChromeDriver + uses: browser-actions/setup-chrome@v1 + with: + chrome-version: stable - name: Verify Redis connection run: | @@ -258,18 +294,40 @@ jobs: - name: Build/Setup test components run: npm run setup-tests.py - - name: Run Background & Async Callback Tests + - name: Setup test directory run: | mkdir bgtests cp -r tests bgtests/tests cd bgtests touch __init__.py - pytest --headless --nopercyfinalize tests/background_callback -v -s + mkdir -p test-reports + + - name: Run Background Callback Tests + timeout-minutes: 15 + run: | + cd bgtests + pytest --headless --nopercyfinalize --junitxml=test-reports/junit_background.xml tests/background_callback -v -s + + - name: Cleanup background processes + if: always() + run: | + pkill -f celery || true + pkill -f "dash" || true + sleep 2 - name: Run Async Callback Tests + timeout-minutes: 15 run: | cd bgtests - pytest --headless --nopercyfinalize tests/async_tests -v -s + pytest --headless --nopercyfinalize --junitxml=test-reports/junit_async.xml tests/async_tests -v -s + + - name: Upload test results + if: always() + uses: actions/upload-artifact@v4 + with: + name: background-test-results-py${{ matrix.python-version }} + path: bgtests/test-reports/ + retention-days: 7 table-unit: name: Table Unit/Lint Tests (Python ${{ matrix.python-version }}) @@ -291,7 +349,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v4 with: - node-version: '20' + node-version: '24' cache: 'npm' - name: Install Node.js dependencies @@ -302,6 +360,7 @@ jobs: with: python-version: ${{ matrix.python-version }} cache: 'pip' + cache-dependency-path: requirements/*.txt - name: Download built Dash packages uses: actions/download-artifact@v4 @@ -349,7 +408,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v4 with: - node-version: '20' + node-version: '24' cache: 'npm' - name: Install Node.js dependencies @@ -360,6 +419,7 @@ jobs: with: python-version: ${{ matrix.python-version }} cache: 'pip' + cache-dependency-path: requirements/*.txt - name: Download built Dash packages uses: actions/download-artifact@v4 @@ -372,65 +432,552 @@ jobs: python -m pip install --upgrade pip wheel python -m pip install "setuptools<80.0.0" find packages -name dash-*.whl -print -exec sh -c 'pip install "{}[ci,testing,dev]"' \; - pip install pytest-split - - name: Install Google Chrome + - name: Setup Chrome and ChromeDriver + uses: browser-actions/setup-chrome@v1 + with: + chrome-version: stable + + - name: Run Table Server Tests + run: | + cd components/dash-table + pytest --nopercyfinalize --headless --junitxml=test-reports/junit_table.xml --splits 3 --group ${{ matrix.test-group }} + + - name: Upload test results + if: always() + uses: actions/upload-artifact@v4 + with: + name: table-server-results-group${{ matrix.test-group }} + path: components/dash-table/test-reports/ + retention-days: 7 + + test-main: + name: Main Dash Tests (Python ${{ matrix.python-version }}, Group ${{ matrix.test-group }}) + needs: build + runs-on: ubuntu-latest + timeout-minutes: 30 + strategy: + fail-fast: false + matrix: + python-version: ["3.8", "3.12"] + test-group: ["1", "2", "3"] + + env: + PERCY_TOKEN: ${{ matrix.python-version == '3.12' && secrets.PERCY_TOKEN || '' }} + PERCY_ENABLE: ${{ matrix.python-version == '3.12' && '1' || '0' }} + PERCY_PARALLEL_TOTAL: -1 + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '24' + cache: 'npm' + + - name: Install Node.js dependencies + run: npm ci + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + cache: 'pip' + cache-dependency-path: requirements/*.txt + + - name: Download built Dash packages + uses: actions/download-artifact@v4 + with: + name: dash-packages + path: packages/ + + - name: Install Dash packages + run: | + python -m pip install --upgrade pip wheel + python -m pip install "setuptools<80.0.0" + find packages -name dash-*.whl -print -exec sh -c 'pip install "{}[ci,testing,dev,celery,diskcache]"' \; + + - name: Setup Chrome and ChromeDriver + uses: browser-actions/setup-chrome@v1 + with: + chrome-version: stable + + - name: Setup virtual display run: | sudo apt-get update - # Attempt to install a specific recent, stable version or just google-chrome-stable - # For more deterministic builds, you might consider a specific version if available via apt, - # or using a Docker image with Chrome pre-installed if extreme consistency is needed. - sudo apt-get install -y google-chrome-stable - - - name: Install ChromeDriver - run: | - echo "Determining Chrome version..." - CHROME_BROWSER_VERSION=$(google-chrome --version) - echo "Installed Chrome Browser version: $CHROME_BROWSER_VERSION" - # Extract the major version number (e.g., 124 from "Google Chrome 124.0.6367.207") - CHROME_MAJOR_VERSION=$(echo "$CHROME_BROWSER_VERSION" | cut -f 3 -d ' ' | cut -f 1 -d '.') - echo "Detected Chrome Major version: $CHROME_MAJOR_VERSION" - - # For Chrome 115 and later, use the new Chrome for Testing (CfT) JSON endpoints - if [ "$CHROME_MAJOR_VERSION" -ge 115 ]; then - echo "Fetching ChromeDriver version for Chrome $CHROME_MAJOR_VERSION using CfT endpoint..." - # Get the latest known good version of chromedriver for this major Chrome version - CHROMEDRIVER_VERSION_STRING=$(curl -sS "https://googlechromelabs.github.io/chrome-for-testing/LATEST_RELEASE_${CHROME_MAJOR_VERSION}") - if [ -z "$CHROMEDRIVER_VERSION_STRING" ]; then - echo "Could not automatically find ChromeDriver version for Chrome $CHROME_MAJOR_VERSION via LATEST_RELEASE. Please check CfT endpoints." - # As a fallback, attempt to fetch the known good versions and pick the latest chromedriver. - # This is more complex and might require parsing JSON with jq. - # For simplicity, we'll rely on LATEST_RELEASE_ for now. - # If that fails consistently, you might need a more robust script or a fixed ChromeDriver version. - # Alternative: List all known good versions - # curl -sS "https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json" - exit 1 - fi - CHROMEDRIVER_URL="https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/${CHROMEDRIVER_VERSION_STRING}/linux64/chromedriver-linux64.zip" + sudo apt-get install -y xvfb + sudo Xvfb :99 -ac -screen 0 1280x1024x24 & + echo "DISPLAY=:99" >> $GITHUB_ENV + + - name: Build/Setup test components + run: npm run setup-tests.py + + - name: Run main integration tests + run: | + if [ "${{ matrix.python-version }}" == "3.12" ]; then + npx percy exec -- pytest --headless --nopercyfinalize --junitxml=test-reports/junit_intg.xml tests/integration --splits 3 --group ${{ matrix.test-group }} else - # For older Chrome versions (less common now) - echo "Fetching ChromeDriver version for Chrome $CHROME_MAJOR_VERSION using older method..." - CHROMEDRIVER_VERSION_STRING=$(curl -sS "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_${CHROME_MAJOR_VERSION}") - CHROMEDRIVER_URL="https://chromedriver.storage.googleapis.com/${CHROMEDRIVER_VERSION_STRING}/chromedriver_linux64.zip" + pytest --headless --nopercyfinalize --junitxml=test-reports/junit_intg.xml tests/integration --splits 3 --group ${{ matrix.test-group }} fi - echo "Using ChromeDriver version string: $CHROMEDRIVER_VERSION_STRING" - echo "Downloading ChromeDriver from: $CHROMEDRIVER_URL" + - name: Upload test results + if: always() + uses: actions/upload-artifact@v4 + with: + name: test-main-results-py${{ matrix.python-version }}-group${{ matrix.test-group }} + path: test-reports/ + retention-days: 7 + + - name: Upload dash artifacts + if: always() + uses: actions/upload-artifact@v4 + with: + name: test-main-dash-artifacts-py${{ matrix.python-version }}-group${{ matrix.test-group }} + path: /tmp/dash_artifacts + retention-days: 7 + if-no-files-found: ignore + + html-test: + name: HTML Components Tests (Python ${{ matrix.python-version }}) + needs: [build, changes_filter] + if: | + (github.event_name == 'push' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/dev')) || + needs.changes_filter.outputs.html_paths_changed == 'true' + runs-on: ubuntu-latest + timeout-minutes: 30 + strategy: + fail-fast: false + matrix: + python-version: ["3.8", "3.12"] + + env: + PERCY_TOKEN: ${{ matrix.python-version == '3.12' && secrets.PERCY_TOKEN || '' }} + PERCY_ENABLE: ${{ matrix.python-version == '3.12' && '1' || '0' }} + PERCY_PARALLEL_TOTAL: -1 + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '24' + cache: 'npm' + + - name: Install Node.js dependencies + run: npm ci + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + cache: 'pip' + cache-dependency-path: requirements/*.txt - wget -q -O chromedriver.zip "$CHROMEDRIVER_URL" - unzip -o chromedriver.zip -d /tmp/ # Unzip to /tmp - # The zip for CfT often contains a directory like chromedriver-linux64/ - sudo mv /tmp/chromedriver-linux64/chromedriver /usr/local/bin/chromedriver || sudo mv /tmp/chromedriver /usr/local/bin/chromedriver - sudo chmod +x /usr/local/bin/chromedriver - # Add /usr/local/bin to GITHUB_PATH to ensure chromedriver is found - echo "/usr/local/bin" >> $GITHUB_PATH - shell: bash + - name: Download built Dash packages + uses: actions/download-artifact@v4 + with: + name: dash-packages + path: packages/ - - name: Verify ChromeDriver Installation + - name: Install Dash packages run: | - chromedriver --version + python -m pip install --upgrade pip wheel + python -m pip install "setuptools<80.0.0" + find packages -name dash-*.whl -print -exec sh -c 'pip install "{}[ci,testing,dev]"' \; - - name: Run Table Server Tests + - name: Setup Chrome and ChromeDriver + uses: browser-actions/setup-chrome@v1 + with: + chrome-version: stable + + - name: Setup virtual display run: | - cd components/dash-table - pytest --nopercyfinalize --headless --splits 3 --group ${{ matrix.test-group }} + sudo apt-get update + sudo apt-get install -y xvfb + sudo Xvfb :99 -ac -screen 0 1280x1024x24 & + echo "DISPLAY=:99" >> $GITHUB_ENV + + - name: Run HTML components tests + working-directory: components/dash-html-components + run: | + npm ci + if [ "${{ matrix.python-version }}" == "3.12" ]; then + npx percy exec -- pytest --headless --nopercyfinalize --junitxml=test-reports/junit_html.xml + else + pytest --headless --nopercyfinalize --junitxml=test-reports/junit_html.xml + fi + + - name: Upload test results + if: always() + uses: actions/upload-artifact@v4 + with: + name: html-test-results-py${{ matrix.python-version }} + path: components/dash-html-components/test-reports/ + retention-days: 7 + + - name: Upload dash artifacts + if: always() + uses: actions/upload-artifact@v4 + with: + name: html-test-dash-artifacts-py${{ matrix.python-version }} + path: /tmp/dash_artifacts + retention-days: 7 + if-no-files-found: ignore + + build-windows: + name: Build on Windows + runs-on: windows-latest + timeout-minutes: 30 + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Node.js 24 + uses: actions/setup-node@v4 + with: + node-version: '24' + cache: 'npm' + + - name: Set up Python 3.12 + uses: actions/setup-python@v5 + with: + python-version: '3.12' + + - name: Install Node.js dependencies + run: npm ci + + - name: Install Python dependencies + run: | + python -m pip install --upgrade pip + python -m pip install "setuptools<80.0.0" + python -m pip install -e .[dev,ci] + + - name: Build dash-renderer + working-directory: dash/dash-renderer + run: | + npm ci + npm run build + + - name: Build dash-html-components + working-directory: components/dash-html-components + run: | + npm ci + npm run build + + dcc-lint: + name: DCC Lint Tests (Python ${{ matrix.python-version }}) + needs: [build, changes_filter] + if: | + (github.event_name == 'push' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/dev')) || + needs.changes_filter.outputs.dcc_paths_changed == 'true' + runs-on: ubuntu-latest + timeout-minutes: 30 + strategy: + fail-fast: false + matrix: + python-version: ["3.8", "3.12"] + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '24' + cache: 'npm' + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + cache: 'pip' + cache-dependency-path: requirements/*.txt + + - name: Download built Dash packages + uses: actions/download-artifact@v4 + with: + name: dash-packages + path: packages/ + + - name: Install Dash packages + run: | + python -m pip install --upgrade pip wheel + python -m pip install "setuptools<80.0.0" + find packages -name dash-*.whl -print -exec sh -c 'pip install "{}[ci,testing,dev]"' \; + + - name: Lint DCC + run: | + cd components/dash-core-components + npm ci + npm run lint + + dcc-test: + name: DCC Integration Tests (Python ${{ matrix.python-version }}, Group ${{ matrix.test-group }}) + needs: [build, changes_filter] + if: | + (github.event_name == 'push' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/dev')) || + needs.changes_filter.outputs.dcc_paths_changed == 'true' + runs-on: ubuntu-latest + timeout-minutes: 30 + strategy: + fail-fast: false + matrix: + python-version: ["3.8", "3.12"] + test-group: ["1", "2", "3"] + + env: + PERCY_TOKEN: ${{ matrix.python-version == '3.12' && secrets.PERCY_TOKEN || '' }} + PERCY_ENABLE: ${{ matrix.python-version == '3.12' && '1' || '0' }} + PERCY_PARALLEL_TOTAL: -1 + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '24' + cache: 'npm' + + - name: Install Node.js dependencies + run: npm ci + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + cache: 'pip' + cache-dependency-path: requirements/*.txt + + - name: Download built Dash packages + uses: actions/download-artifact@v4 + with: + name: dash-packages + path: packages/ + + - name: Install Dash packages + run: | + python -m pip install --upgrade pip wheel + python -m pip install "setuptools<80.0.0" + find packages -name dash-*.whl -print -exec sh -c 'pip install "{}[ci,testing,dev,celery,diskcache]"' \; + + - name: Setup Chrome and ChromeDriver + uses: browser-actions/setup-chrome@v1 + with: + chrome-version: stable + + - name: Setup virtual display + run: | + sudo apt-get update + sudo apt-get install -y xvfb + sudo Xvfb :99 -ac -screen 0 1280x1024x24 & + echo "DISPLAY=:99" >> $GITHUB_ENV + + - name: Remove DCC Python package and run tests + run: | + rm -rf components/dash-core-components/dash_core_components + cd components/dash-core-components + npm ci + npm run test:jest + pytest --headless --nopercyfinalize --junitxml=test-reports/junit_intg.xml --junitprefix="components.dash-core-components" tests/integration --splits 3 --group ${{ matrix.test-group }} + + - name: Upload test results + if: always() + uses: actions/upload-artifact@v4 + with: + name: dcc-test-results-py${{ matrix.python-version }}-group${{ matrix.test-group }} + path: components/dash-core-components/test-reports/ + retention-days: 7 + + - name: Upload dash artifacts + if: always() + uses: actions/upload-artifact@v4 + with: + name: dcc-dash-artifacts-py${{ matrix.python-version }}-group${{ matrix.test-group }} + path: /tmp/dash_artifacts + retention-days: 7 + if-no-files-found: ignore + + table-visual-test: + name: Dash Table Visual Tests + needs: [build, changes_filter] + if: | + (github.event_name == 'push' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/dev')) || + needs.changes_filter.outputs.table_paths_changed == 'true' + runs-on: ubuntu-latest + timeout-minutes: 30 + + env: + PERCY_TOKEN: ${{ secrets.PERCY_TOKEN_TABLE }} + PERCY_ENABLE: '1' + # Note: percy-storybook auto-finalizes, don't use PERCY_PARALLEL_TOTAL here + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '24' + cache: 'npm' + + - name: Install Node.js dependencies + run: npm ci + + - name: Set up Python 3.12 + uses: actions/setup-python@v5 + with: + python-version: '3.12' + cache: 'pip' + cache-dependency-path: requirements/*.txt + + - name: Download built Dash packages + uses: actions/download-artifact@v4 + with: + name: dash-packages + path: packages/ + + - name: Install Dash packages + run: | + python -m pip install --upgrade pip wheel + python -m pip install "setuptools<80.0.0" + find packages -name dash-*.whl -print -exec sh -c 'pip install "{}[ci,testing,dev]"' \; + + - name: Setup Chrome and ChromeDriver + uses: browser-actions/setup-chrome@v1 + with: + chrome-version: stable + + - name: Setup virtual display + run: | + sudo apt-get update + sudo apt-get install -y xvfb + sudo Xvfb :99 -ac -screen 0 1280x1024x24 & + echo "DISPLAY=:99" >> $GITHUB_ENV + + - name: Run Table visual tests + working-directory: components/dash-table + run: | + npm ci + npm run test.visual + + - name: Upload dash artifacts + if: always() + uses: actions/upload-artifact@v4 + with: + name: table-visual-test-dash-artifacts + path: /tmp/dash_artifacts + retention-days: 7 + if-no-files-found: ignore + + percy-finalize: + name: Finalize Percy Snapshots + needs: [test-main, dcc-test, html-test] + runs-on: ubuntu-latest + if: always() + steps: + - name: Finalize Main Percy Build + if: | + needs.test-main.result != 'skipped' || + needs.dcc-test.result != 'skipped' || + needs.html-test.result != 'skipped' + run: | + npm install -g @percy/cli + npx percy build:finalize + env: + PERCY_TOKEN: ${{ secrets.PERCY_TOKEN }} + + test-report: + name: Consolidated Test Report + needs: [lint-unit, test-main, dcc-test, html-test, table-server, background-callbacks, test-typing] + runs-on: ubuntu-latest + if: always() + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Download all test results + uses: actions/download-artifact@v4 + with: + pattern: '*-results-*' + path: test-results + merge-multiple: false + + - name: List downloaded results + run: find test-results -name "*.xml" -type f 2>/dev/null || echo "No XML files found" + + - name: Publish Test Report + uses: dorny/test-reporter@v1 + if: always() + with: + name: Test Results Summary + path: 'test-results/**/*.xml' + reporter: java-junit + fail-on-error: false + fail-on-empty: false + list-suites: 'failed' + list-tests: 'failed' + max-annotations: '50' + + - name: Generate Summary + if: always() + run: | + echo "## ๐ Test Results Summary" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "| Job | Status |" >> $GITHUB_STEP_SUMMARY + echo "|-----|--------|" >> $GITHUB_STEP_SUMMARY + echo "| Lint & Unit Tests | ${{ needs.lint-unit.result }} |" >> $GITHUB_STEP_SUMMARY + echo "| Main Integration Tests | ${{ needs.test-main.result }} |" >> $GITHUB_STEP_SUMMARY + echo "| DCC Tests | ${{ needs.dcc-test.result }} |" >> $GITHUB_STEP_SUMMARY + echo "| HTML Tests | ${{ needs.html-test.result }} |" >> $GITHUB_STEP_SUMMARY + echo "| Table Server Tests | ${{ needs.table-server.result }} |" >> $GITHUB_STEP_SUMMARY + echo "| Background Callbacks | ${{ needs.background-callbacks.result }} |" >> $GITHUB_STEP_SUMMARY + echo "| Typing Tests | ${{ needs.test-typing.result }} |" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "๐ Detailed test reports are available in the artifacts section above." >> $GITHUB_STEP_SUMMARY + + - name: Check for failures + if: always() + run: | + if [[ "${{ needs.lint-unit.result }}" == "failure" ]] || \ + [[ "${{ needs.test-main.result }}" == "failure" ]] || \ + [[ "${{ needs.dcc-test.result }}" == "failure" ]] || \ + [[ "${{ needs.html-test.result }}" == "failure" ]] || \ + [[ "${{ needs.table-server.result }}" == "failure" ]] || \ + [[ "${{ needs.background-callbacks.result }}" == "failure" ]] || \ + [[ "${{ needs.test-typing.result }}" == "failure" ]]; then + echo "One or more required jobs failed" + exit 1 + fi + + artifacts: + name: Store Build Artifacts + needs: [build, percy-finalize] + runs-on: ubuntu-latest + if: | + github.event_name == 'push' && + (github.ref == 'refs/heads/master' || + github.ref == 'refs/heads/dev' || + startsWith(github.ref, 'refs/tags/')) + + steps: + - name: Download built Dash packages + uses: actions/download-artifact@v4 + with: + name: dash-packages + path: packages/ + + - name: Upload build artifacts + uses: actions/upload-artifact@v4 + with: + name: dash-build-artifacts-${{ github.sha }} + path: packages/ + retention-days: 90 diff --git a/.nvmrc b/.nvmrc index 9de2256827..a45fd52cc5 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -lts/iron +24 diff --git a/.test_durations b/.test_durations new file mode 100644 index 0000000000..9517440b57 --- /dev/null +++ b/.test_durations @@ -0,0 +1,333 @@ +{ + "tests/integration/callbacks/test_api_callback.py::test_apib001_api_callback": 9.07, + "tests/integration/callbacks/test_arbitrary_callbacks.py::test_arb001_global_set_props": 1.033, + "tests/integration/callbacks/test_arbitrary_callbacks.py::test_arb002_no_output_callbacks": 1.666, + "tests/integration/callbacks/test_arbitrary_callbacks.py::test_arb003_arbitrary_pages": 1.048, + "tests/integration/callbacks/test_arbitrary_callbacks.py::test_arb004_wildcard_set_props": 0.823, + "tests/integration/callbacks/test_arbitrary_callbacks.py::test_arb005_no_output_error": 1.167, + "tests/integration/callbacks/test_arbitrary_callbacks.py::test_arb006_multi_set_props": 0.911, + "tests/integration/callbacks/test_arbitrary_callbacks.py::test_arb007_clientside_no_output": 0.75, + "tests/integration/callbacks/test_arbitrary_callbacks.py::test_arb008_set_props_chain_cb": 1.267, + "tests/integration/callbacks/test_basic_callback.py::test_cbsc001_simple_callback": 2.321, + "tests/integration/callbacks/test_basic_callback.py::test_cbsc002_callbacks_generating_children": 0.941, + "tests/integration/callbacks/test_basic_callback.py::test_cbsc003_callback_with_unloaded_async_component": 0.869, + "tests/integration/callbacks/test_basic_callback.py::test_cbsc004_callback_using_unloaded_async_component": 2.38, + "tests/integration/callbacks/test_basic_callback.py::test_cbsc005_children_types[json]": 1.408, + "tests/integration/callbacks/test_basic_callback.py::test_cbsc005_children_types[orjson]": 1.419, + "tests/integration/callbacks/test_basic_callback.py::test_cbsc006_array_of_objects[json]": 1.993, + "tests/integration/callbacks/test_basic_callback.py::test_cbsc006_array_of_objects[orjson]": 1.981, + "tests/integration/callbacks/test_basic_callback.py::test_cbsc007_parallel_updates[False]": 1.122, + "tests/integration/callbacks/test_basic_callback.py::test_cbsc007_parallel_updates[True]": 1.052, + "tests/integration/callbacks/test_basic_callback.py::test_cbsc008_wildcard_prop_callbacks": 2.326, + "tests/integration/callbacks/test_basic_callback.py::test_cbsc009_callback_using_unloaded_async_component_and_graph": 1.234, + "tests/integration/callbacks/test_basic_callback.py::test_cbsc010_event_properties": 0.959, + "tests/integration/callbacks/test_basic_callback.py::test_cbsc011_one_call_for_multiple_outputs_initial": 0.759, + "tests/integration/callbacks/test_basic_callback.py::test_cbsc012_one_call_for_multiple_outputs_update": 0.939, + "tests/integration/callbacks/test_basic_callback.py::test_cbsc013_multi_output_out_of_order": 0.973, + "tests/integration/callbacks/test_basic_callback.py::test_cbsc014_multiple_properties_update_at_same_time_on_same_component": 1.05, + "tests/integration/callbacks/test_basic_callback.py::test_cbsc015_input_output_callback": 0.843, + "tests/integration/callbacks/test_basic_callback.py::test_cbsc016_extra_components_callback": 1.588, + "tests/integration/callbacks/test_basic_callback.py::test_cbsc017_callback_directly_callable": 0.025, + "tests/integration/callbacks/test_basic_callback.py::test_cbsc018_callback_ndarray_output": 0.861, + "tests/integration/callbacks/test_basic_callback.py::test_cbsc019_callback_running": 0.919, + "tests/integration/callbacks/test_basic_callback.py::test_cbsc020_callback_running_non_existing_component": 0.923, + "tests/integration/callbacks/test_basic_callback.py::test_cbsc021_callback_running_non_existing_component": 3.151, + "tests/integration/callbacks/test_callback_context.py::test_cbcx001_modified_response": 0.836, + "tests/integration/callbacks/test_callback_context.py::test_cbcx002_triggered": 2.395, + "tests/integration/callbacks/test_callback_context.py::test_cbcx003_no_callback_context": 0.0, + "tests/integration/callbacks/test_callback_context.py::test_cbcx004_triggered_backward_compat": 0.864, + "tests/integration/callbacks/test_callback_context.py::test_cbcx005_grouped_clicks": 0.0, + "tests/integration/callbacks/test_callback_context.py::test_cbcx006_initial_callback_predecessor": 1.217, + "tests/integration/callbacks/test_callback_context.py::test_cbcx007_triggered_id": 2.463, + "tests/integration/callbacks/test_callback_context.py::test_cbcx008_triggered_id_pmc": 0.924, + "tests/integration/callbacks/test_callback_error.py::test_cber001_error_handler": 1.148, + "tests/integration/callbacks/test_callback_optional.py::test_cbop001_optional_input": 1.087, + "tests/integration/callbacks/test_callback_optional.py::test_cbop002_optional_state": 1.083, + "tests/integration/callbacks/test_dynamic_callback.py::test_dyn003_dynamic_callback_import_library": 0.928, + "tests/integration/callbacks/test_dynamic_callback.py::test_dync001_dynamic_callback": 1.114, + "tests/integration/callbacks/test_dynamic_callback.py::test_dync002_dynamic_callback_without_element": 0.93, + "tests/integration/callbacks/test_global_dash_callback.py::test_dash_callback_001": 0.892, + "tests/integration/callbacks/test_layout_paths_with_callbacks.py::test_cblp001_radio_buttons_callbacks_generating_children": 4.059, + "tests/integration/callbacks/test_malformed_request.py::test_cbmf001_bad_output_outputs": 0.646, + "tests/integration/callbacks/test_missing_inputs.py::test_cbmi001_all_missing_inputs": 1.05, + "tests/integration/callbacks/test_missing_inputs.py::test_cbmi002_follow_on_to_two_skipped_callbacks": 0.921, + "tests/integration/callbacks/test_missing_inputs.py::test_cbmi003_some_missing_inputs": 1.031, + "tests/integration/callbacks/test_missing_inputs.py::test_cbmi004_some_missing_outputs": 0.906, + "tests/integration/callbacks/test_missing_inputs.py::test_cbmi005_all_multi_wildcards_with_output": 1.137, + "tests/integration/callbacks/test_missing_inputs.py::test_cbmi006_all_multi_wildcards_no_outputs": 1.06, + "tests/integration/callbacks/test_missing_inputs.py::test_cbmi007_all_multi_wildcards_some_outputs": 1.205, + "tests/integration/callbacks/test_missing_inputs.py::test_cbmi008_multi_wildcards_and_simple_all_missing": 1.06, + "tests/integration/callbacks/test_missing_inputs.py::test_cbmi009_match_wildcards_all_missing": 0.927, + "tests/integration/callbacks/test_missing_outputs.py::test_cbmo001_all_output[False]": 2.007, + "tests/integration/callbacks/test_missing_outputs.py::test_cbmo001_all_output[True]": 1.9, + "tests/integration/callbacks/test_missing_outputs.py::test_cbmo002_all_and_match_output[False]": 4.359, + "tests/integration/callbacks/test_missing_outputs.py::test_cbmo002_all_and_match_output[True]": 4.278, + "tests/integration/callbacks/test_missing_outputs.py::test_cbmo003_multi_all": 3.157, + "tests/integration/callbacks/test_missing_outputs.py::test_cbmo004_removing_element_while_waiting_to_update": 1.131, + "tests/integration/callbacks/test_missing_outputs.py::test_cbmo005_no_update_single_to_multi": 1.867, + "tests/integration/callbacks/test_multiple_callbacks.py::test_cbmt001_called_multiple_times_and_out_of_order": 4.02, + "tests/integration/callbacks/test_multiple_callbacks.py::test_cbmt002_canceled_intermediate_callback": 2.106, + "tests/integration/callbacks/test_multiple_callbacks.py::test_cbmt003_chain_with_table": 1.272, + "tests/integration/callbacks/test_multiple_callbacks.py::test_cbmt004_chain_with_sliders[False]": 1.163, + "tests/integration/callbacks/test_multiple_callbacks.py::test_cbmt004_chain_with_sliders[True]": 1.181, + "tests/integration/callbacks/test_multiple_callbacks.py::test_cbmt005_multi_converging_chain": 1.099, + "tests/integration/callbacks/test_multiple_callbacks.py::test_cbmt006_derived_props": 0.953, + "tests/integration/callbacks/test_multiple_callbacks.py::test_cbmt007_early_preventupdate_inputs_above_below": 0.875, + "tests/integration/callbacks/test_multiple_callbacks.py::test_cbmt008_direct_chain": 1.065, + "tests/integration/callbacks/test_multiple_callbacks.py::test_cbmt009_branched_chain": 1.561, + "tests/integration/callbacks/test_multiple_callbacks.py::test_cbmt010_shared_grandparent": 0.751, + "tests/integration/callbacks/test_multiple_callbacks.py::test_cbmt011_callbacks_triggered_on_generated_output": 0.923, + "tests/integration/callbacks/test_multiple_callbacks.py::test_cbmt012_initialization_with_overlapping_outputs[False]": 0.85, + "tests/integration/callbacks/test_multiple_callbacks.py::test_cbmt012_initialization_with_overlapping_outputs[True]": 0.76, + "tests/integration/callbacks/test_multiple_callbacks.py::test_cbmt013_chained_callback_should_be_blocked": 0.922, + "tests/integration/callbacks/test_prevent_initial.py::test_cbpi001_prevent_initial_call[flavor0]": 1.039, + "tests/integration/callbacks/test_prevent_initial.py::test_cbpi001_prevent_initial_call[flavor1]": 0.755, + "tests/integration/callbacks/test_prevent_initial.py::test_cbpi001_prevent_initial_call[flavor2]": 1.129, + "tests/integration/callbacks/test_prevent_initial.py::test_cbpi001_prevent_initial_call[flavor3]": 0.787, + "tests/integration/callbacks/test_prevent_initial.py::test_cbpi001_prevent_initial_call[flavor4]": 1.138, + "tests/integration/callbacks/test_prevent_initial.py::test_cbpi002_pattern_matching[flavor0]": 1.162, + "tests/integration/callbacks/test_prevent_initial.py::test_cbpi002_pattern_matching[flavor1]": 0.757, + "tests/integration/callbacks/test_prevent_initial.py::test_cbpi002_pattern_matching[flavor2]": 1.084, + "tests/integration/callbacks/test_prevent_initial.py::test_cbpi002_pattern_matching[flavor3]": 0.858, + "tests/integration/callbacks/test_prevent_initial.py::test_cbpi002_pattern_matching[flavor4]": 1.148, + "tests/integration/callbacks/test_prevent_initial.py::test_cbpi003_multi_outputs[flavor0]": 1.067, + "tests/integration/callbacks/test_prevent_initial.py::test_cbpi003_multi_outputs[flavor1]": 1.244, + "tests/integration/callbacks/test_prevent_initial.py::test_cbpi003_multi_outputs[flavor2]": 1.161, + "tests/integration/callbacks/test_prevent_initial.py::test_cbpi003_multi_outputs[flavor3]": 1.347, + "tests/integration/callbacks/test_prevent_initial.py::test_cbpi003_multi_outputs[flavor4]": 1.177, + "tests/integration/callbacks/test_prevent_initial.py::test_cbpi004_positional_arg": 0.97, + "tests/integration/callbacks/test_prevent_update.py::test_cbpu001_aborted_callback": 0.859, + "tests/integration/callbacks/test_prevent_update.py::test_cbpu002_multi_output_no_update": 3.206, + "tests/integration/callbacks/test_prevent_update.py::test_cbpu003_no_update_chains": 1.395, + "tests/integration/callbacks/test_validation.py::test_cbva001_callback_dep_types": 0.023, + "tests/integration/callbacks/test_validation.py::test_cbva002_callback_return_validation": 0.014, + "tests/integration/callbacks/test_validation.py::test_cbva003_list_single_output": 0.737, + "tests/integration/callbacks/test_validation.py::test_cbva004_named_args[False-False-False]": 0.857, + "tests/integration/callbacks/test_validation.py::test_cbva004_named_args[False-False-True]": 0.854, + "tests/integration/callbacks/test_validation.py::test_cbva004_named_args[True-True-False]": 0.844, + "tests/integration/callbacks/test_validation.py::test_cbva004_named_args[True-True-True]": 0.846, + "tests/integration/callbacks/test_validation.py::test_cbva005_tuple_args": 0.749, + "tests/integration/callbacks/test_wildcards.py::test_cbwc001_todo_app[False]": 5.245, + "tests/integration/callbacks/test_wildcards.py::test_cbwc001_todo_app[True]": 5.329, + "tests/integration/callbacks/test_wildcards.py::test_cbwc002_fibonacci_app[False]": 3.826, + "tests/integration/callbacks/test_wildcards.py::test_cbwc002_fibonacci_app[True]": 1.643, + "tests/integration/callbacks/test_wildcards.py::test_cbwc003_same_keys": 1.433, + "tests/integration/callbacks/test_wildcards.py::test_cbwc004_layout_chunk_changed_props": 1.143, + "tests/integration/callbacks/test_wildcards.py::test_cbwc005_callbacks_count": 2.016, + "tests/integration/callbacks/test_wildcards.py::test_cbwc006_grouping_callbacks": 1.334, + "tests/integration/callbacks/test_wildcards.py::test_cbwc007_pmc_update_subtree_ordering": 1.518, + "tests/integration/callbacks/test_wildcards.py::test_cbwc008_running_match": 1.147, + "tests/integration/clientside/test_clientside.py::test_clsd001_simple_clientside_serverside_callback": 0.94, + "tests/integration/clientside/test_clientside.py::test_clsd002_chained_serverside_clientside_callbacks": 1.164, + "tests/integration/clientside/test_clientside.py::test_clsd003_clientside_exceptions_halt_subsequent_updates": 0.739, + "tests/integration/clientside/test_clientside.py::test_clsd004_clientside_multiple_outputs": 0.837, + "tests/integration/clientside/test_clientside.py::test_clsd006_PreventUpdate": 0.848, + "tests/integration/clientside/test_clientside.py::test_clsd007_no_update": 0.741, + "tests/integration/clientside/test_clientside.py::test_clsd008_clientside_inline_source": 1.043, + "tests/integration/clientside/test_clientside.py::test_clsd009_clientside_callback_context_triggered": 1.065, + "tests/integration/clientside/test_clientside.py::test_clsd010_clientside_callback_context_inputs": 9.759, + "tests/integration/clientside/test_clientside.py::test_clsd011_clientside_callback_context_inputs_list": 0.863, + "tests/integration/clientside/test_clientside.py::test_clsd012_clientside_callback_context_states": 1.338, + "tests/integration/clientside/test_clientside.py::test_clsd013_clientside_callback_context_states_list": 0.85, + "tests/integration/clientside/test_clientside.py::test_clsd014_input_output_callback": 0.843, + "tests/integration/clientside/test_clientside.py::test_clsd015_clientside_chained_callbacks_returning_promise": 1.494, + "tests/integration/clientside/test_clientside.py::test_clsd016_serverside_clientside_shared_input_with_promise": 0.86, + "tests/integration/clientside/test_clientside.py::test_clsd017_clientside_serverside_shared_input_with_promise": 0.887, + "tests/integration/clientside/test_clientside.py::test_clsd018_clientside_inline_async_function": 0.888, + "tests/integration/clientside/test_clientside.py::test_clsd019_clientside_inline_promise": 0.865, + "tests/integration/clientside/test_clientside.py::test_clsd020_clientside_callback_context_triggered_id": 0.753, + "tests/integration/clientside/test_clientside.py::test_clsd021_simple_clientside_module_serverside_callback": 1.04, + "tests/integration/clientside/test_clientside.py::test_clsd022_clientside_pattern_matching_dots": 0.762, + "tests/integration/clientside/test_clientside_functions.py::test_sp001_clientside_setprops": 0.931, + "tests/integration/clientside/test_clientside_multiple_output_return_single_no_update.py::test_cmorsnu001_clientside_multiple_output_return_single_no_update": 0.848, + "tests/integration/clientside/test_clientside_outputs_list.py::test_clol001_clientside_outputs_list_by_single_output": 0.756, + "tests/integration/clientside/test_clientside_outputs_list.py::test_clol002_clientside_outputs_list_by_multiple_output1": 0.871, + "tests/integration/clientside/test_clientside_outputs_list.py::test_clol003_clientside_outputs_list_by_multiple_output2": 0.851, + "tests/integration/clientside/test_clientside_outputs_list.py::test_clol004_clientside_outputs_list_by_no_output": 0.846, + "tests/integration/clientside/test_clientside_restarts.py::test_clrs001_clientside_inline_restarts": 0.0, + "tests/integration/dash_assets/test_assets_path_ignore.py::test_api001_assets_path_ignore": 0.852, + "tests/integration/dash_assets/test_dash_assets.py::test_dada001_assets": 0.85, + "tests/integration/dash_assets/test_dash_assets.py::test_dada002_external_files_init": 1.007, + "tests/integration/dash_assets/test_dash_assets.py::test_dada003_external_resources_with_attributes": 0.748, + "tests/integration/dash_assets/test_dash_assets.py::test_dada004_external_scripts_init_with_attributes": 0.933, + "tests/integration/devtools/test_callback_timing.py::test_dvct001_callback_timing": 1.126, + "tests/integration/devtools/test_callback_validation.py::test_dvcv001_blank": 1.071, + "tests/integration/devtools/test_callback_validation.py::test_dvcv002_blank_id_prop": 1.559, + "tests/integration/devtools/test_callback_validation.py::test_dvcv003_duplicate_outputs_same_callback": 1.066, + "tests/integration/devtools/test_callback_validation.py::test_dvcv004_duplicate_outputs_across_callbacks": 1.573, + "tests/integration/devtools/test_callback_validation.py::test_dvcv005_input_output_overlap": 1.066, + "tests/integration/devtools/test_callback_validation.py::test_dvcv006_inconsistent_wildcards": 1.61, + "tests/integration/devtools/test_callback_validation.py::test_dvcv007_disallowed_ids": 1.575, + "tests/integration/devtools/test_callback_validation.py::test_dvcv008_wrong_callback_id": 1.609, + "tests/integration/devtools/test_callback_validation.py::test_dvcv009_suppress_callback_exceptions": 1.108, + "tests/integration/devtools/test_callback_validation.py::test_dvcv010_bad_props": 2.134, + "tests/integration/devtools/test_callback_validation.py::test_dvcv011_duplicate_outputs_simple": 1.054, + "tests/integration/devtools/test_callback_validation.py::test_dvcv012_circular_2_step": 1.106, + "tests/integration/devtools/test_callback_validation.py::test_dvcv013_circular_3_step": 1.162, + "tests/integration/devtools/test_callback_validation.py::test_dvcv014_multipage_errors": 1.595, + "tests/integration/devtools/test_callback_validation.py::test_dvcv015_multipage_validation_layout[attribute]": 1.512, + "tests/integration/devtools/test_callback_validation.py::test_dvcv015_multipage_validation_layout[function]": 1.415, + "tests/integration/devtools/test_callback_validation.py::test_dvcv015_multipage_validation_layout[suppress]": 1.528, + "tests/integration/devtools/test_callback_validation.py::test_dvcv016_circular_with_input_output": 1.279, + "tests/integration/devtools/test_devtools_error_handling.py::test_dveh001_python_errors": 1.253, + "tests/integration/devtools/test_devtools_error_handling.py::test_dveh002_prevent_update_not_in_error_msg": 1.441, + "tests/integration/devtools/test_devtools_error_handling.py::test_dveh003_validation_errors_in_place": 3.369, + "tests/integration/devtools/test_devtools_error_handling.py::test_dveh004_validation_errors_creation": 1.434, + "tests/integration/devtools/test_devtools_error_handling.py::test_dveh005_multiple_outputs": 1.464, + "tests/integration/devtools/test_devtools_error_handling.py::test_dveh006_long_python_errors": 1.705, + "tests/integration/devtools/test_devtools_ui.py::test_dvui001_disable_props_check_config": 2.317, + "tests/integration/devtools/test_devtools_ui.py::test_dvui002_disable_ui_config": 3.066, + "tests/integration/devtools/test_devtools_ui.py::test_dvui003_callback_graph": 6.913, + "tests/integration/devtools/test_devtools_ui.py::test_dvui004_width_props": 4.113, + "tests/integration/devtools/test_devtools_ui.py::test_dvui005_undo_redo": 1.763, + "tests/integration/devtools/test_devtools_ui.py::test_dvui006_no_undo_redo": 0.917, + "tests/integration/devtools/test_devtools_ui.py::test_dvui007_other_before_request_func": 1.424, + "tests/integration/devtools/test_hot_reload.py::test_dvhr001_hot_reload": 10.25, + "tests/integration/devtools/test_props_check.py::test_dvpc001_prop_check_errors_with_path": 0.0, + "tests/integration/multi_page/test_pages_layout.py::test_pala001_layout": 2.873, + "tests/integration/multi_page/test_pages_layout.py::test_pala002_meta_tags_default": 0.867, + "tests/integration/multi_page/test_pages_layout.py::test_pala003_meta_tags_custom": 0.882, + "tests/integration/multi_page/test_pages_layout.py::test_pala004_no_layout_exception": 0.015, + "tests/integration/multi_page/test_pages_layout.py::test_pala005_routing_inputs": 1.537, + "tests/integration/multi_page/test_pages_layout.py::test_pala006_pages_external_library": 0.959, + "tests/integration/multi_page/test_pages_layout.py::test_pala007_app_title_discription": 0.813, + "tests/integration/multi_page/test_pages_order.py::test_paor001_order": 1.813, + "tests/integration/multi_page/test_pages_relative_path.py::test_pare001_relative_path": 3.036, + "tests/integration/multi_page/test_pages_relative_path.py::test_pare002_relative_path_with_url_base_pathname": 2.752, + "tests/integration/multi_page/test_pages_relative_path.py::test_pare003_absolute_path": 1.939, + "tests/integration/renderer/test_add_receive_props.py::test_rdarp001_add_receive_props": 1.222, + "tests/integration/renderer/test_array_of_exact_or_shape_with_node_prop_assign_none.py::test_aoeoswnpsn001_array_of_exact_or_shape_with_node_prop_assign_none": 0.838, + "tests/integration/renderer/test_children_reorder.py::test_roc001_reorder_children": 1.835, + "tests/integration/renderer/test_component_as_prop.py::test_rdcap001_component_as_prop": 6.298, + "tests/integration/renderer/test_component_as_prop.py::test_rdcap002_component_as_props_dynamic_id": 1.421, + "tests/integration/renderer/test_component_as_prop.py::test_rdcap003_side_effect_regression": 0.987, + "tests/integration/renderer/test_component_as_prop.py::test_rdcap004_side_effect_same_component": 0.957, + "tests/integration/renderer/test_dependencies.py::test_rddp001_dependencies_on_components_that_dont_exist": 0.994, + "tests/integration/renderer/test_descendant_listening.py::test_dcl001_descendant_tabs": 1.01, + "tests/integration/renderer/test_due_diligence.py::test_rddd001_initial_state": 0.915, + "tests/integration/renderer/test_due_diligence.py::test_rddd002_falsy_child[0]": 0.842, + "tests/integration/renderer/test_due_diligence.py::test_rddd002_falsy_child[child1]": 0.831, + "tests/integration/renderer/test_external_component.py::test_rext001_render_external_component": 1.102, + "tests/integration/renderer/test_external_component.py::test_rext002_render_external_component_temp": 2.737, + "tests/integration/renderer/test_iframe.py::test_rdif001_sandbox_allow_scripts": 1.368, + "tests/integration/renderer/test_loading_states.py::test_rdls001_multi_loading_components": 1.448, + "tests/integration/renderer/test_loading_states.py::test_rdls002_chained_loading_states": 1.314, + "tests/integration/renderer/test_loading_states.py::test_rdls003_update_title[kwargs0-Updating...-False]": 0.988, + "tests/integration/renderer/test_loading_states.py::test_rdls003_update_title[kwargs1-Dash-False]": 0.948, + "tests/integration/renderer/test_loading_states.py::test_rdls003_update_title[kwargs2-Dash-False]": 0.911, + "tests/integration/renderer/test_loading_states.py::test_rdls003_update_title[kwargs3-Hello World-False]": 0.983, + "tests/integration/renderer/test_loading_states.py::test_rdls003_update_title[kwargs4-Updating...-True]": 1.022, + "tests/integration/renderer/test_loading_states.py::test_rdls003_update_title[kwargs5-Dash-True]": 1.103, + "tests/integration/renderer/test_loading_states.py::test_rdls003_update_title[kwargs6-Dash-True]": 1.118, + "tests/integration/renderer/test_loading_states.py::test_rdls003_update_title[kwargs7-Hello World-True]": 1.111, + "tests/integration/renderer/test_loading_states.py::test_rdls004_update_title_chained_callbacks[Custom Update Title]": 0.903, + "tests/integration/renderer/test_loading_states.py::test_rdls004_update_title_chained_callbacks[None]": 0.979, + "tests/integration/renderer/test_multi_output.py::test_rdmo001_single_input_multi_outputs_on_multiple_components": 26.558, + "tests/integration/renderer/test_multi_output.py::test_rdmo002_multi_outputs_on_single_component": 1.024, + "tests/integration/renderer/test_multi_output.py::test_rdmo003_single_output_as_multi": 0.951, + "tests/integration/renderer/test_multi_output.py::test_rdmo004_multi_output_circular_dependencies": 1.147, + "tests/integration/renderer/test_multi_output.py::test_rdmo005_set_props_behavior": 1.087, + "tests/integration/renderer/test_persistence.py::test_rdps001_local_reload": 2.486, + "tests/integration/renderer/test_persistence.py::test_rdps002_session_reload": 1.204, + "tests/integration/renderer/test_persistence.py::test_rdps003_memory_reload": 1.2, + "tests/integration/renderer/test_persistence.py::test_rdps004_show_hide": 1.554, + "tests/integration/renderer/test_persistence.py::test_rdps005_persisted_props": 1.288, + "tests/integration/renderer/test_persistence.py::test_rdps006_move_on_page": 12.024, + "tests/integration/renderer/test_persistence.py::test_rdps007_one_prop_changed": 6.886, + "tests/integration/renderer/test_persistence.py::test_rdps008_unsaved_part_changed": 5.349, + "tests/integration/renderer/test_persistence.py::test_rdps009_clear_prop_callback": 1.207, + "tests/integration/renderer/test_persistence.py::test_rdps010_toggle_persistence": 2.301, + "tests/integration/renderer/test_persistence.py::test_rdps011_toggle_persistence2": 2.275, + "tests/integration/renderer/test_persistence.py::test_rdps012_pattern_matching": 4.956, + "tests/integration/renderer/test_persistence.py::test_rdps013_persisted_props_nested": 1.115, + "tests/integration/renderer/test_persistence.py::test_rdps014_layout_as_list": 2.645, + "tests/integration/renderer/test_race_conditions.py::test_rdrc001_race_conditions[_config,dependencies,layout,update-component]": 2.435, + "tests/integration/renderer/test_race_conditions.py::test_rdrc001_race_conditions[_config,dependencies,update-component,layout]": 2.622, + "tests/integration/renderer/test_race_conditions.py::test_rdrc001_race_conditions[_config,layout,dependencies,update-component]": 2.456, + "tests/integration/renderer/test_race_conditions.py::test_rdrc001_race_conditions[_config,layout,update-component,dependencies]": 2.565, + "tests/integration/renderer/test_race_conditions.py::test_rdrc001_race_conditions[_config,update-component,dependencies,layout]": 2.131, + "tests/integration/renderer/test_race_conditions.py::test_rdrc001_race_conditions[_config,update-component,layout,dependencies]": 2.16, + "tests/integration/renderer/test_race_conditions.py::test_rdrc001_race_conditions[dependencies,_config,layout,update-component]": 2.435, + "tests/integration/renderer/test_race_conditions.py::test_rdrc001_race_conditions[dependencies,_config,update-component,layout]": 2.641, + "tests/integration/renderer/test_race_conditions.py::test_rdrc001_race_conditions[dependencies,layout,_config,update-component]": 2.155, + "tests/integration/renderer/test_race_conditions.py::test_rdrc001_race_conditions[dependencies,layout,update-component,_config]": 2.229, + "tests/integration/renderer/test_race_conditions.py::test_rdrc001_race_conditions[dependencies,update-component,_config,layout]": 2.122, + "tests/integration/renderer/test_race_conditions.py::test_rdrc001_race_conditions[dependencies,update-component,layout,_config]": 1.924, + "tests/integration/renderer/test_race_conditions.py::test_rdrc001_race_conditions[layout,_config,dependencies,update-component]": 2.321, + "tests/integration/renderer/test_race_conditions.py::test_rdrc001_race_conditions[layout,_config,update-component,dependencies]": 2.662, + "tests/integration/renderer/test_race_conditions.py::test_rdrc001_race_conditions[layout,dependencies,_config,update-component]": 2.251, + "tests/integration/renderer/test_race_conditions.py::test_rdrc001_race_conditions[layout,dependencies,update-component,_config]": 2.243, + "tests/integration/renderer/test_race_conditions.py::test_rdrc001_race_conditions[layout,update-component,_config,dependencies]": 2.138, + "tests/integration/renderer/test_race_conditions.py::test_rdrc001_race_conditions[layout,update-component,dependencies,_config]": 1.833, + "tests/integration/renderer/test_race_conditions.py::test_rdrc001_race_conditions[update-component,_config,dependencies,layout]": 2.143, + "tests/integration/renderer/test_race_conditions.py::test_rdrc001_race_conditions[update-component,_config,layout,dependencies]": 2.122, + "tests/integration/renderer/test_race_conditions.py::test_rdrc001_race_conditions[update-component,dependencies,_config,layout]": 2.129, + "tests/integration/renderer/test_race_conditions.py::test_rdrc001_race_conditions[update-component,dependencies,layout,_config]": 1.953, + "tests/integration/renderer/test_race_conditions.py::test_rdrc001_race_conditions[update-component,layout,_config,dependencies]": 2.127, + "tests/integration/renderer/test_race_conditions.py::test_rdrc001_race_conditions[update-component,layout,dependencies,_config]": 1.935, + "tests/integration/renderer/test_redraw.py::test_rdraw001_redraw": 2.008, + "tests/integration/renderer/test_render_type.py::test_rtype001_rendertype": 1.288, + "tests/integration/renderer/test_request_hooks.py::test_rdrh001_request_hooks": 1.648, + "tests/integration/renderer/test_request_hooks.py::test_rdrh002_with_custom_renderer_interpolated": 1.591, + "tests/integration/renderer/test_request_hooks.py::test_rdrh003_refresh_jwt[400]": 1.824, + "tests/integration/renderer/test_request_hooks.py::test_rdrh003_refresh_jwt[401]": 1.899, + "tests/integration/renderer/test_request_hooks.py::test_rdrh004_layout_hooks": 0.833, + "tests/integration/renderer/test_state_and_input.py::test_rdsi001_state_and_inputs": 1.546, + "tests/integration/renderer/test_state_and_input.py::test_rdsi002_event_properties_state_and_inputs": 1.539, + "tests/integration/security/test_injection.py::test_sinj001_url_injection": 0.925, + "tests/integration/security/test_xss.py::test_xss001_banned_protocols": 0.721, + "tests/integration/security/test_xss.py::test_xss002_blank_href": 0.655, + "tests/integration/security/test_xss.py::test_xss003_data_allowed": 0.819, + "tests/integration/test_clientside_patch.py::test_pch_cs001_patch_operations_clientside": 1.815, + "tests/integration/test_clientside_patch.py::test_pch_cs002_patch_operations_set_props": 1.834, + "tests/integration/test_csp.py::test_incs001_csp_hashes_inline_scripts[False-None-expectation0]": 2.817, + "tests/integration/test_csp.py::test_incs001_csp_hashes_inline_scripts[True-sha256-expectation1]": 0.85, + "tests/integration/test_csp.py::test_incs001_csp_hashes_inline_scripts[True-sha384-expectation2]": 0.734, + "tests/integration/test_csp.py::test_incs001_csp_hashes_inline_scripts[True-sha512-expectation3]": 0.83, + "tests/integration/test_csp.py::test_incs001_csp_hashes_inline_scripts[True-sha999-expectation4]": 0.079, + "tests/integration/test_duo.py::test_duo001_wait_for_text_error": 13.787, + "tests/integration/test_duo.py::test_duo002_wait_for_text_value": 1.808, + "tests/integration/test_generation.py::test_gene001_simple_callback": 0.726, + "tests/integration/test_generation.py::test_gene002_arbitrary_resources": 0.938, + "tests/integration/test_generation.py::test_gene003_max_props": 0.001, + "tests/integration/test_generation.py::test_gene004_required_children_prop": 0.001, + "tests/integration/test_hooks.py::test_hook001_layout": 0.718, + "tests/integration/test_hooks.py::test_hook002_setup": 0.012, + "tests/integration/test_hooks.py::test_hook003_route": 0.847, + "tests/integration/test_hooks.py::test_hook004_error": 0.894, + "tests/integration/test_hooks.py::test_hook005_callback": 0.894, + "tests/integration/test_hooks.py::test_hook006_priority_final": 0.815, + "tests/integration/test_hooks.py::test_hook007_hook_index": 0.826, + "tests/integration/test_hooks.py::test_hook008_hook_distributions": 1.044, + "tests/integration/test_hooks.py::test_hook009_hook_clientside_callback": 0.811, + "tests/integration/test_hooks.py::test_hook010_hook_custom_data": 0.792, + "tests/integration/test_hooks.py::test_hook011_devtool_hook": 1.128, + "tests/integration/test_hooks.py::test_hook012_get_app_available_in_hooks_on_routes": 1.516, + "tests/integration/test_integration.py::test_inin003_wildcard_data_attributes": 0.772, + "tests/integration/test_integration.py::test_inin006_meta_tags": 0.733, + "tests/integration/test_integration.py::test_inin007_change_viewport_meta_tag": 0.711, + "tests/integration/test_integration.py::test_inin008_index_customization": 0.718, + "tests/integration/test_integration.py::test_inin009_invalid_index_string": 0.71, + "tests/integration/test_integration.py::test_inin010_func_layout_accepted": 0.818, + "tests/integration/test_integration.py::test_inin017_late_component_register": 0.903, + "tests/integration/test_integration.py::test_inin025_url_base_pathname": 1.818, + "tests/integration/test_integration.py::test_inin026_graphs_in_tabs_do_not_share_state": 2.122, + "tests/integration/test_integration.py::test_inin027_multi_page_without_pages_folder": 1.122, + "tests/integration/test_integration.py::test_inin028_layout_as_list": 1.127, + "tests/integration/test_integration.py::test_inin029_layout_as_list_with_pages": 1.073, + "tests/integration/test_integration.py::test_inin030_add_startup_route": 0.843, + "tests/integration/test_integration.py::test_inin031_initial_value_set_back": 1.287, + "tests/integration/test_integration.py::test_inin_024_port_env_success": 0.715, + "tests/integration/test_legacy_components.py::test_leg001_legacy_pre_component_as_props": 0.704, + "tests/integration/test_pages_redirect_home.py::test_pare001_redirect_home": 0.06, + "tests/integration/test_patch.py::test_pch001_patch_operations": 2.118, + "tests/integration/test_patch.py::test_pch002_patch_app_pmc_callbacks": 0.93, + "tests/integration/test_patch.py::test_pch003_patch_children": 0.874, + "tests/integration/test_patch.py::test_pch004_duplicate_output_restart": 1.572, + "tests/integration/test_patch.py::test_pch005_clientside_duplicate": 0.816, + "tests/integration/test_patch.py::test_pch006_base_operators": 1.165, + "tests/integration/test_patch.py::test_pch007_patch_operations_side_updates": 2.167, + "tests/integration/test_scripts.py::test_scri001_scripts[False]": 2.155, + "tests/integration/test_scripts.py::test_scri001_scripts[True]": 5.709, + "tests/integration/test_scripts.py::test_scri002_scripts_on_request": 5.626 +} \ No newline at end of file diff --git a/components/dash-core-components/.test_durations b/components/dash-core-components/.test_durations new file mode 100644 index 0000000000..38bbce2bcd --- /dev/null +++ b/components/dash-core-components/.test_durations @@ -0,0 +1,428 @@ +{ + "tests/integration/button/test_button.py::test_btev001_clicks_and_blur": 38.622, + "tests/integration/button/test_button.py::test_btev002_disabled_button": 1.815, + "tests/integration/button/test_button.py::test_btev003_button_states_visual": 0.799, + "tests/integration/calendar/locales/test_date_picker_locales.py::test_dtps030_french_localization_via_cdn": 2.396, + "tests/integration/calendar/test_a11y_date_picker_range.py::test_a11y_range_001_keyboard_range_selection_with_highlights": 1.257, + "tests/integration/calendar/test_a11y_date_picker_range.py::test_a11y_range_002_keyboard_update_existing_range": 1.203, + "tests/integration/calendar/test_a11y_date_picker_single.py::test_a11y001_label_focuses_date_picker": 0.903, + "tests/integration/calendar/test_a11y_date_picker_single.py::test_a11y002_label_with_htmlFor_can_focus_date_picker": 0.906, + "tests/integration/calendar/test_a11y_date_picker_single.py::test_a11y003_keyboard_navigation_arrows": 0.547, + "tests/integration/calendar/test_a11y_date_picker_single.py::test_a11y004_keyboard_navigation_home_end": 0.817, + "tests/integration/calendar/test_a11y_date_picker_single.py::test_a11y005_keyboard_navigation_home_end_monday_start": 1.07, + "tests/integration/calendar/test_a11y_date_picker_single.py::test_a11y006_keyboard_navigation_rtl": 0.82, + "tests/integration/calendar/test_a11y_date_picker_single.py::test_a11y007_all_keyboard_keys_respect_min_max": 1.794, + "tests/integration/calendar/test_a11y_date_picker_single.py::test_a11y008_all_keyboard_keys_respect_disabled_days": 1.696, + "tests/integration/calendar/test_a11y_date_picker_single.py::test_a11y009_keyboard_space_selects_date": 1.161, + "tests/integration/calendar/test_calendar_props.py::test_cdpr001_date_clearable_true_works": 3.662, + "tests/integration/calendar/test_calendar_props.py::test_cdpr002_updatemodes": 1.159, + "tests/integration/calendar/test_date_picker_persistence.py::test_rdpr001_persisted_dps": 1.493, + "tests/integration/calendar/test_date_picker_persistence.py::test_rdpr002_persisted_dpr": 2.581, + "tests/integration/calendar/test_date_picker_range.py::test_dtpr001_initial_month_provided": 0.835, + "tests/integration/calendar/test_date_picker_range.py::test_dtpr002_no_initial_month_min_date": 0.821, + "tests/integration/calendar/test_date_picker_range.py::test_dtpr003_no_initial_month_no_min_date_start_date": 0.819, + "tests/integration/calendar/test_date_picker_range.py::test_dtpr004_max_and_min_dates_are_clickable": 2.426, + "tests/integration/calendar/test_date_picker_range.py::test_dtpr005_disabled_days_arent_clickable": 3.839, + "tests/integration/calendar/test_date_picker_range.py::test_dtpr006_minimum_nights_forward_selection": 7.418, + "tests/integration/calendar/test_date_picker_range.py::test_dtpr007_minimum_nights_backward_selection": 4.911, + "tests/integration/calendar/test_date_picker_range.py::test_dtpr008_input_click_opens_but_keeps_focus": 4.333, + "tests/integration/calendar/test_date_picker_range.py::test_dtpr030_external_date_range_update": 1.52, + "tests/integration/calendar/test_date_picker_single.py::test_dtps0014_disabed_days_timeout": 1.477, + "tests/integration/calendar/test_date_picker_single.py::test_dtps001_simple_click": 0.825, + "tests/integration/calendar/test_date_picker_single.py::test_dtps010_local_and_session_persistence": 5.012, + "tests/integration/calendar/test_date_picker_single.py::test_dtps011_memory_persistence": 1.975, + "tests/integration/calendar/test_date_picker_single.py::test_dtps012_initial_visible_month": 0.897, + "tests/integration/calendar/test_date_picker_single.py::test_dtps013_min_max_date_allowed": 5.344, + "tests/integration/calendar/test_date_picker_single.py::test_dtps014_disabled_days_arent_clickable": 2.428, + "tests/integration/calendar/test_date_picker_single.py::test_dtps020_renders_date_picker": 1.912, + "tests/integration/calendar/test_date_picker_single.py::test_dtps022_custom_display_format": 0.704, + "tests/integration/calendar/test_date_picker_single.py::test_dtps023_default_display_format": 0.924, + "tests/integration/calendar/test_date_picker_single.py::test_dtps023b_input_validation_and_blur": 1.012, + "tests/integration/calendar/test_date_picker_single.py::test_dtps024_rtl_directionality": 0.845, + "tests/integration/calendar/test_date_picker_single.py::test_dtps025_typing_disabled_day_should_not_trigger_callback": 1.222, + "tests/integration/calendar/test_date_picker_single.py::test_dtps026_input_click_opens_but_keeps_focus": 3.329, + "tests/integration/calendar/test_date_picker_single.py::test_dtps030_external_date_update": 1.372, + "tests/integration/calendar/test_date_picker_single.py::test_dtps031_resize_detector": 1.43, + "tests/integration/calendar/test_multi_month_selection.py::test_dtpr_cross_month_click_selection": 1.577, + "tests/integration/calendar/test_multi_month_selection.py::test_dtpr_cross_month_drag_selection": 1.867, + "tests/integration/calendar/test_multi_month_selection.py::test_dtpr_multi_month_click_in_second_month": 1.797, + "tests/integration/calendar/test_multi_month_selection.py::test_dtpr_multi_month_drag_in_second_month": 2.306, + "tests/integration/calendar/test_multi_month_selection.py::test_dtps_multi_month_click_second_month": 1.562, + "tests/integration/calendar/test_portal.py::test_dppt000_datepicker_single_default": 5.506, + "tests/integration/calendar/test_portal.py::test_dppt001_datepicker_single_with_portal": 6.622, + "tests/integration/calendar/test_portal.py::test_dppt001a_datepicker_range_default": 8.535, + "tests/integration/calendar/test_portal.py::test_dppt002_datepicker_range_with_portal": 8.51, + "tests/integration/calendar/test_portal.py::test_dppt003_datepicker_single_with_fullscreen_portal": 5.509, + "tests/integration/calendar/test_portal.py::test_dppt004_datepicker_range_with_fullscreen_portal": 8.518, + "tests/integration/calendar/test_portal.py::test_dppt005_portal_has_correct_classes": 1.145, + "tests/integration/calendar/test_portal.py::test_dppt006_fullscreen_portal_close_button_keyboard": 1.635, + "tests/integration/calendar/test_portal.py::test_dppt007_portal_close_by_clicking_outside": 1.151, + "tests/integration/clipboard/test_clipboard.py::test_clp001_clipboard_text": 4.655, + "tests/integration/clipboard/test_clipboard.py::test_clp002_clipboard_text": 2.493, + "tests/integration/clipboard/test_clipboard.py::test_clp003_clipboard_text": 2.561, + "tests/integration/clipboard/test_clipboard.py::test_clp004_clipboard_children_and_copied_children": 1.557, + "tests/integration/confirmdialog/test_confirm.py::test_cnfd001_dialog[components0-False-confirms0]": 2.978, + "tests/integration/confirmdialog/test_confirm.py::test_cnfd001_dialog[components0-False-confirms1]": 2.975, + "tests/integration/confirmdialog/test_confirm.py::test_cnfd001_dialog[components0-False-confirms2]": 2.87, + "tests/integration/confirmdialog/test_confirm.py::test_cnfd001_dialog[components0-False-confirms3]": 2.862, + "tests/integration/confirmdialog/test_confirm.py::test_cnfd001_dialog[components0-True-confirms0]": 3.014, + "tests/integration/confirmdialog/test_confirm.py::test_cnfd001_dialog[components0-True-confirms1]": 3.023, + "tests/integration/confirmdialog/test_confirm.py::test_cnfd001_dialog[components0-True-confirms2]": 3.032, + "tests/integration/confirmdialog/test_confirm.py::test_cnfd001_dialog[components0-True-confirms3]": 3.035, + "tests/integration/confirmdialog/test_confirm.py::test_cnfd001_dialog[components1-False-confirms0]": 2.826, + "tests/integration/confirmdialog/test_confirm.py::test_cnfd001_dialog[components1-False-confirms1]": 2.818, + "tests/integration/confirmdialog/test_confirm.py::test_cnfd001_dialog[components1-False-confirms2]": 2.716, + "tests/integration/confirmdialog/test_confirm.py::test_cnfd001_dialog[components1-False-confirms3]": 2.816, + "tests/integration/confirmdialog/test_confirm.py::test_cnfd001_dialog[components1-True-confirms0]": 3.04, + "tests/integration/confirmdialog/test_confirm.py::test_cnfd001_dialog[components1-True-confirms1]": 2.942, + "tests/integration/confirmdialog/test_confirm.py::test_cnfd001_dialog[components1-True-confirms2]": 3.043, + "tests/integration/confirmdialog/test_confirm.py::test_cnfd001_dialog[components1-True-confirms3]": 2.942, + "tests/integration/confirmdialog/test_confirm.py::test_cnfd002_injected_confirm": 1.786, + "tests/integration/download/test_download.py::test_dltx001_download_text": 0.787, + "tests/integration/download/test_download_dataframe.py::test_dldf001_download_dataframe[csv]": 0.888, + "tests/integration/download/test_download_dataframe.py::test_dldf001_download_dataframe[feather]": 0.886, + "tests/integration/download/test_download_dataframe.py::test_dldf001_download_dataframe[html]": 0.785, + "tests/integration/download/test_download_dataframe.py::test_dldf001_download_dataframe[json]": 0.884, + "tests/integration/download/test_download_dataframe.py::test_dldf001_download_dataframe[parquet]": 0.878, + "tests/integration/download/test_download_dataframe.py::test_dldf001_download_dataframe[pickle]": 0.882, + "tests/integration/download/test_download_dataframe.py::test_dldf001_download_dataframe[stata]": 0.795, + "tests/integration/download/test_download_file.py::test_dlfi001_download_file": 0.873, + "tests/integration/dropdown/test_a11y.py::test_a11y001_label_focuses_dropdown": 4.018, + "tests/integration/dropdown/test_a11y.py::test_a11y002_label_with_htmlFor_can_focus_dropdown": 3.31, + "tests/integration/dropdown/test_a11y.py::test_a11y003_keyboard_navigation": 3.706, + "tests/integration/dropdown/test_a11y.py::test_a11y003b_keyboard_navigation_not_searchable": 3.819, + "tests/integration/dropdown/test_a11y.py::test_a11y004_selection_visibility_single": 0.704, + "tests/integration/dropdown/test_a11y.py::test_a11y005_selection_visibility_multi": 0.809, + "tests/integration/dropdown/test_a11y.py::test_a11y006_multi_select_keyboard_focus_retention": 1.21, + "tests/integration/dropdown/test_a11y.py::test_a11y007_opens_and_closes_without_races": 2.823, + "tests/integration/dropdown/test_a11y.py::test_a11y008_home_end_pageup_pagedown_navigation": 0.808, + "tests/integration/dropdown/test_a11y.py::test_a11y009_enter_on_search_selects_first_option_multi": 1.176, + "tests/integration/dropdown/test_a11y.py::test_a11y010_enter_on_search_selects_first_option_single": 1.052, + "tests/integration/dropdown/test_a11y.py::test_a11y011_enter_on_search_no_deselect_when_not_clearable": 0.816, + "tests/integration/dropdown/test_a11y.py::test_a11y012_typing_on_trigger_opens_dropdown_with_search": 0.912, + "tests/integration/dropdown/test_a11y.py::test_a11y013_enter_on_search_after_reopen_selects_correctly": 1.448, + "tests/integration/dropdown/test_clearable_false.py::test_ddcf001_clearable_false_single": 3.214, + "tests/integration/dropdown/test_clearable_false.py::test_ddcf001b_delete_backspace_keys_clearable_false": 0.811, + "tests/integration/dropdown/test_clearable_false.py::test_ddcf001c_delete_backspace_keys_clearable_true": 1.171, + "tests/integration/dropdown/test_clearable_false.py::test_ddcf002_clearable_false_multi": 3.52, + "tests/integration/dropdown/test_dropdown_debounce.py::test_ddde001_dropdown_debounce": 1.042, + "tests/integration/dropdown/test_dropdown_radioitems_checklist_shorthands.py::test_ddsh001_test_dropdown_radioitems_checklist_shorthands": 0.816, + "tests/integration/dropdown/test_dynamic_options.py::test_dddo001_dynamic_options": 1.242, + "tests/integration/dropdown/test_dynamic_options.py::test_dddo002_array_comma_value": 0.811, + "tests/integration/dropdown/test_dynamic_options.py::test_dddo003_value_no_options": 0.805, + "tests/integration/dropdown/test_dynamic_options.py::test_dddo004_dynamic_value_search": 1.489, + "tests/integration/dropdown/test_localization.py::test_ddlo001_translations": 1.308, + "tests/integration/dropdown/test_localization.py::test_ddlo002_partial_translations": 1.211, + "tests/integration/dropdown/test_remove_option.py::test_ddro001_remove_option_single[False]": 0.915, + "tests/integration/dropdown/test_remove_option.py::test_ddro001_remove_option_single[True]": 0.82, + "tests/integration/dropdown/test_remove_option.py::test_ddro002_remove_option_multi[False]": 0.817, + "tests/integration/dropdown/test_remove_option.py::test_ddro002_remove_option_multi[True]": 0.813, + "tests/integration/dropdown/test_remove_option.py::test_ddro003_remove_option_multiple_dropdowns": 1.002, + "tests/integration/dropdown/test_remove_option.py::test_ddro004_empty_string_not_updated": 0.984, + "tests/integration/dropdown/test_search_value.py::test_ddsv001_search_value": 0.981, + "tests/integration/dropdown/test_styles.py::test_ddst001_cursor_should_be_pointer": 1.315, + "tests/integration/dropdown/test_visibility.py::test_ddvi001_fixed_table": 0.816, + "tests/integration/dropdown/test_visibility.py::test_ddvi002_maxHeight": 0.812, + "tests/integration/geolocation/test_geolocation.py::test_geol001_position": 1.821, + "tests/integration/graph/test_graph_basics.py::test_grbs001_graph_without_ids[False]": 0.709, + "tests/integration/graph/test_graph_basics.py::test_grbs001_graph_without_ids[True]": 6.32, + "tests/integration/graph/test_graph_basics.py::test_grbs002_wrapped_graph_has_no_infinite_loop[False]": 2.544, + "tests/integration/graph/test_graph_basics.py::test_grbs002_wrapped_graph_has_no_infinite_loop[True]": 7.937, + "tests/integration/graph/test_graph_basics.py::test_grbs003_graph_wrapped_in_loading_component_does_not_fail": 1.835, + "tests/integration/graph/test_graph_basics.py::test_grbs004_graph_loading_state_updates": 1.424, + "tests/integration/graph/test_graph_basics.py::test_grbs005_graph_customdata": 0.0, + "tests/integration/graph/test_graph_basics.py::test_grbs006_graph_update_frames": 2.246, + "tests/integration/graph/test_graph_basics.py::test_grbs007_graph_scatter_lines_customdata": 1.87, + "tests/integration/graph/test_graph_basics.py::test_grbs008_graph_with_empty_figure": 3.929, + "tests/integration/graph/test_graph_purge.py::test_grgp001_clean_purge[False]": 2.545, + "tests/integration/graph/test_graph_purge.py::test_grgp001_clean_purge[True]": 7.715, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-600-600-False-False]": 7.284554924999611, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-600-600-False-None]": 7.214430019000247, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-600-600-False-True]": 6.803961937000167, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-600-600-None-False]": 7.493491317000917, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-600-600-None-None]": 7.347791550000693, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-600-600-None-True]": 7.310973616999945, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-600-600-True-False]": 6.8968877489996885, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-600-600-True-None]": 6.941685961000985, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-600-600-True-True]": 6.4033063329998186, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-600-None-False-False]": 7.296197197000765, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-600-None-False-None]": 7.7309637689995725, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-600-None-False-True]": 6.856384835999961, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-600-None-None-False]": 7.033855409999887, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-600-None-None-None]": 7.1723327750014505, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-600-None-None-True]": 7.248216258998582, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-600-None-True-False]": 7.205802173000848, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-600-None-True-None]": 7.422934485000042, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-600-None-True-True]": 7.31256299099914, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-None-600-False-False]": 7.451688185000421, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-None-600-False-None]": 7.443648510999992, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-None-600-False-True]": 7.367691627999193, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-None-600-None-False]": 7.657604052001261, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-None-600-None-None]": 7.433712416000162, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-None-600-None-True]": 7.536519396000585, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-None-600-True-False]": 7.2315164429992365, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-None-600-True-None]": 7.135000790000049, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-None-600-True-True]": 7.114700159000677, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-None-None-600-600]": 2.165, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-None-None-False-False]": 7.80122638299963, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-None-None-False-None]": 7.861336936999578, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-None-None-False-True]": 7.808372402000714, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-None-None-None-False]": 8.01719757400042, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-None-None-None-None]": 7.813041058999261, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-None-None-None-True]": 7.567784362999191, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-None-None-True-False]": 7.7159110119991965, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-None-None-True-None]": 8.037083686000187, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-None-None-True-True]": 7.684389855000518, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[False-True-True-None-None]": 1.934, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-600-600-False-False]": 5.82275866099917, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-600-600-False-None]": 6.0087271590000455, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-600-600-False-True]": 6.039655221999965, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-600-600-None-False]": 6.074156362000394, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-600-600-None-None]": 6.09133993299929, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-600-600-None-True]": 6.0561844140001995, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-600-600-True-False]": 5.690873995000402, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-600-600-True-None]": 5.801946895999208, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-600-600-True-True]": 5.687949469999694, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-600-None-False-False]": 6.489894251999431, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-600-None-False-None]": 5.687385061999521, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-600-None-False-True]": 6.041331999999784, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-600-None-None-False]": 5.77260293099971, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-600-None-None-None]": 6.216985517000467, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-600-None-None-True]": 5.653733572999954, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-600-None-True-False]": 5.805468708000262, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-600-None-True-None]": 5.908365883999977, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-600-None-True-True]": 6.084631822000119, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-False-False-600-600]": 3.71, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-None-600-False-False]": 6.471105571999942, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-None-600-False-None]": 6.957498449999548, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-None-600-False-True]": 6.372051036999437, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-None-600-None-False]": 6.711550336999608, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-None-600-None-None]": 6.453660960999514, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-None-600-None-True]": 6.1091358700005, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-None-600-True-False]": 6.387604486000782, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-None-600-True-None]": 6.290739175998169, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-None-600-True-True]": 5.924085367999396, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-None-None-False-False]": 5.83051194699965, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-None-None-False-None]": 5.977921568000056, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-None-None-False-True]": 6.011052949999794, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-None-None-None-False]": 7.501756733000548, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-None-None-None-None]": 7.314, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-None-None-None-True]": 6.3077086120001695, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-None-None-True-False]": 6.3224427960003595, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-None-None-True-None]": 5.81624952400125, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[True-None-None-True-True]": 7.2082914850007, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-600-600-False-False]": 7.695677488000911, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-600-600-False-None]": 7.941908481999235, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-600-600-False-True]": 7.580129093000323, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-600-600-None-False]": 7.750337285000569, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-600-600-None-None]": 7.331829526000547, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-600-600-None-True]": 7.566534591999698, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-600-600-True-False]": 8.136083313998824, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-600-600-True-None]": 8.163796986999841, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-600-600-True-True]": 7.949342575000628, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-600-None-False-False]": 8.794751252999959, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-600-None-False-None]": 7.785567480000282, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-600-None-False-True]": 7.717311108001013, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-600-None-None-False]": 8.104114529000071, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-600-None-None-None]": 7.950562424999589, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-600-None-None-True]": 7.838195313000142, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-600-None-True-False]": 7.8246707039998, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-600-None-True-None]": 8.220065619000707, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-600-None-True-True]": 7.698572184001023, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-False-True-None-None]": 2.346, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-None-600-False-False]": 8.50270284799899, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-None-600-False-None]": 8.637397768999108, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-None-600-False-True]": 8.759300188001362, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-None-600-None-False]": 8.883150002000548, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-None-600-None-None]": 8.835384653000801, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-None-600-None-True]": 8.457285718000094, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-None-600-True-False]": 8.091693646999374, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-None-600-True-None]": 8.303008965000117, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-None-600-True-True]": 8.262198350999824, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-None-None-600-600]": 2.475, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-None-None-False-False]": 8.811412665999342, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-None-None-False-None]": 7.984537907000231, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-None-None-False-True]": 8.363506467999287, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-None-None-None-False]": 7.9478049239996835, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-None-None-None-None]": 8.96899504599969, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-None-None-None-True]": 7.5213931280004545, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-None-None-True-False]": 8.83125211800052, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-None-None-True-None]": 8.885810460000357, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-None-None-True-True]": 8.933959553000022, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-True-False-None-None]": 2.382, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-True-True-600-None]": 2.381, + "tests/integration/graph/test_graph_responsive.py::test_grrs001_graph[auto-True-True-None-None]": 2.12, + "tests/integration/graph/test_graph_responsive.py::test_grrs002_responsive_parent_height": 2.273, + "tests/integration/graph/test_graph_responsive.py::test_grrs003_graph": 1.896, + "tests/integration/graph/test_graph_varia.py::test_grva001_candlestick[False]": 4.276, + "tests/integration/graph/test_graph_varia.py::test_grva001_candlestick[True]": 4.63, + "tests/integration/graph/test_graph_varia.py::test_grva002_graphs_with_different_figures[False]": 2.746, + "tests/integration/graph/test_graph_varia.py::test_grva002_graphs_with_different_figures[True]": 4.269, + "tests/integration/graph/test_graph_varia.py::test_grva003_empty_graph[False]": 1.958, + "tests/integration/graph/test_graph_varia.py::test_grva003_empty_graph[True]": 2.518, + "tests/integration/graph/test_graph_varia.py::test_grva004_graph_prepend_trace[False]": 17.862, + "tests/integration/graph/test_graph_varia.py::test_grva004_graph_prepend_trace[True]": 18.526, + "tests/integration/graph/test_graph_varia.py::test_grva005_graph_extend_trace[False]": 17.88, + "tests/integration/graph/test_graph_varia.py::test_grva005_graph_extend_trace[True]": 18.827, + "tests/integration/graph/test_graph_varia.py::test_grva006_unmounted_graph_resize[False]": 0.826, + "tests/integration/graph/test_graph_varia.py::test_grva006_unmounted_graph_resize[True]": 2.617, + "tests/integration/graph/test_graph_varia.py::test_grva007_external_plotlyjs_prevents_lazy[False]": 5.645, + "tests/integration/graph/test_graph_varia.py::test_grva007_external_plotlyjs_prevents_lazy[True]": 7.365, + "tests/integration/graph/test_graph_varia.py::test_grva008_shapes_not_lost": 3.326, + "tests/integration/graph/test_graph_varia.py::test_grva009_originals_maintained_for_responsive_override[False]": 2.336, + "tests/integration/graph/test_graph_varia.py::test_grva009_originals_maintained_for_responsive_override[True]": 2.34, + "tests/integration/graph/test_graph_varia.py::test_grva010_external_mathjax_prevents_lazy": 2.348, + "tests/integration/graph/test_graph_varia.py::test_grva011_without_mathjax[False]": 1.865, + "tests/integration/graph/test_graph_varia.py::test_grva011_without_mathjax[True]": 3.06, + "tests/integration/graph/test_graph_varia.py::test_grva012_with_mathjax[False]": 1.855, + "tests/integration/graph/test_graph_varia.py::test_grva012_with_mathjax[True]": 3.056, + "tests/integration/graph/test_graph_varia.py::test_grva013_toggle_mathjax[False]": 2.374, + "tests/integration/graph/test_graph_varia.py::test_grva013_toggle_mathjax[True]": 3.581, + "tests/integration/graph/test_graph_varia.py::test_grva014_load_mathjax[False]": 2.044, + "tests/integration/graph/test_graph_varia.py::test_grva014_load_mathjax[True]": 3.325, + "tests/integration/input/test_a11y_input.py::test_a11y001_label_focuses_input[number]": 0.822, + "tests/integration/input/test_a11y_input.py::test_a11y001_label_focuses_input[text]": 1.54, + "tests/integration/input/test_a11y_input.py::test_a11y002_label_with_htmlFor_can_focus_input[number]": 0.818, + "tests/integration/input/test_a11y_input.py::test_a11y002_label_with_htmlFor_can_focus_input[text]": 0.799, + "tests/integration/input/test_debounce.py::test_debounce_number_by_time": 4.313, + "tests/integration/input/test_debounce.py::test_debounce_text_by_time": 4.332, + "tests/integration/input/test_input_and_state.py::test_state_and_inputs": 1.417, + "tests/integration/input/test_input_basics.py::test_inbs001_all_types": 3.564, + "tests/integration/input/test_input_basics.py::test_inbs002_user_class": 0.714, + "tests/integration/input/test_input_basics.py::test_inbs003_styles_are_scoped": 0.816, + "tests/integration/input/test_input_basics.py::test_inbs004_cursor_position_on_invalid_input[abcdddef-/-2-ab/cdddef-3]": 0.811, + "tests/integration/input/test_input_basics.py::test_inbs004_cursor_position_on_invalid_input[abcdef-$-2-ab$cdef-3]": 0.807, + "tests/integration/input/test_input_basics.py::test_inbs004_cursor_position_on_invalid_input[abcdef-$-3-abc$def-4]": 0.808, + "tests/integration/input/test_input_basics.py::test_inbs004_cursor_position_on_invalid_input[abcdef-A-4-abcdAef-5]": 0.811, + "tests/integration/input/test_number_input.py::test_inni001_invalid_numbers": 10.311, + "tests/integration/input/test_number_input.py::test_inni002_invalid_numbers_ui": 2.236, + "tests/integration/input/test_number_input.py::test_inni003_invalid_numbers_range": 3.575, + "tests/integration/input/test_number_input.py::test_inni004_steppers": 3.467, + "tests/integration/input/test_number_input.py::test_inni005_stepper_decrement_bug": 0.789, + "tests/integration/input/test_number_input.py::test_inni006_stepper_floating_point_precision[0.0001]": 2.075, + "tests/integration/input/test_number_input.py::test_inni006_stepper_floating_point_precision[0.001]": 2.004, + "tests/integration/input/test_number_input.py::test_inni006_stepper_floating_point_precision[0.01]": 2.074, + "tests/integration/input/test_number_input.py::test_inni006_stepper_floating_point_precision[0.1]": 2.145, + "tests/integration/input/test_number_input.py::test_inni007_stepper_very_small_steps[1e-05]": 1.549, + "tests/integration/input/test_number_input.py::test_inni007_stepper_very_small_steps[1e-06]": 1.561, + "tests/integration/input/test_number_input.py::test_inni010_valid_numbers": 4.399, + "tests/integration/interval/test_interval.py::test_intv001_interval": 5.712, + "tests/integration/interval/test_interval.py::test_intv002_restart": 4.802, + "tests/integration/link/test_absolute_path.py::test_lipa001_path": 0.891, + "tests/integration/link/test_absolute_path.py::test_lipa002_path": 0.784, + "tests/integration/link/test_link_children.py::test_lich001_default": 0.802, + "tests/integration/link/test_link_children.py::test_lich002_children": 0.821, + "tests/integration/link/test_link_event.py::test_link001_event": 0.896, + "tests/integration/link/test_link_event.py::test_link002_scroll": 0.921, + "tests/integration/link/test_title_prop.py::test_liti001_prop": 0.715, + "tests/integration/loading/test_loading_component.py::test_ldcp001_loading_component_initialization": 0.711, + "tests/integration/loading/test_loading_component.py::test_ldcp002_loading_component_action": 0.926, + "tests/integration/loading/test_loading_component.py::test_ldcp003_multiple_loading_components": 1.074, + "tests/integration/loading/test_loading_component.py::test_ldcp004_nested_loading_components": 1.082, + "tests/integration/loading/test_loading_component.py::test_ldcp005_dynamic_loading_component": 1.023, + "tests/integration/loading/test_loading_component.py::test_ldcp006_children_identity": 2.317, + "tests/integration/loading/test_loading_component.py::test_ldcp007_class_and_style_props": 9.327, + "tests/integration/loading/test_loading_component.py::test_ldcp008_graph_in_loading_fits_container_height": 1.819, + "tests/integration/loading/test_loading_component.py::test_ldcp009_loading_component_overlay_style": 0.936, + "tests/integration/loading/test_loading_component.py::test_ldcp011_loading_component_target_components": 2.95, + "tests/integration/loading/test_loading_component.py::test_ldcp012_loading_component_custom_spinner": 2.914, + "tests/integration/loading/test_loading_component.py::test_ldcp013_loading_component_display_show": 0.744, + "tests/integration/loading/test_loading_component.py::test_ldcp014_loading_component_delay_hide": 2.914, + "tests/integration/loading/test_loading_component.py::test_ldcp015_loading_component_delay_show": 3.409, + "tests/integration/loading/test_loading_component.py::test_ldcp016_loading_component_delay_hide": 1.828, + "tests/integration/loading/test_loading_component.py::test_ldcp017_loading_component_target_components_duplicates": 3.063, + "tests/integration/loading/test_loading_component.py::test_ldcp018_loading_component_target_components_wildcard": 3.182, + "tests/integration/location/test_location_callback.py::test_loca001_callbacks": 0.706, + "tests/integration/location/test_location_callback.py::test_loca002_location_link": 1.912, + "tests/integration/location/test_location_callback.py::test_loca003_location_callback": 0.899, + "tests/integration/markdown/test_markdown.py::test_mkdw001_img": 2.268, + "tests/integration/markdown/test_markdown.py::test_mkdw002_dcclink": 2.302, + "tests/integration/markdown/test_markdown.py::test_mkdw003_without_mathjax[False]": 0.844, + "tests/integration/markdown/test_markdown.py::test_mkdw003_without_mathjax[True]": 2.209, + "tests/integration/markdown/test_markdown.py::test_mkdw004_inline_mathjax[False]": 0.962, + "tests/integration/markdown/test_markdown.py::test_mkdw004_inline_mathjax[True]": 2.478, + "tests/integration/markdown/test_markdown.py::test_mkdw005_block_mathjax[False]": 0.987, + "tests/integration/markdown/test_markdown.py::test_mkdw005_block_mathjax[True]": 2.497, + "tests/integration/markdown/test_markdown.py::test_mkdw006_toggle_mathjax[False]": 1.154, + "tests/integration/markdown/test_markdown.py::test_mkdw006_toggle_mathjax[True]": 2.894, + "tests/integration/markdown/test_markdown.py::test_mkdw007_load_mathjax[False]": 0.904, + "tests/integration/markdown/test_markdown.py::test_mkdw007_load_mathjax[True]": 2.696, + "tests/integration/markdown/test_markdown.py::test_mkdw008_mathjax_visual": 1.962, + "tests/integration/markdown/test_markdown.py::test_mkdw009_target_blank_links": 0.825, + "tests/integration/markdown/test_markdown.py::test_mkdw010_mathjax_with_html": 1.091, + "tests/integration/misc/test_bcdp_auto_id.py::test_msai001_auto_id_assert": 0.833, + "tests/integration/misc/test_dcc_components_as_props.py::test_mdcap001_dcc_components_as_props": 6.054, + "tests/integration/misc/test_inline.py::test_inline_props": 0.808, + "tests/integration/misc/test_markdown_highlight.py::test_msmh001_no_window_variable": 0.837, + "tests/integration/misc/test_markdown_highlight.py::test_msmh002_window_override": 0.846, + "tests/integration/misc/test_markdown_highlight.py::test_msmh003_update_md": 0.467, + "tests/integration/misc/test_persistence.py::test_msps001_basic_persistence": 6.131, + "tests/integration/misc/test_platter.py::test_mspl001_dcc_components_platter": 2.953, + "tests/integration/misc/test_popover_visibility.py::test_mspv001_popover_visibility_when_app_is_smaller_than_popup": 12.448, + "tests/integration/misc/test_popover_visibility.py::test_mspv002_popover_visibility_when_app_is_scrolled_down": 5.05, + "tests/integration/misc/test_popover_visibility.py::test_mspv003_popover_contained_within_dash_app": 7.981, + "tests/integration/misc/test_popover_visibility.py::test_mspv004_popover_inherits_container_styles": 1.116, + "tests/integration/sliders/test_marks_density.py::test_slsl_extreme_range_marks_density": 0.797, + "tests/integration/sliders/test_marks_density.py::test_slsl_extreme_range_no_width": 0.798, + "tests/integration/sliders/test_sliders.py::test_sls016_sliders_format_tooltips": 0.806, + "tests/integration/sliders/test_sliders.py::test_slsl001_always_visible_slider": 12.497, + "tests/integration/sliders/test_sliders.py::test_slsl002_always_visible_rangeslider": 12.551, + "tests/integration/sliders/test_sliders.py::test_slsl003_out_of_range_marks_slider": 0.796, + "tests/integration/sliders/test_sliders.py::test_slsl004_out_of_range_marks_rangeslider": 0.793, + "tests/integration/sliders/test_sliders.py::test_slsl005_slider_tooltip": 0.8, + "tests/integration/sliders/test_sliders.py::test_slsl006_rangeslider_tooltip": 0.799, + "tests/integration/sliders/test_sliders.py::test_slsl007_drag_value_slider": 16.876, + "tests/integration/sliders/test_sliders.py::test_slsl008_drag_value_rangeslider": 12.085, + "tests/integration/sliders/test_sliders.py::test_slsl009_loading_state": 0.961, + "tests/integration/sliders/test_sliders.py::test_slsl010_range_loading_state": 0.961, + "tests/integration/sliders/test_sliders.py::test_slsl011_horizontal_slider": 0.802, + "tests/integration/sliders/test_sliders.py::test_slsl012_vertical_slider": 0.8, + "tests/integration/sliders/test_sliders.py::test_slsl013_horizontal_range_slider": 0.795, + "tests/integration/sliders/test_sliders.py::test_slsl014_vertical_range_slider": 0.795, + "tests/integration/sliders/test_sliders.py::test_slsl015_range_slider_no_min_max": 0.797, + "tests/integration/sliders/test_sliders.py::test_slsl015_range_slider_step_none": 0.792, + "tests/integration/sliders/test_sliders.py::test_slsl017_marks_limit_500": 0.802, + "tests/integration/sliders/test_sliders.py::test_slsl018_marks_limit_exceeded": 0.805, + "tests/integration/sliders/test_sliders.py::test_slsl019_allow_direct_input_false": 16.167, + "tests/integration/sliders/test_sliders_keyboard_input.py::test_slkb001_input_constrained_by_min_max": 3.289, + "tests/integration/sliders/test_sliders_keyboard_input.py::test_slkb002_range_input_constrained_by_min_max": 4.498, + "tests/integration/sliders/test_sliders_keyboard_input.py::test_slkb003_input_constrained_by_step": 3.247, + "tests/integration/sliders/test_sliders_keyboard_input.py::test_slkb004_range_input_constrained_by_step": 1.599, + "tests/integration/sliders/test_sliders_keyboard_input.py::test_slkb005_input_decimals_precision": 1.508, + "tests/integration/sliders/test_sliders_shorthands.py::test_slsh001_rangeslider_shorthand_props": 1.81, + "tests/integration/sliders/test_sliders_shorthands.py::test_slsh002_sliders_marks_si_unit_format": 4.32, + "tests/integration/sliders/test_sliders_step.py::test_slst001_step_params[test_case0]": 106.715, + "tests/integration/sliders/test_sliders_step.py::test_slst001_step_params[test_case1]": 106.514, + "tests/integration/sliders/test_sliders_step.py::test_slst001_step_params[test_case2]": 106.562, + "tests/integration/sliders/test_sliders_step.py::test_slst001_step_params[test_case3]": 106.428, + "tests/integration/store/test_component_props.py::test_stcp001_clear_data_on_all_types": 1.723, + "tests/integration/store/test_component_props.py::test_stcp002_modified_ts": 0.924, + "tests/integration/store/test_component_props.py::test_stcp003_initial_falsy": 0.793, + "tests/integration/store/test_component_props.py::test_stcp004_remount_store_component": 3.494, + "tests/integration/store/test_data_lifecycle.py::test_stdl001_data_lifecycle_with_different_condition": 1.81, + "tests/integration/store/test_store_data.py::test_stda001_data_types": 4.752, + "tests/integration/store/test_store_data.py::test_stda002_nested_data": 0.873, + "tests/integration/store/test_store_data.py::test_stda003_large_data_size[local]": 0.991, + "tests/integration/store/test_store_data.py::test_stda003_large_data_size[memory]": 2.351, + "tests/integration/store/test_store_data.py::test_stda003_large_data_size[session]": 0.991, + "tests/integration/tab/test_tabs.py::test_tabs001_in_vertical_mode": 0.794, + "tests/integration/tab/test_tabs.py::test_tabs002_without_children": 0.82, + "tests/integration/tab/test_tabs.py::test_tabs003_without_children_undefined": 0.798, + "tests/integration/tab/test_tabs.py::test_tabs004_without_value": 0.815, + "tests/integration/tab/test_tabs.py::test_tabs005_disabled": 0.7, + "tests/integration/tab/test_tabs_with_graphs.py::test_tagr001_graph_does_not_resize_in_tabs[False]": 2.032, + "tests/integration/tab/test_tabs_with_graphs.py::test_tagr001_graph_does_not_resize_in_tabs[True]": 5.099, + "tests/integration/tab/test_tabs_with_graphs.py::test_tagr002_tabs_render_without_selected[False]": 3.951, + "tests/integration/tab/test_tabs_with_graphs.py::test_tagr002_tabs_render_without_selected[True]": 6.99, + "tests/integration/test_title_props.py::test_ddot001_dropdown_radioitems_checklist_option_title": 2.593, + "tests/integration/tooltip/test_tooltip.py::test_ttbs001_canonical_behavior": 2.245, + "tests/integration/upload/test_children_accept_any_component.py::test_upca001_upload_children_gallery": 1.303, + "tests/integration/upload/test_folder_upload.py::test_upfd001_folder_upload_with_enable_folder_selection": 0.725, + "tests/integration/upload/test_folder_upload.py::test_upfd002_multiple_files_without_folder_selection": 0.793, + "tests/integration/upload/test_folder_upload.py::test_upfd003_single_file_upload": 0.811, + "tests/integration/upload/test_upload_different_file_types.py::test_upft001_test_upload_with_different_file_types[csv]": 0.896, + "tests/integration/upload/test_upload_different_file_types.py::test_upft001_test_upload_with_different_file_types[png]": 0.789, + "tests/integration/upload/test_upload_different_file_types.py::test_upft001_test_upload_with_different_file_types[svg]": 1.129, + "tests/integration/upload/test_upload_different_file_types.py::test_upft001_test_upload_with_different_file_types[xls]": 0.793, + "tests/integration/upload/test_upload_different_file_types.py::test_upft001_test_upload_with_different_file_types[xlsx]": 0.893 +} \ No newline at end of file diff --git a/components/dash-core-components/tests/integration/graph/test_graph_responsive.py b/components/dash-core-components/tests/integration/graph/test_graph_responsive.py index aee3a87315..f81dc1fb7c 100644 --- a/components/dash-core-components/tests/integration/graph/test_graph_responsive.py +++ b/components/dash-core-components/tests/integration/graph/test_graph_responsive.py @@ -4,18 +4,35 @@ import flaky from dash import Dash, Input, Output, State, dcc, html -import plotly.graph_objects as go from dash.exceptions import PreventUpdate from dash.testing import wait -@pytest.mark.parametrize("responsive", [True, False, None]) -@pytest.mark.parametrize("autosize", [True, False, None]) -@pytest.mark.parametrize("height", [600, None]) -@pytest.mark.parametrize("width", [600, None]) -@pytest.mark.parametrize("is_responsive", [True, False, "auto"]) -def test_grrs001_graph(dash_dcc, responsive, autosize, height, width, is_responsive): +@pytest.mark.parametrize( + "is_responsive,responsive,autosize,height,width", + [ + # is_responsive=True: always responsive regardless of other params + (True, None, None, None, None), + (True, False, False, 600, 600), # still responsive even with fixed dims + # is_responsive=False: never responsive regardless of other params + (False, True, True, None, None), # not responsive even with autosize + (False, None, None, 600, 600), + # is_responsive="auto": behavior depends on other params + ("auto", True, True, None, None), # responsive: all conditions met + ("auto", True, True, 600, None), # responsive: one dim fixed is ok + ("auto", True, False, None, None), # NOT responsive: autosize=False + ( + "auto", + False, + True, + None, + None, + ), # NOT responsive on resize: config.responsive=False + ("auto", None, None, 600, 600), # NOT responsive: both dims fixed + ], +) +def test_grrs001_graph(dash_dcc, is_responsive, responsive, autosize, height, width): app = Dash(__name__, eager_loading=True) header_style = dict(padding="10px", backgroundColor="yellow", flex="0 0 100px") diff --git a/components/dash-html-components/scripts/generate-components.js b/components/dash-html-components/scripts/generate-components.js index 1e4bd0d677..9a4472804b 100644 --- a/components/dash-html-components/scripts/generate-components.js +++ b/components/dash-html-components/scripts/generate-components.js @@ -355,6 +355,7 @@ if (!listPath) { const list = fs .readFileSync(listPath, 'utf8') .split('\n') + .map(item => item.trim()) .filter(item => Boolean(item)); // Get the mapping of attributes to elements diff --git a/components/dash-table/.test_durations b/components/dash-table/.test_durations index 0954a7e3d1..864b5c3511 100644 --- a/components/dash-table/.test_durations +++ b/components/dash-table/.test_durations @@ -1,392 +1,392 @@ { - "tests/selenium/test_basic_copy_paste.py::test_tbcp001_copy_paste_callback": 0.00019522494403645396, - "tests/selenium/test_basic_copy_paste.py::test_tbcp002_sorted_copy_paste_callback": 0.00014724500942975283, - "tests/selenium/test_basic_copy_paste.py::test_tbcp003_copy_multiple_rows[False]": 0.0001170769683085382, - "tests/selenium/test_basic_copy_paste.py::test_tbcp003_copy_multiple_rows[True]": 0.00018426397582516074, - "tests/selenium/test_basic_copy_paste.py::test_tbcp004_copy_9_and_10": 2.3618100970052183, - "tests/selenium/test_basic_copy_paste.py::test_tbcp005_copy_multiple_rows_and_columns": 0.0006186750251799822, - "tests/selenium/test_basic_copy_paste.py::test_tbcp006_copy_paste_between_tables": 0.000454101013019681, - "tests/selenium/test_basic_copy_paste.py::test_tbcp007_copy_paste_with_hidden_column": 0.00047546200221404433, - "tests/selenium/test_basic_copy_paste.py::test_tbcp008_copy_paste_between_tables_with_hidden_columns": 0.0004522940143942833, - "tests/selenium/test_basic_copy_paste.py::test_tbcp009_copy_9_and_10_click": 2.334818640956655, - "tests/selenium/test_basic_copy_paste.py::test_tbcp010_copy_from_unselectable_cells_table": 3.64440403500339, - "tests/selenium/test_basic_copy_paste.py::test_tbcp011_copy_double_quotes": 2.099863847019151, - "tests/selenium/test_basic_copy_paste.py::test_tbcp011_copy_multiline": 2.052545247017406, - "tests/selenium/test_basic_operations.py::test_tbst001_get_cell[props0]": 2.7311835610307753, - "tests/selenium/test_basic_operations.py::test_tbst001_get_cell[props1]": 1.7271678000106476, - "tests/selenium/test_basic_operations.py::test_tbst002_select_all_text[props0]": 2.6768361960421316, - "tests/selenium/test_basic_operations.py::test_tbst002_select_all_text[props1]": 1.6827889429987408, - "tests/selenium/test_basic_operations.py::test_tbst003_edit_on_enter[props0]": 2.7179253359208815, - "tests/selenium/test_basic_operations.py::test_tbst003_edit_on_enter[props1]": 3.1697040230501443, - "tests/selenium/test_basic_operations.py::test_tbst004_edit_on_tab[props0]": 2.9788199129980057, - "tests/selenium/test_basic_operations.py::test_tbst004_edit_on_tab[props1]": 3.1577080780407414, - "tests/selenium/test_basic_operations.py::test_tbst005_edit_last_row_on_click_outside[props0]": 3.185404047020711, - "tests/selenium/test_basic_operations.py::test_tbst005_edit_last_row_on_click_outside[props1]": 3.176985738973599, - "tests/selenium/test_basic_operations.py::test_tbst006_focused_arrow_left": 3.188558186928276, - "tests/selenium/test_basic_operations.py::test_tbst007_active_focused_arrow_right": 2.679577363014687, - "tests/selenium/test_basic_operations.py::test_tbst008_active_focused_arrow_up": 2.6878972130361944, - "tests/selenium/test_basic_operations.py::test_tbst009_active_focused_arrow_down": 2.679912735009566, - "tests/selenium/test_basic_operations.py::test_tbst010_active_with_dblclick[props0]": 3.6809552700142376, - "tests/selenium/test_basic_operations.py::test_tbst010_active_with_dblclick[props1]": 3.1547473430400714, - "tests/selenium/test_basic_operations.py::test_tbst011_delete_row[props0]": 2.958765771065373, - "tests/selenium/test_basic_operations.py::test_tbst011_delete_row[props1]": 1.6942474040552042, - "tests/selenium/test_basic_operations.py::test_tbst012_delete_sorted_row[props0]": 3.220703576982487, - "tests/selenium/test_basic_operations.py::test_tbst012_delete_sorted_row[props1]": 2.519949849054683, - "tests/selenium/test_basic_operations.py::test_tbst013_select_row[props0]": 2.191247455019038, - "tests/selenium/test_basic_operations.py::test_tbst013_select_row[props1]": 1.6611916000256315, - "tests/selenium/test_basic_operations.py::test_tbst013_select_row[props2]": 2.180750813044142, - "tests/selenium/test_basic_operations.py::test_tbst014_selected_sorted_row[props0]": 3.805833949998487, - "tests/selenium/test_basic_operations.py::test_tbst014_selected_sorted_row[props1]": 2.1639014940010384, - "tests/selenium/test_basic_operations.py::test_tbst014_selected_sorted_row[props2]": 3.7030246410286054, - "tests/selenium/test_basic_operations.py::test_tbst015_selected_row_respects_sort[props0]": 3.6779075110098347, - "tests/selenium/test_basic_operations.py::test_tbst015_selected_row_respects_sort[props1]": 2.1594175070058554, - "tests/selenium/test_basic_operations.py::test_tbst015_selected_row_respects_sort[props2]": 3.69613198103616, - "tests/selenium/test_basic_operations.py::test_tbst016_delete_cell[props0]": 3.263621886027977, - "tests/selenium/test_basic_operations.py::test_tbst016_delete_cell[props1]": 1.98756921896711, - "tests/selenium/test_basic_operations.py::test_tbst017_delete_cell_updates_while_selected[props0]": 0.00021198397735133767, - "tests/selenium/test_basic_operations.py::test_tbst017_delete_cell_updates_while_selected[props1]": 0.00015217997133731842, - "tests/selenium/test_basic_operations.py::test_tbst018_delete_multiple_cells[props0]": 3.2013827829505317, - "tests/selenium/test_basic_operations.py::test_tbst018_delete_multiple_cells[props1]": 2.340432584984228, - "tests/selenium/test_basic_operations.py::test_tbst019_delete_multiple_cells_while_selected[props0]": 0.0006018630228936672, - "tests/selenium/test_basic_operations.py::test_tbst019_delete_multiple_cells_while_selected[props1]": 0.0005421870155259967, - "tests/selenium/test_basic_operations.py::test_tbst020_sorted_table_delete_cell[props0]": 3.6559230600250885, - "tests/selenium/test_basic_operations.py::test_tbst020_sorted_table_delete_cell[props1]": 2.238027448998764, - "tests/selenium/test_basic_operations.py::test_tbst021_sorted_table_delete_cell_updates_while_selected[props0]": 0.0005888969753868878, - "tests/selenium/test_basic_operations.py::test_tbst021_sorted_table_delete_cell_updates_while_selected[props1]": 0.0004974550101906061, - "tests/selenium/test_basic_operations.py::test_tbst022_sorted_table_delete_multiple_cells[props0]": 4.175277445989195, - "tests/selenium/test_basic_operations.py::test_tbst022_sorted_table_delete_multiple_cells[props1]": 2.195623565989081, - "tests/selenium/test_basic_operations.py::test_tbst023_sorted_table_delete_multiple_cells_while_selected[props0]": 0.000649340043310076, - "tests/selenium/test_basic_operations.py::test_tbst023_sorted_table_delete_multiple_cells_while_selected[props1]": 0.0005274569848552346, - "tests/selenium/test_basic_operations.py::test_tbst024_row_selectable_filter_action": 1.532161755952984, - "tests/selenium/test_column.py::test_colm001_can_delete": 2.5322491909610108, - "tests/selenium/test_column.py::test_colm002_keep_hidden_on_delete": 4.572097742988262, - "tests/selenium/test_column.py::test_colm003_can_clear": 2.5521739520481788, - "tests/selenium/test_column.py::test_colm004_can_hide": 5.094524133019149, - "tests/selenium/test_column.py::test_colm005_dont_clear_hidden": 4.576996338029858, - "tests/selenium/test_column.py::test_colm006_multi_select": 51.61643337405985, - "tests/selenium/test_column.py::test_colm007_single_select": 76.16343968000729, - "tests/selenium/test_column.py::test_colm008_top_row_by_subset": 23.03438583208481, - "tests/selenium/test_column.py::test_colm009_newline_id": 2.315119614941068, - "tests/selenium/test_derived_props.py::test_tdrp001_select_rows": 1.8959960130159743, - "tests/selenium/test_derived_props.py::test_tdrp002_select_cell": 2.8513190529774874, - "tests/selenium/test_derived_props.py::test_tdrp003_select_cells": 2.067663702997379, - "tests/selenium/test_derived_props.py::test_tdrp004_navigate_selected_cells": 3.0031098460312933, - "tests/selenium/test_derived_props.py::test_tdrp005_filtered_and_sorted_row_select": 2.3864269059849903, - "tests/selenium/test_dropdown.py::test_drpd001_no_scroll": 1.7662509219371714, - "tests/selenium/test_edit.py::test_edit001_can_delete_dropdown[props0]": 2.034055811993312, - "tests/selenium/test_edit.py::test_edit001_can_delete_dropdown[props1]": 1.567317212058697, - "tests/selenium/test_edit.py::test_edit002_can_delete_dropown_and_set[props0]": 4.042541190050542, - "tests/selenium/test_edit.py::test_edit002_can_delete_dropown_and_set[props1]": 3.58369900501566, - "tests/selenium/test_edit.py::test_edit003_can_edit_dropdown[props0]": 3.576839070999995, - "tests/selenium/test_edit.py::test_edit003_can_edit_dropdown[props1]": 3.577014662034344, - "tests/selenium/test_edit.py::test_edit004_edit_focused[props0]": 2.0643234290764667, - "tests/selenium/test_edit.py::test_edit004_edit_focused[props1]": 1.5715787120279856, - "tests/selenium/test_editable.py::test_tedi001_loading_on_data_change": 5.623658173950389, - "tests/selenium/test_editable.py::test_tedi002_ready_on_non_data_change": 3.0887748500099406, - "tests/selenium/test_editable.py::test_tedi003_does_not_steal_focus": 3.035281224991195, - "tests/selenium/test_editable.py::test_tedi004_edit_on_non_blocking": 3.5861314330250025, - "tests/selenium/test_editable.py::test_tedi005_prevent_copy_paste_on_blocking": 3.826171776978299, - "tests/selenium/test_editable.py::test_tedi006_allow_copy_paste_on_non_blocking": 4.732877348025795, - "tests/selenium/test_empty.py::test_empt001_clear_": 3.6893790590111166, - "tests/selenium/test_export.py::test_tbex001_table_export_csv[csv-read_csv]": 1.6934574150363915, - "tests/selenium/test_export.py::test_tbex001_table_export_csv[xlsx-read_excel]": 1.6489325300208293, - "tests/selenium/test_filter.py::test_filt001_basic[props0-expect0]": 1.6774216850171797, - "tests/selenium/test_filter.py::test_filt001_basic[props1-expect1]": 1.555854316917248, - "tests/selenium/test_filter.py::test_filt001_basic[props2-expect2]": 1.5620564660639502, - "tests/selenium/test_filter.py::test_filt002_sensitivity[insensitive-None]": 6.046198113937862, - "tests/selenium/test_filter.py::test_filt002_sensitivity[insensitive-sensitive]": 18.517423591925763, - "tests/selenium/test_filter.py::test_filt002_sensitivity[sensitive-None0]": 18.63489165896317, - "tests/selenium/test_filter.py::test_filt002_sensitivity[sensitive-None1]": 18.567635487997904, - "tests/selenium/test_filter.py::test_filt002_sensitivity[sensitive-None2]": 18.590553184971213, - "tests/selenium/test_filter.py::test_filt002_sensitivity[sensitive-insensitive]": 6.080368667084258, - "tests/selenium/test_filter.py::test_filt003_sensitivity[insensitive-None]": 2.0643330549355596, - "tests/selenium/test_filter.py::test_filt003_sensitivity[insensitive-sensitive]": 14.243360938096885, - "tests/selenium/test_filter.py::test_filt003_sensitivity[sensitive-None0]": 14.04549520398723, - "tests/selenium/test_filter.py::test_filt003_sensitivity[sensitive-None1]": 14.063306336873211, - "tests/selenium/test_filter.py::test_filt003_sensitivity[sensitive-None2]": 14.08545574103482, - "tests/selenium/test_filter.py::test_filt003_sensitivity[sensitive-insensitive]": 2.0537407429656014, - "tests/selenium/test_filter.py::test_filt004_placeholder[-None-]": 1.551754874002654, - "tests/selenium/test_filter.py::test_filt004_placeholder[None-None-filter data...]": 1.5544508790480904, - "tests/selenium/test_filter.py::test_filt004_placeholder[None-def-def]": 1.5717498479643837, - "tests/selenium/test_filter.py::test_filt004_placeholder[abc-None-abc]": 1.557968818990048, - "tests/selenium/test_filter.py::test_filt004_placeholder[gah-ijk-gah]": 1.879218292015139, - "tests/selenium/test_filter2.py::test_spfi001_can_filter_columns_with_special_characters": 4.059455763956066, - "tests/selenium/test_filter2.py::test_spfi002_handles_hovering": 2.5398884729947895, - "tests/selenium/test_filter2.py::test_spfi003_handles_invalid_queries": 2.3994685130310245, - "tests/selenium/test_filter2.py::test_spfi004_defaults_to_contains_on_text_column": 2.1153930079890415, - "tests/selenium/test_filter2.py::test_spfi005_defaults_to_equal_on_numeric_column": 2.0881739059695974, - "tests/selenium/test_filter2.py::test_spfi006_relational_operator_space[<= 5-True]": 2.041939807997551, - "tests/selenium/test_filter2.py::test_spfi006_relational_operator_space[<=5-True]": 2.07335260102991, - "tests/selenium/test_filter2.py::test_spfi006_relational_operator_space[le 5-True]": 2.0412401650683023, - "tests/selenium/test_filter2.py::test_spfi006_relational_operator_space[le5-False]": 4.043640643008985, - "tests/selenium/test_filter2.py::test_spfi007_invalid_and_valid_no_reset": 2.0428292330470867, - "tests/selenium/test_filter2.py::test_spfi008_reset_updates": 2.6318635680363514, - "tests/selenium/test_formatting.py::test_form001_can_edit_formatted_cells": 2.0698677729815245, - "tests/selenium/test_formatting.py::test_form002_can_copy_formatted_cells": 2.082036539039109, - "tests/selenium/test_header.py::test_head001_renames_only_row[0]": 2.3986330759944394, - "tests/selenium/test_header.py::test_head001_renames_only_row[1]": 2.370070897974074, - "tests/selenium/test_header.py::test_head001_renames_only_row[2]": 2.061278747045435, - "tests/selenium/test_header.py::test_head002_preserves_hidden_columns_on_rename": 4.57496335695032, - "tests/selenium/test_header.py::test_head003_preserves_column_name_on_cancel": 1.582993823045399, - "tests/selenium/test_header.py::test_head004_change_single_row_header": 2.0824087010114454, - "tests/selenium/test_header.py::test_head005_no_warnings_emitted": 1.7279441700084135, - "tests/selenium/test_header.py::test_head006_style_merged_columns": 1.733552248973865, - "tests/selenium/test_markdown.py::test_mark001_header": 2.26767564896727, - "tests/selenium/test_markdown.py::test_mark002_emphasized_text": 2.301611021044664, - "tests/selenium/test_markdown.py::test_mark003_link": 2.275399253005162, - "tests/selenium/test_markdown.py::test_mark004_image": 2.2524119949666783, - "tests/selenium/test_markdown.py::test_mark005_table": 2.349028220982291, - "tests/selenium/test_markdown.py::test_mark006_filter_link_text[/wiki/97]": 3.865964367054403, - "tests/selenium/test_markdown.py::test_mark006_filter_link_text[Learn about 97]": 3.803582806023769, - "tests/selenium/test_markdown.py::test_mark007_filter_image_alt_text": 3.8038285819930024, - "tests/selenium/test_markdown.py::test_mark008_loads_highlightjs": 1.8307973239570856, - "tests/selenium/test_markdown.py::test_mark009_loads_custom_highlightjs": 1.7377096839481965, - "tests/selenium/test_markdown_copy_paste.py::test_tmcp001_copy_markdown_to_text": 0.0007087640115059912, - "tests/selenium/test_markdown_copy_paste.py::test_tmcp002_copy_markdown_to_markdown": 0.0006161439814604819, - "tests/selenium/test_markdown_copy_paste.py::test_tmcp003_copy_text_to_markdown": 0.0002618349390104413, - "tests/selenium/test_markdown_copy_paste.py::test_tmcp004_copy_null_text_to_markdown": 2.5125464380253106, - "tests/selenium/test_markdown_html.py::test_tmdh001_html_not_allowed": 3.5626728490460664, - "tests/selenium/test_markdown_html.py::test_tmdh002_html_allowed": 1.571883146010805, - "tests/selenium/test_markdown_link.py::test_tmdl001_click_markdown_link[False-None-True]": 1.7322017239639536, - "tests/selenium/test_markdown_link.py::test_tmdl001_click_markdown_link[False-markdown_options1-True]": 1.6621089070104063, - "tests/selenium/test_markdown_link.py::test_tmdl001_click_markdown_link[False-markdown_options2-False]": 1.7125120229902677, - "tests/selenium/test_markdown_link.py::test_tmdl001_click_markdown_link[True-None-True]": 1.6753457569284365, - "tests/selenium/test_markdown_link.py::test_tmdl001_click_markdown_link[True-markdown_options1-True]": 1.6492830160423182, - "tests/selenium/test_markdown_link.py::test_tmdl001_click_markdown_link[True-markdown_options2-False]": 1.62193273199955, - "tests/selenium/test_multiple_tables.py::test_tbmu001_select_row": 2.6223896280280314, - "tests/selenium/test_multiple_tables.py::test_tbmu002_select_column": 2.8685586740029976, - "tests/selenium/test_multiple_tables.py::test_tbmu003_edit_on_enter": 2.5485591259784997, - "tests/selenium/test_multiple_tables.py::test_tbmu004_edit_click_outside": 2.5900718410266563, - "tests/selenium/test_navigation.py::test_navg001_keyboard_through_9_10_cells[props0]": 2.3960530759650283, - "tests/selenium/test_navigation.py::test_navg001_keyboard_through_9_10_cells[props1]": 1.552508738997858, - "tests/selenium/test_navigation.py::test_navg002_keyboard_after_ctrl_copy[props0]": 1.5415158569812775, - "tests/selenium/test_navigation.py::test_navg002_keyboard_after_ctrl_copy[props1]": 1.5496328009758145, - "tests/selenium/test_navigation.py::test_navg003_keyboard_can_move_down[\\ue012-0--1-props0]": 1.579538904945366, - "tests/selenium/test_navigation.py::test_navg003_keyboard_can_move_down[\\ue012-0--1-props1]": 1.5625901719904505, - "tests/selenium/test_navigation.py::test_navg003_keyboard_can_move_down[\\ue013--1-0-props0]": 1.5332143270643428, - "tests/selenium/test_navigation.py::test_navg003_keyboard_can_move_down[\\ue013--1-0-props1]": 1.5375344240455888, - "tests/selenium/test_navigation.py::test_navg003_keyboard_can_move_down[\\ue014-0-1-props0]": 1.6406138020684011, - "tests/selenium/test_navigation.py::test_navg003_keyboard_can_move_down[\\ue014-0-1-props1]": 1.8110565580427647, - "tests/selenium/test_navigation.py::test_navg003_keyboard_can_move_down[\\ue015-1-0-props0]": 1.5880227779853158, - "tests/selenium/test_navigation.py::test_navg003_keyboard_can_move_down[\\ue015-1-0-props1]": 1.6017284750705585, - "tests/selenium/test_navigation.py::test_navg004_keyboard_between_md_and_standard_cells[props0]": 1.5680928359506652, - "tests/selenium/test_navigation.py::test_navg005_unselectable_cells[False]": 1.5565250720246695, - "tests/selenium/test_navigation.py::test_navg005_unselectable_cells[True]": 1.6011834350065328, - "tests/selenium/test_navigation_keyboard.py::test_knav001_navigate_9_10_cells[props0]": 2.0830641929642297, - "tests/selenium/test_navigation_keyboard.py::test_knav001_navigate_9_10_cells[props1]": 2.1012904459494166, - "tests/selenium/test_navigation_keyboard.py::test_knav001_navigate_9_10_cells[props2]": 2.09728444297798, - "tests/selenium/test_navigation_keyboard.py::test_knav002_can_move[\\ue012--1-0-props0]": 2.1086710880044848, - "tests/selenium/test_navigation_keyboard.py::test_knav002_can_move[\\ue012--1-0-props1]": 1.5754481309559196, - "tests/selenium/test_navigation_keyboard.py::test_knav002_can_move[\\ue012--1-0-props2]": 1.547530350042507, - "tests/selenium/test_navigation_keyboard.py::test_knav002_can_move[\\ue013-0--1-props0]": 2.0839679809869267, - "tests/selenium/test_navigation_keyboard.py::test_knav002_can_move[\\ue013-0--1-props1]": 1.5972941380459815, - "tests/selenium/test_navigation_keyboard.py::test_knav002_can_move[\\ue013-0--1-props2]": 1.5580657849786803, - "tests/selenium/test_navigation_keyboard.py::test_knav002_can_move[\\ue014-1-0-props0]": 2.093384423002135, - "tests/selenium/test_navigation_keyboard.py::test_knav002_can_move[\\ue014-1-0-props1]": 1.7513713689986616, - "tests/selenium/test_navigation_keyboard.py::test_knav002_can_move[\\ue014-1-0-props2]": 1.5896643170272, - "tests/selenium/test_navigation_keyboard.py::test_knav002_can_move[\\ue015-0-1-props0]": 2.1123452989268117, - "tests/selenium/test_navigation_keyboard.py::test_knav002_can_move[\\ue015-0-1-props1]": 1.5375407279934734, - "tests/selenium/test_navigation_keyboard.py::test_knav002_can_move[\\ue015-0-1-props2]": 1.572929889021907, - "tests/selenium/test_navigation_keyboard.py::test_knav003_can_move_after_copy[props0]": 2.115790126088541, - "tests/selenium/test_navigation_keyboard.py::test_knav003_can_move_after_copy[props1]": 1.897912970976904, - "tests/selenium/test_navigation_keyboard.py::test_knav003_can_move_after_copy[props2]": 1.614201588963624, - "tests/selenium/test_navigation_keyboard.py::test_knav004_can_move_out_of_viewport": 2.115017563046422, - "tests/selenium/test_navigation_keyboard.py::test_knav005_can_select_down_twice[props0]": 2.0756387769943103, - "tests/selenium/test_navigation_keyboard.py::test_knav005_can_select_down_twice[props1]": 2.1345110560650937, - "tests/selenium/test_navigation_keyboard.py::test_knav005_can_select_down_twice[props2]": 2.0925943970214576, - "tests/selenium/test_navigation_keyboard.py::test_knav006_can_select_down_then_up[props0]": 2.0638650019536726, - "tests/selenium/test_navigation_keyboard.py::test_knav006_can_select_down_then_up[props1]": 1.904237628041301, - "tests/selenium/test_navigation_keyboard.py::test_knav006_can_select_down_then_up[props2]": 1.5682297689490952, - "tests/selenium/test_navigation_keyboard.py::test_knav007_can_select_down_then_right[props0]": 2.3657625279738568, - "tests/selenium/test_navigation_keyboard.py::test_knav007_can_select_down_then_right[props1]": 1.596420589950867, - "tests/selenium/test_navigation_keyboard.py::test_knav007_can_select_down_then_right[props2]": 2.081588139932137, - "tests/selenium/test_navigation_keyboard.py::test_knav008_focus_cell_on_enter[\\ue004-3-2-props0]": 3.1145674609579146, - "tests/selenium/test_navigation_keyboard.py::test_knav008_focus_cell_on_enter[\\ue004-3-2-props1]": 3.096714415936731, - "tests/selenium/test_navigation_keyboard.py::test_knav008_focus_cell_on_enter[\\ue007-4-1-props0]": 3.086848213977646, - "tests/selenium/test_navigation_keyboard.py::test_knav008_focus_cell_on_enter[\\ue007-4-1-props1]": 3.1072757050278597, - "tests/selenium/test_navigation_keyboard.py::test_knav008_focus_cell_on_enter[abc\\ue007-4-1-props0]": 3.251937388908118, - "tests/selenium/test_navigation_keyboard.py::test_knav008_focus_cell_on_enter[abc\\ue007-4-1-props1]": 3.1029497589333914, - "tests/selenium/test_navigation_keyboard.py::test_knav009_arrows_move_caret[props0]": 3.086354337981902, - "tests/selenium/test_navigation_keyboard.py::test_knav009_arrows_move_caret[props1]": 3.1284122969955206, - "tests/selenium/test_navigation_keyboard.py::test_knav010_arrows_do_not_change_focus[props0]": 3.033913452003617, - "tests/selenium/test_navigation_keyboard.py::test_knav010_arrows_do_not_change_focus[props1]": 3.0657146380399354, - "tests/selenium/test_navigation_keyboard_readonly.py::test_kron001_navigate_into[in and out of dropdown cell-ggg-bbb-False]": 2.102552052005194, - "tests/selenium/test_navigation_keyboard_readonly.py::test_kron001_navigate_into[in and out of dropdown cell-ggg-bbb-True]": 2.1055639509577304, - "tests/selenium/test_navigation_keyboard_readonly.py::test_kron001_navigate_into[in and out of label cell-eee-fff-False]": 2.0384477270417847, - "tests/selenium/test_navigation_keyboard_readonly.py::test_kron001_navigate_into[in and out of label cell-eee-fff-True]": 2.0354405969846994, - "tests/selenium/test_navigation_mouse.py::test_mnav001_navigate_to_self[generate_markdown_mock_data-props0]": 1.818138257949613, - "tests/selenium/test_navigation_mouse.py::test_mnav001_navigate_to_self[generate_markdown_mock_data-props1]": 1.7360191718908027, - "tests/selenium/test_navigation_mouse.py::test_mnav001_navigate_to_self[generate_markdown_mock_data-props2]": 1.835556139005348, - "tests/selenium/test_navigation_mouse.py::test_mnav001_navigate_to_self[generate_mixed_markdown_data-props0]": 1.5770881479838863, - "tests/selenium/test_navigation_mouse.py::test_mnav001_navigate_to_self[generate_mixed_markdown_data-props1]": 1.601589088095352, - "tests/selenium/test_navigation_mouse.py::test_mnav001_navigate_to_self[generate_mixed_markdown_data-props2]": 1.5894037389662117, - "tests/selenium/test_navigation_mouse.py::test_mnav001_navigate_to_self[generate_mock_data-props0]": 2.0797294439398684, - "tests/selenium/test_navigation_mouse.py::test_mnav001_navigate_to_self[generate_mock_data-props1]": 1.6205128550063819, - "tests/selenium/test_navigation_mouse.py::test_mnav001_navigate_to_self[generate_mock_data-props2]": 1.5748455480206758, - "tests/selenium/test_navigation_mouse.py::test_mnav002_navigate_to_other[generate_markdown_mock_data-props0]": 1.890721246949397, - "tests/selenium/test_navigation_mouse.py::test_mnav002_navigate_to_other[generate_markdown_mock_data-props1]": 1.719519889971707, - "tests/selenium/test_navigation_mouse.py::test_mnav002_navigate_to_other[generate_markdown_mock_data-props2]": 1.866913527075667, - "tests/selenium/test_navigation_mouse.py::test_mnav002_navigate_to_other[generate_mixed_markdown_data-props0]": 1.622829166939482, - "tests/selenium/test_navigation_mouse.py::test_mnav002_navigate_to_other[generate_mixed_markdown_data-props1]": 1.626745583023876, - "tests/selenium/test_navigation_mouse.py::test_mnav002_navigate_to_other[generate_mixed_markdown_data-props2]": 1.5858883350156248, - "tests/selenium/test_navigation_mouse.py::test_mnav002_navigate_to_other[generate_mock_data-props0]": 2.065992344985716, - "tests/selenium/test_navigation_mouse.py::test_mnav002_navigate_to_other[generate_mock_data-props1]": 1.603917829983402, - "tests/selenium/test_navigation_mouse.py::test_mnav002_navigate_to_other[generate_mock_data-props2]": 1.649450019991491, - "tests/selenium/test_pagination.py::test_tpag001_next_previous[custom]": 1.9597044540569186, - "tests/selenium/test_pagination.py::test_tpag001_next_previous[native]": 1.751728850940708, - "tests/selenium/test_pagination.py::test_tpag002_ops_on_first_page[custom]": 1.5883871620171703, - "tests/selenium/test_pagination.py::test_tpag002_ops_on_first_page[native]": 1.7339834720478393, - "tests/selenium/test_pagination.py::test_tpag003_ops_on_last_page[custom]": 1.7792917489423417, - "tests/selenium/test_pagination.py::test_tpag003_ops_on_last_page[native]": 1.6780518459854648, - "tests/selenium/test_pagination.py::test_tpag004_ops_input_with_enter": 1.7552651860169135, - "tests/selenium/test_pagination.py::test_tpag005_ops_input_with_unfocus": 2.043301481055096, - "tests/selenium/test_pagination.py::test_tpag006_ops_input_invalid_with_enter[-1-1]": 1.7733774880180135, - "tests/selenium/test_pagination.py::test_tpag006_ops_input_invalid_with_enter[0-1]": 1.711068502976559, - "tests/selenium/test_pagination.py::test_tpag006_ops_input_invalid_with_enter[11264-5632]": 1.714881731022615, - "tests/selenium/test_pagination.py::test_tpag006_ops_input_invalid_with_enter[a-1]": 1.7152802539640106, - "tests/selenium/test_pagination.py::test_tpag007_ops_input_invalid_with_unfocus[-1-1]": 1.7348888600827195, - "tests/selenium/test_pagination.py::test_tpag007_ops_input_invalid_with_unfocus[0-1]": 1.7030591209768318, - "tests/selenium/test_pagination.py::test_tpag007_ops_input_invalid_with_unfocus[11264-5632]": 1.7526291820104234, - "tests/selenium/test_pagination.py::test_tpag007_ops_input_invalid_with_unfocus[a-1]": 1.747004259028472, - "tests/selenium/test_pagination.py::test_tpag008_hide_with_single_page[custom]": 3.588203130988404, - "tests/selenium/test_pagination.py::test_tpag008_hide_with_single_page[native]": 3.6205791129614227, - "tests/selenium/test_pagination.py::test_tpag009_hide_with_invalid_page_count": 3.5796678889309987, - "tests/selenium/test_pagination.py::test_tpag010_limits_page": 1.7078331649536267, - "tests/selenium/test_pagination.py::test_tpag011_valid_page": 2.624576616974082, - "tests/selenium/test_readonly_cell.py::test_tbed001_readonly_text[props0]": 4.139177770994138, - "tests/selenium/test_readonly_cell.py::test_tbed001_readonly_text[props1]": 4.689787614042871, - "tests/selenium/test_readonly_cell.py::test_tbed002_readonly_dropdown[props0]": 4.072356187039986, - "tests/selenium/test_readonly_cell.py::test_tbed002_readonly_dropdown[props1]": 3.566327090957202, - "tests/selenium/test_readonly_cell.py::test_tbed003_readonly_copy_paste[props0]": 2.097323977970518, - "tests/selenium/test_readonly_cell.py::test_tbed003_readonly_copy_paste[props1]": 2.07018945296295, - "tests/selenium/test_scrolling.py::test_scrol001_fixed_alignment[ops0-fixed_columns0-fixed_rows0]": 1.5931375590153039, - "tests/selenium/test_scrolling.py::test_scrol001_fixed_alignment[ops0-fixed_columns0-fixed_rows1]": 1.6045171629521064, - "tests/selenium/test_scrolling.py::test_scrol001_fixed_alignment[ops0-fixed_columns1-fixed_rows0]": 1.5809224149561487, - "tests/selenium/test_scrolling.py::test_scrol001_fixed_alignment[ops0-fixed_columns1-fixed_rows1]": 1.5902175839873962, - "tests/selenium/test_scrolling.py::test_scrol001_fixed_alignment[ops0-fixed_columns2-fixed_rows0]": 1.5842016559909098, - "tests/selenium/test_scrolling.py::test_scrol001_fixed_alignment[ops0-fixed_columns2-fixed_rows1]": 1.624855300062336, - "tests/selenium/test_scrolling.py::test_scrol001_fixed_alignment[ops1-fixed_columns0-fixed_rows0]": 1.913718925032299, - "tests/selenium/test_scrolling.py::test_scrol001_fixed_alignment[ops1-fixed_columns0-fixed_rows1]": 1.5962275000056252, - "tests/selenium/test_scrolling.py::test_scrol001_fixed_alignment[ops1-fixed_columns1-fixed_rows0]": 2.6455224549863487, - "tests/selenium/test_scrolling.py::test_scrol001_fixed_alignment[ops1-fixed_columns1-fixed_rows1]": 1.5846513660508208, - "tests/selenium/test_scrolling.py::test_scrol001_fixed_alignment[ops1-fixed_columns2-fixed_rows0]": 1.6322666719788685, - "tests/selenium/test_scrolling.py::test_scrol001_fixed_alignment[ops1-fixed_columns2-fixed_rows1]": 1.6051405349862762, - "tests/selenium/test_scrolling.py::test_scrol002_edit_navigate[ops0-fixed_columns0-fixed_rows0]": 1.6206717789755203, - "tests/selenium/test_scrolling.py::test_scrol002_edit_navigate[ops0-fixed_columns0-fixed_rows1]": 1.8615154389990494, - "tests/selenium/test_scrolling.py::test_scrol002_edit_navigate[ops0-fixed_columns1-fixed_rows0]": 1.6276237859856337, - "tests/selenium/test_scrolling.py::test_scrol002_edit_navigate[ops0-fixed_columns1-fixed_rows1]": 1.5704864610452205, - "tests/selenium/test_scrolling.py::test_scrol002_edit_navigate[ops0-fixed_columns2-fixed_rows0]": 1.587076144933235, - "tests/selenium/test_scrolling.py::test_scrol002_edit_navigate[ops0-fixed_columns2-fixed_rows1]": 1.6029599760076962, - "tests/selenium/test_scrolling.py::test_scrol002_edit_navigate[ops1-fixed_columns0-fixed_rows0]": 1.57987266901182, - "tests/selenium/test_scrolling.py::test_scrol002_edit_navigate[ops1-fixed_columns0-fixed_rows1]": 2.644929086032789, - "tests/selenium/test_scrolling.py::test_scrol002_edit_navigate[ops1-fixed_columns1-fixed_rows0]": 1.6197839549859054, - "tests/selenium/test_scrolling.py::test_scrol002_edit_navigate[ops1-fixed_columns1-fixed_rows1]": 1.5825127980206162, - "tests/selenium/test_scrolling.py::test_scrol002_edit_navigate[ops1-fixed_columns2-fixed_rows0]": 1.6298021330148913, - "tests/selenium/test_scrolling.py::test_scrol002_edit_navigate[ops1-fixed_columns2-fixed_rows1]": 1.6356841200613417, - "tests/selenium/test_scrolling2.py::test_scrv001_select_on_scroll[generate_markdown_mock_data-props0]": 1.8311817809590138, - "tests/selenium/test_scrolling2.py::test_scrv001_select_on_scroll[generate_markdown_mock_data-props1]": 1.8288544079987332, - "tests/selenium/test_scrolling2.py::test_scrv001_select_on_scroll[generate_markdown_mock_data-props2]": 1.8273463319637813, - "tests/selenium/test_scrolling2.py::test_scrv001_select_on_scroll[generate_mixed_markdown_data-props0]": 1.5578462049597874, - "tests/selenium/test_scrolling2.py::test_scrv001_select_on_scroll[generate_mixed_markdown_data-props1]": 1.6590360010741279, - "tests/selenium/test_scrolling2.py::test_scrv001_select_on_scroll[generate_mixed_markdown_data-props2]": 1.6035682789515704, - "tests/selenium/test_scrolling2.py::test_scrv001_select_on_scroll[generate_mock_data-props0]": 2.130573094007559, - "tests/selenium/test_scrolling2.py::test_scrv001_select_on_scroll[generate_mock_data-props1]": 1.5732414220110513, - "tests/selenium/test_scrolling2.py::test_scrv001_select_on_scroll[generate_mock_data-props2]": 1.5946487369947135, - "tests/selenium/test_scrolling2.py::test_scrv002_virtualization_keeps_focused[props0]": 4.114318899984937, - "tests/selenium/test_scrolling2.py::test_scrv002_virtualization_keeps_focused[props1]": 4.3197436920017935, - "tests/selenium/test_scrolling2.py::test_scrv002_virtualization_keeps_focused[props2]": 3.6209495079820044, - "tests/selenium/test_scrolling2.py::test_scrv003_virtualization_keeps_selection[props0]": 20.073411491059233, - "tests/selenium/test_scrolling2.py::test_scrv003_virtualization_keeps_selection[props1]": 20.11529590189457, - "tests/selenium/test_scrolling2.py::test_scrv003_virtualization_keeps_selection[props2]": 20.097759187046904, - "tests/selenium/test_scrolling2.py::test_scrv004_virtualization_can_edit[props0]": 2.0501502850675024, - "tests/selenium/test_scrolling2.py::test_scrv004_virtualization_can_edit[props1]": 2.093722090998199, - "tests/selenium/test_scrolling2.py::test_scrv004_virtualization_can_edit[props2]": 2.0511999239679426, - "tests/selenium/test_sizing.py::test_szng001_widths_on_style_change": 71.14496942597907, - "tests/selenium/test_sizing.py::test_szng002_percentages_result_in_same_widths": 18.607002958015073, - "tests/selenium/test_sizing_a.py::test_szng003_a_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows0-fixed_columns0]": 10.07794211799046, - "tests/selenium/test_sizing_a.py::test_szng003_a_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows0-fixed_columns1]": 1.8373468210338615, - "tests/selenium/test_sizing_a.py::test_szng003_a_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows1-fixed_columns0]": 9.904061316978186, - "tests/selenium/test_sizing_a.py::test_szng003_a_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows1-fixed_columns1]": 1.8531219269498251, - "tests/selenium/test_sizing_a.py::test_szng003_a_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows0-fixed_columns0]": 9.858829612960108, - "tests/selenium/test_sizing_a.py::test_szng003_a_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows0-fixed_columns1]": 1.7283235149807297, - "tests/selenium/test_sizing_a.py::test_szng003_a_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows1-fixed_columns0]": 9.769644562969916, - "tests/selenium/test_sizing_a.py::test_szng003_a_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows1-fixed_columns1]": 1.8091757880174555, - "tests/selenium/test_sizing_b.py::test_szng003_b_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows0-fixed_columns0]": 9.856038532918319, - "tests/selenium/test_sizing_b.py::test_szng003_b_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows0-fixed_columns1]": 1.7866360019543208, - "tests/selenium/test_sizing_b.py::test_szng003_b_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows1-fixed_columns0]": 9.871415485977195, - "tests/selenium/test_sizing_b.py::test_szng003_b_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows1-fixed_columns1]": 1.7406971010495909, - "tests/selenium/test_sizing_b.py::test_szng003_b_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows0-fixed_columns0]": 9.864964381034952, - "tests/selenium/test_sizing_b.py::test_szng003_b_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows0-fixed_columns1]": 1.744190127006732, - "tests/selenium/test_sizing_b.py::test_szng003_b_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows1-fixed_columns0]": 9.881391071947291, - "tests/selenium/test_sizing_b.py::test_szng003_b_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows1-fixed_columns1]": 1.760899214015808, - "tests/selenium/test_sizing_c.py::test_szng003_c_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows0-fixed_columns0]": 9.838561322016176, - "tests/selenium/test_sizing_c.py::test_szng003_c_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows0-fixed_columns1]": 5.8351284030941315, - "tests/selenium/test_sizing_c.py::test_szng003_c_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows1-fixed_columns0]": 9.888102094002534, - "tests/selenium/test_sizing_c.py::test_szng003_c_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows1-fixed_columns1]": 5.822712563036475, - "tests/selenium/test_sizing_c.py::test_szng003_c_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows0-fixed_columns0]": 9.80213569191983, - "tests/selenium/test_sizing_c.py::test_szng003_c_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows0-fixed_columns1]": 5.771967458014842, - "tests/selenium/test_sizing_c.py::test_szng003_c_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows1-fixed_columns0]": 9.807217922993004, - "tests/selenium/test_sizing_c.py::test_szng003_c_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows1-fixed_columns1]": 5.792492755979765, - "tests/selenium/test_sizing_d.py::test_szng003_d_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows0-fixed_columns0]": 10.119748920958955, - "tests/selenium/test_sizing_d.py::test_szng003_d_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows0-fixed_columns1]": 1.821836304035969, - "tests/selenium/test_sizing_d.py::test_szng003_d_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows1-fixed_columns0]": 9.841402094985824, - "tests/selenium/test_sizing_d.py::test_szng003_d_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows1-fixed_columns1]": 1.8240867069689557, - "tests/selenium/test_sizing_d.py::test_szng003_d_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows0-fixed_columns0]": 9.870760374935344, - "tests/selenium/test_sizing_d.py::test_szng003_d_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows0-fixed_columns1]": 1.8318506800569594, - "tests/selenium/test_sizing_d.py::test_szng003_d_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows1-fixed_columns0]": 9.872544030018616, - "tests/selenium/test_sizing_d.py::test_szng003_d_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows1-fixed_columns1]": 1.770841156016104, - "tests/selenium/test_sizing_e.py::test_szng003_e_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows0-fixed_columns0]": 9.815168213972356, - "tests/selenium/test_sizing_e.py::test_szng003_e_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows0-fixed_columns1]": 2.050322192022577, - "tests/selenium/test_sizing_e.py::test_szng003_e_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows1-fixed_columns0]": 9.871639558987226, - "tests/selenium/test_sizing_e.py::test_szng003_e_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows1-fixed_columns1]": 1.7815177189768292, - "tests/selenium/test_sizing_e.py::test_szng003_e_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows0-fixed_columns0]": 9.857073193998076, - "tests/selenium/test_sizing_e.py::test_szng003_e_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows0-fixed_columns1]": 1.7834910029778257, - "tests/selenium/test_sizing_e.py::test_szng003_e_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows1-fixed_columns0]": 9.79992094100453, - "tests/selenium/test_sizing_e.py::test_szng003_e_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows1-fixed_columns1]": 1.7543196750921197, - "tests/selenium/test_sizing_x.py::test_szng004_on_focus[props0]": 126.20336364296963, - "tests/selenium/test_sizing_x.py::test_szng004_on_focus[props1]": 125.70995489502093, - "tests/selenium/test_sizing_x.py::test_szng004_on_focus[props2]": 125.745579469949, - "tests/selenium/test_sizing_y.py::test_szng005_on_focus[props0]": 113.39952140505193, - "tests/selenium/test_sizing_y.py::test_szng005_on_focus[props1]": 113.33263917500153, - "tests/selenium/test_sizing_y.py::test_szng005_on_focus[props2]": 113.40925867302576, - "tests/selenium/test_sizing_z.py::test_szng006_on_focus[props0]": 51.12730318593094, - "tests/selenium/test_sizing_z.py::test_szng006_on_focus[props1]": 51.09857365099015, - "tests/selenium/test_sizing_z.py::test_szng006_on_focus[props2]": 51.09605178702623, - "tests/selenium/test_sort.py::test_sort001_can_sort[props0]": 2.3263084539212286, - "tests/selenium/test_sort.py::test_sort001_can_sort[props1]": 1.5519860989879817, - "tests/selenium/test_sort.py::test_sort001_can_sort[props2]": 1.4928846000111662, - "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops0-fixed_columns0-fixed_rows0]": 2.5540182539843954, - "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops0-fixed_columns0-fixed_rows1]": 2.8680737749673426, - "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops0-fixed_columns0-fixed_rows2]": 2.5703997319797054, - "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops0-fixed_columns1-fixed_rows0]": 3.045099287002813, - "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops0-fixed_columns1-fixed_rows1]": 2.5557332699536346, - "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops0-fixed_columns1-fixed_rows2]": 2.5622641340014525, - "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops0-fixed_columns2-fixed_rows0]": 3.0470568609889597, - "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops0-fixed_columns2-fixed_rows1]": 3.0656494359718636, - "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops0-fixed_columns2-fixed_rows2]": 3.092999142012559, - "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops1-fixed_columns0-fixed_rows0]": 2.5833326769643463, - "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops1-fixed_columns0-fixed_rows1]": 2.562386354082264, - "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops1-fixed_columns0-fixed_rows2]": 2.58790870802477, - "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops1-fixed_columns1-fixed_rows0]": 3.058700004068669, - "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops1-fixed_columns1-fixed_rows1]": 3.1016814420581795, - "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops1-fixed_columns1-fixed_rows2]": 3.1107651529600844, - "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops1-fixed_columns2-fixed_rows0]": 3.0591380239930004, - "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops1-fixed_columns2-fixed_rows1]": 3.3656719640130177, - "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops1-fixed_columns2-fixed_rows2]": 3.0942697289283387, - "tests/selenium/test_tooltip.py::test_ttip002_displays_tooltip_content[tooltip_data0-;; 1-1]": 2.039471722964663, - "tests/selenium/test_tooltip.py::test_ttip002_displays_tooltip_content[tooltip_data1-